Index: emacs/Emacs_for_NeXTstep.README
diff -c /dev/null emacs/Emacs_for_NeXTstep.README:1.3
*** /dev/null	Fri Aug  2 19:54:58 1996
--- emacs/Emacs_for_NeXTstep.README	Thu Aug  1 00:57:25 1996
***************
*** 0 ****
--- 1,82 ----
+                         Emacs for NeXTstep 4.2
+                         ======================
+ 
+ This is the third public release of Emacs for NeXTstep (**).  This is
+ a version of GNU Emacs 19.29 (not the latest release as of this writing)
+ which has been enhanced so that it supports NeXTstep windows, colors,
+ fonts, menus a.s.o. in the same way the stock Emacs 19 supports X.  In
+ addition it also supports some special NeXTstep only features like
+ font and file panels, NeXTstep services, opening documents in Emacs by
+ double-clicking them in the workspace, NeXTstep style pop up and pull
+ down menus, cooperation with ProjectBuilder, drag and drop, ISOLatin
+ character set, automatic saving on logout, NeXTstep defaults and a
+ look and feel which honest people can describe as being different from
+ ugly.  None of the capabilities of GNU Emacs 19.29 have been lost, so
+ this Emacs will still run without problems under a dumb terminal and
+ virtually all Emacs Lisp software written for GNU Emacs under X will
+ run without modifications under NeXTstep.  Creating a single binary
+ which will run under NeXTstep, X or a dumb terminal (depending on how
+ it was launched) requires nothing more than recompiling the source
+ with a different compiler switch (see installation instructions).
+ 
+ So very likely this is the only Emacs you'll ever need which is lucky
+ considering how big a complete Emacs installation is and how much work
+ it can be.  To reduce that amount of work, there are two archives
+ available -- a quad fat binary-only Installer package
+ Emacs_for_NeXTstep_4.2.pkg.NIHS.b.tar.gz, and a full source distribution
+ Emacs_for_NeXTstep_4.2.src.NIHS.s.tar.gz.
+ 
+ The binary distribution is fully functional, comes with complete
+ online documentation and should only take a few minutes and less than
+ 10 MBytes of disk space to install for a single architecture.  If you
+ don't have a developer package or the 40 MBytes or so of free disk
+ space which installing Emacs from sources temporarily needs or you
+ need a fat Emacs binary, you should get this package.  However, you
+ need to get and make the full source distribution under any of these
+ conditions:
+ 
+ (a) You run NeXTstep on any hardware other than NeXT, Intel, HP or
+     Sparc hardware.
+ 
+ (b) You need an Emacs binary which also runs under X.
+ 
+ (c) You don't have write access to your /LocalApps directory and need
+     to install Emacs somewhere else. //FIXME/cl is this still true ?
+ 
+ (d) You want to dump a customized Emacs.
+ 
+ (e) You don't just want to browse the online documentation but also
+     want to print it out in a pretty form.
+ 
+ (f) Your Emacs binary crashes immediately upon startup.  An Emacs
+     dumped under one release does not necessarily work on all others.
+     That is why NeXT had to distribute a new Emacs with NS3.3.  The
+     binary package is compiled to work on as many machines as possible
+     and there have been no reports that it actually crashes on any
+     machine.  But if this happens to you, recompile the source on your
+     machine.  It will work.
+ 
+ For more details on how to customize Emacs to your liking, read the
+ online documentation (menu item Info/Browse Manuals) and in particular
+ the NeXT specific sections (menu item Info/Info about Emacs for NS).
+ 
+ Emacs for NeXTstep runs only under NS 3.x (and for best results use NS
+ 3.3 or later).
+ 
+ Emacs for NeXTstep up to and including version 4.1 was written by Carl
+ Edman <cedman@princeton.edu>. As of version 4.2, Christian Limpach
+ <chris@nice.ch> has been maintaining Emacs for NeXTstep up-to-date
+ with the latest GNU Emacs releases.
+ 
+ 
+         Christian Limpach                               Jul 28, 1996
+         <chris@nice.ch>
+ 
+ 
+ 
+ ** So why in the world is it called version 4.x ?  To avoid confusion
+    with the older Emacs.app interface (lately up to version 3.1) which
+    is completely unrelated except for the fact that its author,
+    Michael Brouwer, has been a major contributor to this project as
+    well.  And even he has replaced the old Emacs.app with Emacs for
+    NeXTstep.
Index: emacs/INSTALL
diff -c emacs/INSTALL:1.1.1.2 emacs/INSTALL:1.3
*** emacs/INSTALL:1.1.1.2	Mon Jul 22 01:29:28 1996
--- emacs/INSTALL	Wed Jul 31 01:32:15 1996
***************
*** 47,55 ****
  system type; if it cannot, you must find the appropriate configuration
  name in `./etc/MACHINES' and specify it explicitly.
  
! If you don't want X support, specify `--with-x=no'.  If you omit this
! option, `configure' will try to figure out for itself whether your
! system has X, and arrange to use it if present.
  
  The `--x-includes=DIR' and `--x-libraries=DIR' options tell the build
  process where the compiler should look for the include files and
--- 47,56 ----
  system type; if it cannot, you must find the appropriate configuration
  name in `./etc/MACHINES' and specify it explicitly.
  
! If you don't want X support, specify `--with-x=no'.  If you don't want
! support for the NeXTstep window system, specify `--with-ns=no'.  If
! you omit this option, `configure' will try to figure out for itself
! whether your system has X and/or NS, and arrange to use it if present.
  
  The `--x-includes=DIR' and `--x-libraries=DIR' options tell the build
  process where the compiler should look for the include files and
Index: emacs/Makefile.in
diff -c emacs/Makefile.in:1.1.1.2 emacs/Makefile.in:1.3
*** emacs/Makefile.in:1.1.1.2	Mon Jul 22 01:29:37 1996
--- emacs/Makefile.in	Wed Jul 31 01:32:18 1996
***************
*** 143,149 ****
  # entry for the directory containing the installed lisp
  # files has been replaced with ../lisp.  This should be a
  # colon-separated list of directories.
! buildlisppath=${srcdir}/lisp
  
  # Where to install the other architecture-independent
  # data files distributed with Emacs (like the tutorial,
--- 143,149 ----
  # entry for the directory containing the installed lisp
  # files has been replaced with ../lisp.  This should be a
  # colon-separated list of directories.
! buildlisppath=${srcdir}/site-lisp:${srcdir}/lisp
  
  # Where to install the other architecture-independent
  # data files distributed with Emacs (like the tutorial,
***************
*** 196,202 ****
  COPYDIR = ${srcdir}/etc ${srcdir}/lisp
  COPYDESTS = ${etcdir} ${lispdir}
  
! all:	paths-force ${SUBDIR}
  
  removenullpaths=sed -e 's/^://g' -e 's/:$$//g' -e 's/::/:/g'
  
--- 196,202 ----
  COPYDIR = ${srcdir}/etc ${srcdir}/lisp
  COPYDESTS = ${etcdir} ${lispdir}
  
! all:	paths-force ${SUBDIR} info
  
  removenullpaths=sed -e 's/^://g' -e 's/:$$//g' -e 's/::/:/g'
  
***************
*** 350,356 ****
  	   if [ ! -f ${infodir}/dir ] && [ -f dir ]; then \
  	     (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
  	   fi ; \
! 	   for f in cl* dired-x* emacs* forms* gnus* info* mh-e* sc* vip*; do \
  	     (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f); \
  	   done); \
  	else true; fi
--- 350,356 ----
  	   if [ ! -f ${infodir}/dir ] && [ -f dir ]; then \
  	     (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
  	   fi ; \
! 	   for f in cl.info* dired-x.info* elisp.info* emacs.info* forms.info* gnus.info* info.info* ns-emacs.info* mh-e.info* sc.info* vip.info* ; do \
  	     (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f); \
  	   done); \
  	else true; fi
***************
*** 391,397 ****
  	    esac ;					\
  	  fi ;						\
  	done
! 	(cd ${infodir} && rm -f cl* dired-x* emacs* forms* gnus* info* mh-e* sc* vip*)
  	(cd ${mandir}  && rm -f emacs.1 etags.1 ctags.1)
  	(cd ${bindir}  && rm -f emacs-${version} $(EMACS))
  
--- 391,397 ----
  	    esac ;					\
  	  fi ;						\
  	done
! 	(cd ${infodir} && rm -f cl.info* dired-x.info* elisp.info* emacs.info* forms.info* gnus.info* info.info* ns-emacs.info* mh-e.info* sc.info* vip.info*)
  	(cd ${mandir}  && rm -f emacs.1 etags.1 ctags.1)
  	(cd ${bindir}  && rm -f emacs-${version} $(EMACS))
  
***************
*** 412,417 ****
--- 412,418 ----
  	(cd oldXMenu; $(MAKE) $(MFLAGS) mostlyclean)
  	(cd lwlib;    $(MAKE) $(MFLAGS) mostlyclean)
  	(cd lib-src;  $(MAKE) $(MFLAGS) mostlyclean)
+ 	-(cd lisp;    $(MAKE) $(MFLAGS) mostlyclean)
  	-(cd man &&   $(MAKE) $(MFLAGS) mostlyclean)
  
  ### `clean'
***************
*** 427,432 ****
--- 428,434 ----
  	(cd oldXMenu; $(MAKE) $(MFLAGS) clean)
  	(cd lwlib;    $(MAKE) $(MFLAGS) clean)
  	(cd lib-src;  $(MAKE) $(MFLAGS) clean)
+ 	-(cd lisp;    $(MAKE) $(MFLAGS) clean)
  	-(cd man &&   $(MAKE) $(MFLAGS) clean)
  
  ### `distclean'
***************
*** 444,452 ****
  	(cd oldXMenu; $(MAKE) $(MFLAGS) distclean)
  	(cd lwlib;    $(MAKE) $(MFLAGS) distclean)
  	(cd lib-src;  $(MAKE) $(MFLAGS) distclean)
  	(cd man &&    $(MAKE) $(MFLAGS) distclean)
  	${top_distclean}
- 	
  
  ### `maintainer-clean'
  ###      Delete everything from the current directory that can be
--- 446,454 ----
  	(cd oldXMenu; $(MAKE) $(MFLAGS) distclean)
  	(cd lwlib;    $(MAKE) $(MFLAGS) distclean)
  	(cd lib-src;  $(MAKE) $(MFLAGS) distclean)
+ 	-(cd lisp;    $(MAKE) $(MFLAGS) distclean)
  	(cd man &&    $(MAKE) $(MFLAGS) distclean)
  	${top_distclean}
  
  ### `maintainer-clean'
  ###      Delete everything from the current directory that can be
***************
*** 464,469 ****
--- 466,472 ----
  	(cd oldXMenu; $(MAKE) $(MFLAGS) maintainer-clean)
  	(cd lwlib;    $(MAKE) $(MFLAGS) maintainer-clean)
  	(cd lib-src;  $(MAKE) $(MFLAGS) maintainer-clean)
+ 	-(cd lisp;    $(MAKE) $(MFLAGS) maintainer-clean)
  	-(cd man &&   $(MAKE) $(MFLAGS) maintainer-clean)
  	${top_distclean}
  
***************
*** 529,534 ****
  .PHONY: info dvi dist check
  force-info:
  info: force-info
! 	(cd ${srcdir}/man; $(MAKE) $(MFLAGS) info)
  dvi:
! 	(cd man; $(MAKE) $(MFLAGS) dvi)
--- 532,537 ----
  .PHONY: info dvi dist check
  force-info:
  info: force-info
! 	(cd ${srcdir}/man; $(MAKE) $(MFLAGS) info gnu)
  dvi:
! 	(cd ${srcdir}/man; $(MAKE) $(MFLAGS) dvi)
Index: emacs/NSBUGS
diff -c /dev/null emacs/NSBUGS:1.2
*** /dev/null	Fri Aug  2 19:55:09 1996
--- emacs/NSBUGS	Fri Aug  2 03:10:01 1996
***************
*** 0 ****
--- 1,31 ----
+ 1. empty menu popup menu crashs. e.g. "select and paste" (fixed)
+ 
+ 2. face text-properties which are lists don't work (fixed)
+ 
+ 3. no ns equivalents for x-defined-colors and x-colors (fixed)
+ 
+ 4. empty menu's run forever, there's no way out
+    [this is actually again #1]
+     (defvar yank-menu2 (cons "Select Yank2" nil))
+     (fset 'yank-menu2 (cons 'keymap yank-menu2))
+     (define-key menu-bar-edit-menu [select-paste2]
+       '("Select and Paste2" . yank-menu2))
+ 
+ 5. submenus in popups don't work at all
+    [recovered old popup code]
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ --------- Working packages:
+ - enriched.el
+ - facemenu.el
+ - (ns-)?menu-bar.el
+ - ediff
+ - ps-print (in europe, don't forget to set ps-paper-type to ps-a4)
Index: emacs/config.guess
diff -c emacs/config.guess:1.1.1.2 emacs/config.guess:1.3
*** emacs/config.guess:1.1.1.2	Mon Jul 22 01:29:50 1996
--- emacs/config.guess	Wed Jul 31 01:32:21 1996
***************
*** 446,459 ****
    printf ("m68k-hp-bsd\n"); exit (0);
  #endif
  
! #if defined (NeXT)
! #if !defined (__ARCHITECTURE__)
  #define __ARCHITECTURE__ "m68k"
  #endif
    int version;
    version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
!   printf ("%s-next-nextstep%s\n", __ARCHITECTURE__,  version==2 ? "2" : "3");
!   exit (0);
  #endif
  
  #if defined (MULTIMAX) || defined (n16)
--- 446,468 ----
    printf ("m68k-hp-bsd\n"); exit (0);
  #endif
  
! #if defined(NeXT)
! /* #if !defined(__ARCHITECTURE__)
  #define __ARCHITECTURE__ "m68k"
  #endif
    int version;
    version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
!   if (version==2)
!     {
!       printf("%s-next-nextstep2\n", __ARCHITECTURE__);
!       exit(0);
!     }
!   else
!     {
!       printf("%s-next-nextstep3\n", __ARCHITECTURE__);
!       exit(0);
!     }*/
!   printf("mab-next-nextstep3\n"); exit(0);
  #endif
  
  #if defined (MULTIMAX) || defined (n16)
Index: emacs/config.sub
diff -c emacs/config.sub:1.1.1.2 emacs/config.sub:1.3
*** emacs/config.sub:1.1.1.2	Mon Jul 22 01:29:49 1996
--- emacs/config.sub	Wed Jul 31 01:32:23 1996
***************
*** 133,139 ****
  		| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
  		| powerpc | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
  		| pdp11 | mips64el | mips64orion | mips64orionel \
! 		| sparc)
  		basic_machine=$basic_machine-unknown
  		;;
  	# Object if more than one company name word.
--- 133,139 ----
  		| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
  		| powerpc | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
  		| pdp11 | mips64el | mips64orion | mips64orionel \
! 		| sparc | mab)
  		basic_machine=$basic_machine-unknown
  		;;
  	# Object if more than one company name word.
***************
*** 149,155 ****
  	      | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
  	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
  	      | pdp11-* | sh-* | powerpc-* | sparc64-* | mips64-* | mipsel-* \
! 	      | mips64el-* | mips64orion-* | mips64orionel-*)
  		;;
  	# Recognize the various machine names and aliases which stand
  	# for a CPU type and a company and sometimes even an OS.
--- 149,155 ----
  	      | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
  	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
  	      | pdp11-* | sh-* | powerpc-* | sparc64-* | mips64-* | mipsel-* \
! 	      | mips64el-* | mips64orion-* | mips64orionel-* | mab-*)
  		;;
  	# Recognize the various machine names and aliases which stand
  	# for a CPU type and a company and sometimes even an OS.
***************
*** 372,379 ****
  		basic_machine=mips-sony
  		os=-newsos
  		;;
! 	next | m*-next )
! 		basic_machine=m68k-next
  		case $os in
  		    -nextstep* )
  			;;
--- 372,379 ----
  		basic_machine=mips-sony
  		os=-newsos
  		;;
! 	next)
! 		basic_machine=mab-next
  		case $os in
  		    -nextstep* )
  			;;
Index: emacs/configure
diff -c emacs/configure:1.1.1.2 emacs/configure:1.3
*** emacs/configure:1.1.1.2	Mon Jul 22 01:29:39 1996
--- emacs/configure	Wed Jul 31 01:32:25 1996
***************
*** 23,28 ****
--- 23,38 ----
    --with-x-toolkit=KIT    use an X toolkit (KIT = yes/lucid/athena/motif)"
  ac_help="$ac_help
    --with-x                use the X Window System"
+ ac_help="$ac_help
+   --with-ns               use the NeXTstep Window System"
+ ## FIXME/cl
+ #ac_help="$ac_help
+ #  --puresize=NUM          define PURESIZE to be NUM.  This is needed for
+ #                          machines which run out of memory during dumping."
+ #ac_help="$ac_help
+ #  --gctypebits=NUM        define GCTYPEBITS to be NUM.  Setting this
+ #                          smaller than 7 allows emacs to use larger files."
+ ## FIXME/cl
  
  # Initialize some variables set by options.
  # The variables have the same names as the options, with
***************
*** 286,291 ****
--- 296,334 ----
  
    esac
  done
+ ##FIXME/cl
+ #	 ## Should we use a non-default PURESIZE ?
+ #	 "puresize" )
+ #	   ## If the value was omitted, get it from the next argument.
+ #	   if [ "${valomitted}" = "yes" ]; then
+ #	     ## Get the next argument from the argument list, if there is one.
+ #	     if [ $# = 0 ]; then
+ #	       (echo "${progname}: You must give a value for the \`--${optname}' option, as in
+ #    \`--${optname}=600000'."
+ #		echo "${short_usage}") >&2
+ #	       exit 1
+ #	     fi
+ #	     val="$1"; shift
+ #	   fi
+ #	   PURESIZE="${val}"
+ #	 ;;           
+ #
+ #	 ## Should we use a non-default GCTYPEBITS ?
+ #	 "gctypebits" )
+ #	   ## If the value was omitted, get it from the next argument.
+ #	   if [ "${valomitted}" = "yes" ]; then
+ #	     ## Get the next argument from the argument list, if there is one.
+ #	     if [ $# = 0 ]; then
+ #	       (echo "${progname}: You must give a value for the \`--${optname}' option, as in
+ #    \`--${optname}=5'."
+ #		echo "${short_usage}") >&2
+ #	       exit 1
+ #	     fi
+ #	     val="$1"; shift
+ #	   fi
+ #	   GCTYPEBITS="${val}"
+ #	 ;;           
+ ##FIXME/cl
  
  if test -n "$ac_prev"; then
    { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
***************
*** 1001,1007 ****
    ;;
  
    ## NeXT
!   m68*-next-* | i[345]86-next-* )
      machine=next opsys=mach2
    ;;
  
--- 1044,1050 ----
    ;;
  
    ## NeXT
!   *-next-* )
      machine=next opsys=mach2
    ;;
  
***************
*** 1289,1295 ****
  case ${with_gcc} in
    "yes" ) CC="gcc" GCC=yes ;;
    "no"  ) : ${CC=cc} ;;
!   * ) # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
--- 1332,1342 ----
  case ${with_gcc} in
    "yes" ) CC="gcc" GCC=yes ;;
    "no"  ) : ${CC=cc} ;;
!   * )
!     if [ $machine = "next" ]; then
!       CC="cc -pipe"
!     else
! # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
  if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
***************
*** 1362,1367 ****
--- 1409,1415 ----
    test "${CFLAGS+set}" = set || CFLAGS="-g"
  fi
  
+     fi
  esac
  
  # On Suns, sometimes $CPP names a directory.
***************
*** 2363,2371 ****
--- 2411,2428 ----
  
  if test "$no_x" = yes; then
    window_system=none
+   window_systems=':terminal:'
  else
    window_system=x11
+   window_systems=':terminal:x11:'
  fi
+ echo $ac_n "checking for NS""... $ac_c" 1>&6
+ HAVE_NS=no
+ if [ "${with_ns}" = "yes" ]; then
+   window_systems=${window_systems}ns:
+   HAVE_NS=yes
+ fi
+ echo "$ac_t""$HAVE_NS" 1>&6
  
  if test "${x_libraries}" != NONE && test -n "${x_libraries}"; then
    LD_SWITCH_X_SITE=-L`echo ${x_libraries} | sed -e "s/:/ -L/g"`
***************
*** 2486,2498 ****
  #endif
  
  #ifndef C_OPTIMIZE_SWITCH
  #define C_OPTIMIZE_SWITCH -O
  #endif
  
  #ifdef THIS_IS_CONFIGURE
  
  /* Get the CFLAGS for tests in configure.  */
! #ifdef __GNUC__
  configure___ CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
--- 2543,2559 ----
  #endif
  
  #ifndef C_OPTIMIZE_SWITCH
+ #ifdef NeXT
+ #define C_OPTIMIZE_SWITCH -O2
+ #else
  #define C_OPTIMIZE_SWITCH -O
  #endif
+ #endif
  
  #ifdef THIS_IS_CONFIGURE
  
  /* Get the CFLAGS for tests in configure.  */
! #if defined(__GNUC__) || defined(NeXT)
  configure___ CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
***************
*** 2501,2507 ****
  #else /* not THIS_IS_CONFIGURE */
  
  /* Get the CFLAGS for real compilation.  */
! #ifdef __GNUC__
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
--- 2562,2568 ----
  #else /* not THIS_IS_CONFIGURE */
  
  /* Get the CFLAGS for real compilation.  */
! #if defined(__GNUC__) || defined(NeXT)
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
***************
*** 3106,3112 ****
  
  for ac_func in gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod drem ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
--- 3167,3173 ----
  
  for ac_func in gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod drem ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize strcasecmp
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
***************
*** 3363,3368 ****
--- 3424,3435 ----
  EOF
  
  fi
+ if test "${HAVE_NS}" = "yes" ; then
+   cat >> confdefs.h <<\EOF
+ #define HAVE_NS 1
+ EOF
+ 
+ fi
  if test "${USE_X_TOOLKIT}" != "none" ; then
    cat >> confdefs.h <<\EOF
  #define USE_X_TOOLKIT 1
***************
*** 3375,3386 ****
--- 3442,3483 ----
  EOF
  
  fi
+ ##FIXME/cl
+ #if [ -n "${PURESIZE}" ] ; then
+ #   
+ #{
+ #test -n "$verbose" && \
+ #echo "	defining" PURESIZE to be "${PURESIZE}"
+ #echo "#define" PURESIZE "${PURESIZE}" >> confdefs.h
+ #DEFS="$DEFS -DPURESIZE=${PURESIZE}"
+ #ac_sed_defs="${ac_sed_defs}\${ac_dA}PURESIZE\${ac_dB}PURESIZE\${ac_dC}${PURESIZE}\${ac_dD}
+ #\${ac_uA}PURESIZE\${ac_uB}PURESIZE\${ac_uC}${PURESIZE}\${ac_uD}
+ #\${ac_eA}PURESIZE\${ac_eB}PURESIZE\${ac_eC}${PURESIZE}\${ac_eD}
+ #"
+ #}
+ # 
+ ##FIXME/cl
  if test "${HAVE_XFREE386}" = "yes" ; then
    cat >> confdefs.h <<\EOF
  #define HAVE_XFREE386 1
  EOF
  
  fi
+ ##FIXME/cl
+ #if [ -n "${GCTYPEBITS}" ] ; then
+ #   
+ #{
+ #test -n "$verbose" && \
+ #echo "	defining" GCTYPEBITS to be "${GCTYPEBITS}"
+ #echo "#define" GCTYPEBITS "${GCTYPEBITS}" >> confdefs.h
+ #DEFS="$DEFS -DGCTYPEBITS=${GCTYPEBITS}"
+ #ac_sed_defs="${ac_sed_defs}\${ac_dA}GCTYPEBITS\${ac_dB}GCTYPEBITS\${ac_dC}${GCTYPEBITS}\${ac_dD}
+ #\${ac_uA}GCTYPEBITS\${ac_uB}GCTYPEBITS\${ac_uC}${GCTYPEBITS}\${ac_uD}
+ #\${ac_eA}GCTYPEBITS\${ac_eB}GCTYPEBITS\${ac_eC}${GCTYPEBITS}\${ac_eD}
+ #"
+ #}
+ # 
+ ##FIXME/cl
  if test "${HAVE_X_MENU}" = "yes" ; then
    cat >> confdefs.h <<\EOF
  #define HAVE_X_MENU 1
***************
*** 3416,3422 ****
    What compiler should emacs be built with?               ${CC} ${CFLAGS}
    Should Emacs use the GNU version of malloc?             ${GNU_MALLOC}${GNU_MALLOC_reason}
    Should Emacs use the relocating allocator for buffers?  ${REL_ALLOC}
!   What window system should Emacs use?                    ${window_system}
    What toolkit should Emacs use?                          ${USE_X_TOOLKIT}"
  
  if test -n "${x_includes}"; then
--- 3513,3519 ----
    What compiler should emacs be built with?               ${CC} ${CFLAGS}
    Should Emacs use the GNU version of malloc?             ${GNU_MALLOC}${GNU_MALLOC_reason}
    Should Emacs use the relocating allocator for buffers?  ${REL_ALLOC}
!   What window system should Emacs use?                    ${window_systems}
    What toolkit should Emacs use?                          ${USE_X_TOOLKIT}"
  
  if test -n "${x_includes}"; then
Index: emacs/configure.in
diff -c emacs/configure.in:1.1.1.2 emacs/configure.in:1.3
*** emacs/configure.in:1.1.1.2	Mon Jul 22 01:29:43 1996
--- emacs/configure.in	Wed Jul 31 01:32:33 1996
***************
*** 31,36 ****
--- 31,38 ----
  AC_ARG_WITH(hesiod,
  [  --with-hesiod           support Hesiod to get the POP server host],
  [AC_DEFINE(HESIOD)])
+ AC_ARG_WITH(ns,
+ [  --with-ns               use the NeXTstep Window System])
  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.
***************
*** 537,543 ****
    ;;
  
    ## NeXT
!   m68*-next-* | i[345]86-next-* )
      machine=next opsys=mach2
    ;;
  
--- 539,545 ----
    ;;
  
    ## NeXT
!   *-next-* )
      machine=next opsys=mach2
    ;;
  
***************
*** 826,832 ****
  case ${with_gcc} in
    "yes" ) CC="gcc" GCC=yes ;;
    "no"  ) : ${CC=cc} ;;
!   * ) AC_PROG_CC
  esac
  
  # On Suns, sometimes $CPP names a directory.
--- 828,839 ----
  case ${with_gcc} in
    "yes" ) CC="gcc" GCC=yes ;;
    "no"  ) : ${CC=cc} ;;
!   * )
!     if [ $machine = "next" ]; then
!       CC="cc -pipe"
!     else
!       AC_PROG_CC
!     fi
  esac
  
  # On Suns, sometimes $CPP names a directory.
***************
*** 934,942 ****
  
  AC_PATH_X
  if test "$no_x" = yes; then
!   window_system=none
  else
!   window_system=x11
  fi
  
  if test "${x_libraries}" != NONE && test -n "${x_libraries}"; then
--- 941,952 ----
  
  AC_PATH_X
  if test "$no_x" = yes; then
!   window_systems=':terminal:'
  else
!   window_systems=':terminal:x11:'
! fi
! if [ "${with_ns}" = "yes" ]; then
!    window_systems=${window_systems}ns:
  fi
  
  if test "${x_libraries}" != NONE && test -n "${x_libraries}"; then
***************
*** 964,971 ****
    fi
  fi
  
  case "${window_system}" in
!   x11 )
      HAVE_X_WINDOWS=yes
      HAVE_X11=yes
      case "${with_x_toolkit}" in
--- 974,985 ----
    fi
  fi
  
+ HAVE_X_WINDOWS=no
+ HAVE_X11=no
+ USE_X_TOOLKIT=none
+ HAVE_NS=no
  case "${window_system}" in
!   *:x11:* )
      HAVE_X_WINDOWS=yes
      HAVE_X11=yes
      case "${with_x_toolkit}" in
***************
*** 975,984 ****
        * ) USE_X_TOOLKIT=none ;;
      esac
    ;;
!   none )
!     HAVE_X_WINDOWS=no
!     HAVE_X11=no
!     USE_X_TOOLKIT=none
    ;;
  esac
  X_TOOLKIT_TYPE=$USE_X_TOOLKIT
--- 989,998 ----
        * ) USE_X_TOOLKIT=none ;;
      esac
    ;;
! esac
! case "${window_systems}" in
!   *:ns:* )
!     HAVE_NS=yes
    ;;
  esac
  X_TOOLKIT_TYPE=$USE_X_TOOLKIT
***************
*** 1059,1071 ****
  #endif
  
  #ifndef C_OPTIMIZE_SWITCH
  #define C_OPTIMIZE_SWITCH -O
  #endif
  
  #ifdef THIS_IS_CONFIGURE
  
  /* Get the CFLAGS for tests in configure.  */
! #ifdef __GNUC__
  configure___ CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
--- 1073,1089 ----
  #endif
  
  #ifndef C_OPTIMIZE_SWITCH
+ #ifdef NeXT
+ #define C_OPTIMIZE_SWITCH -O2
+ #else
  #define C_OPTIMIZE_SWITCH -O
  #endif
+ #endif
  
  #ifdef THIS_IS_CONFIGURE
  
  /* Get the CFLAGS for tests in configure.  */
! #if defined(__GNUC__) || defined(NeXT)
  configure___ CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
***************
*** 1074,1080 ****
  #else /* not THIS_IS_CONFIGURE */
  
  /* Get the CFLAGS for real compilation.  */
! #ifdef __GNUC__
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
--- 1092,1098 ----
  #else /* not THIS_IS_CONFIGURE */
  
  /* Get the CFLAGS for real compilation.  */
! #if defined(__GNUC__) || defined(NeXT)
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${CFLAGS}'
  #else
  configure___ REAL_CFLAGS=C_DEBUG_SWITCH '${CFLAGS}'
***************
*** 1216,1222 ****
  AC_CHECK_LIB(m, sqrt(0.0) + t)
  AC_CHECK_FUNCS(gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod drem ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize)
  
  ok_so_far=yes
  AC_CHECK_FUNC(socket, , ok_so_far=no)
--- 1234,1240 ----
  AC_CHECK_LIB(m, sqrt(0.0) + t)
  AC_CHECK_FUNCS(gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod drem ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize strcasecmp)
  
  ok_so_far=yes
  AC_CHECK_FUNC(socket, , ok_so_far=no)
***************
*** 1290,1295 ****
--- 1308,1316 ----
  if test "${HAVE_X_WINDOWS}" = "yes" ; then
    AC_DEFINE(HAVE_X_WINDOWS)
  fi
+ if test "${HAVE_NS}" = "yes" ; then
+   AC_DEFINE(HAVE_NS)
+ fi
  if test "${USE_X_TOOLKIT}" != "none" ; then
    AC_DEFINE(USE_X_TOOLKIT)
  fi
***************
*** 1311,1316 ****
--- 1332,1345 ----
  if test "${LISP_FLOAT_TYPE}" = "yes" ; then
    AC_DEFINE(LISP_FLOAT_TYPE)
  fi
+ ##FIXME/cl
+ #if [ -n "${PURESIZE}" ] ; then
+ #  ] AC_DEFINE_UNQUOTED(PURESIZE,${PURESIZE}) [
+ #fi
+ #if [ -n "${GCTYPEBITS}" ] ; then
+ #  ] AC_DEFINE_UNQUOTED(GCTYPEBITS,${GCTYPEBITS}) [
+ #fi
+ ##FIXME/cl
  
  #### Report on what we decided to do.
  echo "
***************
*** 1322,1328 ****
    What compiler should emacs be built with?               ${CC} ${CFLAGS}
    Should Emacs use the GNU version of malloc?             ${GNU_MALLOC}${GNU_MALLOC_reason}
    Should Emacs use the relocating allocator for buffers?  ${REL_ALLOC}
!   What window system should Emacs use?                    ${window_system}
    What toolkit should Emacs use?                          ${USE_X_TOOLKIT}"
  
  if test -n "${x_includes}"; then
--- 1351,1357 ----
    What compiler should emacs be built with?               ${CC} ${CFLAGS}
    Should Emacs use the GNU version of malloc?             ${GNU_MALLOC}${GNU_MALLOC_reason}
    Should Emacs use the relocating allocator for buffers?  ${REL_ALLOC}
!   What window system should Emacs use?                    ${window_systems}
    What toolkit should Emacs use?                          ${USE_X_TOOLKIT}"
  
  if test -n "${x_includes}"; then
Index: emacs/etc/Emacs.clr
diff -c /dev/null emacs/etc/Emacs.clr:1.1
*** /dev/null	Fri Aug  2 19:55:45 1996
--- emacs/etc/Emacs.clr	Fri Jul 19 04:58:39 1996
***************
*** 0 ****
--- 1,745 ----
+ 743
+ 0 1.000 0.980 0.980 1.0 snow
+ 0 0.972 0.972 1.000 1.0 ghost white
+ 0 0.972 0.972 1.000 1.0 GhostWhite
+ 0 0.960 0.960 0.960 1.0 white smoke
+ 0 0.960 0.960 0.960 1.0 WhiteSmoke
+ 0 0.862 0.862 0.862 1.0 gainsboro
+ 0 1.000 0.980 0.941 1.0 floral white
+ 0 1.000 0.980 0.941 1.0 FloralWhite
+ 0 0.992 0.960 0.901 1.0 old lace
+ 0 0.992 0.960 0.901 1.0 OldLace
+ 0 0.980 0.941 0.901 1.0 linen
+ 0 0.980 0.921 0.843 1.0 antique white
+ 0 0.980 0.921 0.843 1.0 AntiqueWhite
+ 0 1.000 0.937 0.835 1.0 papaya whip
+ 0 1.000 0.937 0.835 1.0 PapayaWhip
+ 0 1.000 0.921 0.803 1.0 blanched almond
+ 0 1.000 0.921 0.803 1.0 BlanchedAlmond
+ 0 1.000 0.894 0.768 1.0 bisque
+ 0 1.000 0.854 0.725 1.0 peach puff
+ 0 1.000 0.854 0.725 1.0 PeachPuff
+ 0 1.000 0.870 0.678 1.0 navajo white
+ 0 1.000 0.870 0.678 1.0 NavajoWhite
+ 0 1.000 0.894 0.709 1.0 moccasin
+ 0 1.000 0.972 0.862 1.0 cornsilk
+ 0 1.000 1.000 0.941 1.0 ivory
+ 0 1.000 0.980 0.803 1.0 lemon chiffon
+ 0 1.000 0.980 0.803 1.0 LemonChiffon
+ 0 1.000 0.960 0.933 1.0 seashell
+ 0 0.941 1.000 0.941 1.0 honeydew
+ 0 0.960 1.000 0.980 1.0 mint cream
+ 0 0.960 1.000 0.980 1.0 MintCream
+ 0 0.941 1.000 1.000 1.0 azure
+ 0 0.941 0.972 1.000 1.0 alice blue
+ 0 0.941 0.972 1.000 1.0 AliceBlue
+ 0 0.901 0.901 0.980 1.0 lavender
+ 0 1.000 0.941 0.960 1.0 lavender blush
+ 0 1.000 0.941 0.960 1.0 LavenderBlush
+ 0 1.000 0.894 0.882 1.0 misty rose
+ 0 1.000 0.894 0.882 1.0 MistyRose
+ 0 1.000 1.000 1.000 1.0 white
+ 0 0.000 0.000 0.000 1.0 black
+ 0 0.184 0.309 0.309 1.0 dark slate gray
+ 0 0.184 0.309 0.309 1.0 DarkSlateGray
+ 0 0.184 0.309 0.309 1.0 dark slate grey
+ 0 0.184 0.309 0.309 1.0 DarkSlateGrey
+ 0 0.411 0.411 0.411 1.0 dim gray
+ 0 0.411 0.411 0.411 1.0 DimGray
+ 0 0.411 0.411 0.411 1.0 dim grey
+ 0 0.411 0.411 0.411 1.0 DimGrey
+ 0 0.439 0.501 0.564 1.0 slate gray
+ 0 0.439 0.501 0.564 1.0 SlateGray
+ 0 0.439 0.501 0.564 1.0 slate grey
+ 0 0.439 0.501 0.564 1.0 SlateGrey
+ 0 0.466 0.533 0.600 1.0 light slate gray
+ 0 0.466 0.533 0.600 1.0 LightSlateGray
+ 0 0.466 0.533 0.600 1.0 light slate grey
+ 0 0.466 0.533 0.600 1.0 LightSlateGrey
+ 0 0.745 0.745 0.745 1.0 gray
+ 0 0.745 0.745 0.745 1.0 grey
+ 0 0.827 0.827 0.827 1.0 light grey
+ 0 0.827 0.827 0.827 1.0 LightGrey
+ 0 0.827 0.827 0.827 1.0 light gray
+ 0 0.827 0.827 0.827 1.0 LightGray
+ 0 0.098 0.098 0.439 1.0 midnight blue
+ 0 0.098 0.098 0.439 1.0 MidnightBlue
+ 0 0.000 0.000 0.501 1.0 navy
+ 0 0.000 0.000 0.501 1.0 navy blue
+ 0 0.000 0.000 0.501 1.0 NavyBlue
+ 0 0.392 0.584 0.929 1.0 cornflower blue
+ 0 0.392 0.584 0.929 1.0 CornflowerBlue
+ 0 0.282 0.239 0.545 1.0 dark slate blue
+ 0 0.282 0.239 0.545 1.0 DarkSlateBlue
+ 0 0.415 0.352 0.803 1.0 slate blue
+ 0 0.415 0.352 0.803 1.0 SlateBlue
+ 0 0.482 0.407 0.933 1.0 medium slate blue
+ 0 0.482 0.407 0.933 1.0 MediumSlateBlue
+ 0 0.517 0.439 1.000 1.0 light slate blue
+ 0 0.517 0.439 1.000 1.0 LightSlateBlue
+ 0 0.000 0.000 0.803 1.0 medium blue
+ 0 0.000 0.000 0.803 1.0 MediumBlue
+ 0 0.254 0.411 0.882 1.0 royal blue
+ 0 0.254 0.411 0.882 1.0 RoyalBlue
+ 0 0.000 0.000 1.000 1.0 blue
+ 0 0.117 0.564 1.000 1.0 dodger blue
+ 0 0.117 0.564 1.000 1.0 DodgerBlue
+ 0 0.000 0.749 1.000 1.0 deep sky blue
+ 0 0.000 0.749 1.000 1.0 DeepSkyBlue
+ 0 0.529 0.807 0.921 1.0 sky blue
+ 0 0.529 0.807 0.921 1.0 SkyBlue
+ 0 0.529 0.807 0.921 1.0 skyblue
+ 0 0.529 0.807 0.980 1.0 light sky blue
+ 0 0.529 0.807 0.980 1.0 LightSkyBlue
+ 0 0.274 0.509 0.705 1.0 steel blue
+ 0 0.274 0.509 0.705 1.0 SteelBlue
+ 0 0.690 0.768 0.870 1.0 light steel blue
+ 0 0.690 0.768 0.870 1.0 LightSteelBlue
+ 0 0.678 0.847 0.901 1.0 light blue
+ 0 0.678 0.847 0.901 1.0 LightBlue
+ 0 0.690 0.878 0.901 1.0 powder blue
+ 0 0.690 0.878 0.901 1.0 PowderBlue
+ 0 0.686 0.933 0.933 1.0 pale turquoise
+ 0 0.686 0.933 0.933 1.0 PaleTurquoise
+ 0 0.000 0.807 0.819 1.0 dark turquoise
+ 0 0.000 0.807 0.819 1.0 DarkTurquoise
+ 0 0.282 0.819 0.800 1.0 medium turquoise
+ 0 0.282 0.819 0.800 1.0 MediumTurquoise
+ 0 0.250 0.878 0.815 1.0 turquoise
+ 0 0.000 1.000 1.000 1.0 cyan
+ 0 0.878 1.000 1.000 1.0 light cyan
+ 0 0.878 1.000 1.000 1.0 LightCyan
+ 0 0.372 0.619 0.627 1.0 cadet blue
+ 0 0.372 0.619 0.627 1.0 CadetBlue
+ 0 0.400 0.803 0.666 1.0 medium aquamarine
+ 0 0.400 0.803 0.666 1.0 MediumAquamarine
+ 0 0.498 1.000 0.831 1.0 aquamarine
+ 0 0.000 0.392 0.000 1.0 dark green
+ 0 0.000 0.392 0.000 1.0 DarkGreen
+ 0 0.333 0.419 0.184 1.0 dark olive green
+ 0 0.333 0.419 0.184 1.0 DarkOliveGreen
+ 0 0.560 0.737 0.560 1.0 dark sea green
+ 0 0.560 0.737 0.560 1.0 DarkSeaGreen
+ 0 0.180 0.545 0.341 1.0 sea green
+ 0 0.180 0.545 0.341 1.0 SeaGreen
+ 0 0.235 0.701 0.443 1.0 medium sea green
+ 0 0.235 0.701 0.443 1.0 MediumSeaGreen
+ 0 0.125 0.698 0.666 1.0 light sea green
+ 0 0.125 0.698 0.666 1.0 LightSeaGreen
+ 0 0.596 0.984 0.596 1.0 pale green
+ 0 0.596 0.984 0.596 1.0 PaleGreen
+ 0 0.000 1.000 0.498 1.0 spring green
+ 0 0.000 1.000 0.498 1.0 SpringGreen
+ 0 0.486 0.988 0.000 1.0 lawn green
+ 0 0.486 0.988 0.000 1.0 LawnGreen
+ 0 0.000 1.000 0.000 1.0 green
+ 0 0.498 1.000 0.000 1.0 chartreuse
+ 0 0.000 0.980 0.603 1.0 medium spring green
+ 0 0.000 0.980 0.603 1.0 MediumSpringGreen
+ 0 0.678 1.000 0.184 1.0 green yellow
+ 0 0.678 1.000 0.184 1.0 GreenYellow
+ 0 0.196 0.803 0.196 1.0 lime green
+ 0 0.196 0.803 0.196 1.0 LimeGreen
+ 0 0.603 0.803 0.196 1.0 yellow green
+ 0 0.603 0.803 0.196 1.0 YellowGreen
+ 0 0.133 0.545 0.133 1.0 forest green
+ 0 0.133 0.545 0.133 1.0 ForestGreen
+ 0 0.419 0.556 0.137 1.0 olive drab
+ 0 0.419 0.556 0.137 1.0 OliveDrab
+ 0 0.741 0.717 0.419 1.0 dark khaki
+ 0 0.741 0.717 0.419 1.0 DarkKhaki
+ 0 0.941 0.901 0.549 1.0 khaki
+ 0 0.933 0.909 0.666 1.0 pale goldenrod
+ 0 0.933 0.909 0.666 1.0 PaleGoldenrod
+ 0 0.980 0.980 0.823 1.0 light goldenrod yellow
+ 0 0.980 0.980 0.823 1.0 LightGoldenrodYellow
+ 0 1.000 1.000 0.878 1.0 light yellow
+ 0 1.000 1.000 0.878 1.0 LightYellow
+ 0 1.000 1.000 0.000 1.0 yellow
+ 0 1.000 0.843 0.000 1.0 gold
+ 0 0.933 0.866 0.509 1.0 light goldenrod
+ 0 0.933 0.866 0.509 1.0 LightGoldenrod
+ 0 0.854 0.647 0.125 1.0 goldenrod
+ 0 0.854 0.647 0.125 1.0 Goldenrod
+ 0 0.721 0.525 0.043 1.0 dark goldenrod
+ 0 0.721 0.525 0.043 1.0 DarkGoldenrod
+ 0 0.737 0.560 0.560 1.0 rosy brown
+ 0 0.737 0.560 0.560 1.0 RosyBrown
+ 0 0.803 0.360 0.360 1.0 indian red
+ 0 0.803 0.360 0.360 1.0 IndianRed
+ 0 0.545 0.270 0.074 1.0 saddle brown
+ 0 0.545 0.270 0.074 1.0 SaddleBrown
+ 0 0.627 0.321 0.176 1.0 sienna
+ 0 0.803 0.521 0.247 1.0 peru
+ 0 0.870 0.721 0.529 1.0 burlywood
+ 0 0.960 0.960 0.862 1.0 beige
+ 0 0.960 0.870 0.701 1.0 wheat
+ 0 0.956 0.643 0.376 1.0 sandy brown
+ 0 0.956 0.643 0.376 1.0 SandyBrown
+ 0 0.823 0.705 0.549 1.0 tan
+ 0 0.823 0.411 0.117 1.0 chocolate
+ 0 0.698 0.133 0.133 1.0 firebrick
+ 0 0.647 0.164 0.164 1.0 brown
+ 0 0.913 0.588 0.478 1.0 dark salmon
+ 0 0.913 0.588 0.478 1.0 DarkSalmon
+ 0 0.980 0.501 0.447 1.0 salmon
+ 0 1.000 0.627 0.478 1.0 light salmon
+ 0 1.000 0.627 0.478 1.0 LightSalmon
+ 0 1.000 0.647 0.000 1.0 orange
+ 0 1.000 0.549 0.000 1.0 dark orange
+ 0 1.000 0.549 0.000 1.0 DarkOrange
+ 0 1.000 0.498 0.313 1.0 coral
+ 0 0.941 0.501 0.501 1.0 light coral
+ 0 0.941 0.501 0.501 1.0 LightCoral
+ 0 1.000 0.388 0.278 1.0 tomato
+ 0 1.000 0.270 0.000 1.0 orange red
+ 0 1.000 0.270 0.000 1.0 OrangeRed
+ 0 1.000 0.000 0.000 1.0 red
+ 0 1.000 0.411 0.705 1.0 hot pink
+ 0 1.000 0.411 0.705 1.0 HotPink
+ 0 1.000 0.078 0.576 1.0 deep pink
+ 0 1.000 0.078 0.576 1.0 DeepPink
+ 0 1.000 0.752 0.796 1.0 pink
+ 0 1.000 0.713 0.756 1.0 light pink
+ 0 1.000 0.713 0.756 1.0 LightPink
+ 0 0.858 0.439 0.576 1.0 pale violet red
+ 0 0.858 0.439 0.576 1.0 PaleVioletRed
+ 0 0.690 0.188 0.376 1.0 maroon
+ 0 0.780 0.082 0.521 1.0 medium violet red
+ 0 0.780 0.082 0.521 1.0 MediumVioletRed
+ 0 0.815 0.125 0.564 1.0 violet red
+ 0 0.815 0.125 0.564 1.0 VioletRed
+ 0 1.000 0.000 1.000 1.0 magenta
+ 0 0.933 0.509 0.933 1.0 violet
+ 0 0.866 0.627 0.866 1.0 plum
+ 0 0.854 0.439 0.839 1.0 orchid
+ 0 0.729 0.333 0.827 1.0 medium orchid
+ 0 0.729 0.333 0.827 1.0 MediumOrchid
+ 0 0.600 0.196 0.800 1.0 dark orchid
+ 0 0.600 0.196 0.800 1.0 DarkOrchid
+ 0 0.580 0.000 0.827 1.0 dark violet
+ 0 0.580 0.000 0.827 1.0 DarkViolet
+ 0 0.541 0.168 0.886 1.0 blue violet
+ 0 0.541 0.168 0.886 1.0 BlueViolet
+ 0 0.627 0.125 0.941 1.0 purple
+ 0 0.576 0.439 0.858 1.0 medium purple
+ 0 0.576 0.439 0.858 1.0 MediumPurple
+ 0 0.847 0.749 0.847 1.0 thistle
+ 0 1.000 0.980 0.980 1.0 snow1
+ 0 0.933 0.913 0.913 1.0 snow2
+ 0 0.803 0.788 0.788 1.0 snow3
+ 0 0.545 0.537 0.537 1.0 snow4
+ 0 1.000 0.960 0.933 1.0 seashell1
+ 0 0.933 0.898 0.870 1.0 seashell2
+ 0 0.803 0.772 0.749 1.0 seashell3
+ 0 0.545 0.525 0.509 1.0 seashell4
+ 0 1.000 0.937 0.858 1.0 AntiqueWhite1
+ 0 0.933 0.874 0.800 1.0 AntiqueWhite2
+ 0 0.803 0.752 0.690 1.0 AntiqueWhite3
+ 0 0.545 0.513 0.470 1.0 AntiqueWhite4
+ 0 1.000 0.894 0.768 1.0 bisque1
+ 0 0.933 0.835 0.717 1.0 bisque2
+ 0 0.803 0.717 0.619 1.0 bisque3
+ 0 0.545 0.490 0.419 1.0 bisque4
+ 0 1.000 0.854 0.725 1.0 PeachPuff1
+ 0 0.933 0.796 0.678 1.0 PeachPuff2
+ 0 0.803 0.686 0.584 1.0 PeachPuff3
+ 0 0.545 0.466 0.396 1.0 PeachPuff4
+ 0 1.000 0.870 0.678 1.0 NavajoWhite1
+ 0 0.933 0.811 0.631 1.0 NavajoWhite2
+ 0 0.803 0.701 0.545 1.0 NavajoWhite3
+ 0 0.545 0.474 0.368 1.0 NavajoWhite4
+ 0 1.000 0.980 0.803 1.0 LemonChiffon1
+ 0 0.933 0.913 0.749 1.0 LemonChiffon2
+ 0 0.803 0.788 0.647 1.0 LemonChiffon3
+ 0 0.545 0.537 0.439 1.0 LemonChiffon4
+ 0 1.000 0.972 0.862 1.0 cornsilk1
+ 0 0.933 0.909 0.803 1.0 cornsilk2
+ 0 0.803 0.784 0.694 1.0 cornsilk3
+ 0 0.545 0.533 0.470 1.0 cornsilk4
+ 0 1.000 1.000 0.941 1.0 ivory1
+ 0 0.933 0.933 0.878 1.0 ivory2
+ 0 0.803 0.803 0.756 1.0 ivory3
+ 0 0.545 0.545 0.513 1.0 ivory4
+ 0 0.941 1.000 0.941 1.0 honeydew1
+ 0 0.878 0.933 0.878 1.0 honeydew2
+ 0 0.756 0.803 0.756 1.0 honeydew3
+ 0 0.513 0.545 0.513 1.0 honeydew4
+ 0 1.000 0.941 0.960 1.0 LavenderBlush1
+ 0 0.933 0.878 0.898 1.0 LavenderBlush2
+ 0 0.803 0.756 0.772 1.0 LavenderBlush3
+ 0 0.545 0.513 0.525 1.0 LavenderBlush4
+ 0 1.000 0.894 0.882 1.0 MistyRose1
+ 0 0.933 0.835 0.823 1.0 MistyRose2
+ 0 0.803 0.717 0.709 1.0 MistyRose3
+ 0 0.545 0.490 0.482 1.0 MistyRose4
+ 0 0.941 1.000 1.000 1.0 azure1
+ 0 0.878 0.933 0.933 1.0 azure2
+ 0 0.756 0.803 0.803 1.0 azure3
+ 0 0.513 0.545 0.545 1.0 azure4
+ 0 0.513 0.435 1.000 1.0 SlateBlue1
+ 0 0.478 0.403 0.933 1.0 SlateBlue2
+ 0 0.411 0.349 0.803 1.0 SlateBlue3
+ 0 0.278 0.235 0.545 1.0 SlateBlue4
+ 0 0.282 0.462 1.000 1.0 RoyalBlue1
+ 0 0.262 0.431 0.933 1.0 RoyalBlue2
+ 0 0.227 0.372 0.803 1.0 RoyalBlue3
+ 0 0.152 0.250 0.545 1.0 RoyalBlue4
+ 0 0.000 0.000 1.000 1.0 blue1
+ 0 0.000 0.000 0.933 1.0 blue2
+ 0 0.000 0.000 0.803 1.0 blue3
+ 0 0.000 0.000 0.545 1.0 blue4
+ 0 0.117 0.564 1.000 1.0 DodgerBlue1
+ 0 0.109 0.525 0.933 1.0 DodgerBlue2
+ 0 0.094 0.454 0.803 1.0 DodgerBlue3
+ 0 0.062 0.305 0.545 1.0 DodgerBlue4
+ 0 0.388 0.721 1.000 1.0 SteelBlue1
+ 0 0.360 0.674 0.933 1.0 SteelBlue2
+ 0 0.309 0.580 0.803 1.0 SteelBlue3
+ 0 0.211 0.392 0.545 1.0 SteelBlue4
+ 0 0.000 0.749 1.000 1.0 DeepSkyBlue1
+ 0 0.000 0.698 0.933 1.0 DeepSkyBlue2
+ 0 0.000 0.603 0.803 1.0 DeepSkyBlue3
+ 0 0.000 0.407 0.545 1.0 DeepSkyBlue4
+ 0 0.529 0.807 1.000 1.0 SkyBlue1
+ 0 0.494 0.752 0.933 1.0 SkyBlue2
+ 0 0.423 0.650 0.803 1.0 SkyBlue3
+ 0 0.290 0.439 0.545 1.0 SkyBlue4
+ 0 0.690 0.886 1.000 1.0 LightSkyBlue1
+ 0 0.643 0.827 0.933 1.0 LightSkyBlue2
+ 0 0.552 0.713 0.803 1.0 LightSkyBlue3
+ 0 0.376 0.482 0.545 1.0 LightSkyBlue4
+ 0 0.776 0.886 1.000 1.0 SlateGray1
+ 0 0.725 0.827 0.933 1.0 SlateGray2
+ 0 0.623 0.713 0.803 1.0 SlateGray3
+ 0 0.423 0.482 0.545 1.0 SlateGray4
+ 0 0.792 0.882 1.000 1.0 LightSteelBlue1
+ 0 0.737 0.823 0.933 1.0 LightSteelBlue2
+ 0 0.635 0.709 0.803 1.0 LightSteelBlue3
+ 0 0.431 0.482 0.545 1.0 LightSteelBlue4
+ 0 0.749 0.937 1.000 1.0 LightBlue1
+ 0 0.698 0.874 0.933 1.0 LightBlue2
+ 0 0.603 0.752 0.803 1.0 LightBlue3
+ 0 0.407 0.513 0.545 1.0 LightBlue4
+ 0 0.878 1.000 1.000 1.0 LightCyan1
+ 0 0.819 0.933 0.933 1.0 LightCyan2
+ 0 0.705 0.803 0.803 1.0 LightCyan3
+ 0 0.478 0.545 0.545 1.0 LightCyan4
+ 0 0.733 1.000 1.000 1.0 PaleTurquoise1
+ 0 0.682 0.933 0.933 1.0 PaleTurquoise2
+ 0 0.588 0.803 0.803 1.0 PaleTurquoise3
+ 0 0.400 0.545 0.545 1.0 PaleTurquoise4
+ 0 0.596 0.960 1.000 1.0 CadetBlue1
+ 0 0.556 0.898 0.933 1.0 CadetBlue2
+ 0 0.478 0.772 0.803 1.0 CadetBlue3
+ 0 0.325 0.525 0.545 1.0 CadetBlue4
+ 0 0.000 0.960 1.000 1.0 turquoise1
+ 0 0.000 0.898 0.933 1.0 turquoise2
+ 0 0.000 0.772 0.803 1.0 turquoise3
+ 0 0.000 0.525 0.545 1.0 turquoise4
+ 0 0.000 1.000 1.000 1.0 cyan1
+ 0 0.000 0.933 0.933 1.0 cyan2
+ 0 0.000 0.803 0.803 1.0 cyan3
+ 0 0.000 0.545 0.545 1.0 cyan4
+ 0 0.592 1.000 1.000 1.0 DarkSlateGray1
+ 0 0.552 0.933 0.933 1.0 DarkSlateGray2
+ 0 0.474 0.803 0.803 1.0 DarkSlateGray3
+ 0 0.321 0.545 0.545 1.0 DarkSlateGray4
+ 0 0.498 1.000 0.831 1.0 aquamarine1
+ 0 0.462 0.933 0.776 1.0 aquamarine2
+ 0 0.400 0.803 0.666 1.0 aquamarine3
+ 0 0.270 0.545 0.454 1.0 aquamarine4
+ 0 0.756 1.000 0.756 1.0 DarkSeaGreen1
+ 0 0.705 0.933 0.705 1.0 DarkSeaGreen2
+ 0 0.607 0.803 0.607 1.0 DarkSeaGreen3
+ 0 0.411 0.545 0.411 1.0 DarkSeaGreen4
+ 0 0.329 1.000 0.623 1.0 SeaGreen1
+ 0 0.305 0.933 0.580 1.0 SeaGreen2
+ 0 0.262 0.803 0.501 1.0 SeaGreen3
+ 0 0.180 0.545 0.341 1.0 SeaGreen4
+ 0 0.603 1.000 0.603 1.0 PaleGreen1
+ 0 0.564 0.933 0.564 1.0 PaleGreen2
+ 0 0.486 0.803 0.486 1.0 PaleGreen3
+ 0 0.329 0.545 0.329 1.0 PaleGreen4
+ 0 0.000 1.000 0.498 1.0 SpringGreen1
+ 0 0.000 0.933 0.462 1.0 SpringGreen2
+ 0 0.000 0.803 0.400 1.0 SpringGreen3
+ 0 0.000 0.545 0.270 1.0 SpringGreen4
+ 0 0.000 1.000 0.000 1.0 green1
+ 0 0.000 0.933 0.000 1.0 green2
+ 0 0.000 0.803 0.000 1.0 green3
+ 0 0.000 0.545 0.000 1.0 green4
+ 0 0.498 1.000 0.000 1.0 chartreuse1
+ 0 0.462 0.933 0.000 1.0 chartreuse2
+ 0 0.400 0.803 0.000 1.0 chartreuse3
+ 0 0.270 0.545 0.000 1.0 chartreuse4
+ 0 0.752 1.000 0.243 1.0 OliveDrab1
+ 0 0.701 0.933 0.227 1.0 OliveDrab2
+ 0 0.603 0.803 0.196 1.0 OliveDrab3
+ 0 0.411 0.545 0.133 1.0 OliveDrab4
+ 0 0.792 1.000 0.439 1.0 DarkOliveGreen1
+ 0 0.737 0.933 0.407 1.0 DarkOliveGreen2
+ 0 0.635 0.803 0.352 1.0 DarkOliveGreen3
+ 0 0.431 0.545 0.239 1.0 DarkOliveGreen4
+ 0 1.000 0.964 0.560 1.0 khaki1
+ 0 0.933 0.901 0.521 1.0 khaki2
+ 0 0.803 0.776 0.450 1.0 khaki3
+ 0 0.545 0.525 0.305 1.0 khaki4
+ 0 1.000 0.925 0.545 1.0 LightGoldenrod1
+ 0 0.933 0.862 0.509 1.0 LightGoldenrod2
+ 0 0.803 0.745 0.439 1.0 LightGoldenrod3
+ 0 0.545 0.505 0.298 1.0 LightGoldenrod4
+ 0 1.000 1.000 0.878 1.0 LightYellow1
+ 0 0.933 0.933 0.819 1.0 LightYellow2
+ 0 0.803 0.803 0.705 1.0 LightYellow3
+ 0 0.545 0.545 0.478 1.0 LightYellow4
+ 0 1.000 1.000 0.000 1.0 yellow1
+ 0 0.933 0.933 0.000 1.0 yellow2
+ 0 0.803 0.803 0.000 1.0 yellow3
+ 0 0.545 0.545 0.000 1.0 yellow4
+ 0 1.000 0.843 0.000 1.0 gold1
+ 0 0.933 0.788 0.000 1.0 gold2
+ 0 0.803 0.678 0.000 1.0 gold3
+ 0 0.545 0.458 0.000 1.0 gold4
+ 0 1.000 0.756 0.145 1.0 goldenrod1
+ 0 0.933 0.705 0.133 1.0 goldenrod2
+ 0 0.803 0.607 0.113 1.0 goldenrod3
+ 0 0.545 0.411 0.078 1.0 goldenrod4
+ 0 1.000 0.725 0.058 1.0 DarkGoldenrod1
+ 0 0.933 0.678 0.054 1.0 DarkGoldenrod2
+ 0 0.803 0.584 0.047 1.0 DarkGoldenrod3
+ 0 0.545 0.396 0.031 1.0 DarkGoldenrod4
+ 0 1.000 0.756 0.756 1.0 RosyBrown1
+ 0 0.933 0.705 0.705 1.0 RosyBrown2
+ 0 0.803 0.607 0.607 1.0 RosyBrown3
+ 0 0.545 0.411 0.411 1.0 RosyBrown4
+ 0 1.000 0.415 0.415 1.0 IndianRed1
+ 0 0.933 0.388 0.388 1.0 IndianRed2
+ 0 0.803 0.333 0.333 1.0 IndianRed3
+ 0 0.545 0.227 0.227 1.0 IndianRed4
+ 0 1.000 0.509 0.278 1.0 sienna1
+ 0 0.933 0.474 0.258 1.0 sienna2
+ 0 0.803 0.407 0.223 1.0 sienna3
+ 0 0.545 0.278 0.149 1.0 sienna4
+ 0 1.000 0.827 0.607 1.0 burlywood1
+ 0 0.933 0.772 0.568 1.0 burlywood2
+ 0 0.803 0.666 0.490 1.0 burlywood3
+ 0 0.545 0.450 0.333 1.0 burlywood4
+ 0 1.000 0.905 0.729 1.0 wheat1
+ 0 0.933 0.847 0.682 1.0 wheat2
+ 0 0.803 0.729 0.588 1.0 wheat3
+ 0 0.545 0.494 0.400 1.0 wheat4
+ 0 1.000 0.647 0.309 1.0 tan1
+ 0 0.933 0.603 0.286 1.0 tan2
+ 0 0.803 0.521 0.247 1.0 tan3
+ 0 0.545 0.352 0.168 1.0 tan4
+ 0 1.000 0.498 0.141 1.0 chocolate1
+ 0 0.933 0.462 0.129 1.0 chocolate2
+ 0 0.803 0.400 0.113 1.0 chocolate3
+ 0 0.545 0.270 0.074 1.0 chocolate4
+ 0 1.000 0.188 0.188 1.0 firebrick1
+ 0 0.933 0.172 0.172 1.0 firebrick2
+ 0 0.803 0.149 0.149 1.0 firebrick3
+ 0 0.545 0.101 0.101 1.0 firebrick4
+ 0 1.000 0.250 0.250 1.0 brown1
+ 0 0.933 0.231 0.231 1.0 brown2
+ 0 0.803 0.200 0.200 1.0 brown3
+ 0 0.545 0.137 0.137 1.0 brown4
+ 0 1.000 0.549 0.411 1.0 salmon1
+ 0 0.933 0.509 0.384 1.0 salmon2
+ 0 0.803 0.439 0.329 1.0 salmon3
+ 0 0.545 0.298 0.223 1.0 salmon4
+ 0 1.000 0.627 0.478 1.0 LightSalmon1
+ 0 0.933 0.584 0.447 1.0 LightSalmon2
+ 0 0.803 0.505 0.384 1.0 LightSalmon3
+ 0 0.545 0.341 0.258 1.0 LightSalmon4
+ 0 1.000 0.647 0.000 1.0 orange1
+ 0 0.933 0.603 0.000 1.0 orange2
+ 0 0.803 0.521 0.000 1.0 orange3
+ 0 0.545 0.352 0.000 1.0 orange4
+ 0 1.000 0.498 0.000 1.0 DarkOrange1
+ 0 0.933 0.462 0.000 1.0 DarkOrange2
+ 0 0.803 0.400 0.000 1.0 DarkOrange3
+ 0 0.545 0.270 0.000 1.0 DarkOrange4
+ 0 1.000 0.447 0.337 1.0 coral1
+ 0 0.933 0.415 0.313 1.0 coral2
+ 0 0.803 0.356 0.270 1.0 coral3
+ 0 0.545 0.243 0.184 1.0 coral4
+ 0 1.000 0.388 0.278 1.0 tomato1
+ 0 0.933 0.360 0.258 1.0 tomato2
+ 0 0.803 0.309 0.223 1.0 tomato3
+ 0 0.545 0.211 0.149 1.0 tomato4
+ 0 1.000 0.270 0.000 1.0 OrangeRed1
+ 0 0.933 0.250 0.000 1.0 OrangeRed2
+ 0 0.803 0.215 0.000 1.0 OrangeRed3
+ 0 0.545 0.145 0.000 1.0 OrangeRed4
+ 0 1.000 0.000 0.000 1.0 red1
+ 0 0.933 0.000 0.000 1.0 red2
+ 0 0.803 0.000 0.000 1.0 red3
+ 0 0.545 0.000 0.000 1.0 red4
+ 0 1.000 0.078 0.576 1.0 DeepPink1
+ 0 0.933 0.070 0.537 1.0 DeepPink2
+ 0 0.803 0.062 0.462 1.0 DeepPink3
+ 0 0.545 0.039 0.313 1.0 DeepPink4
+ 0 1.000 0.431 0.705 1.0 HotPink1
+ 0 0.933 0.415 0.654 1.0 HotPink2
+ 0 0.803 0.376 0.564 1.0 HotPink3
+ 0 0.545 0.227 0.384 1.0 HotPink4
+ 0 1.000 0.709 0.772 1.0 pink1
+ 0 0.933 0.662 0.721 1.0 pink2
+ 0 0.803 0.568 0.619 1.0 pink3
+ 0 0.545 0.388 0.423 1.0 pink4
+ 0 1.000 0.682 0.725 1.0 LightPink1
+ 0 0.933 0.635 0.678 1.0 LightPink2
+ 0 0.803 0.549 0.584 1.0 LightPink3
+ 0 0.545 0.372 0.396 1.0 LightPink4
+ 0 1.000 0.509 0.670 1.0 PaleVioletRed1
+ 0 0.933 0.474 0.623 1.0 PaleVioletRed2
+ 0 0.803 0.407 0.537 1.0 PaleVioletRed3
+ 0 0.545 0.278 0.364 1.0 PaleVioletRed4
+ 0 1.000 0.203 0.701 1.0 maroon1
+ 0 0.933 0.188 0.654 1.0 maroon2
+ 0 0.803 0.160 0.564 1.0 maroon3
+ 0 0.545 0.109 0.384 1.0 maroon4
+ 0 1.000 0.243 0.588 1.0 VioletRed1
+ 0 0.933 0.227 0.549 1.0 VioletRed2
+ 0 0.803 0.196 0.470 1.0 VioletRed3
+ 0 0.545 0.133 0.321 1.0 VioletRed4
+ 0 1.000 0.000 1.000 1.0 magenta1
+ 0 0.933 0.000 0.933 1.0 magenta2
+ 0 0.803 0.000 0.803 1.0 magenta3
+ 0 0.545 0.000 0.545 1.0 magenta4
+ 0 1.000 0.513 0.980 1.0 orchid1
+ 0 0.933 0.478 0.913 1.0 orchid2
+ 0 0.803 0.411 0.788 1.0 orchid3
+ 0 0.545 0.278 0.537 1.0 orchid4
+ 0 1.000 0.733 1.000 1.0 plum1
+ 0 0.933 0.682 0.933 1.0 plum2
+ 0 0.803 0.588 0.803 1.0 plum3
+ 0 0.545 0.400 0.545 1.0 plum4
+ 0 0.878 0.400 1.000 1.0 MediumOrchid1
+ 0 0.819 0.372 0.933 1.0 MediumOrchid2
+ 0 0.705 0.321 0.803 1.0 MediumOrchid3
+ 0 0.478 0.215 0.545 1.0 MediumOrchid4
+ 0 0.749 0.243 1.000 1.0 DarkOrchid1
+ 0 0.698 0.227 0.933 1.0 DarkOrchid2
+ 0 0.603 0.196 0.803 1.0 DarkOrchid3
+ 0 0.407 0.133 0.545 1.0 DarkOrchid4
+ 0 0.607 0.188 1.000 1.0 purple1
+ 0 0.568 0.172 0.933 1.0 purple2
+ 0 0.490 0.149 0.803 1.0 purple3
+ 0 0.333 0.101 0.545 1.0 purple4
+ 0 0.670 0.509 1.000 1.0 MediumPurple1
+ 0 0.623 0.474 0.933 1.0 MediumPurple2
+ 0 0.537 0.407 0.803 1.0 MediumPurple3
+ 0 0.364 0.278 0.545 1.0 MediumPurple4
+ 0 1.000 0.882 1.000 1.0 thistle1
+ 0 0.933 0.823 0.933 1.0 thistle2
+ 0 0.803 0.709 0.803 1.0 thistle3
+ 0 0.545 0.482 0.545 1.0 thistle4
+ 0 0.000 0.000 0.000 1.0 gray0
+ 0 0.000 0.000 0.000 1.0 grey0
+ 0 0.011 0.011 0.011 1.0 gray1
+ 0 0.011 0.011 0.011 1.0 grey1
+ 0 0.019 0.019 0.019 1.0 gray2
+ 0 0.019 0.019 0.019 1.0 grey2
+ 0 0.031 0.031 0.031 1.0 gray3
+ 0 0.031 0.031 0.031 1.0 grey3
+ 0 0.039 0.039 0.039 1.0 gray4
+ 0 0.039 0.039 0.039 1.0 grey4
+ 0 0.050 0.050 0.050 1.0 gray5
+ 0 0.050 0.050 0.050 1.0 grey5
+ 0 0.058 0.058 0.058 1.0 gray6
+ 0 0.058 0.058 0.058 1.0 grey6
+ 0 0.070 0.070 0.070 1.0 gray7
+ 0 0.070 0.070 0.070 1.0 grey7
+ 0 0.078 0.078 0.078 1.0 gray8
+ 0 0.078 0.078 0.078 1.0 grey8
+ 0 0.090 0.090 0.090 1.0 gray9
+ 0 0.090 0.090 0.090 1.0 grey9
+ 0 0.101 0.101 0.101 1.0 gray10
+ 0 0.101 0.101 0.101 1.0 grey10
+ 0 0.109 0.109 0.109 1.0 gray11
+ 0 0.109 0.109 0.109 1.0 grey11
+ 0 0.121 0.121 0.121 1.0 gray12
+ 0 0.121 0.121 0.121 1.0 grey12
+ 0 0.129 0.129 0.129 1.0 gray13
+ 0 0.129 0.129 0.129 1.0 grey13
+ 0 0.141 0.141 0.141 1.0 gray14
+ 0 0.141 0.141 0.141 1.0 grey14
+ 0 0.149 0.149 0.149 1.0 gray15
+ 0 0.149 0.149 0.149 1.0 grey15
+ 0 0.160 0.160 0.160 1.0 gray16
+ 0 0.160 0.160 0.160 1.0 grey16
+ 0 0.168 0.168 0.168 1.0 gray17
+ 0 0.168 0.168 0.168 1.0 grey17
+ 0 0.180 0.180 0.180 1.0 gray18
+ 0 0.180 0.180 0.180 1.0 grey18
+ 0 0.188 0.188 0.188 1.0 gray19
+ 0 0.188 0.188 0.188 1.0 grey19
+ 0 0.200 0.200 0.200 1.0 gray20
+ 0 0.200 0.200 0.200 1.0 grey20
+ 0 0.211 0.211 0.211 1.0 gray21
+ 0 0.211 0.211 0.211 1.0 grey21
+ 0 0.219 0.219 0.219 1.0 gray22
+ 0 0.219 0.219 0.219 1.0 grey22
+ 0 0.231 0.231 0.231 1.0 gray23
+ 0 0.231 0.231 0.231 1.0 grey23
+ 0 0.239 0.239 0.239 1.0 gray24
+ 0 0.239 0.239 0.239 1.0 grey24
+ 0 0.250 0.250 0.250 1.0 gray25
+ 0 0.250 0.250 0.250 1.0 grey25
+ 0 0.258 0.258 0.258 1.0 gray26
+ 0 0.258 0.258 0.258 1.0 grey26
+ 0 0.270 0.270 0.270 1.0 gray27
+ 0 0.270 0.270 0.270 1.0 grey27
+ 0 0.278 0.278 0.278 1.0 gray28
+ 0 0.278 0.278 0.278 1.0 grey28
+ 0 0.290 0.290 0.290 1.0 gray29
+ 0 0.290 0.290 0.290 1.0 grey29
+ 0 0.301 0.301 0.301 1.0 gray30
+ 0 0.301 0.301 0.301 1.0 grey30
+ 0 0.309 0.309 0.309 1.0 gray31
+ 0 0.309 0.309 0.309 1.0 grey31
+ 0 0.321 0.321 0.321 1.0 gray32
+ 0 0.321 0.321 0.321 1.0 grey32
+ 0 0.329 0.329 0.329 1.0 gray33
+ 0 0.329 0.329 0.329 1.0 grey33
+ 0 0.341 0.341 0.341 1.0 gray34
+ 0 0.341 0.341 0.341 1.0 grey34
+ 0 0.349 0.349 0.349 1.0 gray35
+ 0 0.349 0.349 0.349 1.0 grey35
+ 0 0.360 0.360 0.360 1.0 gray36
+ 0 0.360 0.360 0.360 1.0 grey36
+ 0 0.368 0.368 0.368 1.0 gray37
+ 0 0.368 0.368 0.368 1.0 grey37
+ 0 0.380 0.380 0.380 1.0 gray38
+ 0 0.380 0.380 0.380 1.0 grey38
+ 0 0.388 0.388 0.388 1.0 gray39
+ 0 0.388 0.388 0.388 1.0 grey39
+ 0 0.400 0.400 0.400 1.0 gray40
+ 0 0.400 0.400 0.400 1.0 grey40
+ 0 0.411 0.411 0.411 1.0 gray41
+ 0 0.411 0.411 0.411 1.0 grey41
+ 0 0.419 0.419 0.419 1.0 gray42
+ 0 0.419 0.419 0.419 1.0 grey42
+ 0 0.431 0.431 0.431 1.0 gray43
+ 0 0.431 0.431 0.431 1.0 grey43
+ 0 0.439 0.439 0.439 1.0 gray44
+ 0 0.439 0.439 0.439 1.0 grey44
+ 0 0.450 0.450 0.450 1.0 gray45
+ 0 0.450 0.450 0.450 1.0 grey45
+ 0 0.458 0.458 0.458 1.0 gray46
+ 0 0.458 0.458 0.458 1.0 grey46
+ 0 0.470 0.470 0.470 1.0 gray47
+ 0 0.470 0.470 0.470 1.0 grey47
+ 0 0.478 0.478 0.478 1.0 gray48
+ 0 0.478 0.478 0.478 1.0 grey48
+ 0 0.490 0.490 0.490 1.0 gray49
+ 0 0.490 0.490 0.490 1.0 grey49
+ 0 0.498 0.498 0.498 1.0 gray50
+ 0 0.498 0.498 0.498 1.0 grey50
+ 0 0.509 0.509 0.509 1.0 gray51
+ 0 0.509 0.509 0.509 1.0 grey51
+ 0 0.521 0.521 0.521 1.0 gray52
+ 0 0.521 0.521 0.521 1.0 grey52
+ 0 0.529 0.529 0.529 1.0 gray53
+ 0 0.529 0.529 0.529 1.0 grey53
+ 0 0.541 0.541 0.541 1.0 gray54
+ 0 0.541 0.541 0.541 1.0 grey54
+ 0 0.549 0.549 0.549 1.0 gray55
+ 0 0.549 0.549 0.549 1.0 grey55
+ 0 0.560 0.560 0.560 1.0 gray56
+ 0 0.560 0.560 0.560 1.0 grey56
+ 0 0.568 0.568 0.568 1.0 gray57
+ 0 0.568 0.568 0.568 1.0 grey57
+ 0 0.580 0.580 0.580 1.0 gray58
+ 0 0.580 0.580 0.580 1.0 grey58
+ 0 0.588 0.588 0.588 1.0 gray59
+ 0 0.588 0.588 0.588 1.0 grey59
+ 0 0.600 0.600 0.600 1.0 gray60
+ 0 0.600 0.600 0.600 1.0 grey60
+ 0 0.611 0.611 0.611 1.0 gray61
+ 0 0.611 0.611 0.611 1.0 grey61
+ 0 0.619 0.619 0.619 1.0 gray62
+ 0 0.619 0.619 0.619 1.0 grey62
+ 0 0.631 0.631 0.631 1.0 gray63
+ 0 0.631 0.631 0.631 1.0 grey63
+ 0 0.639 0.639 0.639 1.0 gray64
+ 0 0.639 0.639 0.639 1.0 grey64
+ 0 0.650 0.650 0.650 1.0 gray65
+ 0 0.650 0.650 0.650 1.0 grey65
+ 0 0.658 0.658 0.658 1.0 gray66
+ 0 0.658 0.658 0.658 1.0 grey66
+ 0 0.670 0.670 0.670 1.0 gray67
+ 0 0.670 0.670 0.670 1.0 grey67
+ 0 0.678 0.678 0.678 1.0 gray68
+ 0 0.678 0.678 0.678 1.0 grey68
+ 0 0.690 0.690 0.690 1.0 gray69
+ 0 0.690 0.690 0.690 1.0 grey69
+ 0 0.701 0.701 0.701 1.0 gray70
+ 0 0.701 0.701 0.701 1.0 grey70
+ 0 0.709 0.709 0.709 1.0 gray71
+ 0 0.709 0.709 0.709 1.0 grey71
+ 0 0.721 0.721 0.721 1.0 gray72
+ 0 0.721 0.721 0.721 1.0 grey72
+ 0 0.729 0.729 0.729 1.0 gray73
+ 0 0.729 0.729 0.729 1.0 grey73
+ 0 0.741 0.741 0.741 1.0 gray74
+ 0 0.741 0.741 0.741 1.0 grey74
+ 0 0.749 0.749 0.749 1.0 gray75
+ 0 0.749 0.749 0.749 1.0 grey75
+ 0 0.760 0.760 0.760 1.0 gray76
+ 0 0.760 0.760 0.760 1.0 grey76
+ 0 0.768 0.768 0.768 1.0 gray77
+ 0 0.768 0.768 0.768 1.0 grey77
+ 0 0.780 0.780 0.780 1.0 gray78
+ 0 0.780 0.780 0.780 1.0 grey78
+ 0 0.788 0.788 0.788 1.0 gray79
+ 0 0.788 0.788 0.788 1.0 grey79
+ 0 0.800 0.800 0.800 1.0 gray80
+ 0 0.800 0.800 0.800 1.0 grey80
+ 0 0.811 0.811 0.811 1.0 gray81
+ 0 0.811 0.811 0.811 1.0 grey81
+ 0 0.819 0.819 0.819 1.0 gray82
+ 0 0.819 0.819 0.819 1.0 grey82
+ 0 0.831 0.831 0.831 1.0 gray83
+ 0 0.831 0.831 0.831 1.0 grey83
+ 0 0.839 0.839 0.839 1.0 gray84
+ 0 0.839 0.839 0.839 1.0 grey84
+ 0 0.850 0.850 0.850 1.0 gray85
+ 0 0.850 0.850 0.850 1.0 grey85
+ 0 0.858 0.858 0.858 1.0 gray86
+ 0 0.858 0.858 0.858 1.0 grey86
+ 0 0.870 0.870 0.870 1.0 gray87
+ 0 0.870 0.870 0.870 1.0 grey87
+ 0 0.878 0.878 0.878 1.0 gray88
+ 0 0.878 0.878 0.878 1.0 grey88
+ 0 0.890 0.890 0.890 1.0 gray89
+ 0 0.890 0.890 0.890 1.0 grey89
+ 0 0.898 0.898 0.898 1.0 gray90
+ 0 0.898 0.898 0.898 1.0 grey90
+ 0 0.909 0.909 0.909 1.0 gray91
+ 0 0.909 0.909 0.909 1.0 grey91
+ 0 0.921 0.921 0.921 1.0 gray92
+ 0 0.921 0.921 0.921 1.0 grey92
+ 0 0.929 0.929 0.929 1.0 gray93
+ 0 0.929 0.929 0.929 1.0 grey93
+ 0 0.941 0.941 0.941 1.0 gray94
+ 0 0.941 0.941 0.941 1.0 grey94
+ 0 0.949 0.949 0.949 1.0 gray95
+ 0 0.949 0.949 0.949 1.0 grey95
+ 0 0.960 0.960 0.960 1.0 gray96
+ 0 0.960 0.960 0.960 1.0 grey96
+ 0 0.968 0.968 0.968 1.0 gray97
+ 0 0.968 0.968 0.968 1.0 grey97
+ 0 0.980 0.980 0.980 1.0 gray98
+ 0 0.980 0.980 0.980 1.0 grey98
+ 0 0.988 0.988 0.988 1.0 gray99
+ 0 0.988 0.988 0.988 1.0 grey99
+ 0 1.000 1.000 1.000 1.0 gray100
+ 0 1.000 1.000 1.000 1.0 grey100
+ 0 0.333 0.333 0.333 1.0 Dark Gray
+ 0 0.500 0.500 0.500 1.0 Gray
+ 0 0.667 0.667 0.667 1.0 Light Gray
+ 0 0.000 0.000 0.000 0.0 Highlight
Index: emacs/etc/Emacs.info
diff -c /dev/null emacs/etc/Emacs.info:1.1
*** /dev/null	Fri Aug  2 19:56:06 1996
--- emacs/etc/Emacs.info	Fri Jul 19 04:58:40 1996
***************
*** 0 ****
--- 1,8 ----
+ Title           Emacs for NeXTstep
+ Version         4.1 (based on GNU Emacs 19.28)
+ Description     Emacs for NeXTstep is a version of GNU Emacs 19 which adds native support for the NeXTstep window system.  If you have installed the old Emacs.app in /LocalApps, don't forget to delete it first.  Installation will also create links to the /usr/local hierarchy which makes Emacs accessible to shell users.
+ DefaultLocation /LocalApps
+ Relocatable     NO
+ Application     YES
+ DiskName        EmacsForNS
+ DeleteWarning   Removing this package will also delete the links to it in the /usr/local hierachy.
Index: emacs/etc/Emacs.post_install
diff -c /dev/null emacs/etc/Emacs.post_install:1.1
*** /dev/null	Fri Aug  2 19:56:07 1996
--- emacs/etc/Emacs.post_install	Fri Jul 19 04:58:42 1996
***************
*** 0 ****
--- 1,19 ----
+ #!/bin/sh
+ PACKAGEDIR="$1"
+ INSTALLDIR="$2"
+ echo
+ echo "Creating links from /usr/local/bin to the Emacs binaries."
+ /bin/mkdirs /usr/local/bin
+ /bin/ln -s $INSTALLDIR/Emacs.app/bin/* /usr/local/bin
+ 
+ echo "Creating links from /usr/local/man subdirectories to the Emacs man pages."
+ /bin/mkdirs /usr/local/man/man1 /usr/local/man/man6
+ /bin/ln -s $INSTALLDIR/Emacs.app/man/man1/* $INSTALLDIR/Emacs.app/lib/emacs/*/etc/celibacy.1 $INSTALLDIR/Emacs.app/lib/emacs/*/etc/condom.1 /usr/local/man/man1
+ /bin/ln -s  $INSTALLDIR/Emacs.app/lib/emacs/*/etc/sex.6 /usr/local/man/man6
+ 
+ echo "Creating a link from /usr/local/lib/emacs to the emacs library directory."
+ /bin/mkdirs /usr/local/lib
+ /bin/ln -s $INSTALLDIR/Emacs.app/lib/emacs /usr/local/lib
+ 
+ echo "Done."
+ exit 0
Index: emacs/etc/Emacs.pre_delete
diff -c /dev/null emacs/etc/Emacs.pre_delete:1.1
*** /dev/null	Fri Aug  2 19:56:09 1996
--- emacs/etc/Emacs.pre_delete	Fri Jul 19 04:58:43 1996
***************
*** 0 ****
--- 1,18 ----
+ #!/bin/sh
+ PACKAGEDIR="$1"
+ INSTALLDIR="$2"
+ echo
+ echo "Removing links from /usr/local/bin to the Emacs binaries."
+ cd $INSTALLDIR/Emacs.app/bin
+ for i in *; do /bin/rm -f /usr/local/bin/$i; done
+ 
+ echo "Removing links from /usr/local/man subdirectories to the Emacs man pages."
+ cd $INSTALLDIR/Emacs.app/man/man1
+ for i in *; do /bin/rm -f /usr/local/man/man1/$i; done
+ /bin/rm -f /usr/local/man/man1/condom.1 /usr/local/man/man1/celibacy.1 /usr/local/man/man6/sex.6
+ 
+ echo "Removing link from /usr/local/lib/emacs to the emacs library directory."
+ /bin/rm -f /usr/local/lib/emacs
+ 
+ echo "Done."
+ exit 0
Index: emacs/etc/MACHINES
diff -c emacs/etc/MACHINES:1.1.1.2 emacs/etc/MACHINES:1.3
*** emacs/etc/MACHINES:1.1.1.2	Mon Jul 22 01:49:50 1996
--- emacs/etc/MACHINES	Wed Jul 31 01:32:38 1996
***************
*** 732,749 ****
    There is a report that compilation with -O did not work with 18.54
    under System V release 2.
  
! NeXT (m68k-next-nextstep)
  
!   Emacs 19 has not been tested extensively yet, but it seems to work
!   in a NeXTStep 3.0 terminal window, and under the X server called
!   co-Xist.  You may need to specify -traditional when src/Makefile
!   builds xmakefile.
  
!   NeXT users might want to implement direct operation with NeXTStep,
!   but from the point of view of the GNU project, that is a
!   distraction.
  
!   Thanks to Thorsten Ohl for working on the NeXT port of Emacs 19.
  
  Nixdorf Targon 31 (m68k-nixdorf-sysv)
  
--- 732,795 ----
    There is a report that compilation with -O did not work with 18.54
    under System V release 2.
  
! NeXT (*-next-*) //FIXME/cl
  
!   Enable support for NeXTstep with the '--with-ns' option or configure
!   will set it by default if you compile on a NS system and don't ask
!   for X.  If you want to compile with both X and NS support you have
!   to ask for both of them explicitly.
  
!   Emacs 19 for NS will compile on i386, m68k, hppa and sparc machines
!   (as well as presumably all future NS machines).  However it will not
!   compile FAT.  This is caused by some truly horrendous acts committed
!   on the binary by the dumping process and is not likely to change in
!   the near future.  On the other hand, if you really need a fat
!   version of emacs for NS, there is nothing to prevent you from
!   seperately creating versions for each architecture you want to
!   support and then using lipo to combine them to a single fat binary.
! 
!   To create a binary installation in /LocalApps follow these steps:
! 
!     1. Run ./configure with the options you otherwise would (possibly
!     none) with the option '--prefix=/LocalApps/Emacs.app' added (and
!     certainly without the '--run-in-place' option).
! 
!     2. make
!        make install
! 
!     3. mv /LocalApps/Emacs.app/bin/emacs /LocalApps/Emacs.app/Emacs
!        ln -s ../Emacs /LocalApps/Emacs.app/bin/emacs
  
!     4. ./etc/Emacs.post_install . /LocalApps
! 
!   To reduce the total installed size of Emacs.app, you can also take any or
!   all of these steps:
!   
!     *  cd /LocalApps/Emacs.app
!        strip bin/* lib/emacs/*/*-next-*/*
!        /bin/rm -f bin/emacs-*
!        [ And don't worry about the warnings ]
! 
!     *  cd /LocalApps/Emacs.app/info
!        gzip *.info*
! 
!     *  cd /LocalApps/Emacs.app/lib/emacs/*/lisp
!        /bin/rm -f *.el term/*.el
! 
!     *  cd /LocalApps/Emacs.app/lib/emacs/*/etc
!        /bin/rm -f 3B-MAXMEM AIX.DUMP LEDIT MSDOS Makefile SUN-SUPPORT
!        /bin/rm -f Xkeymap.txt emacs.icon emacs.xbm emacstool.1
!        /bin/rm -f etags.vms ms-kermit* news.texi termcap*
!        /bin/rm -f ulimit.hack ledit.l emacs.bash emacs.csh DOC
!        gzip Emacs.info Emacs.post_install Emacs.pre_delete
!        gzip APPLE BABYL COOKIES COPYING DEBUG DISTRIB MH-E-NEWS FAQ FTP
!        gzip GNU INTERVIEW JOKES LNEWS LPF MACHINES MAILINGLISTS MORE.STUFF
!        gzip MOTIVATION O*NEWS ChangeLog* ORDERS* OTHER.EMACSES README
!        gzip SERVICE TERMS TO-DO TODO copying.paper refcard.tex vipcard.tex
!        gzip echo.msg etags.notes
!        
!   The GNU project considers the direct operation with NeXTstep a
!   distraction.
  
  Nixdorf Targon 31 (m68k-nixdorf-sysv)
  
Index: emacs/etc/TO-DO
diff -c /dev/null emacs/etc/TO-DO:1.1
*** /dev/null	Fri Aug  2 19:56:44 1996
--- emacs/etc/TO-DO	Fri Jul 19 04:58:47 1996
***************
*** 0 ****
--- 1,83 ----
+ Things useful to do for GNU Emacs:
+ 
+ * Primitive for random access insertion of part of a file.
+ 
+ * Making I/O streams for files, so that read and prin1 can
+  be used on files directly.  The I/O stream itself would
+  serve as a function to read or write one character.
+ 
+ * If a file you can't write is in a directory you can write,
+  make sure it works to modify and save this file.
+ 
+ * Make dired's commands handle correctly the case where
+  ls has listed several subdirectories' contents.
+  It needs to be able to tell which directory each file
+  is really in, by searching backward for the line
+  which identifies the start of a directory.
+ 
+ * Add more dired commands, such as sorting (use the
+  sort utility through call-process-region).
+ 
+ * Make display.c record inverse-video-ness on
+  a character by character basis.  Then make non-full-screen-width
+  mode lines inverse video, and display the marked location in
+  inverse video.
+ 
+ * VMS code to list a file directory.  Make dired work.
+ 
+ Long range:
+ 
+    Ideas for extending GNU Emacs to deal with arbitrary character sets.
+ 
+ I would like GNU Emacs to be extended to handle all the world's alphabets
+ and word signs.  I don't expect to have time to do such a thing in the next
+ few years, so here are my ideas on the best way to do it.
+ 
+ * Each graphic is represented by a sequence of ordinary 8-bit characters.
+ 
+ * All the characters that make up such a sequence have codes >= 0200.
+ 
+ * The first character of such a sequence is between 0200 and 0237.
+ 
+ * The remaining characters of such a sequence are all 0240 or higher.
+ 
+ * The first character of the sequence determines the number of characters
+ in the sequence.  Thus, 0200...0207 could start two-character sequences,
+ 0210...0227 could start three-character sequences, and 0230 could start
+ four-character sequences.  (Codes 0231...0237 would be reserved.)
+ 
+ *  Several common  alphabets,  and  some mathematical   symbols,  would get
+ two-character sequences.  (Probably Greek,  Russian,  Hebrew(?), Arabic(?),
+ Korean, and Japanese kana).  The remaining alphabets, and  some versions of
+ Chinese,  would   get  three-character sequences.    Other  sets of Chinese
+ characters would get four-character sequences.
+ 
+ Each country that uses Chinese characters has its own standard character
+ set, and it is not easy to correlate them to avoid overlap.  So there may
+ need to be several sets of Chinese characters.  That is why they need so
+ much code space.
+ 
+ True support for Hebrew and Arabic requires dealing with the problem of
+ writing direction for mixed text; I don't know what to do for that.
+ 
+ * The functions that use syntax table would determine the
+ syntax of a sequence from its first character.
+ 
+ * Functions in indent.c for computing widths and columns would
+ determine the width of a sequence from its first character.
+ So would display routines.
+ 
+ * Only a few other editing routines would need any change.  In
+ particular, searching and regexp matching might not need any change.
+ 
+ * Most of the work required would be in redisplay.  The only case that
+ needs to be supported is with X windows, since ordinary terminals
+ can't display all these characters anyway.
+ 
+ * There might need to be code to translate files from this format
+ to whatever format is typically stored on disk.
+ 
+ 
+ I would be very unhappy with half-measures, such as support for
+ Japanese only.
+ 
Index: emacs/etc/TODO
diff -c /dev/null emacs/etc/TODO:1.1
*** /dev/null	Fri Aug  2 19:56:47 1996
--- emacs/etc/TODO	Fri Jul 19 04:58:48 1996
***************
*** 0 ****
--- 1,190 ----
+ 1. Alpha Lock does not work. (FIXED)
+ 
+ 2. Menus don't work yet. (FIXED)
+ 
+ 3. Menu-enable is disabled
+ 
+ 4. Scroll bars don't scroll (FIXED) and are trashed in resizing (FIXED)
+ 
+ 5. Window update is _much_ too slow (FIXED)
+ 
+ 6. Eight bit characters aren't supported properly. (FIXED)
+ 
+ 7. If you try to start emacs with -ns when you are not on the next,
+    it coredumps instead of exiting cleanly. (NOT CONFIRMABLE)
+ 
+ 8. Icons aren't set by default.  Have to change that. (FIXED)
+ 
+ 9. Actually write ns-popup-menu. (FIXED)
+ 
+ 10. Menu-bar events get the wrong x,y location. (FIXED)
+ 
+ 11. Menubar is controlled by _selected_ frame. (and window !). (FIXED)
+ 
+ 11. Line spacing preference. (FIXED)
+ 
+ 12. Better handling of alt/ctrl/shift-chars rebound with Keyboard.app. (FIXED)
+ 
+ 13. ns-popup-filepanel always gives "Replace" query.  (FIXED)
+ 
+ 14. The modeline is displayed in highlight rather than in modeline face by
+     GNU emacs. (FIXED)
+ 
+ 15. AutoLower and AutoRaise have strange effects. (SEE BELOW)
+ 
+ 16. Miniaturize with keystroke de-miniaturizes next frame. (FIXED)
+ 
+ 17. When use-open-panel is t,  ns-open-file misfires. (FIXED)
+ 
+ 18. ns-read-file-name doesn't allow directories. (FIXED)
+ 
+ 19. When a menu is resized, the attached submenus aren't moved to
+     match.  (NOT FIXED.  WAIT FOR NEXT TO FIX THE BUG.)
+ 
+ 20. The buffer menu doesn't pop up invisible frames (WAIT FOR GNU EMACS 19.23).
+ 
+ 21. Ohlfs 11 (and others) break horribly when ISOLatin==YES. (FIXED)
+ 
+ 22. Save as... menu item gives double querries when UseOpenPanel==YES. (FIXED)
+ 
+ 23. Cursor streaks and is lost sometimes. (FIXED)
+ 
+ 24. Scroll bars not at the edge of the frame get trashed. (FIXED)
+ 
+ 25. Readchar-menu-prompt code broken. (FIXED)
+ 
+ 26. Scroll bars may trash frame. (FIXED)
+ 
+ 27. open(1) with multiple files doesn't work right. (FIXED)
+ 
+ 28. Double-click from Workspace puts wrong frame on top. (FIXED)
+ 
+ 29. Pulling scrollers all the way down doesn't always put the scroller
+     to the end.  (FIXED)
+ 
+ 30. Activate initial window when run. (DONE)
+ 
+ 31. Fix puresize=... (DONE)
+ 
+ 32. Display one key equivalent in menu (use where-is-internal and
+     key-description) (DONE)
+ 
+ 33. Don't copy to pasteboard when just selecting. (FIXED)
+ 
+ 34. Changing to huge font causes problems in view size. (FIXED)
+ 
+ 35. What if a default value for the original startup is the empty
+     string ? (FIXED)
+ 
+ 36. Scroller doesn't scroll to top when first line empty. (FIXED)
+ 
+ 37. Do/Don't startup in NS from command line (FIXED)
+ 
+ 38. ns-insert-file broken for multiple files. (FIXED)
+ 
+ 39. Using PB/Emacs may not select lines every time and may quit Emacs
+     (UNCONFIRMED)
+ 
+ 40. Autolower/autoraise should use window boundaries. (FIXED)
+ 
+ 41. Autolower/autoraise should not kill hide/miniaturize.
+ 
+ 42. iso-syntax/printable-character in ns-win.el. (FIXED)
+ 
+ 43. Detached menus sometimes don't reappear properly. (UNCONFIRMED &
+     FIXED IN ANY CASE)
+ 
+ 44. ns-find-file-fresh-frame opens new frame unnecessarily sometimes. (FIXED)
+ 
+ 45. Frames not always activated properly when other frames closed. (FIXED)
+ 
+ 46. Minibuffer-only frame may start activated.
+ 
+ 47. 'IPCFlushOutput: failed to flush output for stream' messages whenever
+     Emacs is closed. (FIXED) (it is back !)
+ 
+ 48. Can't use keyboard shortcuts when all frames miniaturized. (FIXED)
+ 
+ 49. Scroller doesn't scroll continuously.
+ 
+ 50. All menu items get 'H' as shortcut (FIXED)
+ 
+ 51. Popup menus popup far to the right (UNCONFIRMED)
+ 
+ 52. Ask y-or-n questions in real Panels. (DONE)
+ 
+ 53. Use the standard color panel to query color names. (DONE)
+ 
+ 54. Create a preferences panel. (DONE)
+ 
+ 55. Make ns-alt-is-meta equal to Qnil, Qt, Qleft and Qright. (DONE)
+ 
+ 56. Create ns-menu-bar-final-items which go even _after_ normal
+     menu-bar-final-items. (NOT ANY LONGER NECESSARY)
+ 
+ 57. Prevent errors on x-set-selection/x-get-selection.  Add support for secondary
+     selection. (DONE)
+ 
+ 58. (make-frame '((top . 33000))) crashes emacs. (FIXED)
+ 
+ 59. Emacs doesn't interact properly with gdb. (FIXED)
+ 
+ 60. Add blinking cursor. (DONE)
+ 
+ 61. Locations of submenus are not restored on restart. (FIXED)
+ 
+ 62. Use print panel (WISHLIST)
+ 
+ 63. Command key equivalents set by user defaults don't work. (FIXED)
+ 
+ 64. Order of menu items doesn't necessary follow order in keymap. (FIXED)
+ 
+ 65. Need to copy from emacs twice. (FIXED)
+ 
+ 65. open *.el starts a new emacs even if an old one is still running (UNCONFIRMED)
+ 
+ 66. Selection of lines from HeaderViewer fails
+ 
+ 67. Automatic highlighting of mouse faces doesn't work yet.
+ 
+ 68. Poping up of NS dialog boxes doesn't work again. (FIXED by Joe Reiss)
+ 
+ 69. Menu equivalents have not been updated for 19.23 (FIXED)
+ 
+ 70. First keystroke in frame after selecting it uses old keymap. (FIXED)
+ 
+ 71. Preserve modifier of scroll bar clicks.
+ 
+ 72. No scroller buttons. (WISHLIST)
+ 
+ 73. Set system beep.  Allow playing of arbitrary sounds. (WISHLIST)
+ 
+ 74. Code from menu-bar.el doesn't work. (FIXED)
+ 
+ 75. Add interface to NeXT system speller. (WISHLIST)
+ 
+ 76. If all frames are iconized and there are unsaved buffers, emacs never quits
+     and re-sync on reboot may be necessary.
+ 
+ 77. Drag'n'drop of colors in c++ mode doesn't work right. (UNCONFIRMED)
+ 
+ 78. int do_poll=1 causes crashes on Sun.  (FIXED)
+ 
+ 79. Crash with this on console: (FIXED)
+ Nov 16 19:24:07 freedom Emacs[19109]: An uncaught exception was raised
+ Nov 16 19:24:07 freedom Emacs[19109]: App Kit: Pasteboard error: Pasteboard communications are out of sync
+ 
+ 80. Crash with this on console: (FIXED)
+ Nov 17 08:52:14 freedom Emacs[19306]: An uncaught exception was raised
+ Nov 17 08:52:14 freedom Emacs[19306]: DPS client library error: Invalid file descriptor, DPSContext 0, data 3
+ 
+ 81. Rapid kills lead to lockup and crash eventually. (FIXED)
+ 
+ 82. Alternatively use NS Find and Goto panels (WISHLIST).
+ 
+ 83. Frames may be refreshed unnecessarily when another frame is refreshed. (WAIT FOR FSF)
+ 
+ 84. Auc-tex menus display in the wrong place.
+ 
+ 85. Crashing but with detached menus.
+ 
Index: emacs/info/cl
diff -c emacs/info/cl:1.1.1.1 emacs/info/cl:removed
*** emacs/info/cl:1.1.1.1	Fri Jul 19 01:54:59 1996
--- emacs/info/cl	Fri Aug  2 19:57:24 1996
***************
*** 1,102 ****
- This is Info file ../info/cl, produced by Makeinfo-1.55 from the input
- file cl.texi.
- 
-    This file documents the GNU Emacs Common Lisp emulation package.
- 
-    Copyright (C) 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "GNU General Public License" is included
- exactly as in the original, and provided that the entire resulting
- derived work is distributed under the terms of a permission notice
- identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the section entitled "GNU General Public License"
- may be included in a translation approved by the author instead of in
- the original English.
- 
- 
- Indirect:
- cl-1: 1042
- cl-2: 46643
- cl-3: 89357
- cl-4: 139030
- cl-5: 183187
- cl-6: 226116
- 
- Tag Table:
- (Indirect)
- Node: Top1042
- Node: Overview2589
- Node: Usage4867
- Node: Organization5512
- Node: Installation7330
- Node: Naming Conventions8478
- Node: Program Structure10612
- Node: Argument Lists11075
- Node: Time of Evaluation21128
- Node: Function Aliases27103
- Node: Predicates27682
- Node: Type Predicates27997
- Node: Equality Predicates32802
- Node: Control Structure36035
- Node: Assignment36834
- Node: Generalized Variables38071
- Node: Basic Setf39373
- Node: Modify Macros46643
- Node: Customizing Setf53848
- Node: Variable Bindings61132
- Node: Dynamic Bindings61708
- Node: Lexical Bindings62593
- Node: Function Bindings66692
- Node: Macro Bindings69074
- Node: Conditionals71993
- Node: Blocks and Exits75067
- Node: Iteration78118
- Node: Loop Facility83586
- Node: Loop Basics84508
- Node: Loop Examples87103
- Node: For Clauses89357
- Node: Iteration Clauses101242
- Node: Accumulation Clauses103078
- Node: Other Clauses105417
- Node: Multiple Values111481
- Node: Macros113369
- Node: Declarations116582
- Node: Symbols125067
- Node: Property Lists125362
- Node: Creating Symbols128558
- Node: Numbers130605
- Node: Predicates on Numbers131080
- Node: Numerical Functions132104
- Node: Random Numbers136326
- Node: Implementation Parameters139030
- Node: Sequences142597
- Node: Sequence Basics143265
- Node: Mapping over Sequences146838
- Node: Sequence Functions152687
- Node: Searching Sequences158857
- Node: Sorting Sequences161890
- Node: Lists164433
- Node: List Functions164853
- Node: Substitution of Expressions169111
- Node: Lists as Sets170992
- Node: Association Lists175049
- Node: Hash Tables176747
- Node: Structures183187
- Node: Assertions197964
- Node: Efficiency Concerns200902
- Node: Common Lisp Compatibility207224
- Node: Old CL Compatibility210376
- Node: Porting Common Lisp214754
- Node: Function Index226116
- Node: Variable Index237615
- 
- End Tag Table
--- 0 ----
Index: emacs/info/cl-1
diff -c emacs/info/cl-1:1.1.1.1 emacs/info/cl-1:removed
*** emacs/info/cl-1:1.1.1.1	Fri Jul 19 01:54:59 1996
--- emacs/info/cl-1	Fri Aug  2 19:57:28 1996
***************
*** 1,1043 ****
- This is Info file ../info/cl, produced by Makeinfo-1.55 from the input
- file cl.texi.
- 
-    This file documents the GNU Emacs Common Lisp emulation package.
- 
-    Copyright (C) 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "GNU General Public License" is included
- exactly as in the original, and provided that the entire resulting
- derived work is distributed under the terms of a permission notice
- identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the section entitled "GNU General Public License"
- may be included in a translation approved by the author instead of in
- the original English.
- 
- 
- File: cl,  Node: Top,  Next: Overview,  Up: (dir)
- 
- Common Lisp Extensions
- **********************
- 
- This document describes a set of Emacs Lisp facilities borrowed from
- Common Lisp.  All the facilities are described here in detail; for more
- discussion and examples, Guy L. Steele's `Common Lisp, the Language',
- second edition, is the definitive book on Common Lisp.  While this
- document does not assume any prior knowledge of Common Lisp, it does
- assume a basic familiarity with Emacs Lisp.
- 
- * Menu:
- 
- * Overview::             Installation, usage, etc.
- * Program Structure::    Arglists, `eval-when', `defalias'
- * Predicates::           `typep', `eql', and `equalp'
- * Control Structure::    `setf', `when', `do', `loop', etc.
- * Macros::               Destructuring, `define-compiler-macro'
- * Declarations::         `proclaim', `declare', etc.
- * Symbols::              Property lists, `gensym'
- * Numbers::              Predicates, functions, random numbers
- * Sequences::            Mapping, functions, searching, sorting
- * Lists::                `cadr', `sublis', `member*', `assoc*', etc.
- * Hash Tables::          `make-hash-table', `gethash', etc.
- * Structures::           `defstruct'
- * Assertions::           `check-type', `assert', `ignore-errors'.
- 
- * Efficiency Concerns::         Hints and techniques
- * Common Lisp Compatibility::   All known differences with Steele
- * Old CL Compatibility::        All known differences with old cl.el
- * Porting Common Lisp::         Hints for porting Common Lisp code
- 
- * Function Index::
- * Variable Index::
- 
- 
- File: cl,  Node: Overview,  Next: Program Structure,  Prev: Top,  Up: Top
- 
- Overview
- ********
- 
- Common Lisp is a huge language, and Common Lisp systems tend to be
- massive and extremely complex.  Emacs Lisp, by contrast, is rather
- minimalist in the choice of Lisp features it offers the programmer.  As
- Emacs Lisp programmers have grown in number, and the applications they
- write have grown more ambitious, it has become clear that Emacs Lisp
- could benefit from many of the conveniences of Common Lisp.
- 
-    The "CL" package adds a number of Common Lisp functions and control
- structures to Emacs Lisp.  While not a 100% complete implementation of
- Common Lisp, "CL" adds enough functionality to make Emacs Lisp
- programming significantly more convenient.
- 
-    Some Common Lisp features have been omitted from this package for
- various reasons:
- 
-    * Some features are too complex or bulky relative to their benefit
-      to Emacs Lisp programmers.  CLOS and Common Lisp streams are fine
-      examples of this group.
- 
-    * Other features cannot be implemented without modification to the
-      Emacs Lisp interpreter itself, such as multiple return values,
-      lexical scoping, case-insensitive symbols, and complex numbers.
-      The "CL" package generally makes no attempt to emulate these
-      features.
- 
-    * Some features conflict with existing things in Emacs Lisp.  For
-      example, Emacs' `assoc' function is incompatible with the Common
-      Lisp `assoc'.  In such cases, this package usually adds the suffix
-      `*' to the function name of the Common Lisp version of the
-      function (e.g., `assoc*').
- 
-    The package described here was written by Dave Gillespie,
- `daveg@synaptics.com'.  It is a total rewrite of the original 1986
- `cl.el' package by Cesar Quiroz.  Most features of the the Quiroz
- package have been retained; any incompatibilities are noted in the
- descriptions below.  Care has been taken in this version to ensure that
- each function is defined efficiently, concisely, and with minimal
- impact on the rest of the Emacs environment.
- 
- * Menu:
- 
- * Usage::                How to use the CL package
- * Organization::         The package's five component files
- * Installation::         Compiling and installing CL
- * Naming Conventions::   Notes on CL function names
- 
- 
- File: cl,  Node: Usage,  Next: Organization,  Prev: Overview,  Up: Overview
- 
- Usage
- =====
- 
- Lisp code that uses features from the "CL" package should include at
- the beginning:
- 
-      (require 'cl)
- 
- If you want to ensure that the new (Gillespie) version of "CL" is the
- one that is present, add an additional `(require 'cl-19)' call:
- 
-      (require 'cl)
-      (require 'cl-19)
- 
- The second call will fail (with "`cl-19.el' not found") if the old
- `cl.el' package was in use.
- 
-    It is safe to arrange to load "CL" at all times, e.g., in your
- `.emacs' file.  But it's a good idea, for portability, to `(require
- 'cl)' in your code even if you do this.
- 
- 
- File: cl,  Node: Organization,  Next: Installation,  Prev: Usage,  Up: Overview
- 
- Organization
- ============
- 
- The Common Lisp package is organized into four files:
- 
- `cl.el'
-      This is the "main" file, which contains basic functions and
-      information about the package.  This file is relatively
-      compact--about 700 lines.
- 
- `cl-extra.el'
-      This file contains the larger, more complex or unusual functions.
-      It is kept separate so that packages which only want to use Common
-      Lisp fundamentals like the `cadr' function won't need to pay the
-      overhead of loading the more advanced functions.
- 
- `cl-seq.el'
-      This file contains most of the advanced functions for operating on
-      sequences or lists, such as `delete-if' and `assoc*'.
- 
- `cl-macs.el'
-      This file contains the features of the packages which are macros
-      instead of functions.  Macros expand when the caller is compiled,
-      not when it is run, so the macros generally only need to be
-      present when the byte-compiler is running (or when the macros are
-      used in uncompiled code such as a `.emacs' file).  Most of the
-      macros of this package are isolated in `cl-macs.el' so that they
-      won't take up memory unless you are compiling.
- 
-    The file `cl.el' includes all necessary `autoload' commands for the
- functions and macros in the other three files.  All you have to do is
- `(require 'cl)', and `cl.el' will take care of pulling in the other
- files when they are needed.
- 
-    There is another file, `cl-compat.el', which defines some routines
- from the older `cl.el' package that are no longer present in the new
- package.  This includes internal routines like `setelt' and
- `zip-lists', deprecated features like `defkeyword', and an emulation of
- the old-style multiple-values feature.  *Note Old CL Compatibility::.
- 
- 
- File: cl,  Node: Installation,  Next: Naming Conventions,  Prev: Organization,  Up: Overview
- 
- Installation
- ============
- 
- Installation of the "CL" package is simple:  Just put the byte-compiled
- files `cl.elc', `cl-extra.elc', `cl-seq.elc', `cl-macs.elc', and
- `cl-compat.elc' into a directory on your `load-path'.
- 
-    There are no special requirements to compile this package: The files
- do not have to be loaded before they are compiled, nor do they need to
- be compiled in any particular order.
- 
-    You may choose to put the files into your main `lisp/' directory,
- replacing the original `cl.el' file there.  Or, you could put them into
- a directory that comes before `lisp/' on your `load-path' so that the
- old `cl.el' is effectively hidden.
- 
-    Also, format the `cl.texinfo' file and put the resulting Info files
- in the `info/' directory or another suitable place.
- 
-    You may instead wish to leave this package's components all in their
- own directory, and then add this directory to your `load-path' and
- (Emacs 19 only) `Info-directory-list'.  Add the directory to the front
- of the list so the old "CL" package and its documentation are hidden.
- 
- 
- File: cl,  Node: Naming Conventions,  Prev: Installation,  Up: Overview
- 
- Naming Conventions
- ==================
- 
- Except where noted, all functions defined by this package have the same
- names and calling conventions as their Common Lisp counterparts.
- 
-    Following is a complete list of functions whose names were changed
- from Common Lisp, usually to avoid conflicts with Emacs.  In each case,
- a `*' has been appended to the Common Lisp name to obtain the Emacs
- name:
- 
-      defun*        defsubst*     defmacro*     function*
-      member*       assoc*        rassoc*       get*
-      remove*       delete*       mapcar*       sort*
-      floor*        ceiling*      truncate*     round*
-      mod*          rem*          random*
- 
-    Internal function and variable names in the package are prefixed by
- `cl-'.  Here is a complete list of functions *not* prefixed by `cl-'
- which were not taken from Common Lisp:
- 
-      member        delete        remove        remq
-      rassoc        floatp-safe   lexical-let   lexical-let*
-      callf         callf2        letf          letf*
-      defsubst*     defalias      add-hook      eval-when-compile
- 
- (Most of these are Emacs 19 features provided to Emacs 18 users, or
- introduced, like `remq', for reasons of symmetry with similar features.)
- 
-    The following simple functions and macros are defined in `cl.el';
- they do not cause other components like `cl-extra' to be loaded.
- 
-      eql           floatp-safe   abs           endp
-      evenp         oddp          plusp         minusp
-      last          butlast       nbutlast      caar .. cddddr
-      list*         ldiff         rest          first .. tenth
-      member [1]    copy-list     subst         mapcar* [2]
-      adjoin [3]    acons         pairlis       when
-      unless        pop [4]       push [4]      pushnew [3,4]
-      incf [4]      decf [4]      proclaim      declaim
-      add-hook
- 
- [1] This is the Emacs 19-compatible function, not `member*'.
- 
- [2] Only for one sequence argument or two list arguments.
- 
- [3] Only if `:test' is `eq', `equal', or unspecified, and `:key' is not
- used.
- 
- [4] Only when PLACE is a plain variable name.
- 
- 
- File: cl,  Node: Program Structure,  Next: Predicates,  Prev: Overview,  Up: Top
- 
- Program Structure
- *****************
- 
- This section describes features of the "CL" package which have to do
- with programs as a whole: advanced argument lists for functions, and
- the `eval-when' construct.
- 
- * Menu:
- 
- * Argument Lists::       `&key', `&aux', `defun*', `defmacro*'.
- * Time of Evaluation::   The `eval-when' construct.
- * Function Aliases::     The `defalias' function.
- 
- 
- File: cl,  Node: Argument Lists,  Next: Time of Evaluation,  Prev: Program Structure,  Up: Program Structure
- 
- Argument Lists
- ==============
- 
- Emacs Lisp's notation for argument lists of functions is a subset of
- the Common Lisp notation.  As well as the familiar `&optional' and
- `&rest' markers, Common Lisp allows you to specify default values for
- optional arguments, and it provides the additional markers `&key' and
- `&aux'.
- 
-    Since argument parsing is built-in to Emacs, there is no way for
- this package to implement Common Lisp argument lists seamlessly.
- Instead, this package defines alternates for several Lisp forms which
- you must use if you need Common Lisp argument lists.
- 
-  - Special Form: defun* NAME ARGLIST BODY...
-      This form is identical to the regular `defun' form, except that
-      ARGLIST is allowed to be a full Common Lisp argument list.  Also,
-      the function body is enclosed in an implicit block called NAME;
-      *note Blocks and Exits::..
- 
-  - Special Form: defsubst* NAME ARGLIST BODY...
-      This is just like `defun*', except that the function that is
-      defined is automatically proclaimed `inline', i.e., calls to it
-      may be expanded into in-line code by the byte compiler.  This is
-      analogous to the `defsubst' form in Emacs 19; `defsubst*' uses a
-      different method (compiler macros) which works in all version of
-      Emacs, and also generates somewhat more efficient inline
-      expansions.  In particular, `defsubst*' arranges for the
-      processing of keyword arguments, default values, etc., to be done
-      at compile-time whenever possible.
- 
-  - Special Form: defmacro* NAME ARGLIST BODY...
-      This is identical to the regular `defmacro' form, except that
-      ARGLIST is allowed to be a full Common Lisp argument list.  The
-      `&environment' keyword is supported as described in Steele.  The
-      `&whole' keyword is supported only within destructured lists (see
-      below); top-level `&whole' cannot be implemented with the current
-      Emacs Lisp interpreter.  The macro expander body is enclosed in an
-      implicit block called NAME.
- 
-  - Special Form: function* SYMBOL-OR-LAMBDA
-      This is identical to the regular `function' form, except that if
-      the argument is a `lambda' form then that form may use a full
-      Common Lisp argument list.
- 
-    Also, all forms (such as `defsetf' and `flet') defined in this
- package that include ARGLISTs in their syntax allow full Common Lisp
- argument lists.
- 
-    Note that it is *not* necessary to use `defun*' in order to have
- access to most "CL" features in your function.  These features are
- always present; `defun*''s only difference from `defun' is its more
- flexible argument lists and its implicit block.
- 
-    The full form of a Common Lisp argument list is
- 
-      (VAR...
-       &optional (VAR INITFORM SVAR)...
-       &rest VAR
-       &key ((KEYWORD VAR) INITFORM SVAR)...
-       &aux (VAR INITFORM)...)
- 
-    Each of the five argument list sections is optional.  The SVAR,
- INITFORM, and KEYWORD parts are optional; if they are omitted, then
- `(VAR)' may be written simply `VAR'.
- 
-    The first section consists of zero or more "required" arguments.
- These arguments must always be specified in a call to the function;
- there is no difference between Emacs Lisp and Common Lisp as far as
- required arguments are concerned.
- 
-    The second section consists of "optional" arguments.  These
- arguments may be specified in the function call; if they are not,
- INITFORM specifies the default value used for the argument.  (No
- INITFORM means to use `nil' as the default.)  The INITFORM is evaluated
- with the bindings for the preceding arguments already established; `(a
- &optional (b (1+ a)))' matches one or two arguments, with the second
- argument defaulting to one plus the first argument.  If the SVAR is
- specified, it is an auxiliary variable which is bound to `t' if the
- optional argument was specified, or to `nil' if the argument was
- omitted.  If you don't use an SVAR, then there will be no way for your
- function to tell whether it was called with no argument, or with the
- default value passed explicitly as an argument.
- 
-    The third section consists of a single "rest" argument.  If more
- arguments were passed to the function than are accounted for by the
- required and optional arguments, those extra arguments are collected
- into a list and bound to the "rest" argument variable.  Common Lisp's
- `&rest' is equivalent to that of Emacs Lisp.  Common Lisp accepts
- `&body' as a synonym for `&rest' in macro contexts; this package
- accepts it all the time.
- 
-    The fourth section consists of "keyword" arguments.  These are
- optional arguments which are specified by name rather than positionally
- in the argument list.  For example,
- 
-      (defun* foo (a &optional b &key c d (e 17)))
- 
- defines a function which may be called with one, two, or more
- arguments.  The first two arguments are bound to `a' and `b' in the
- usual way.  The remaining arguments must be pairs of the form `:c',
- `:d', or `:e' followed by the value to be bound to the corresponding
- argument variable.  (Symbols whose names begin with a colon are called
- "keywords", and they are self-quoting in the same way as `nil' and `t'.)
- 
-    For example, the call `(foo 1 2 :d 3 :c 4)' sets the five arguments
- to 1, 2, 4, 3, and 17, respectively.  If the same keyword appears more
- than once in the function call, the first occurrence takes precedence
- over the later ones.  Note that it is not possible to specify keyword
- arguments without specifying the optional argument `b' as well, since
- `(foo 1 :c 2)' would bind `b' to the keyword `:c', then signal an error
- because `2' is not a valid keyword.
- 
-    If a KEYWORD symbol is explicitly specified in the argument list as
- shown in the above diagram, then that keyword will be used instead of
- just the variable name prefixed with a colon.  You can specify a
- KEYWORD symbol which does not begin with a colon at all, but such
- symbols will not be self-quoting; you will have to quote them
- explicitly with an apostrophe in the function call.
- 
-    Ordinarily it is an error to pass an unrecognized keyword to a
- function, e.g., `(foo 1 2 :c 3 :goober 4)'.  You can ask Lisp to ignore
- unrecognized keywords, either by adding the marker `&allow-other-keys'
- after the keyword section of the argument list, or by specifying an
- `:allow-other-keys' argument in the call whose value is non-`nil'.  If
- the function uses both `&rest' and `&key' at the same time, the "rest"
- argument is bound to the keyword list as it appears in the call.  For
- example:
- 
-      (defun* find-thing (thing &rest rest &key need &allow-other-keys)
-        (or (apply 'member* thing thing-list :allow-other-keys t rest)
-            (if need (error "Thing not found"))))
- 
- This function takes a `:need' keyword argument, but also accepts other
- keyword arguments which are passed on to the `member*' function.
- `allow-other-keys' is used to keep both `find-thing' and `member*' from
- complaining about each others' keywords in the arguments.
- 
-    In Common Lisp, keywords are recognized by the Lisp parser itself
- and treated as special entities.  In Emacs, keywords are just symbols
- whose names begin with colons, which `defun*' has arranged to set equal
- to themselves so that they will essentially be self-quoting.
- 
-    As a (significant) performance optimization, this package implements
- the scan for keyword arguments by calling `memq' to search for keywords
- in a "rest" argument.  Technically speaking, this is incorrect, since
- `memq' looks at the odd-numbered values as well as the even-numbered
- keywords.  The net effect is that if you happen to pass a keyword symbol
- as the *value* of another keyword argument, where that keyword symbol
- happens to equal the name of a valid keyword argument of the same
- function, then the keyword parser will become confused.  This minor bug
- can only affect you if you use keyword symbols as general-purpose data
- in your program; this practice is strongly discouraged in Emacs Lisp.
- 
-    The fifth section of the argument list consists of "auxiliary
- variables".  These are not really arguments at all, but simply
- variables which are bound to `nil' or to the specified INITFORMS during
- execution of the function.  There is no difference between the
- following two functions, except for a matter of stylistic taste:
- 
-      (defun* foo (a b &aux (c (+ a b)) d)
-        BODY)
-      
-      (defun* foo (a b)
-        (let ((c (+ a b)) d)
-          BODY))
- 
-    Argument lists support "destructuring".  In Common Lisp,
- destructuring is only allowed with `defmacro'; this package allows it
- with `defun*' and other argument lists as well.  In destructuring, any
- argument variable (VAR in the above diagram) can be replaced by a list
- of variables, or more generally, a recursive argument list.  The
- corresponding argument value must be a list whose elements match this
- recursive argument list.  For example:
- 
-      (defmacro* dolist ((var listform &optional resultform)
-                         &rest body)
-        ...)
- 
-    This says that the first argument of `dolist' must be a list of two
- or three items; if there are other arguments as well as this list, they
- are stored in `body'.  All features allowed in regular argument lists
- are allowed in these recursive argument lists.  In addition, the clause
- `&whole VAR' is allowed at the front of a recursive argument list.  It
- binds VAR to the whole list being matched; thus `(&whole all a b)'
- matches a list of two things, with `a' bound to the first thing, `b'
- bound to the second thing, and `all' bound to the list itself.  (Common
- Lisp allows `&whole' in top-level `defmacro' argument lists as well,
- but Emacs Lisp does not support this usage.)
- 
-    One last feature of destructuring is that the argument list may be
- dotted, so that the argument list `(a b . c)' is functionally
- equivalent to `(a b &rest c)'.
- 
-    If the optimization quality `safety' is set to 0 (*note
- Declarations::.), error checking for wrong number of arguments and
- invalid keyword arguments is disabled.  By default, argument lists are
- rigorously checked.
- 
- 
- File: cl,  Node: Time of Evaluation,  Next: Function Aliases,  Prev: Argument Lists,  Up: Program Structure
- 
- Time of Evaluation
- ==================
- 
- Normally, the byte-compiler does not actually execute the forms in a
- file it compiles.  For example, if a file contains `(setq foo t)', the
- act of compiling it will not actually set `foo' to `t'.  This is true
- even if the `setq' was a top-level form (i.e., not enclosed in a
- `defun' or other form).  Sometimes, though, you would like to have
- certain top-level forms evaluated at compile-time.  For example, the
- compiler effectively evaluates `defmacro' forms at compile-time so that
- later parts of the file can refer to the macros that are defined.
- 
-  - Special Form: eval-when (SITUATIONS...) FORMS...
-      This form controls when the body FORMS are evaluated.  The
-      SITUATIONS list may contain any set of the symbols `compile',
-      `load', and `eval' (or their long-winded ANSI equivalents,
-      `:compile-toplevel', `:load-toplevel', and `:execute').
- 
-      The `eval-when' form is handled differently depending on whether
-      or not it is being compiled as a top-level form.  Specifically, it
-      gets special treatment if it is being compiled by a command such
-      as `byte-compile-file' which compiles files or buffers of code,
-      and it appears either literally at the top level of the file or
-      inside a top-level `progn'.
- 
-      For compiled top-level `eval-when's, the body FORMS are executed
-      at compile-time if `compile' is in the SITUATIONS list, and the
-      FORMS are written out to the file (to be executed at load-time) if
-      `load' is in the SITUATIONS list.
- 
-      For non-compiled-top-level forms, only the `eval' situation is
-      relevant.  (This includes forms executed by the interpreter, forms
-      compiled with `byte-compile' rather than `byte-compile-file', and
-      non-top-level forms.)  The `eval-when' acts like a `progn' if
-      `eval' is specified, and like `nil' (ignoring the body FORMS) if
-      not.
- 
-      The rules become more subtle when `eval-when's are nested; consult
-      Steele (second edition) for the gruesome details (and some
-      gruesome examples).
- 
-      Some simple examples:
- 
-           ;; Top-level forms in foo.el:
-           (eval-when (compile)           (setq foo1 'bar))
-           (eval-when (load)              (setq foo2 'bar))
-           (eval-when (compile load)      (setq foo3 'bar))
-           (eval-when (eval)              (setq foo4 'bar))
-           (eval-when (eval compile)      (setq foo5 'bar))
-           (eval-when (eval load)         (setq foo6 'bar))
-           (eval-when (eval compile load) (setq foo7 'bar))
- 
-      When `foo.el' is compiled, these variables will be set during the
-      compilation itself:
- 
-           foo1  foo3  foo5  foo7      ; `compile'
- 
-      When `foo.elc' is loaded, these variables will be set:
- 
-           foo2  foo3  foo6  foo7      ; `load'
- 
-      And if `foo.el' is loaded uncompiled, these variables will be set:
- 
-           foo4  foo5  foo6  foo7      ; `eval'
- 
-      If these seven `eval-when's had been, say, inside a `defun', then
-      the first three would have been equivalent to `nil' and the last
-      four would have been equivalent to the corresponding `setq's.
- 
-      Note that `(eval-when (load eval) ...)' is equivalent to `(progn
-      ...)' in all contexts.  The compiler treats certain top-level
-      forms, like `defmacro' (sort-of) and `require', as if they were
-      wrapped in `(eval-when (compile load eval) ...)'.
- 
-    Emacs 19 includes two special forms related to `eval-when'.  One of
- these, `eval-when-compile', is not quite equivalent to any `eval-when'
- construct and is described below.  This package defines a version of
- `eval-when-compile' for the benefit of Emacs 18 users.
- 
-    The other form, `(eval-and-compile ...)', is exactly equivalent to
- `(eval-when (compile load eval) ...)' and so is not itself defined by
- this package.
- 
-  - Special Form: eval-when-compile FORMS...
-      The FORMS are evaluated at compile-time; at execution time, this
-      form acts like a quoted constant of the resulting value.  Used at
-      top-level, `eval-when-compile' is just like `eval-when (compile
-      eval)'.  In other contexts, `eval-when-compile' allows code to be
-      evaluated once at compile-time for efficiency or other reasons.
- 
-      This form is similar to the `#.' syntax of true Common Lisp.
- 
-  - Special Form: load-time-value FORM
-      The FORM is evaluated at load-time; at execution time, this form
-      acts like a quoted constant of the resulting value.
- 
-      Early Common Lisp had a `#,' syntax that was similar to this, but
-      ANSI Common Lisp replaced it with `load-time-value' and gave it
-      more well-defined semantics.
- 
-      In a compiled file, `load-time-value' arranges for FORM to be
-      evaluated when the `.elc' file is loaded and then used as if it
-      were a quoted constant.  In code compiled by `byte-compile' rather
-      than `byte-compile-file', the effect is identical to
-      `eval-when-compile'.  In uncompiled code, both `eval-when-compile'
-      and `load-time-value' act exactly like `progn'.
- 
-           (defun report ()
-             (insert "This function was executed on: "
-                     (current-time-string)
-                     ", compiled on: "
-                     (eval-when-compile (current-time-string))
-                     ;; or '#.(current-time-string) in real Common Lisp
-                     ", and loaded on: "
-                     (load-time-value (current-time-string))))
- 
-      Byte-compiled, the above defun will result in the following code
-      (or its compiled equivalent, of course) in the `.elc' file:
- 
-           (setq --temp-- (current-time-string))
-           (defun report ()
-             (insert "This function was executed on: "
-                     (current-time-string)
-                     ", compiled on: "
-                     '"Wed Jun 23 18:33:43 1993"
-                     ", and loaded on: "
-                     --temp--))
- 
- 
- File: cl,  Node: Function Aliases,  Prev: Time of Evaluation,  Up: Program Structure
- 
- Function Aliases
- ================
- 
- This section describes a feature from GNU Emacs 19 which this package
- makes available in other versions of Emacs.
- 
-  - Function: defalias SYMBOL FUNCTION
-      This function sets SYMBOL's function cell to FUNCTION.  It is
-      equivalent to `fset', except that in GNU Emacs 19 it also records
-      the setting in `load-history' so that it can be undone by a later
-      `unload-feature'.
- 
-      In other versions of Emacs, `defalias' is a synonym for `fset'.
- 
- 
- File: cl,  Node: Predicates,  Next: Control Structure,  Prev: Program Structure,  Up: Top
- 
- Predicates
- **********
- 
- This section describes functions for testing whether various facts are
- true or false.
- 
- * Menu:
- 
- * Type Predicates::      `typep', `deftype', and `coerce'
- * Equality Predicates::  `eql' and `equalp'
- 
- 
- File: cl,  Node: Type Predicates,  Next: Equality Predicates,  Prev: Predicates,  Up: Predicates
- 
- Type Predicates
- ===============
- 
- The "CL" package defines a version of the Common Lisp `typep' predicate.
- 
-  - Function: typep OBJECT TYPE
-      Check if OBJECT is of type TYPE, where TYPE is a (quoted) type
-      name of the sort used by Common Lisp.  For example, `(typep foo
-      'integer)' is equivalent to `(integerp foo)'.
- 
-    The TYPE argument to the above function is either a symbol or a list
- beginning with a symbol.
- 
-    * If the type name is a symbol, Emacs appends `-p' to the symbol
-      name to form the name of a predicate function for testing the
-      type.  (Built-in predicates whose names end in `p' rather than
-      `-p' are used when appropriate.)
- 
-    * The type symbol `t' stands for the union of all types.  `(typep
-      OBJECT t)' is always true.  Likewise, the type symbol `nil' stands
-      for nothing at all, and `(typep OBJECT nil)' is always false.
- 
-    * The type symbol `null' represents the symbol `nil'.  Thus `(typep
-      OBJECT 'null)' is equivalent to `(null OBJECT)'.
- 
-    * The type symbol `real' is a synonym for `number', and `fixnum' is
-      a synonym for `integer'.
- 
-    * The type symbols `character' and `string-char' match integers in
-      the range from 0 to 255.
- 
-    * The type symbol `float' uses the `floatp-safe' predicate defined
-      by this package rather than `floatp', so it will work correctly
-      even in Emacs versions without floating-point support.
- 
-    * The type list `(integer LOW HIGH)' represents all integers between
-      LOW and HIGH, inclusive.  Either bound may be a list of a single
-      integer to specify an exclusive limit, or a `*' to specify no
-      limit.  The type `(integer * *)' is thus equivalent to `integer'.
- 
-    * Likewise, lists beginning with `float', `real', or `number'
-      represent numbers of that type falling in a particular range.
- 
-    * Lists beginning with `and', `or', and `not' form combinations of
-      types.  For example, `(or integer (float 0 *))' represents all
-      objects that are integers or non-negative floats.
- 
-    * Lists beginning with `member' or `member*' represent objects `eql'
-      to any of the following values.  For example, `(member 1 2 3 4)'
-      is equivalent to `(integer 1 4)', and `(member nil)' is equivalent
-      to `null'.
- 
-    * Lists of the form `(satisfies PREDICATE)' represent all objects
-      for which PREDICATE returns true when called with that object as
-      an argument.
- 
-    The following function and macro (not technically predicates) are
- related to `typep'.
- 
-  - Function: coerce OBJECT TYPE
-      This function attempts to convert OBJECT to the specified TYPE.
-      If OBJECT is already of that type as determined by `typep', it is
-      simply returned.  Otherwise, certain types of conversions will be
-      made:  If TYPE is any sequence type (`string', `list', etc.) then
-      OBJECT will be converted to that type if possible.  If TYPE is
-      `character', then strings of length one and symbols with
-      one-character names can be coerced.  If TYPE is `float', then
-      integers can be coerced in versions of Emacs that support floats.
-      In all other circumstances, `coerce' signals an error.
- 
-  - Special Form: deftype NAME ARGLIST FORMS...
-      This macro defines a new type called NAME.  It is similar to
-      `defmacro' in many ways; when NAME is encountered as a type name,
-      the body FORMS are evaluated and should return a type specifier
-      that is equivalent to the type.  The ARGLIST is a Common Lisp
-      argument list of the sort accepted by `defmacro*'.  The type
-      specifier `(NAME ARGS...)' is expanded by calling the expander
-      with those arguments; the type symbol `NAME' is expanded by
-      calling the expander with no arguments.  The ARGLIST is processed
-      the same as for `defmacro*' except that optional arguments without
-      explicit defaults use `*' instead of `nil' as the "default"
-      default.  Some examples:
- 
-           (deftype null () '(satisfies null))    ; predefined
-           (deftype list () '(or null cons))      ; predefined
-           (deftype unsigned-byte (&optional bits)
-             (list 'integer 0 (if (eq bits '*) bits (1- (lsh 1 bits)))))
-           (unsigned-byte 8)  ==  (integer 0 255)
-           (unsigned-byte)  ==  (integer 0 *)
-           unsigned-byte  ==  (integer 0 *)
- 
-      The last example shows how the Common Lisp `unsigned-byte' type
-      specifier could be implemented if desired; this package does not
-      implement `unsigned-byte' by default.
- 
-    The `typecase' and `check-type' macros also use type names.  *Note
- Conditionals::.  *Note Assertions::.  The `map', `concatenate', and
- `merge' functions take type-name arguments to specify the type of
- sequence to return.  *Note Sequences::.
- 
- 
- File: cl,  Node: Equality Predicates,  Prev: Type Predicates,  Up: Predicates
- 
- Equality Predicates
- ===================
- 
- This package defines two Common Lisp predicates, `eql' and `equalp'.
- 
-  - Function: eql A B
-      This function is almost the same as `eq', except that if A and B
-      are numbers of the same type, it compares them for numeric
-      equality (as if by `equal' instead of `eq').  This makes a
-      difference only for versions of Emacs that are compiled with
-      floating-point support, such as Emacs 19.  Emacs floats are
-      allocated objects just like cons cells, which means that `(eq 3.0
-      3.0)' will not necessarily be true--if the two `3.0's were
-      allocated separately, the pointers will be different even though
-      the numbers are the same.  But `(eql 3.0 3.0)' will always be true.
- 
-      The types of the arguments must match, so `(eql 3 3.0)' is still
-      false.
- 
-      Note that Emacs integers are "direct" rather than allocated, which
-      basically means `(eq 3 3)' will always be true.  Thus `eq' and
-      `eql' behave differently only if floating-point numbers are
-      involved, and are indistinguishable on Emacs versions that don't
-      support floats.
- 
-      There is a slight inconsistency with Common Lisp in the treatment
-      of positive and negative zeros.  Some machines, notably those with
-      IEEE standard arithmetic, represent `+0' and `-0' as distinct
-      values.  Normally this doesn't matter because the standard
-      specifies that `(= 0.0 -0.0)' should always be true, and this is
-      indeed what Emacs Lisp and Common Lisp do.  But the Common Lisp
-      standard states that `(eql 0.0 -0.0)' and `(equal 0.0 -0.0)' should
-      be false on IEEE-like machines; Emacs Lisp does not do this, and in
-      fact the only known way to distinguish between the two zeros in
-      Emacs Lisp is to `format' them and check for a minus sign.
- 
-  - Function: equalp A B
-      This function is a more flexible version of `equal'.  In
-      particular, it compares strings case-insensitively, and it compares
-      numbers without regard to type (so that `(equalp 3 3.0)' is true).
-      Vectors and conses are compared recursively.  All other objects
-      are compared as if by `equal'.
- 
-      This function differs from Common Lisp `equalp' in several
-      respects.  First, Common Lisp's `equalp' also compares
-      *characters* case-insensitively, which would be impractical in
-      this package since Emacs does not distinguish between integers and
-      characters.  In keeping with the idea that strings are less
-      vector-like in Emacs Lisp, this package's `equalp' also will not
-      compare strings against vectors of integers.  Finally, Common
-      Lisp's `equalp' compares hash tables without regard to ordering,
-      whereas this package simply compares hash tables in terms of their
-      underlying structure (which means vectors for Lucid Emacs 19 hash
-      tables, or lists for other hash tables).
- 
-    Also note that the Common Lisp functions `member' and `assoc' use
- `eql' to compare elements, whereas Emacs Lisp follows the MacLisp
- tradition and uses `equal' for these two functions.  In Emacs, use
- `member*' and `assoc*' to get functions which use `eql' for comparisons.
- 
- 
- File: cl,  Node: Control Structure,  Next: Macros,  Prev: Predicates,  Up: Top
- 
- Control Structure
- *****************
- 
- The features described in the following sections implement various
- advanced control structures, including the powerful `setf' facility and
- a number of looping and conditional constructs.
- 
- * Menu:
- 
- * Assignment::             The `psetq' form
- * Generalized Variables::  `setf', `incf', `push', etc.
- * Variable Bindings::      `progv', `lexical-let', `flet', `macrolet'
- * Conditionals::           `when', `unless', `case', `typecase'
- * Blocks and Exits::       `block', `return', `return-from'
- * Iteration::              `do', `dotimes', `dolist', `do-symbols'
- * Loop Facility::          The Common Lisp `loop' macro
- * Multiple Values::        `values', `multiple-value-bind', etc.
- 
- 
- File: cl,  Node: Assignment,  Next: Generalized Variables,  Prev: Control Structure,  Up: Control Structure
- 
- Assignment
- ==========
- 
- The `psetq' form is just like `setq', except that multiple assignments
- are done in parallel rather than sequentially.
- 
-  - Special Form: psetq [SYMBOL FORM]...
-      This special form (actually a macro) is used to assign to several
-      variables simultaneously.  Given only one SYMBOL and FORM, it has
-      the same effect as `setq'.  Given several SYMBOL and FORM pairs,
-      it evaluates all the FORMs in advance and then stores the
-      corresponding variables afterwards.
- 
-           (setq x 2 y 3)
-           (setq x (+ x y)  y (* x y))
-           x
-                => 5
-           y                     ; `y' was computed after `x' was set.
-                => 15
-           (setq x 2 y 3)
-           (psetq x (+ x y)  y (* x y))
-           x
-                => 5
-           y                     ; `y' was computed before `x' was set.
-                => 6
- 
-      The simplest use of `psetq' is `(psetq x y y x)', which exchanges
-      the values of two variables.  (The `rotatef' form provides an even
-      more convenient way to swap two variables; *note Modify Macros::..)
- 
-      `psetq' always returns `nil'.
- 
- 
- File: cl,  Node: Generalized Variables,  Next: Variable Bindings,  Prev: Assignment,  Up: Control Structure
- 
- Generalized Variables
- =====================
- 
- A "generalized variable" or "place form" is one of the many places in
- Lisp memory where values can be stored.  The simplest place form is a
- regular Lisp variable.  But the cars and cdrs of lists, elements of
- arrays, properties of symbols, and many other locations are also places
- where Lisp values are stored.
- 
-    The `setf' form is like `setq', except that it accepts arbitrary
- place forms on the left side rather than just symbols.  For example,
- `(setf (car a) b)' sets the car of `a' to `b', doing the same operation
- as `(setcar a b)' but without having to remember two separate functions
- for setting and accessing every type of place.
- 
-    Generalized variables are analogous to "lvalues" in the C language,
- where `x = a[i]' gets an element from an array and `a[i] = x' stores an
- element using the same notation.  Just as certain forms like `a[i]' can
- be lvalues in C, there is a set of forms that can be generalized
- variables in Lisp.
- 
- * Menu:
- 
- * Basic Setf::         `setf' and place forms
- * Modify Macros::      `incf', `push', `rotatef', `letf', `callf', etc.
- * Customizing Setf::   `define-modify-macro', `defsetf', `define-setf-method'
- 
- 
- File: cl,  Node: Basic Setf,  Next: Modify Macros,  Prev: Generalized Variables,  Up: Generalized Variables
- 
- Basic Setf
- ----------
- 
- The `setf' macro is the most basic way to operate on generalized
- variables.
- 
-  - Special Form: setf [PLACE FORM]...
-      This macro evaluates FORM and stores it in PLACE, which must be a
-      valid generalized variable form.  If there are several PLACE and
-      FORM pairs, the assignments are done sequentially just as with
-      `setq'.  `setf' returns the value of the last FORM.
- 
-      The following Lisp forms will work as generalized variables, and
-      so may legally appear in the PLACE argument of `setf':
- 
-         * A symbol naming a variable.  In other words, `(setf x y)' is
-           exactly equivalent to `(setq x y)', and `setq' itself is
-           strictly speaking redundant now that `setf' exists.  Many
-           programmers continue to prefer `setq' for setting simple
-           variables, though, purely for stylistic or historical reasons.
-           The macro `(setf x y)' actually expands to `(setq x y)', so
-           there is no performance penalty for using it in compiled code.
- 
-         * A call to any of the following Lisp functions:
- 
-                car                 cdr                 caar .. cddddr
-                nth                 rest                first .. tenth
-                aref                elt                 nthcdr
-                symbol-function     symbol-value        symbol-plist
-                get                 get*                getf
-                gethash             subseq
- 
-           Note that for `nthcdr' and `getf', the list argument of the
-           function must itself be a valid PLACE form.  For example,
-           `(setf (nthcdr 0 foo) 7)' will set `foo' itself to 7.  Note
-           that `push' and `pop' on an `nthcdr' place can be used to
-           insert or delete at any position in a list.  The use of
-           `nthcdr' as a PLACE form is an extension to standard Common
-           Lisp.
- 
-         * The following Emacs-specific functions are also `setf'-able.
-           (Some of these are defined only in Emacs 19 or only in Lucid
-           Emacs.)
- 
-                buffer-file-name                  marker-position
-                buffer-modified-p                 match-data
-                buffer-name                       mouse-position
-                buffer-string                     overlay-end
-                buffer-substring                  overlay-get
-                current-buffer                    overlay-start
-                current-case-table                point
-                current-column                    point-marker
-                current-global-map                point-max
-                current-input-mode                point-min
-                current-local-map                 process-buffer
-                current-window-configuration      process-filter
-                default-file-modes                process-sentinel
-                default-value                     read-mouse-position
-                documentation-property            screen-height
-                extent-data                       screen-menubar
-                extent-end-position               screen-width
-                extent-start-position             selected-window
-                face-background                   selected-screen
-                face-background-pixmap            selected-frame
-                face-font                         standard-case-table
-                face-foreground                   syntax-table
-                face-underline-p                  window-buffer
-                file-modes                        window-dedicated-p
-                frame-height                      window-display-table
-                frame-parameters                  window-height
-                frame-visible-p                   window-hscroll
-                frame-width                       window-point
-                get-register                      window-start
-                getenv                            window-width
-                global-key-binding                x-get-cut-buffer
-                keymap-parent                     x-get-cutbuffer
-                local-key-binding                 x-get-secondary-selection
-                mark                              x-get-selection
-                mark-marker
- 
-           Most of these have directly corresponding "set" functions,
-           like `use-local-map' for `current-local-map', or `goto-char'
-           for `point'.  A few, like `point-min', expand to longer
-           sequences of code when they are `setf''d (`(narrow-to-region
-           x (point-max))' in this case).
- 
-         * A call of the form `(substring SUBPLACE N [M])', where
-           SUBPLACE is itself a legal generalized variable whose current
-           value is a string, and where the value stored is also a
-           string.  The new string is spliced into the specified part of
-           the destination string.  For example:
- 
-                (setq a (list "hello" "world"))
-                     => ("hello" "world")
-                (cadr a)
-                     => "world"
-                (substring (cadr a) 2 4)
-                     => "rl"
-                (setf (substring (cadr a) 2 4) "o")
-                     => "o"
-                (cadr a)
-                     => "wood"
-                a
-                     => ("hello" "wood")
- 
-           The generalized variable `buffer-substring', listed above,
-           also works in this way by replacing a portion of the current
-           buffer.
- 
-         * A call of the form `(apply 'FUNC ...)' or `(apply (function
-           FUNC) ...)', where FUNC is a `setf'-able function whose store
-           function is "suitable" in the sense described in Steele's
-           book; since none of the standard Emacs place functions are
-           suitable in this sense, this feature is only interesting when
-           used with places you define yourself with
-           `define-setf-method' or the long form of `defsetf'.
- 
-         * A macro call, in which case the macro is expanded and `setf'
-           is applied to the resulting form.
- 
-         * Any form for which a `defsetf' or `define-setf-method' has
-           been made.
- 
-      Using any forms other than these in the PLACE argument to `setf'
-      will signal an error.
- 
-      The `setf' macro takes care to evaluate all subforms in the proper
-      left-to-right order; for example,
- 
-           (setf (aref vec (incf i)) i)
- 
-      looks like it will evaluate `(incf i)' exactly once, before the
-      following access to `i'; the `setf' expander will insert temporary
-      variables as necessary to ensure that it does in fact work this
-      way no matter what setf-method is defined for `aref'.  (In this
-      case, `aset' would be used and no such steps would be necessary
-      since `aset' takes its arguments in a convenient order.)
- 
-      However, if the PLACE form is a macro which explicitly evaluates
-      its arguments in an unusual order, this unusual order will be
-      preserved.  Adapting an example from Steele, given
- 
-           (defmacro wrong-order (x y) (list 'aref y x))
- 
-      the form `(setf (wrong-order A B) 17)' will evaluate B first, then
-      A, just as in an actual call to `wrong-order'.
- 
--- 0 ----
Index: emacs/info/cl-2
diff -c emacs/info/cl-2:1.1.1.1 emacs/info/cl-2:removed
*** emacs/info/cl-2:1.1.1.1	Fri Jul 19 01:55:00 1996
--- emacs/info/cl-2	Fri Aug  2 19:58:03 1996
***************
*** 1,1026 ****
- This is Info file ../info/cl, produced by Makeinfo-1.55 from the input
- file cl.texi.
- 
-    This file documents the GNU Emacs Common Lisp emulation package.
- 
-    Copyright (C) 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "GNU General Public License" is included
- exactly as in the original, and provided that the entire resulting
- derived work is distributed under the terms of a permission notice
- identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the section entitled "GNU General Public License"
- may be included in a translation approved by the author instead of in
- the original English.
- 
- 
- File: cl,  Node: Modify Macros,  Next: Customizing Setf,  Prev: Basic Setf,  Up: Generalized Variables
- 
- Modify Macros
- -------------
- 
- This package defines a number of other macros besides `setf' that
- operate on generalized variables.  Many are interesting and useful even
- when the PLACE is just a variable name.
- 
-  - Special Form: psetf [PLACE FORM]...
-      This macro is to `setf' what `psetq' is to `setq': When several
-      PLACEs and FORMs are involved, the assignments take place in
-      parallel rather than sequentially.  Specifically, all subforms are
-      evaluated from left to right, then all the assignments are done
-      (in an undefined order).
- 
-  - Special Form: incf PLACE &optional X
-      This macro increments the number stored in PLACE by one, or by X
-      if specified.  The incremented value is returned.  For example,
-      `(incf i)' is equivalent to `(setq i (1+ i))', and `(incf (car x)
-      2)' is equivalent to `(setcar x (+ (car x) 2))'.
- 
-      Once again, care is taken to preserve the "apparent" order of
-      evaluation.  For example,
- 
-           (incf (aref vec (incf i)))
- 
-      appears to increment `i' once, then increment the element of `vec'
-      addressed by `i'; this is indeed exactly what it does, which means
-      the above form is *not* equivalent to the "obvious" expansion,
- 
-           (setf (aref vec (incf i)) (1+ (aref vec (incf i))))   ; Wrong!
- 
-      but rather to something more like
- 
-           (let ((temp (incf i)))
-             (setf (aref vec temp) (1+ (aref vec temp))))
- 
-      Again, all of this is taken care of automatically by `incf' and
-      the other generalized-variable macros.
- 
-      As a more Emacs-specific example of `incf', the expression `(incf
-      (point) N)' is essentially equivalent to `(forward-char N)'.
- 
-  - Special Form: decf PLACE &optional X
-      This macro decrements the number stored in PLACE by one, or by X
-      if specified.
- 
-  - Special Form: pop PLACE
-      This macro removes and returns the first element of the list stored
-      in PLACE.  It is analogous to `(prog1 (car PLACE) (setf PLACE (cdr
-      PLACE)))', except that it takes care to evaluate all subforms only
-      once.
- 
-  - Special Form: push X PLACE
-      This macro inserts X at the front of the list stored in PLACE.  It
-      is analogous to `(setf PLACE (cons X PLACE))', except for
-      evaluation of the subforms.
- 
-  - Special Form: pushnew X PLACE &key :test :test-not :key
-      This macro inserts X at the front of the list stored in PLACE, but
-      only if X was not `eql' to any existing element of the list.  The
-      optional keyword arguments are interpreted in the same way as for
-      `adjoin'.  *Note Lists as Sets::.
- 
-  - Special Form: shiftf PLACE... NEWVALUE
-      This macro shifts the PLACEs left by one, shifting in the value of
-      NEWVALUE (which may be any Lisp expression, not just a generalized
-      variable), and returning the value shifted out of the first PLACE.
-      Thus, `(shiftf A B C D)' is equivalent to
- 
-           (prog1
-               A
-             (psetf A B
-                    B C
-                    C D))
- 
-      except that the subforms of A, B, and C are actually evaluated
-      only once each and in the apparent order.
- 
-  - Special Form: rotatef PLACE...
-      This macro rotates the PLACEs left by one in circular fashion.
-      Thus, `(rotatef A B C D)' is equivalent to
- 
-           (psetf A B
-                  B C
-                  C D
-                  D A)
- 
-      except for the evaluation of subforms.  `rotatef' always returns
-      `nil'.  Note that `(rotatef A B)' conveniently exchanges A and B.
- 
-    The following macros were invented for this package; they have no
- analogues in Common Lisp.
- 
-  - Special Form: letf (BINDINGS...) FORMS...
-      This macro is analogous to `let', but for generalized variables
-      rather than just symbols.  Each BINDING should be of the form
-      `(PLACE VALUE)'; the original contents of the PLACEs are saved,
-      the VALUEs are stored in them, and then the body FORMs are
-      executed.  Afterwards, the PLACES are set back to their original
-      saved contents.  This cleanup happens even if the FORMs exit
-      irregularly due to a `throw' or an error.
- 
-      For example,
- 
-           (letf (((point) (point-min))
-                  (a 17))
-             ...)
- 
-      moves "point" in the current buffer to the beginning of the buffer,
-      and also binds `a' to 17 (as if by a normal `let', since `a' is
-      just a regular variable).  After the body exits, `a' is set back
-      to its original value and point is moved back to its original
-      position.
- 
-      Note that `letf' on `(point)' is not quite like a
-      `save-excursion', as the latter effectively saves a marker which
-      tracks insertions and deletions in the buffer.  Actually, a `letf'
-      of `(point-marker)' is much closer to this behavior.  (`point' and
-      `point-marker' are equivalent as `setf' places; each will accept
-      either an integer or a marker as the stored value.)
- 
-      Since generalized variables look like lists, `let''s shorthand of
-      using `foo' for `(foo nil)' as a BINDING would be ambiguous in
-      `letf' and is not allowed.
- 
-      However, a BINDING specifier may be a one-element list `(PLACE)',
-      which is similar to `(PLACE PLACE)'.  In other words, the PLACE is
-      not disturbed on entry to the body, and the only effect of the
-      `letf' is to restore the original value of PLACE afterwards.  (The
-      redundant access-and-store suggested by the `(PLACE PLACE)'
-      example does not actually occur.)
- 
-      In most cases, the PLACE must have a well-defined value on entry
-      to the `letf' form.  The only exceptions are plain variables and
-      calls to `symbol-value' and `symbol-function'.  If the symbol is
-      not bound on entry, it is simply made unbound by `makunbound' or
-      `fmakunbound' on exit.
- 
-  - Special Form: letf* (BINDINGS...) FORMS...
-      This macro is to `letf' what `let*' is to `let': It does the
-      bindings in sequential rather than parallel order.
- 
-  - Special Form: callf FUNCTION PLACE ARGS...
-      This is the "generic" modify macro.  It calls FUNCTION, which
-      should be an unquoted function name, macro name, or lambda.  It
-      passes PLACE and ARGS as arguments, and assigns the result back to
-      PLACE.  For example, `(incf PLACE N)' is the same as `(callf +
-      PLACE N)'.  Some more examples:
- 
-           (callf abs my-number)
-           (callf concat (buffer-name) "<" (int-to-string n) ">")
-           (callf union happy-people (list joe bob) :test 'same-person)
- 
-      *Note Customizing Setf::, for `define-modify-macro', a way to
-      create even more concise notations for modify macros.  Note again
-      that `callf' is an extension to standard Common Lisp.
- 
-  - Special Form: callf2 FUNCTION ARG1 PLACE ARGS...
-      This macro is like `callf', except that PLACE is the *second*
-      argument of FUNCTION rather than the first.  For example, `(push X
-      PLACE)' is equivalent to `(callf2 cons X PLACE)'.
- 
-    The `callf' and `callf2' macros serve as building blocks for other
- macros like `incf', `pushnew', and `define-modify-macro'.  The `letf'
- and `letf*' macros are used in the processing of symbol macros; *note
- Macro Bindings::..
- 
- 
- File: cl,  Node: Customizing Setf,  Prev: Modify Macros,  Up: Generalized Variables
- 
- Customizing Setf
- ----------------
- 
- Common Lisp defines three macros, `define-modify-macro', `defsetf', and
- `define-setf-method', that allow the user to extend generalized
- variables in various ways.
- 
-  - Special Form: define-modify-macro NAME ARGLIST FUNCTION [DOC-STRING]
-      This macro defines a "read-modify-write" macro similar to `incf'
-      and `decf'.  The macro NAME is defined to take a PLACE argument
-      followed by additional arguments described by ARGLIST.  The call
- 
-           (NAME PLACE ARGS...)
- 
-      will be expanded to
- 
-           (callf FUNC PLACE ARGS...)
- 
-      which in turn is roughly equivalent to
- 
-           (setf PLACE (FUNC PLACE ARGS...))
- 
-      For example:
- 
-           (define-modify-macro incf (&optional (n 1)) +)
-           (define-modify-macro concatf (&rest args) concat)
- 
-      Note that `&key' is not allowed in ARGLIST, but `&rest' is
-      sufficient to pass keywords on to the function.
- 
-      Most of the modify macros defined by Common Lisp do not exactly
-      follow the pattern of `define-modify-macro'.  For example, `push'
-      takes its arguments in the wrong order, and `pop' is completely
-      irregular.  You can define these macros "by hand" using
-      `get-setf-method', or consult the source file `cl-macs.el' to see
-      how to use the internal `setf' building blocks.
- 
-  - Special Form: defsetf ACCESS-FN UPDATE-FN
-      This is the simpler of two `defsetf' forms.  Where ACCESS-FN is
-      the name of a function which accesses a place, this declares
-      UPDATE-FN to be the corresponding store function.  From now on,
- 
-           (setf (ACCESS-FN ARG1 ARG2 ARG3) VALUE)
- 
-      will be expanded to
- 
-           (UPDATE-FN ARG1 ARG2 ARG3 VALUE)
- 
-      The UPDATE-FN is required to be either a true function, or a macro
-      which evaluates its arguments in a function-like way.  Also, the
-      UPDATE-FN is expected to return VALUE as its result.  Otherwise,
-      the above expansion would not obey the rules for the way `setf' is
-      supposed to behave.
- 
-      As a special (non-Common-Lisp) extension, a third argument of `t'
-      to `defsetf' says that the `update-fn''s return value is not
-      suitable, so that the above `setf' should be expanded to something
-      more like
- 
-           (let ((temp VALUE))
-             (UPDATE-FN ARG1 ARG2 ARG3 temp)
-             temp)
- 
-      Some examples of the use of `defsetf', drawn from the standard
-      suite of setf methods, are:
- 
-           (defsetf car setcar)
-           (defsetf symbol-value set)
-           (defsetf buffer-name rename-buffer t)
- 
-  - Special Form: defsetf ACCESS-FN ARGLIST (STORE-VAR) FORMS...
-      This is the second, more complex, form of `defsetf'.  It is rather
-      like `defmacro' except for the additional STORE-VAR argument.  The
-      FORMS should return a Lisp form which stores the value of
-      STORE-VAR into the generalized variable formed by a call to
-      ACCESS-FN with arguments described by ARGLIST.  The FORMS may
-      begin with a string which documents the `setf' method (analogous
-      to the doc string that appears at the front of a function).
- 
-      For example, the simple form of `defsetf' is shorthand for
- 
-           (defsetf ACCESS-FN (&rest args) (store)
-             (append '(UPDATE-FN) args (list store)))
- 
-      The Lisp form that is returned can access the arguments from
-      ARGLIST and STORE-VAR in an unrestricted fashion; macros like
-      `setf' and `incf' which invoke this setf-method will insert
-      temporary variables as needed to make sure the apparent order of
-      evaluation is preserved.
- 
-      Another example drawn from the standard package:
- 
-           (defsetf nth (n x) (store)
-             (list 'setcar (list 'nthcdr n x) store))
- 
-  - Special Form: define-setf-method ACCESS-FN ARGLIST FORMS...
-      This is the most general way to create new place forms.  When a
-      `setf' to ACCESS-FN with arguments described by ARGLIST is
-      expanded, the FORMS are evaluated and must return a list of five
-      items:
- 
-        1. A list of "temporary variables".
- 
-        2. A list of "value forms" corresponding to the temporary
-           variables above.  The temporary variables will be bound to
-           these value forms as the first step of any operation on the
-           generalized variable.
- 
-        3. A list of exactly one "store variable" (generally obtained
-           from a call to `gensym').
- 
-        4. A Lisp form which stores the contents of the store variable
-           into the generalized variable, assuming the temporaries have
-           been bound as described above.
- 
-        5. A Lisp form which accesses the contents of the generalized
-           variable, assuming the temporaries have been bound.
- 
-      This is exactly like the Common Lisp macro of the same name,
-      except that the method returns a list of five values rather than
-      the five values themselves, since Emacs Lisp does not support
-      Common Lisp's notion of multiple return values.
- 
-      Once again, the FORMS may begin with a documentation string.
- 
-      A setf-method should be maximally conservative with regard to
-      temporary variables.  In the setf-methods generated by `defsetf',
-      the second return value is simply the list of arguments in the
-      place form, and the first return value is a list of a
-      corresponding number of temporary variables generated by `gensym'.
-      Macros like `setf' and `incf' which use this setf-method will
-      optimize away most temporaries that turn out to be unnecessary, so
-      there is little reason for the setf-method itself to optimize.
- 
-  - Function: get-setf-method PLACE &optional ENV
-      This function returns the setf-method for PLACE, by invoking the
-      definition previously recorded by `defsetf' or
-      `define-setf-method'.  The result is a list of five values as
-      described above.  You can use this function to build your own
-      `incf'-like modify macros.  (Actually, it is better to use the
-      internal functions `cl-setf-do-modify' and `cl-setf-do-store',
-      which are a bit easier to use and which also do a number of
-      optimizations; consult the source code for the `incf' function for
-      a simple example.)
- 
-      The argument ENV specifies the "environment" to be passed on to
-      `macroexpand' if `get-setf-method' should need to expand a macro
-      in PLACE.  It should come from an `&environment' argument to the
-      macro or setf-method that called `get-setf-method'.
- 
-      See also the source code for the setf-methods for `apply' and
-      `substring', each of which works by calling `get-setf-method' on a
-      simpler case, then massaging the result in various ways.
- 
-    Modern Common Lisp defines a second, independent way to specify the
- `setf' behavior of a function, namely "`setf' functions" whose names
- are lists `(setf NAME)' rather than symbols.  For example, `(defun
- (setf foo) ...)' defines the function that is used when `setf' is
- applied to `foo'.  This package does not currently support `setf'
- functions.  In particular, it is a compile-time error to use `setf' on
- a form which has not already been `defsetf''d or otherwise declared; in
- newer Common Lisps, this would not be an error since the function
- `(setf FUNC)' might be defined later.
- 
- 
- File: cl,  Node: Variable Bindings,  Next: Conditionals,  Prev: Generalized Variables,  Up: Control Structure
- 
- Variable Bindings
- =================
- 
- These Lisp forms make bindings to variables and function names,
- analogous to Lisp's built-in `let' form.
- 
-    *Note Modify Macros::, for the `letf' and `letf*' forms which are
- also related to variable bindings.
- 
- * Menu:
- 
- * Dynamic Bindings::     The `progv' form
- * Lexical Bindings::     `lexical-let' and lexical closures
- * Function Bindings::    `flet' and `labels'
- * Macro Bindings::       `macrolet' and `symbol-macrolet'
- 
- 
- File: cl,  Node: Dynamic Bindings,  Next: Lexical Bindings,  Prev: Variable Bindings,  Up: Variable Bindings
- 
- Dynamic Bindings
- ----------------
- 
- The standard `let' form binds variables whose names are known at
- compile-time.  The `progv' form provides an easy way to bind variables
- whose names are computed at run-time.
- 
-  - Special Form: progv SYMBOLS VALUES FORMS...
-      This form establishes `let'-style variable bindings on a set of
-      variables computed at run-time.  The expressions SYMBOLS and
-      VALUES are evaluated, and must return lists of symbols and values,
-      respectively.  The symbols are bound to the corresponding values
-      for the duration of the body FORMs.  If VALUES is shorter than
-      SYMBOLS, the last few symbols are made unbound (as if by
-      `makunbound') inside the body.  If SYMBOLS is shorter than VALUES,
-      the excess values are ignored.
- 
- 
- File: cl,  Node: Lexical Bindings,  Next: Function Bindings,  Prev: Dynamic Bindings,  Up: Variable Bindings
- 
- Lexical Bindings
- ----------------
- 
- The "CL" package defines the following macro which more closely follows
- the Common Lisp `let' form:
- 
-  - Special Form: lexical-let (BINDINGS...) FORMS...
-      This form is exactly like `let' except that the bindings it
-      establishes are purely lexical.  Lexical bindings are similar to
-      local variables in a language like C:  Only the code physically
-      within the body of the `lexical-let' (after macro expansion) may
-      refer to the bound variables.
- 
-           (setq a 5)
-           (defun foo (b) (+ a b))
-           (let ((a 2)) (foo a))
-                => 4
-           (lexical-let ((a 2)) (foo a))
-                => 7
- 
-      In this example, a regular `let' binding of `a' actually makes a
-      temporary change to the global variable `a', so `foo' is able to
-      see the binding of `a' to 2.  But `lexical-let' actually creates a
-      distinct local variable `a' for use within its body, without any
-      effect on the global variable of the same name.
- 
-      The most important use of lexical bindings is to create "closures".
-      A closure is a function object that refers to an outside lexical
-      variable.  For example:
- 
-           (defun make-adder (n)
-             (lexical-let ((n n))
-               (function (lambda (m) (+ n m)))))
-           (setq add17 (make-adder 17))
-           (funcall add17 4)
-                => 21
- 
-      The call `(make-adder 17)' returns a function object which adds 17
-      to its argument.  If `let' had been used instead of `lexical-let',
-      the function object would have referred to the global `n', which
-      would have been bound to 17 only during the call to `make-adder'
-      itself.
- 
-           (defun make-counter ()
-             (lexical-let ((n 0))
-               (function* (lambda (&optional (m 1)) (incf n m)))))
-           (setq count-1 (make-counter))
-           (funcall count-1 3)
-                => 3
-           (funcall count-1 14)
-                => 17
-           (setq count-2 (make-counter))
-           (funcall count-2 5)
-                => 5
-           (funcall count-1 2)
-                => 19
-           (funcall count-2)
-                => 6
- 
-      Here we see that each call to `make-counter' creates a distinct
-      local variable `n', which serves as a private counter for the
-      function object that is returned.
- 
-      Closed-over lexical variables persist until the last reference to
-      them goes away, just like all other Lisp objects.  For example,
-      `count-2' refers to a function object which refers to an instance
-      of the variable `n'; this is the only reference to that variable,
-      so after `(setq count-2 nil)' the garbage collector would be able
-      to delete this instance of `n'.  Of course, if a `lexical-let'
-      does not actually create any closures, then the lexical variables
-      are free as soon as the `lexical-let' returns.
- 
-      Many closures are used only during the extent of the bindings they
-      refer to; these are known as "downward funargs" in Lisp parlance.
-      When a closure is used in this way, regular Emacs Lisp dynamic
-      bindings suffice and will be more efficient than `lexical-let'
-      closures:
- 
-           (defun add-to-list (x list)
-             (mapcar (function (lambda (y) (+ x y))) list))
-           (add-to-list 7 '(1 2 5))
-                => (8 9 12)
- 
-      Since this lambda is only used while `x' is still bound, it is not
-      necessary to make a true closure out of it.
- 
-      You can use `defun' or `flet' inside a `lexical-let' to create a
-      named closure.  If several closures are created in the body of a
-      single `lexical-let', they all close over the same instance of the
-      lexical variable.
- 
-      The `lexical-let' form is an extension to Common Lisp.  In true
-      Common Lisp, all bindings are lexical unless declared otherwise.
- 
-  - Special Form: lexical-let* (BINDINGS...) FORMS...
-      This form is just like `lexical-let', except that the bindings are
-      made sequentially in the manner of `let*'.
- 
- 
- File: cl,  Node: Function Bindings,  Next: Macro Bindings,  Prev: Lexical Bindings,  Up: Variable Bindings
- 
- Function Bindings
- -----------------
- 
- These forms make `let'-like bindings to functions instead of variables.
- 
-  - Special Form: flet (BINDINGS...) FORMS...
-      This form establishes `let'-style bindings on the function cells
-      of symbols rather than on the value cells.  Each BINDING must be a
-      list of the form `(NAME ARGLIST FORMS...)', which defines a
-      function exactly as if it were a `defun*' form.  The function NAME
-      is defined accordingly for the duration of the body of the `flet';
-      then the old function definition, or lack thereof, is restored.
- 
-      While `flet' in Common Lisp establishes a lexical binding of NAME,
-      Emacs Lisp `flet' makes a dynamic binding.  The result is that
-      `flet' affects indirect calls to a function as well as calls
-      directly inside the `flet' form itself.
- 
-      You can use `flet' to disable or modify the behavior of a function
-      in a temporary fashion.  This will even work on Emacs primitives,
-      although note that some calls to primitive functions internal to
-      Emacs are made without going through the symbol's function cell,
-      and so will not be affected by `flet'.  For example,
- 
-           (flet ((message (&rest args) (push args saved-msgs)))
-             (do-something))
- 
-      This code attempts to replace the built-in function `message' with
-      a function that simply saves the messages in a list rather than
-      displaying them.  The original definition of `message' will be
-      restored after `do-something' exits.  This code will work fine on
-      messages generated by other Lisp code, but messages generated
-      directly inside Emacs will not be caught since they make direct
-      C-language calls to the message routines rather than going through
-      the Lisp `message' function.
- 
-      Functions defined by `flet' may use the full Common Lisp argument
-      notation supported by `defun*'; also, the function body is
-      enclosed in an implicit block as if by `defun*'.  *Note Program
-      Structure::.
- 
-  - Special Form: labels (BINDINGS...) FORMS...
-      The `labels' form is a synonym for `flet'.  (In Common Lisp,
-      `labels' and `flet' differ in ways that depend on their lexical
-      scoping; these distinctions vanish in dynamically scoped Emacs
-      Lisp.)
- 
- 
- File: cl,  Node: Macro Bindings,  Prev: Function Bindings,  Up: Variable Bindings
- 
- Macro Bindings
- --------------
- 
- These forms create local macros and "symbol macros."
- 
-  - Special Form: macrolet (BINDINGS...) FORMS...
-      This form is analogous to `flet', but for macros instead of
-      functions.  Each BINDING is a list of the same form as the
-      arguments to `defmacro*' (i.e., a macro name, argument list, and
-      macro-expander forms).  The macro is defined accordingly for use
-      within the body of the `macrolet'.
- 
-      Because of the nature of macros, `macrolet' is lexically scoped
-      even in Emacs Lisp:  The `macrolet' binding will affect only calls
-      that appear physically within the body FORMS, possibly after
-      expansion of other macros in the body.
- 
-  - Special Form: symbol-macrolet (BINDINGS...) FORMS...
-      This form creates "symbol macros", which are macros that look like
-      variable references rather than function calls.  Each BINDING is a
-      list `(VAR EXPANSION)'; any reference to VAR within the body FORMS
-      is replaced by EXPANSION.
- 
-           (setq bar '(5 . 9))
-           (symbol-macrolet ((foo (car bar)))
-             (incf foo))
-           bar
-                => (6 . 9)
- 
-      A `setq' of a symbol macro is treated the same as a `setf'.  I.e.,
-      `(setq foo 4)' in the above would be equivalent to `(setf foo 4)',
-      which in turn expands to `(setf (car bar) 4)'.
- 
-      Likewise, a `let' or `let*' binding a symbol macro is treated like
-      a `letf' or `letf*'.  This differs from true Common Lisp, where
-      the rules of lexical scoping cause a `let' binding to shadow a
-      `symbol-macrolet' binding.  In this package, only `lexical-let'
-      and `lexical-let*' will shadow a symbol macro.
- 
-      There is no analogue of `defmacro' for symbol macros; all symbol
-      macros are local.  A typical use of `symbol-macrolet' is in the
-      expansion of another macro:
- 
-           (defmacro* my-dolist ((x list) &rest body)
-             (let ((var (gensym)))
-               (list 'loop 'for var 'on list 'do
-                     (list* 'symbol-macrolet (list (list x (list 'car var)))
-                            body))))
-           
-           (setq mylist '(1 2 3 4))
-           (my-dolist (x mylist) (incf x))
-           mylist
-                => (2 3 4 5)
- 
-      In this example, the `my-dolist' macro is similar to `dolist'
-      (*note Iteration::.) except that the variable `x' becomes a true
-      reference onto the elements of the list.  The `my-dolist' call
-      shown here expands to
- 
-           (loop for G1234 on mylist do
-                 (symbol-macrolet ((x (car G1234)))
-                   (incf x)))
- 
-      which in turn expands to
- 
-           (loop for G1234 on mylist do (incf (car G1234)))
- 
-      *Note Loop Facility::, for a description of the `loop' macro.
-      This package defines a nonstandard `in-ref' loop clause that works
-      much like `my-dolist'.
- 
- 
- File: cl,  Node: Conditionals,  Next: Blocks and Exits,  Prev: Variable Bindings,  Up: Control Structure
- 
- Conditionals
- ============
- 
- These conditional forms augment Emacs Lisp's simple `if', `and', `or',
- and `cond' forms.
- 
-  - Special Form: when TEST FORMS...
-      This is a variant of `if' where there are no "else" forms, and
-      possibly several "then" forms.  In particular,
- 
-           (when TEST A B C)
- 
-      is entirely equivalent to
- 
-           (if TEST (progn A B C) nil)
- 
-  - Special Form: unless TEST FORMS...
-      This is a variant of `if' where there are no "then" forms, and
-      possibly several "else" forms:
- 
-           (unless TEST A B C)
- 
-      is entirely equivalent to
- 
-           (when (not TEST) A B C)
- 
-  - Special Form: case KEYFORM CLAUSE...
-      This macro evaluates KEYFORM, then compares it with the key values
-      listed in the various CLAUSEs.  Whichever clause matches the key
-      is executed; comparison is done by `eql'.  If no clause matches,
-      the `case' form returns `nil'.  The clauses are of the form
- 
-           (KEYLIST BODY-FORMS...)
- 
-      where KEYLIST is a list of key values.  If there is exactly one
-      value, and it is not a cons cell or the symbol `nil' or `t', then
-      it can be used by itself as a KEYLIST without being enclosed in a
-      list.  All key values in the `case' form must be distinct.  The
-      final clauses may use `t' in place of a KEYLIST to indicate a
-      default clause that should be taken if none of the other clauses
-      match.  (The symbol `otherwise' is also recognized in place of
-      `t'.  To make a clause that matches the actual symbol `t', `nil',
-      or `otherwise', enclose the symbol in a list.)
- 
-      For example, this expression reads a keystroke, then does one of
-      four things depending on whether it is an `a', a `b', a RET or
-      LFD, or anything else.
- 
-           (case (read-char)
-             (?a (do-a-thing))
-             (?b (do-b-thing))
-             ((?\r ?\n) (do-ret-thing))
-             (t (do-other-thing)))
- 
-  - Special Form: ecase KEYFORM CLAUSE...
-      This macro is just like `case', except that if the key does not
-      match any of the clauses, an error is signalled rather than simply
-      returning `nil'.
- 
-  - Special Form: typecase KEYFORM CLAUSE...
-      This macro is a version of `case' that checks for types rather
-      than values.  Each CLAUSE is of the form `(TYPE BODY...)'.  *Note
-      Type Predicates::, for a description of type specifiers.  For
-      example,
- 
-           (typecase x
-             (integer (munch-integer x))
-             (float (munch-float x))
-             (string (munch-integer (string-to-int x)))
-             (t (munch-anything x)))
- 
-      The type specifier `t' matches any type of object; the word
-      `otherwise' is also allowed.  To make one clause match any of
-      several types, use an `(or ...)' type specifier.
- 
-  - Special Form: etypecase KEYFORM CLAUSE...
-      This macro is just like `typecase', except that if the key does
-      not match any of the clauses, an error is signalled rather than
-      simply returning `nil'.
- 
- 
- File: cl,  Node: Blocks and Exits,  Next: Iteration,  Prev: Conditionals,  Up: Control Structure
- 
- Blocks and Exits
- ================
- 
- Common Lisp "blocks" provide a non-local exit mechanism very similar to
- `catch' and `throw', but lexically rather than dynamically scoped.
- This package actually implements `block' in terms of `catch'; however,
- the lexical scoping allows the optimizing byte-compiler to omit the
- costly `catch' step if the body of the block does not actually
- `return-from' the block.
- 
-  - Special Form: block NAME FORMS...
-      The FORMS are evaluated as if by a `progn'.  However, if any of
-      the FORMS execute `(return-from NAME)', they will jump out and
-      return directly from the `block' form.  The `block' returns the
-      result of the last FORM unless a `return-from' occurs.
- 
-      The `block'/`return-from' mechanism is quite similar to the
-      `catch'/`throw' mechanism.  The main differences are that block
-      NAMEs are unevaluated symbols, rather than forms (such as quoted
-      symbols) which evaluate to a tag at run-time; and also that blocks
-      are lexically scoped whereas `catch'/`throw' are dynamically
-      scoped.  This means that functions called from the body of a
-      `catch' can also `throw' to the `catch', but the `return-from'
-      referring to a block name must appear physically within the FORMS
-      that make up the body of the block.  They may not appear within
-      other called functions, although they may appear within macro
-      expansions or `lambda's in the body.  Block names and `catch'
-      names form independent name-spaces.
- 
-      In true Common Lisp, `defun' and `defmacro' surround the function
-      or expander bodies with implicit blocks with the same name as the
-      function or macro.  This does not occur in Emacs Lisp, but this
-      package provides `defun*' and `defmacro*' forms which do create
-      the implicit block.
- 
-      The Common Lisp looping constructs defined by this package, such
-      as `loop' and `dolist', also create implicit blocks just as in
-      Common Lisp.
- 
-      Because they are implemented in terms of Emacs Lisp `catch' and
-      `throw', blocks have the same overhead as actual `catch'
-      constructs (roughly two function calls).  However, Zawinski and
-      Furuseth's optimizing byte compiler (standard in Emacs 19) will
-      optimize away the `catch' if the block does not in fact contain
-      any `return' or `return-from' calls that jump to it.  This means
-      that `do' loops and `defun*' functions which don't use `return'
-      don't pay the overhead to support it.
- 
-  - Special Form: return-from NAME [RESULT]
-      This macro returns from the block named NAME, which must be an
-      (unevaluated) symbol.  If a RESULT form is specified, it is
-      evaluated to produce the result returned from the `block'.
-      Otherwise, `nil' is returned.
- 
-  - Special Form: return [RESULT]
-      This macro is exactly like `(return-from nil RESULT)'.  Common
-      Lisp loops like `do' and `dolist' implicitly enclose themselves in
-      `nil' blocks.
- 
- 
- File: cl,  Node: Iteration,  Next: Loop Facility,  Prev: Blocks and Exits,  Up: Control Structure
- 
- Iteration
- =========
- 
- The macros described here provide more sophisticated, high-level
- looping constructs to complement Emacs Lisp's basic `while' loop.
- 
-  - Special Form: loop FORMS...
-      The "CL" package supports both the simple, old-style meaning of
-      `loop' and the extremely powerful and flexible feature known as
-      the "Loop Facility" or "Loop Macro".  This more advanced facility
-      is discussed in the following section; *note Loop Facility::..
-      The simple form of `loop' is described here.
- 
-      If `loop' is followed by zero or more Lisp expressions, then
-      `(loop EXPRS...)' simply creates an infinite loop executing the
-      expressions over and over.  The loop is enclosed in an implicit
-      `nil' block.  Thus,
- 
-           (loop (foo)  (if (no-more) (return 72))  (bar))
- 
-      is exactly equivalent to
- 
-           (block nil (while t (foo)  (if (no-more) (return 72))  (bar)))
- 
-      If any of the expressions are plain symbols, the loop is instead
-      interpreted as a Loop Macro specification as described later.
-      (This is not a restriction in practice, since a plain symbol in
-      the above notation would simply access and throw away the value of
-      a variable.)
- 
-  - Special Form: do (SPEC...) (END-TEST [RESULT...]) FORMS...
-      This macro creates a general iterative loop.  Each SPEC is of the
-      form
- 
-           (VAR [INIT [STEP]])
- 
-      The loop works as follows:  First, each VAR is bound to the
-      associated INIT value as if by a `let' form.  Then, in each
-      iteration of the loop, the END-TEST is evaluated; if true, the
-      loop is finished.  Otherwise, the body FORMS are evaluated, then
-      each VAR is set to the associated STEP expression (as if by a
-      `psetq' form) and the next iteration begins.  Once the END-TEST
-      becomes true, the RESULT forms are evaluated (with the VARs still
-      bound to their values) to produce the result returned by `do'.
- 
-      The entire `do' loop is enclosed in an implicit `nil' block, so
-      that you can use `(return)' to break out of the loop at any time.
- 
-      If there are no RESULT forms, the loop returns `nil'.  If a given
-      VAR has no STEP form, it is bound to its INIT value but not
-      otherwise modified during the `do' loop (unless the code
-      explicitly modifies it); this case is just a shorthand for putting
-      a `(let ((VAR INIT)) ...)' around the loop.  If INIT is also
-      omitted it defaults to `nil', and in this case a plain `VAR' can
-      be used in place of `(VAR)', again following the analogy with
-      `let'.
- 
-      This example (from Steele) illustrates a loop which applies the
-      function `f' to successive pairs of values from the lists `foo'
-      and `bar'; it is equivalent to the call `(mapcar* 'f foo bar)'.
-      Note that this loop has no body FORMS at all, performing all its
-      work as side effects of the rest of the loop.
- 
-           (do ((x foo (cdr x))
-                (y bar (cdr y))
-                (z nil (cons (f (car x) (car y)) z)))
-             ((or (null x) (null y))
-              (nreverse z)))
- 
-  - Special Form: do* (SPEC...) (END-TEST [RESULT...]) FORMS...
-      This is to `do' what `let*' is to `let'.  In particular, the
-      initial values are bound as if by `let*' rather than `let', and
-      the steps are assigned as if by `setq' rather than `psetq'.
- 
-      Here is another way to write the above loop:
- 
-           (do* ((xp foo (cdr xp))
-                 (yp bar (cdr yp))
-                 (x (car xp) (car xp))
-                 (y (car yp) (car yp))
-                 z)
-             ((or (null xp) (null yp))
-              (nreverse z))
-             (push (f x y) z))
- 
-  - Special Form: dolist (VAR LIST [RESULT]) FORMS...
-      This is a more specialized loop which iterates across the elements
-      of a list.  LIST should evaluate to a list; the body FORMS are
-      executed with VAR bound to each element of the list in turn.
-      Finally, the RESULT form (or `nil') is evaluated with VAR bound to
-      `nil' to produce the result returned by the loop.  The loop is
-      surrounded by an implicit `nil' block.
- 
-  - Special Form: dotimes (VAR COUNT [RESULT]) FORMS...
-      This is a more specialized loop which iterates a specified number
-      of times.  The body is executed with VAR bound to the integers
-      from zero (inclusive) to COUNT (exclusive), in turn.  Then the
-      `result' form is evaluated with VAR bound to the total number of
-      iterations that were done (i.e., `(max 0 COUNT)') to get the
-      return value for the loop form.  The loop is surrounded by an
-      implicit `nil' block.
- 
-  - Special Form: do-symbols (VAR [OBARRAY [RESULT]]) FORMS...
-      This loop iterates over all interned symbols.  If OBARRAY is
-      specified and is not `nil', it loops over all symbols in that
-      obarray.  For each symbol, the body FORMS are evaluated with VAR
-      bound to that symbol.  The symbols are visited in an unspecified
-      order.  Afterward the RESULT form, if any, is evaluated (with VAR
-      bound to `nil') to get the return value.  The loop is surrounded
-      by an implicit `nil' block.
- 
-  - Special Form: do-all-symbols (VAR [RESULT]) FORMS...
-      This is identical to `do-symbols' except that the OBARRAY argument
-      is omitted; it always iterates over the default obarray.
- 
-    *Note Mapping over Sequences::, for some more functions for
- iterating over vectors or lists.
- 
- 
- File: cl,  Node: Loop Facility,  Next: Multiple Values,  Prev: Iteration,  Up: Control Structure
- 
- Loop Facility
- =============
- 
- A common complaint with Lisp's traditional looping constructs is that
- they are either too simple and limited, such as Common Lisp's `dotimes'
- or Emacs Lisp's `while', or too unreadable and obscure, like Common
- Lisp's `do' loop.
- 
-    To remedy this, recent versions of Common Lisp have added a new
- construct called the "Loop Facility" or "`loop' macro," with an
- easy-to-use but very powerful and expressive syntax.
- 
- * Menu:
- 
- * Loop Basics::           `loop' macro, basic clause structure
- * Loop Examples::         Working examples of `loop' macro
- * For Clauses::           Clauses introduced by `for' or `as'
- * Iteration Clauses::     `repeat', `while', `thereis', etc.
- * Accumulation Clauses::  `collect', `sum', `maximize', etc.
- * Other Clauses::         `with', `if', `initially', `finally'
- 
- 
- File: cl,  Node: Loop Basics,  Next: Loop Examples,  Prev: Loop Facility,  Up: Loop Facility
- 
- Loop Basics
- -----------
- 
- The `loop' macro essentially creates a mini-language within Lisp that
- is specially tailored for describing loops.  While this language is a
- little strange-looking by the standards of regular Lisp, it turns out
- to be very easy to learn and well-suited to its purpose.
- 
-    Since `loop' is a macro, all parsing of the loop language takes
- place at byte-compile time; compiled `loop's are just as efficient as
- the equivalent `while' loops written longhand.
- 
-  - Special Form: loop CLAUSES...
-      A loop construct consists of a series of CLAUSEs, each introduced
-      by a symbol like `for' or `do'.  Clauses are simply strung
-      together in the argument list of `loop', with minimal extra
-      parentheses.  The various types of clauses specify
-      initializations, such as the binding of temporary variables,
-      actions to be taken in the loop, stepping actions, and final
-      cleanup.
- 
-      Common Lisp specifies a certain general order of clauses in a loop:
- 
-           (loop NAME-CLAUSE
-                 VAR-CLAUSES...
-                 ACTION-CLAUSES...)
- 
-      The NAME-CLAUSE optionally gives a name to the implicit block that
-      surrounds the loop.  By default, the implicit block is named
-      `nil'.  The VAR-CLAUSES specify what variables should be bound
-      during the loop, and how they should be modified or iterated
-      throughout the course of the loop.  The ACTION-CLAUSES are things
-      to be done during the loop, such as computing, collecting, and
-      returning values.
- 
-      The Emacs version of the `loop' macro is less restrictive about
-      the order of clauses, but things will behave most predictably if
-      you put the variable-binding clauses `with', `for', and `repeat'
-      before the action clauses.  As in Common Lisp, `initially' and
-      `finally' clauses can go anywhere.
- 
-      Loops generally return `nil' by default, but you can cause them to
-      return a value by using an accumulation clause like `collect', an
-      end-test clause like `always', or an explicit `return' clause to
-      jump out of the implicit block.  (Because the loop body is
-      enclosed in an implicit block, you can also use regular Lisp
-      `return' or `return-from' to break out of the loop.)
- 
-    The following sections give some examples of the Loop Macro in
- action, and describe the particular loop clauses in great detail.
- Consult the second edition of Steele's "Common Lisp, the Language", for
- additional discussion and examples of the `loop' macro.
- 
- 
- File: cl,  Node: Loop Examples,  Next: For Clauses,  Prev: Loop Basics,  Up: Loop Facility
- 
- Loop Examples
- -------------
- 
- Before listing the full set of clauses that are allowed, let's look at
- a few example loops just to get a feel for the `loop' language.
- 
-      (loop for buf in (buffer-list)
-            collect (buffer-file-name buf))
- 
- This loop iterates over all Emacs buffers, using the list returned by
- `buffer-list'.  For each buffer `buf', it calls `buffer-file-name' and
- collects the results into a list, which is then returned from the
- `loop' construct.  The result is a list of the file names of all the
- buffers in Emacs' memory.  The words `for', `in', and `collect' are
- reserved words in the `loop' language.
- 
-      (loop repeat 20 do (insert "Yowsa\n"))
- 
- This loop inserts the phrase "Yowsa" twenty times in the current buffer.
- 
-      (loop until (eobp) do (munch-line) (forward-line 1))
- 
- This loop calls `munch-line' on every line until the end of the buffer.
- If point is already at the end of the buffer, the loop exits
- immediately.
- 
-      (loop do (munch-line) until (eobp) do (forward-line 1))
- 
- This loop is similar to the above one, except that `munch-line' is
- always called at least once.
- 
-      (loop for x from 1 to 100
-            for y = (* x x)
-            until (>= y 729)
-            finally return (list x (= y 729)))
- 
- This more complicated loop searches for a number `x' whose square is
- 729.  For safety's sake it only examines `x' values up to 100; dropping
- the phrase `to 100' would cause the loop to count upwards with no
- limit.  The second `for' clause defines `y' to be the square of `x'
- within the loop; the expression after the `=' sign is reevaluated each
- time through the loop.  The `until' clause gives a condition for
- terminating the loop, and the `finally' clause says what to do when the
- loop finishes.  (This particular example was written less concisely
- than it could have been, just for the sake of illustration.)
- 
-    Note that even though this loop contains three clauses (two `for's
- and an `until') that would have been enough to define loops all by
- themselves, it still creates a single loop rather than some sort of
- triple-nested loop.  You must explicitly nest your `loop' constructs if
- you want nested loops.
- 
--- 0 ----
Index: emacs/info/cl-3
diff -c emacs/info/cl-3:1.1.1.1 emacs/info/cl-3:removed
*** emacs/info/cl-3:1.1.1.1	Fri Jul 19 01:55:00 1996
--- emacs/info/cl-3	Fri Aug  2 19:58:37 1996
***************
*** 1,1138 ****
- This is Info file ../info/cl, produced by Makeinfo-1.55 from the input
- file cl.texi.
- 
-    This file documents the GNU Emacs Common Lisp emulation package.
- 
-    Copyright (C) 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "GNU General Public License" is included
- exactly as in the original, and provided that the entire resulting
- derived work is distributed under the terms of a permission notice
- identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the section entitled "GNU General Public License"
- may be included in a translation approved by the author instead of in
- the original English.
- 
- 
- File: cl,  Node: For Clauses,  Next: Iteration Clauses,  Prev: Loop Examples,  Up: Loop Facility
- 
- For Clauses
- -----------
- 
- Most loops are governed by one or more `for' clauses.  A `for' clause
- simultaneously describes variables to be bound, how those variables are
- to be stepped during the loop, and usually an end condition based on
- those variables.
- 
-    The word `as' is a synonym for the word `for'.  This word is
- followed by a variable name, then a word like `from' or `across' that
- describes the kind of iteration desired.  In Common Lisp, the phrase
- `being the' sometimes precedes the type of iteration; in this package
- both `being' and `the' are optional.  The word `each' is a synonym for
- `the', and the word that follows it may be singular or plural:  `for x
- being the elements of y' or `for x being each element of y'.  Which
- form you use is purely a matter of style.
- 
-    The variable is bound around the loop as if by `let':
- 
-      (setq i 'happy)
-      (loop for i from 1 to 10 do (do-something-with i))
-      i
-           => happy
- 
- `for VAR from EXPR1 to EXPR2 by EXPR3'
-      This type of `for' clause creates a counting loop.  Each of the
-      three sub-terms is optional, though there must be at least one
-      term so that the clause is marked as a counting clause.
- 
-      The three expressions are the starting value, the ending value, and
-      the step value, respectively, of the variable.  The loop counts
-      upwards by default (EXPR3 must be positive), from EXPR1 to EXPR2
-      inclusively.  If you omit the `from' term, the loop counts from
-      zero; if you omit the `to' term, the loop counts forever without
-      stopping (unless stopped by some other loop clause, of course); if
-      you omit the `by' term, the loop counts in steps of one.
- 
-      You can replace the word `from' with `upfrom' or `downfrom' to
-      indicate the direction of the loop.  Likewise, you can replace
-      `to' with `upto' or `downto'.  For example, `for x from 5 downto
-      1' executes five times with `x' taking on the integers from 5 down
-      to 1 in turn.  Also, you can replace `to' with `below' or `above',
-      which are like `upto' and `downto' respectively except that they
-      are exclusive rather than inclusive limits:
- 
-           (loop for x to 10 collect x)
-                => (0 1 2 3 4 5 6 7 8 9 10)
-           (loop for x below 10 collect x)
-                => (0 1 2 3 4 5 6 7 8 9)
- 
-      The `by' value is always positive, even for downward-counting
-      loops.  Some sort of `from' value is required for downward loops;
-      `for x downto 5' is not a legal loop clause all by itself.
- 
- `for VAR in LIST by FUNCTION'
-      This clause iterates VAR over all the elements of LIST, in turn.
-      If you specify the `by' term, then FUNCTION is used to traverse
-      the list instead of `cdr'; it must be a function taking one
-      argument.  For example:
- 
-           (loop for x in '(1 2 3 4 5 6) collect (* x x))
-                => (1 4 9 16 25 36)
-           (loop for x in '(1 2 3 4 5 6) by 'cddr collect (* x x))
-                => (1 9 25)
- 
- `for VAR on LIST by FUNCTION'
-      This clause iterates VAR over all the cons cells of LIST.
- 
-           (loop for x on '(1 2 3 4) collect x)
-                => ((1 2 3 4) (2 3 4) (3 4) (4))
- 
-      With `by', there is no real reason that the `on' expression must
-      be a list.  For example:
- 
-           (loop for x on first-animal by 'next-animal collect x)
- 
-      where `(next-animal x)' takes an "animal" X and returns the next
-      in the (assumed) sequence of animals, or `nil' if X was the last
-      animal in the sequence.
- 
- `for VAR in-ref LIST by FUNCTION'
-      This is like a regular `in' clause, but VAR becomes a `setf'-able
-      "reference" onto the elements of the list rather than just a
-      temporary variable.  For example,
- 
-           (loop for x in-ref my-list do (incf x))
- 
-      increments every element of `my-list' in place.  This clause is an
-      extension to standard Common Lisp.
- 
- `for VAR across ARRAY'
-      This clause iterates VAR over all the elements of ARRAY, which may
-      be a vector or a string.
- 
-           (loop for x across "aeiou"
-                 do (use-vowel (char-to-string x)))
- 
- `for VAR across-ref ARRAY'
-      This clause iterates over an array, with VAR a `setf'-able
-      reference onto the elements; see `in-ref' above.
- 
- `for VAR being the elements of SEQUENCE'
-      This clause iterates over the elements of SEQUENCE, which may be a
-      list, vector, or string.  Since the type must be determined at
-      run-time, this is somewhat less efficient than `in' or `across'.
-      The clause may be followed by the additional term `using (index
-      VAR2)' to cause VAR2 to be bound to the successive indices
-      (starting at 0) of the elements.
- 
-      This clause type is taken from older versions of the `loop' macro,
-      and is not present in modern Common Lisp.  The `using (sequence
-      ...)' term of the older macros is not supported.
- 
- `for VAR being the elements of-ref SEQUENCE'
-      This clause iterates over a sequence, with VAR a `setf'-able
-      reference onto the elements; see `in-ref' above.
- 
- `for VAR being the symbols [of OBARRAY]'
-      This clause iterates over symbols, either over all interned symbols
-      or over all symbols in OBARRAY.  The loop is executed with VAR
-      bound to each symbol in turn.  The symbols are visited in an
-      unspecified order.
- 
-      As an example,
- 
-           (loop for sym being the symbols
-                 when (fboundp sym)
-                 when (string-match "^map" (symbol-name sym))
-                 collect sym)
- 
-      returns a list of all the functions whose names begin with `map'.
- 
-      The Common Lisp words `external-symbols' and `present-symbols' are
-      also recognized but are equivalent to `symbols' in Emacs Lisp.
- 
-      Due to a minor implementation restriction, it will not work to have
-      more than one `for' clause iterating over symbols, hash tables,
-      keymaps, overlays, or intervals in a given `loop'.  Fortunately,
-      it would rarely if ever be useful to do so.  It *is* legal to mix
-      one of these types of clauses with other clauses like `for ... to'
-      or `while'.
- 
- `for VAR being the hash-keys of HASH-TABLE'
-      This clause iterates over the entries in HASH-TABLE.  For each
-      hash table entry, VAR is bound to the entry's key.  If you write
-      `the hash-values' instead, VAR is bound to the values of the
-      entries.  The clause may be followed by the additional term `using
-      (hash-values VAR2)' (where `hash-values' is the opposite word of
-      the word following `the') to cause VAR and VAR2 to be bound to the
-      two parts of each hash table entry.
- 
- `for VAR being the key-codes of KEYMAP'
-      This clause iterates over the entries in KEYMAP.  In GNU Emacs 18
-      and 19, keymaps are either alists or vectors, and key-codes are
-      integers or symbols.  In Lucid Emacs 19, keymaps are a special new
-      data type, and key-codes are symbols or lists of symbols.  The
-      iteration does not enter nested keymaps or inherited (parent)
-      keymaps.  You can use `the key-bindings' to access the commands
-      bound to the keys rather than the key codes, and you can add a
-      `using' clause to access both the codes and the bindings together.
- 
- `for VAR being the key-seqs of KEYMAP'
-      This clause iterates over all key sequences defined by KEYMAP and
-      its nested keymaps, where VAR takes on values which are strings in
-      Emacs 18 or vectors in Emacs 19.  The strings or vectors are
-      reused for each iteration, so you must copy them if you wish to
-      keep them permanently.  You can add a `using (key-bindings ...)'
-      clause to get the command bindings as well.
- 
- `for VAR being the overlays [of BUFFER] ...'
-      This clause iterates over the Emacs 19 "overlays" or Lucid Emacs
-      "extents" of a buffer (the clause `extents' is synonymous with
-      `overlays').  Under Emacs 18, this clause iterates zero times.  If
-      the `of' term is omitted, the current buffer is used.  This clause
-      also accepts optional `from POS' and `to POS' terms, limiting the
-      clause to overlays which overlap the specified region.
- 
- `for VAR being the intervals [of BUFFER] ...'
-      This clause iterates over all intervals of a buffer with constant
-      text properties.  The variable VAR will be bound to conses of
-      start and end positions, where one start position is always equal
-      to the previous end position.  The clause allows `of', `from',
-      `to', and `property' terms, where the latter term restricts the
-      search to just the specified property.  The `of' term may specify
-      either a buffer or a string.  This clause is useful only in GNU
-      Emacs 19; in other versions, all buffers and strings consist of a
-      single interval.
- 
- `for VAR being the frames'
-      This clause iterates over all frames, i.e., X window system windows
-      open on Emacs files.  This clause works only under Emacs 19.  The
-      clause `screens' is a synonym for `frames'.  The frames are
-      visited in `next-frame' order starting from `selected-frame'.
- 
- `for VAR being the windows [of FRAME]'
-      This clause iterates over the windows (in the Emacs sense) of the
-      current frame, or of the specified FRAME.  (In Emacs 18 there is
-      only ever one frame, and the `of' term is not allowed there.)
- 
- `for VAR being the buffers'
-      This clause iterates over all buffers in Emacs.  It is equivalent
-      to `for VAR in (buffer-list)'.
- 
- `for VAR = EXPR1 then EXPR2'
-      This clause does a general iteration.  The first time through the
-      loop, VAR will be bound to EXPR1.  On the second and successive
-      iterations it will be set by evaluating EXPR2 (which may refer to
-      the old value of VAR).  For example, these two loops are
-      effectively the same:
- 
-           (loop for x on my-list by 'cddr do ...)
-           (loop for x = my-list then (cddr x) while x do ...)
- 
-      Note that this type of `for' clause does not imply any sort of
-      terminating condition; the above example combines it with a
-      `while' clause to tell when to end the loop.
- 
-      If you omit the `then' term, EXPR1 is used both for the initial
-      setting and for successive settings:
- 
-           (loop for x = (random) when (> x 0) return x)
- 
-      This loop keeps taking random numbers from the `(random)' function
-      until it gets a positive one, which it then returns.
- 
-    If you include several `for' clauses in a row, they are treated
- sequentially (as if by `let*' and `setq').  You can instead use the
- word `and' to link the clauses, in which case they are processed in
- parallel (as if by `let' and `psetq').
- 
-      (loop for x below 5 for y = nil then x collect (list x y))
-           => ((0 nil) (1 1) (2 2) (3 3) (4 4))
-      (loop for x below 5 and y = nil then x collect (list x y))
-           => ((0 nil) (1 0) (2 1) (3 2) (4 3))
- 
- In the first loop, `y' is set based on the value of `x' that was just
- set by the previous clause; in the second loop, `x' and `y' are set
- simultaneously so `y' is set based on the value of `x' left over from
- the previous time through the loop.
- 
-    Another feature of the `loop' macro is "destructuring", similar in
- concept to the destructuring provided by `defmacro'.  The VAR part of
- any `for' clause can be given as a list of variables instead of a
- single variable.  The values produced during loop execution must be
- lists; the values in the lists are stored in the corresponding
- variables.
- 
-      (loop for (x y) in '((2 3) (4 5) (6 7)) collect (+ x y))
-           => (5 9 13)
- 
-    In loop destructuring, if there are more values than variables the
- trailing values are ignored, and if there are more variables than
- values the trailing variables get the value `nil'.  If `nil' is used as
- a variable name, the corresponding values are ignored.  Destructuring
- may be nested, and dotted lists of variables like `(x . y)' are allowed.
- 
- 
- File: cl,  Node: Iteration Clauses,  Next: Accumulation Clauses,  Prev: For Clauses,  Up: Loop Facility
- 
- Iteration Clauses
- -----------------
- 
- Aside from `for' clauses, there are several other loop clauses that
- control the way the loop operates.  They might be used by themselves,
- or in conjunction with one or more `for' clauses.
- 
- `repeat INTEGER'
-      This clause simply counts up to the specified number using an
-      internal temporary variable.  The loops
- 
-           (loop repeat n do ...)
-           (loop for temp to n do ...)
- 
-      are identical except that the second one forces you to choose a
-      name for a variable you aren't actually going to use.
- 
- `while CONDITION'
-      This clause stops the loop when the specified condition (any Lisp
-      expression) becomes `nil'.  For example, the following two loops
-      are equivalent, except for the implicit `nil' block that surrounds
-      the second one:
- 
-           (while COND FORMS...)
-           (loop while COND do FORMS...)
- 
- `until CONDITION'
-      This clause stops the loop when the specified condition is true,
-      i.e., non-`nil'.
- 
- `always CONDITION'
-      This clause stops the loop when the specified condition is `nil'.
-      Unlike `while', it stops the loop using `return nil' so that the
-      `finally' clauses are not executed.  If all the conditions were
-      non-`nil', the loop returns `t':
- 
-           (if (loop for size in size-list always (> size 10))
-               (some-big-sizes)
-             (no-big-sizes))
- 
- `never CONDITION'
-      This clause is like `always', except that the loop returns `t' if
-      any conditions were false, or `nil' otherwise.
- 
- `thereis CONDITION'
-      This clause stops the loop when the specified form is non-`nil';
-      in this case, it returns that non-`nil' value.  If all the values
-      were `nil', the loop returns `nil'.
- 
- 
- File: cl,  Node: Accumulation Clauses,  Next: Other Clauses,  Prev: Iteration Clauses,  Up: Loop Facility
- 
- Accumulation Clauses
- --------------------
- 
- These clauses cause the loop to accumulate information about the
- specified Lisp FORM.  The accumulated result is returned from the loop
- unless overridden, say, by a `return' clause.
- 
- `collect FORM'
-      This clause collects the values of FORM into a list.  Several
-      examples of `collect' appear elsewhere in this manual.
- 
-      The word `collecting' is a synonym for `collect', and likewise for
-      the other accumulation clauses.
- 
- `append FORM'
-      This clause collects lists of values into a result list using
-      `append'.
- 
- `nconc FORM'
-      This clause collects lists of values into a result list by
-      destructively modifying the lists rather than copying them.
- 
- `concat FORM'
-      This clause concatenates the values of the specified FORM into a
-      string.  (It and the following clause are extensions to standard
-      Common Lisp.)
- 
- `vconcat FORM'
-      This clause concatenates the values of the specified FORM into a
-      vector.
- 
- `count FORM'
-      This clause counts the number of times the specified FORM
-      evaluates to a non-`nil' value.
- 
- `sum FORM'
-      This clause accumulates the sum of the values of the specified
-      FORM, which must evaluate to a number.
- 
- `maximize FORM'
-      This clause accumulates the maximum value of the specified FORM,
-      which must evaluate to a number.  The return value is undefined if
-      `maximize' is executed zero times.
- 
- `minimize FORM'
-      This clause accumulates the minimum value of the specified FORM.
- 
-    Accumulation clauses can be followed by `into VAR' to cause the data
- to be collected into variable VAR (which is automatically `let'-bound
- during the loop) rather than an unnamed temporary variable.  Also,
- `into' accumulations do not automatically imply a return value.  The
- loop must use some explicit mechanism, such as `finally return', to
- return the accumulated result.
- 
-    It is legal for several accumulation clauses of the same type to
- accumulate into the same place.  From Steele:
- 
-      (loop for name in '(fred sue alice joe june)
-            for kids in '((bob ken) () () (kris sunshine) ())
-            collect name
-            append kids)
-           => (fred bob ken sue alice joe kris sunshine june)
- 
- 
- File: cl,  Node: Other Clauses,  Prev: Accumulation Clauses,  Up: Loop Facility
- 
- Other Clauses
- -------------
- 
- This section describes the remaining loop clauses.
- 
- `with VAR = VALUE'
-      This clause binds a variable to a value around the loop, but
-      otherwise leaves the variable alone during the loop.  The following
-      loops are basically equivalent:
- 
-           (loop with x = 17 do ...)
-           (let ((x 17)) (loop do ...))
-           (loop for x = 17 then x do ...)
- 
-      Naturally, the variable VAR might be used for some purpose in the
-      rest of the loop.  For example:
- 
-           (loop for x in my-list  with res = nil  do (push x res)
-                 finally return res)
- 
-      This loop inserts the elements of `my-list' at the front of a new
-      list being accumulated in `res', then returns the list `res' at
-      the end of the loop.  The effect is similar to that of a `collect'
-      clause, but the list gets reversed by virtue of the fact that
-      elements are being pushed onto the front of `res' rather than the
-      end.
- 
-      If you omit the `=' term, the variable is initialized to `nil'.
-      (Thus the `= nil' in the above example is unnecessary.)
- 
-      Bindings made by `with' are sequential by default, as if by
-      `let*'.  Just like `for' clauses, `with' clauses can be linked
-      with `and' to cause the bindings to be made by `let' instead.
- 
- `if CONDITION CLAUSE'
-      This clause executes the following loop clause only if the
-      specified condition is true.  The following CLAUSE should be an
-      accumulation, `do', `return', `if', or `unless' clause.  Several
-      clauses may be linked by separating them with `and'.  These
-      clauses may be followed by `else' and a clause or clauses to
-      execute if the condition was false.  The whole construct may
-      optionally be followed by the word `end' (which may be used to
-      disambiguate an `else' or `and' in a nested `if').
- 
-      The actual non-`nil' value of the condition form is available by
-      the name `it' in the "then" part.  For example:
- 
-           (setq funny-numbers '(6 13 -1))
-                => (6 13 -1)
-           (loop for x below 10
-                 if (oddp x)
-                   collect x into odds
-                   and if (memq x funny-numbers) return (cdr it) end
-                 else
-                   collect x into evens
-                 finally return (vector odds evens))
-                => [(1 3 5 7 9) (0 2 4 6 8)]
-           (setq funny-numbers '(6 7 13 -1))
-                => (6 7 13 -1)
-           (loop <same thing again>)
-                => (13 -1)
- 
-      Note the use of `and' to put two clauses into the "then" part, one
-      of which is itself an `if' clause.  Note also that `end', while
-      normally optional, was necessary here to make it clear that the
-      `else' refers to the outermost `if' clause.  In the first case,
-      the loop returns a vector of lists of the odd and even values of
-      X.  In the second case, the odd number 7 is one of the
-      `funny-numbers' so the loop returns early; the actual returned
-      value is based on the result of the `memq' call.
- 
- `when CONDITION CLAUSE'
-      This clause is just a synonym for `if'.
- 
- `unless CONDITION CLAUSE'
-      The `unless' clause is just like `if' except that the sense of the
-      condition is reversed.
- 
- `named NAME'
-      This clause gives a name other than `nil' to the implicit block
-      surrounding the loop.  The NAME is the symbol to be used as the
-      block name.
- 
- `initially [do] FORMS...'
-      This keyword introduces one or more Lisp forms which will be
-      executed before the loop itself begins (but after any variables
-      requested by `for' or `with' have been bound to their initial
-      values).  `initially' clauses can appear anywhere; if there are
-      several, they are executed in the order they appear in the loop.
-      The keyword `do' is optional.
- 
- `finally [do] FORMS...'
-      This introduces Lisp forms which will be executed after the loop
-      finishes (say, on request of a `for' or `while').  `initially' and
-      `finally' clauses may appear anywhere in the loop construct, but
-      they are executed (in the specified order) at the beginning or
-      end, respectively, of the loop.
- 
- `finally return FORM'
-      This says that FORM should be executed after the loop is done to
-      obtain a return value.  (Without this, or some other clause like
-      `collect' or `return', the loop will simply return `nil'.)
-      Variables bound by `for', `with', or `into' will still contain
-      their final values when FORM is executed.
- 
- `do FORMS...'
-      The word `do' may be followed by any number of Lisp expressions
-      which are executed as an implicit `progn' in the body of the loop.
-      Many of the examples in this section illustrate the use of `do'.
- 
- `return FORM'
-      This clause causes the loop to return immediately.  The following
-      Lisp form is evaluated to give the return value of the `loop'
-      form.  The `finally' clauses, if any, are not executed.  Of
-      course, `return' is generally used inside an `if' or `unless', as
-      its use in a top-level loop clause would mean the loop would never
-      get to "loop" more than once.
- 
-      The clause `return FORM' is equivalent to `do (return FORM)' (or
-      `return-from' if the loop was named).  The `return' clause is
-      implemented a bit more efficiently, though.
- 
-    While there is no high-level way to add user extensions to `loop'
- (comparable to `defsetf' for `setf', say), this package does offer two
- properties called `cl-loop-handler' and `cl-loop-for-handler' which are
- functions to be called when a given symbol is encountered as a
- top-level loop clause or `for' clause, respectively.  Consult the
- source code in file `cl-macs.el' for details.
- 
-    This package's `loop' macro is compatible with that of Common Lisp,
- except that a few features are not implemented:  `loop-finish' and
- data-type specifiers.  Naturally, the `for' clauses which iterate over
- keymaps, overlays, intervals, frames, windows, and buffers are
- Emacs-specific extensions.
- 
- 
- File: cl,  Node: Multiple Values,  Prev: Loop Facility,  Up: Control Structure
- 
- Multiple Values
- ===============
- 
- Common Lisp functions can return zero or more results.  Emacs Lisp
- functions, by contrast, always return exactly one result.  This package
- makes no attempt to emulate Common Lisp multiple return values; Emacs
- versions of Common Lisp functions that return more than one value
- either return just the first value (as in `compiler-macroexpand') or
- return a list of values (as in `get-setf-method').  This package *does*
- define placeholders for the Common Lisp functions that work with
- multiple values, but in Emacs Lisp these functions simply operate on
- lists instead.  The `values' form, for example, is a synonym for `list'
- in Emacs.
- 
-  - Special Form: multiple-value-bind (VAR...) VALUES-FORM FORMS...
-      This form evaluates VALUES-FORM, which must return a list of
-      values.  It then binds the VARs to these respective values, as if
-      by `let', and then executes the body FORMS.  If there are more
-      VARs than values, the extra VARs are bound to `nil'.  If there are
-      fewer VARs than values, the excess values are ignored.
- 
-  - Special Form: multiple-value-setq (VAR...) FORM
-      This form evaluates FORM, which must return a list of values.  It
-      then sets the VARs to these respective values, as if by `setq'.
-      Extra VARs or values are treated the same as in
-      `multiple-value-bind'.
- 
-    The older Quiroz package attempted a more faithful (but still
- imperfect) emulation of Common Lisp multiple values.  The old method
- "usually" simulated true multiple values quite well, but under certain
- circumstances would leave spurious return values in memory where a
- later, unrelated `multiple-value-bind' form would see them.
- 
-    Since a perfect emulation is not feasible in Emacs Lisp, this
- package opts to keep it as simple and predictable as possible.
- 
- 
- File: cl,  Node: Macros,  Next: Declarations,  Prev: Control Structure,  Up: Top
- 
- Macros
- ******
- 
- This package implements the various Common Lisp features of `defmacro',
- such as destructuring, `&environment', and `&body'.  Top-level `&whole'
- is not implemented for `defmacro' due to technical difficulties.  *Note
- Argument Lists::.
- 
-    Destructuring is made available to the user by way of the following
- macro:
- 
-  - Special Form: destructuring-bind ARGLIST EXPR FORMS...
-      This macro expands to code which executes FORMS, with the
-      variables in ARGLIST bound to the list of values returned by EXPR.
-      The ARGLIST can include all the features allowed for `defmacro'
-      argument lists, including destructuring.  (The `&environment'
-      keyword is not allowed.)  The macro expansion will signal an error
-      if EXPR returns a list of the wrong number of arguments or with
-      incorrect keyword arguments.
- 
-    This package also includes the Common Lisp `define-compiler-macro'
- facility, which allows you to define compile-time expansions and
- optimizations for your functions.
- 
-  - Special Form: define-compiler-macro NAME ARGLIST FORMS...
-      This form is similar to `defmacro', except that it only expands
-      calls to NAME at compile-time; calls processed by the Lisp
-      interpreter are not expanded, nor are they expanded by the
-      `macroexpand' function.
- 
-      The argument list may begin with a `&whole' keyword and a
-      variable.  This variable is bound to the macro-call form itself,
-      i.e., to a list of the form `(NAME ARGS...)'.  If the macro
-      expander returns this form unchanged, then the compiler treats it
-      as a normal function call.  This allows compiler macros to work as
-      optimizers for special cases of a function, leaving complicated
-      cases alone.
- 
-      For example, here is a simplified version of a definition that
-      appears as a standard part of this package:
- 
-           (define-compiler-macro member* (&whole form a list &rest keys)
-             (if (and (null keys)
-                      (eq (car-safe a) 'quote)
-                      (not (floatp-safe (cadr a))))
-                 (list 'memq a list)
-               form))
- 
-      This definition causes `(member* A LIST)' to change to a call to
-      the faster `memq' in the common case where A is a
-      non-floating-point constant; if A is anything else, or if there
-      are any keyword arguments in the call, then the original `member*'
-      call is left intact.  (The actual compiler macro for `member*'
-      optimizes a number of other cases, including common `:test'
-      predicates.)
- 
-  - Function: compiler-macroexpand FORM
-      This function is analogous to `macroexpand', except that it
-      expands compiler macros rather than regular macros.  It returns
-      FORM unchanged if it is not a call to a function for which a
-      compiler macro has been defined, or if that compiler macro decided
-      to punt by returning its `&whole' argument.  Like `macroexpand',
-      it expands repeatedly until it reaches a form for which no further
-      expansion is possible.
- 
-    *Note Macro Bindings::, for descriptions of the `macrolet' and
- `symbol-macrolet' forms for making "local" macro definitions.
- 
- 
- File: cl,  Node: Declarations,  Next: Symbols,  Prev: Macros,  Up: Top
- 
- Declarations
- ************
- 
- Common Lisp includes a complex and powerful "declaration" mechanism
- that allows you to give the compiler special hints about the types of
- data that will be stored in particular variables, and about the ways
- those variables and functions will be used.  This package defines
- versions of all the Common Lisp declaration forms: `declare',
- `locally', `proclaim', `declaim', and `the'.
- 
-    Most of the Common Lisp declarations are not currently useful in
- Emacs Lisp, as the byte-code system provides little opportunity to
- benefit from type information, and `special' declarations are redundant
- in a fully dynamically-scoped Lisp.  A few declarations are meaningful
- when the optimizing Emacs 19 byte compiler is being used, however.
- Under the earlier non-optimizing compiler, these declarations will
- effectively be ignored.
- 
-  - Function: proclaim DECL-SPEC
-      This function records a "global" declaration specified by
-      DECL-SPEC.  Since `proclaim' is a function, DECL-SPEC is evaluated
-      and thus should normally be quoted.
- 
-  - Special Form: declaim DECL-SPECS...
-      This macro is like `proclaim', except that it takes any number of
-      DECL-SPEC arguments, and the arguments are unevaluated and
-      unquoted.  The `declaim' macro also puts an `(eval-when (compile
-      load eval) ...)' around the declarations so that they will be
-      registered at compile-time as well as at run-time.  (This is vital,
-      since normally the declarations are meant to influence the way the
-      compiler treats the rest of the file that contains the `declaim'
-      form.)
- 
-  - Special Form: declare DECL-SPECS...
-      This macro is used to make declarations within functions and other
-      code.  Common Lisp allows declarations in various locations,
-      generally at the beginning of any of the many "implicit `progn's"
-      throughout Lisp syntax, such as function bodies, `let' bodies,
-      etc.  Currently the only declaration understood by `declare' is
-      `special'.
- 
-  - Special Form: locally DECLARATIONS... FORMS...
-      In this package, `locally' is no different from `progn'.
- 
-  - Special Form: the TYPE FORM
-      Type information provided by `the' is ignored in this package; in
-      other words, `(the TYPE FORM)' is equivalent to FORM.  Future
-      versions of the optimizing byte-compiler may make use of this
-      information.
- 
-      For example, `mapcar' can map over both lists and arrays.  It is
-      hard for the compiler to expand `mapcar' into an in-line loop
-      unless it knows whether the sequence will be a list or an array
-      ahead of time.  With `(mapcar 'car (the vector foo))', a future
-      compiler would have enough information to expand the loop in-line.
-      For now, Emacs Lisp will treat the above code as exactly equivalent
-      to `(mapcar 'car foo)'.
- 
-    Each DECL-SPEC in a `proclaim', `declaim', or `declare' should be a
- list beginning with a symbol that says what kind of declaration it is.
- This package currently understands `special', `inline', `notinline',
- `optimize', and `warn' declarations.  (The `warn' declaration is an
- extension of standard Common Lisp.)  Other Common Lisp declarations,
- such as `type' and `ftype', are silently ignored.
- 
- `special'
-      Since all variables in Emacs Lisp are "special" (in the Common
-      Lisp sense), `special' declarations are only advisory.  They
-      simply tell the optimizing byte compiler that the specified
-      variables are intentionally being referred to without being bound
-      in the body of the function.  The compiler normally emits warnings
-      for such references, since they could be typographical errors for
-      references to local variables.
- 
-      The declaration `(declare (special VAR1 VAR2))' is equivalent to
-      `(defvar VAR1) (defvar VAR2)' in the optimizing compiler, or to
-      nothing at all in older compilers (which do not warn for non-local
-      references).
- 
-      In top-level contexts, it is generally better to write `(defvar
-      VAR)' than `(declaim (special VAR))', since `defvar' makes your
-      intentions clearer.  But the older byte compilers can not handle
-      `defvar's appearing inside of functions, while `(declare (special
-      VAR))' takes care to work correctly with all compilers.
- 
- `inline'
-      The `inline' DECL-SPEC lists one or more functions whose bodies
-      should be expanded "in-line" into calling functions whenever the
-      compiler is able to arrange for it.  For example, the Common Lisp
-      function `cadr' is declared `inline' by this package so that the
-      form `(cadr X)' will expand directly into `(car (cdr X))' when it
-      is called in user functions, for a savings of one (relatively
-      expensive) function call.
- 
-      The following declarations are all equivalent.  Note that the
-      `defsubst' form is a convenient way to define a function and
-      declare it inline all at once, but it is available only in Emacs
-      19.
- 
-           (declaim (inline foo bar))
-           (eval-when (compile load eval) (proclaim '(inline foo bar)))
-           (proclaim-inline foo bar)      ; Lucid Emacs only
-           (defsubst foo (...) ...)       ; instead of defun; Emacs 19 only
- 
-      *Note:*  This declaration remains in effect after the containing
-      source file is done.  It is correct to use it to request that a
-      function you have defined should be inlined, but it is impolite to
-      use it to request inlining of an external function.
- 
-      In Common Lisp, it is possible to use `(declare (inline ...))'
-      before a particular call to a function to cause just that call to
-      be inlined; the current byte compilers provide no way to implement
-      this, so `(declare (inline ...))' is currently ignored by this
-      package.
- 
- `notinline'
-      The `notinline' declaration lists functions which should not be
-      inlined after all; it cancels a previous `inline' declaration.
- 
- `optimize'
-      This declaration controls how much optimization is performed by
-      the compiler.  Naturally, it is ignored by the earlier
-      non-optimizing compilers.
- 
-      The word `optimize' is followed by any number of lists like
-      `(speed 3)' or `(safety 2)'.  Common Lisp defines several
-      optimization "qualities"; this package ignores all but `speed' and
-      `safety'.  The value of a quality should be an integer from 0 to
-      3, with 0 meaning "unimportant" and 3 meaning "very important."
-      The default level for both qualities is 1.
- 
-      In this package, with the Emacs 19 optimizing compiler, the
-      `speed' quality is tied to the `byte-compile-optimize' flag, which
-      is set to `nil' for `(speed 0)' and to `t' for higher settings;
-      and the `safety' quality is tied to the
-      `byte-compile-delete-errors' flag, which is set to `t' for
-      `(safety 3)' and to `nil' for all lower settings.  (The latter
-      flag controls whether the compiler is allowed to optimize out code
-      whose only side-effect could be to signal an error, e.g.,
-      rewriting `(progn foo bar)' to `bar' when it is not known whether
-      `foo' will be bound at run-time.)
- 
-      Note that even compiling with `(safety 0)', the Emacs byte-code
-      system provides sufficient checking to prevent real harm from
-      being done.  For example, barring serious bugs in Emacs itself,
-      Emacs will not crash with a segmentation fault just because of an
-      error in a fully-optimized Lisp program.
- 
-      The `optimize' declaration is normally used in a top-level
-      `proclaim' or `declaim' in a file; Common Lisp allows it to be
-      used with `declare' to set the level of optimization locally for a
-      given form, but this will not work correctly with the current
-      version of the optimizing compiler.  (The `declare' will set the
-      new optimization level, but that level will not automatically be
-      unset after the enclosing form is done.)
- 
- `warn'
-      This declaration controls what sorts of warnings are generated by
-      the byte compiler.  Again, only the optimizing compiler generates
-      warnings.  The word `warn' is followed by any number of "warning
-      qualities," similar in form to optimization qualities.  The
-      currently supported warning types are `redefine', `callargs',
-      `unresolved', and `free-vars'; in the current system, a value of 0
-      will disable these warnings and any higher value will enable them.
-      See the documentation for the optimizing byte compiler for details.
- 
- 
- File: cl,  Node: Symbols,  Next: Numbers,  Prev: Declarations,  Up: Top
- 
- Symbols
- *******
- 
- This package defines several symbol-related features that were missing
- from Emacs Lisp.
- 
- * Menu:
- 
- * Property Lists::       `get*', `remprop', `getf', `remf'
- * Creating Symbols::     `gensym', `gentemp'
- 
- 
- File: cl,  Node: Property Lists,  Next: Creating Symbols,  Prev: Symbols,  Up: Symbols
- 
- Property Lists
- ==============
- 
- These functions augment the standard Emacs Lisp functions `get' and
- `put' for operating on properties attached to symbols.  There are also
- functions for working with property lists as first-class data
- structures not attached to particular symbols.
- 
-  - Function: get* SYMBOL PROPERTY &optional DEFAULT
-      This function is like `get', except that if the property is not
-      found, the DEFAULT argument provides the return value.  (The Emacs
-      Lisp `get' function always uses `nil' as the default; this
-      package's `get*' is equivalent to Common Lisp's `get'.)
- 
-      The `get*' function is `setf'-able; when used in this fashion, the
-      DEFAULT argument is allowed but ignored.
- 
-  - Function: remprop SYMBOL PROPERTY
-      This function removes the entry for PROPERTY from the property
-      list of SYMBOL.  It returns a true value if the property was
-      indeed found and removed, or `nil' if there was no such property.
-      (This function was probably omitted from Emacs originally because,
-      since `get' did not allow a DEFAULT, it was very difficult to
-      distinguish between a missing property and a property whose value
-      was `nil'; thus, setting a property to `nil' was close enough to
-      `remprop' for most purposes.)
- 
-  - Function: getf PLACE PROPERTY &optional DEFAULT
-      This function scans the list PLACE as if it were a property list,
-      i.e., a list of alternating property names and values.  If an
-      even-numbered element of PLACE is found which is `eq' to PROPERTY,
-      the following odd-numbered element is returned.  Otherwise,
-      DEFAULT is returned (or `nil' if no default is given).
- 
-      In particular,
- 
-           (get sym prop)  ==  (getf (symbol-plist sym) prop)
- 
-      It is legal to use `getf' as a `setf' place, in which case its
-      PLACE argument must itself be a legal `setf' place.  The DEFAULT
-      argument, if any, is ignored in this context.  The effect is to
-      change (via `setcar') the value cell in the list that corresponds
-      to PROPERTY, or to cons a new property-value pair onto the list if
-      the property is not yet present.
- 
-           (put sym prop val)  ==  (setf (getf (symbol-plist sym) prop) val)
- 
-      The `get' and `get*' functions are also `setf'-able.  The fact
-      that `default' is ignored can sometimes be useful:
- 
-           (incf (get* 'foo 'usage-count 0))
- 
-      Here, symbol `foo''s `usage-count' property is incremented if it
-      exists, or set to 1 (an incremented 0) otherwise.
- 
-      When not used as a `setf' form, `getf' is just a regular function
-      and its PLACE argument can actually be any Lisp expression.
- 
-  - Special Form: remf PLACE PROPERTY
-      This macro removes the property-value pair for PROPERTY from the
-      property list stored at PLACE, which is any `setf'-able place
-      expression.  It returns true if the property was found.  Note that
-      if PROPERTY happens to be first on the list, this will effectively
-      do a `(setf PLACE (cddr PLACE))', whereas if it occurs later, this
-      simply uses `setcdr' to splice out the property and value cells.
- 
- 
- File: cl,  Node: Creating Symbols,  Prev: Property Lists,  Up: Symbols
- 
- Creating Symbols
- ================
- 
- These functions create unique symbols, typically for use as temporary
- variables.
- 
-  - Function: gensym &optional X
-      This function creates a new, uninterned symbol (using
-      `make-symbol') with a unique name.  (The name of an uninterned
-      symbol is relevant only if the symbol is printed.)  By default,
-      the name is generated from an increasing sequence of numbers,
-      `G1000', `G1001', `G1002', etc.  If the optional argument X is a
-      string, that string is used as a prefix instead of `G'.
-      Uninterned symbols are used in macro expansions for temporary
-      variables, to ensure that their names will not conflict with
-      "real" variables in the user's code.
- 
-  - Variable: *gensym-counter*
-      This variable holds the counter used to generate `gensym' names.
-      It is incremented after each use by `gensym'.  In Common Lisp this
-      is initialized with 0, but this package initializes it with a
-      random (time-dependent) value to avoid trouble when two files that
-      each used `gensym' in their compilation are loaded together.
-      (Uninterned symbols become interned when the compiler writes them
-      out to a file and the Emacs loader loads them, so their names have
-      to be treated a bit more carefully than in Common Lisp where
-      uninterned symbols remain uninterned after loading.)
- 
-  - Function: gentemp &optional X
-      This function is like `gensym', except that it produces a new
-      *interned* symbol.  If the symbol that is generated already
-      exists, the function keeps incrementing the counter and trying
-      again until a new symbol is generated.
- 
-    The Quiroz `cl.el' package also defined a `defkeyword' form for
- creating self-quoting keyword symbols.  This package automatically
- creates all keywords that are called for by `&key' argument specifiers,
- and discourages the use of keywords as data unrelated to keyword
- arguments, so the `defkeyword' form has been discontinued.
- 
- 
- File: cl,  Node: Numbers,  Next: Sequences,  Prev: Symbols,  Up: Top
- 
- Numbers
- *******
- 
- This section defines a few simple Common Lisp operations on numbers
- which were left out of Emacs Lisp.
- 
- * Menu:
- 
- * Predicates on Numbers::       `plusp', `oddp', `floatp-safe', etc.
- * Numerical Functions::         `abs', `expt', `floor*', etc.
- * Random Numbers::              `random*', `make-random-state'
- * Implementation Parameters::   `most-positive-fixnum', `most-positive-float'
- 
- 
- File: cl,  Node: Predicates on Numbers,  Next: Numerical Functions,  Prev: Numbers,  Up: Numbers
- 
- Predicates on Numbers
- =====================
- 
- These functions return `t' if the specified condition is true of the
- numerical argument, or `nil' otherwise.
- 
-  - Function: plusp NUMBER
-      This predicate tests whether NUMBER is positive.  It is an error
-      if the argument is not a number.
- 
-  - Function: minusp NUMBER
-      This predicate tests whether NUMBER is negative.  It is an error
-      if the argument is not a number.
- 
-  - Function: oddp INTEGER
-      This predicate tests whether INTEGER is odd.  It is an error if
-      the argument is not an integer.
- 
-  - Function: evenp INTEGER
-      This predicate tests whether INTEGER is even.  It is an error if
-      the argument is not an integer.
- 
-  - Function: floatp-safe OBJECT
-      This predicate tests whether OBJECT is a floating-point number.
-      On systems that support floating-point, this is equivalent to
-      `floatp'.  On other systems, this always returns `nil'.
- 
- 
- File: cl,  Node: Numerical Functions,  Next: Random Numbers,  Prev: Predicates on Numbers,  Up: Numbers
- 
- Numerical Functions
- ===================
- 
- These functions perform various arithmetic operations on numbers.
- 
-  - Function: abs NUMBER
-      This function returns the absolute value of NUMBER.  (Newer
-      versions of Emacs provide this as a built-in function; this package
-      defines `abs' only for Emacs 18 versions which don't provide it as
-      a primitive.)
- 
-  - Function: expt BASE POWER
-      This function returns BASE raised to the power of NUMBER.  (Newer
-      versions of Emacs provide this as a built-in function; this
-      package defines `expt' only for Emacs 18 versions which don't
-      provide it as a primitive.)
- 
-  - Function: gcd &rest INTEGERS
-      This function returns the Greatest Common Divisor of the arguments.
-      For one argument, it returns the absolute value of that argument.
-      For zero arguments, it returns zero.
- 
-  - Function: lcm &rest INTEGERS
-      This function returns the Least Common Multiple of the arguments.
-      For one argument, it returns the absolute value of that argument.
-      For zero arguments, it returns one.
- 
-  - Function: isqrt INTEGER
-      This function computes the "integer square root" of its integer
-      argument, i.e., the greatest integer less than or equal to the true
-      square root of the argument.
- 
-  - Function: floor* NUMBER &optional DIVISOR
-      This function implements the Common Lisp `floor' function.  It is
-      called `floor*' to avoid name conflicts with the simpler `floor'
-      function built-in to Emacs 19.
- 
-      With one argument, `floor*' returns a list of two numbers: The
-      argument rounded down (toward minus infinity) to an integer, and
-      the "remainder" which would have to be added back to the first
-      return value to yield the argument again.  If the argument is an
-      integer X, the result is always the list `(X 0)'.  If the argument
-      is an Emacs 19 floating-point number, the first result is a Lisp
-      integer and the second is a Lisp float between 0 (inclusive) and 1
-      (exclusive).
- 
-      With two arguments, `floor*' divides NUMBER by DIVISOR, and
-      returns the floor of the quotient and the corresponding remainder
-      as a list of two numbers.  If `(floor* X Y)' returns `(Q R)', then
-      `Q*Y + R = X', with R between 0 (inclusive) and R (exclusive).
-      Also, note that `(floor* X)' is exactly equivalent to `(floor* X
-      1)'.
- 
-      This function is entirely compatible with Common Lisp's `floor'
-      function, except that it returns the two results in a list since
-      Emacs Lisp does not support multiple-valued functions.
- 
-  - Function: ceiling* NUMBER &optional DIVISOR
-      This function implements the Common Lisp `ceiling' function, which
-      is analogous to `floor' except that it rounds the argument or
-      quotient of the arguments up toward plus infinity.  The remainder
-      will be between 0 and minus R.
- 
-  - Function: truncate* NUMBER &optional DIVISOR
-      This function implements the Common Lisp `truncate' function,
-      which is analogous to `floor' except that it rounds the argument
-      or quotient of the arguments toward zero.  Thus it is equivalent
-      to `floor*' if the argument or quotient is positive, or to
-      `ceiling*' otherwise.  The remainder has the same sign as NUMBER.
- 
-  - Function: round* NUMBER &optional DIVISOR
-      This function implements the Common Lisp `round' function, which
-      is analogous to `floor' except that it rounds the argument or
-      quotient of the arguments to the nearest integer.  In the case of
-      a tie (the argument or quotient is exactly halfway between two
-      integers), it rounds to the even integer.
- 
-  - Function: mod* NUMBER DIVISOR
-      This function returns the same value as the second return value of
-      `floor'.
- 
-  - Function: rem* NUMBER DIVISOR
-      This function returns the same value as the second return value of
-      `truncate'.
- 
-    These definitions are compatible with those in the Quiroz `cl.el'
- package, except that this package appends `*' to certain function names
- to avoid conflicts with existing Emacs 19 functions, and that the
- mechanism for returning multiple values is different.
- 
- 
- File: cl,  Node: Random Numbers,  Next: Implementation Parameters,  Prev: Numerical Functions,  Up: Numbers
- 
- Random Numbers
- ==============
- 
- This package also provides an implementation of the Common Lisp random
- number generator.  It uses its own additive-congruential algorithm,
- which is much more likely to give statistically clean random numbers
- than the simple generators supplied by many operating systems.
- 
-  - Function: random* NUMBER &optional STATE
-      This function returns a random nonnegative number less than
-      NUMBER, and of the same type (either integer or floating-point).
-      The STATE argument should be a `random-state' object which holds
-      the state of the random number generator.  The function modifies
-      this state object as a side effect.  If STATE is omitted, it
-      defaults to the variable `*random-state*', which contains a
-      pre-initialized `random-state' object.
- 
-  - Variable: *random-state*
-      This variable contains the system "default" `random-state' object,
-      used for calls to `random*' that do not specify an alternative
-      state object.  Since any number of programs in the Emacs process
-      may be accessing `*random-state*' in interleaved fashion, the
-      sequence generated from this variable will be irreproducible for
-      all intents and purposes.
- 
-  - Function: make-random-state &optional STATE
-      This function creates or copies a `random-state' object.  If STATE
-      is omitted or `nil', it returns a new copy of `*random-state*'.
-      This is a copy in the sense that future sequences of calls to
-      `(random* N)' and `(random* N S)' (where S is the new random-state
-      object) will return identical sequences of random numbers.
- 
-      If STATE is a `random-state' object, this function returns a copy
-      of that object.  If STATE is `t', this function returns a new
-      `random-state' object seeded from the date and time.  As an
-      extension to Common Lisp, STATE may also be an integer in which
-      case the new object is seeded from that integer; each different
-      integer seed will result in a completely different sequence of
-      random numbers.
- 
-      It is legal to print a `random-state' object to a buffer or file
-      and later read it back with `read'.  If a program wishes to use a
-      sequence of pseudo-random numbers which can be reproduced later
-      for debugging, it can call `(make-random-state t)' to get a new
-      sequence, then print this sequence to a file.  When the program is
-      later rerun, it can read the original run's random-state from the
-      file.
- 
-  - Function: random-state-p OBJECT
-      This predicate returns `t' if OBJECT is a `random-state' object,
-      or `nil' otherwise.
- 
--- 0 ----
Index: emacs/info/cl-4
diff -c emacs/info/cl-4:1.1.1.1 emacs/info/cl-4:removed
*** emacs/info/cl-4:1.1.1.1	Fri Jul 19 01:55:01 1996
--- emacs/info/cl-4	Fri Aug  2 19:59:16 1996
***************
*** 1,970 ****
- This is Info file ../info/cl, produced by Makeinfo-1.55 from the input
- file cl.texi.
- 
-    This file documents the GNU Emacs Common Lisp emulation package.
- 
-    Copyright (C) 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "GNU General Public License" is included
- exactly as in the original, and provided that the entire resulting
- derived work is distributed under the terms of a permission notice
- identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the section entitled "GNU General Public License"
- may be included in a translation approved by the author instead of in
- the original English.
- 
- 
- File: cl,  Node: Implementation Parameters,  Prev: Random Numbers,  Up: Numbers
- 
- Implementation Parameters
- =========================
- 
- This package defines several useful constants having to with numbers.
- 
-  - Variable: most-positive-fixnum
-      This constant equals the largest value a Lisp integer can hold.
-      It is typically `2^23-1' or `2^25-1'.
- 
-  - Variable: most-negative-fixnum
-      This constant equals the smallest (most negative) value a Lisp
-      integer can hold.
- 
-    The following parameters have to do with floating-point numbers.
- This package determines their values by exercising the computer's
- floating-point arithmetic in various ways.  Because this operation
- might be slow, the code for initializing them is kept in a separate
- function that must be called before the parameters can be used.
- 
-  - Function: cl-float-limits
-      This function makes sure that the Common Lisp floating-point
-      parameters like `most-positive-float' have been initialized.
-      Until it is called, these parameters will be `nil'.  If this
-      version of Emacs does not support floats (e.g., most versions of
-      Emacs 18), the parameters will remain `nil'.  If the parameters
-      have already been initialized, the function returns immediately.
- 
-      The algorithm makes assumptions that will be valid for most modern
-      machines, but will fail if the machine's arithmetic is extremely
-      unusual, e.g., decimal.
- 
-    Since true Common Lisp supports up to four different floating-point
- precisions, it has families of constants like
- `most-positive-single-float', `most-positive-double-float',
- `most-positive-long-float', and so on.  Emacs has only one
- floating-point precision, so this package omits the precision word from
- the constants' names.
- 
-  - Variable: most-positive-float
-      This constant equals the largest value a Lisp float can hold.  For
-      those systems whose arithmetic supports infinities, this is the
-      largest *finite* value.  For IEEE machines, the value is
-      approximately `1.79e+308'.
- 
-  - Variable: most-negative-float
-      This constant equals the most-negative value a Lisp float can hold.
-      (It is assumed to be equal to `(- most-positive-float)'.)
- 
-  - Variable: least-positive-float
-      This constant equals the smallest Lisp float value greater than
-      zero.  For IEEE machines, it is about `4.94e-324' if denormals are
-      supported or `2.22e-308' if not.
- 
-  - Variable: least-positive-normalized-float
-      This constant equals the smallest *normalized* Lisp float greater
-      than zero, i.e., the smallest value for which IEEE denormalization
-      will not result in a loss of precision.  For IEEE machines, this
-      value is about `2.22e-308'.  For machines that do not support the
-      concept of denormalization and gradual underflow, this constant
-      will always equal `least-positive-float'.
- 
-  - Variable: least-negative-float
-      This constant is the negative counterpart of
-      `least-positive-float'.
- 
-  - Variable: least-negative-normalized-float
-      This constant is the negative counterpart of
-      `least-positive-normalized-float'.
- 
-  - Variable: float-epsilon
-      This constant is the smallest positive Lisp float that can be added
-      to 1.0 to produce a distinct value.  Adding a smaller number to 1.0
-      will yield 1.0 again due to roundoff.  For IEEE machines, epsilon
-      is about `2.22e-16'.
- 
-  - Variable: float-negative-epsilon
-      This is the smallest positive value that can be subtracted from
-      1.0 to produce a distinct value.  For IEEE machines, it is about
-      `1.11e-16'.
- 
- 
- File: cl,  Node: Sequences,  Next: Lists,  Prev: Numbers,  Up: Top
- 
- Sequences
- *********
- 
- Common Lisp defines a number of functions that operate on "sequences",
- which are either lists, strings, or vectors.  Emacs Lisp includes a few
- of these, notably `elt' and `length'; this package defines most of the
- rest.
- 
- * Menu:
- 
- * Sequence Basics::          Arguments shared by all sequence functions
- * Mapping over Sequences::   `mapcar*', `mapcan', `map', `every', etc.
- * Sequence Functions::       `subseq', `remove*', `substitute', etc.
- * Searching Sequences::      `find', `position', `count', `search', etc.
- * Sorting Sequences::        `sort*', `stable-sort', `merge'
- 
- 
- File: cl,  Node: Sequence Basics,  Next: Mapping over Sequences,  Prev: Sequences,  Up: Sequences
- 
- Sequence Basics
- ===============
- 
- Many of the sequence functions take keyword arguments; *note Argument
- Lists::..  All keyword arguments are optional and, if specified, may
- appear in any order.
- 
-    The `:key' argument should be passed either `nil', or a function of
- one argument.  This key function is used as a filter through which the
- elements of the sequence are seen; for example, `(find x y :key 'car)'
- is similar to `(assoc* x y)': It searches for an element of the list
- whose `car' equals `x', rather than for an element which equals `x'
- itself.  If `:key' is omitted or `nil', the filter is effectively the
- identity function.
- 
-    The `:test' and `:test-not' arguments should be either `nil', or
- functions of two arguments.  The test function is used to compare two
- sequence elements, or to compare a search value with sequence elements.
- (The two values are passed to the test function in the same order as
- the original sequence function arguments from which they are derived,
- or, if they both come from the same sequence, in the same order as they
- appear in that sequence.) The `:test' argument specifies a function
- which must return true (non-`nil') to indicate a match; instead, you
- may use `:test-not' to give a function which returns *false* to
- indicate a match.  The default test function is `:test 'eql'.
- 
-    Many functions which take ITEM and `:test' or `:test-not' arguments
- also come in `-if' and `-if-not' varieties, where a PREDICATE function
- is passed instead of ITEM, and sequence elements match if the predicate
- returns true on them (or false in the case of `-if-not').  For example:
- 
-      (remove* 0 seq :test '=)  ==  (remove-if 'zerop seq)
- 
- to remove all zeros from sequence `seq'.
- 
-    Some operations can work on a subsequence of the argument sequence;
- these function take `:start' and `:end' arguments which default to zero
- and the length of the sequence, respectively.  Only elements between
- START (inclusive) and END (exclusive) are affected by the operation.
- The END argument may be passed `nil' to signify the length of the
- sequence; otherwise, both START and END must be integers, with `0 <=
- START <= END <= (length SEQ)'.  If the function takes two sequence
- arguments, the limits are defined by keywords `:start1' and `:end1' for
- the first, and `:start2' and `:end2' for the second.
- 
-    A few functions accept a `:from-end' argument, which, if non-`nil',
- causes the operation to go from right-to-left through the sequence
- instead of left-to-right, and a `:count' argument, which specifies an
- integer maximum number of elements to be removed or otherwise processed.
- 
-    The sequence functions make no guarantees about the order in which
- the `:test', `:test-not', and `:key' functions are called on various
- elements.  Therefore, it is a bad idea to depend on side effects of
- these functions.  For example, `:from-end' may cause the sequence to be
- scanned actually in reverse, or it may be scanned forwards but
- computing a result "as if" it were scanned backwards.  (Some functions,
- like `mapcar*' and `every', *do* specify exactly the order in which the
- function is called so side effects are perfectly acceptable in those
- cases.)
- 
-    Strings in GNU Emacs 19 may contain "text properties" as well as
- character data.  Except as noted, it is undefined whether or not text
- properties are preserved by sequence functions.  For example, `(remove*
- ?A STR)' may or may not preserve the properties of the characters
- copied from STR into the result.
- 
- 
- File: cl,  Node: Mapping over Sequences,  Next: Sequence Functions,  Prev: Sequence Basics,  Up: Sequences
- 
- Mapping over Sequences
- ======================
- 
- These functions "map" the function you specify over the elements of
- lists or arrays.  They are all variations on the theme of the built-in
- function `mapcar'.
- 
-  - Function: mapcar* FUNCTION SEQ &rest MORE-SEQS
-      This function calls FUNCTION on successive parallel sets of
-      elements from its argument sequences.  Given a single SEQ argument
-      it is equivalent to `mapcar'; given N sequences, it calls the
-      function with the first elements of each of the sequences as the N
-      arguments to yield the first element of the result list, then with
-      the second elements, and so on.  The mapping stops as soon as the
-      shortest sequence runs out.  The argument sequences may be any
-      mixture of lists, strings, and vectors; the return sequence is
-      always a list.
- 
-      Common Lisp's `mapcar' accepts multiple arguments but works only
-      on lists; Emacs Lisp's `mapcar' accepts a single sequence
-      argument.  This package's `mapcar*' works as a compatible superset
-      of both.
- 
-  - Function: map RESULT-TYPE FUNCTION SEQ &rest MORE-SEQS
-      This function maps FUNCTION over the argument sequences, just like
-      `mapcar*', but it returns a sequence of type RESULT-TYPE rather
-      than a list.  RESULT-TYPE must be one of the following symbols:
-      `vector', `string', `list' (in which case the effect is the same
-      as for `mapcar*'), or `nil' (in which case the results are thrown
-      away and `map' returns `nil').
- 
-  - Function: maplist FUNCTION LIST &rest MORE-LISTS
-      This function calls FUNCTION on each of its argument lists, then
-      on the `cdr's of those lists, and so on, until the shortest list
-      runs out.  The results are returned in the form of a list.  Thus,
-      `maplist' is like `mapcar*' except that it passes in the list
-      pointers themselves rather than the `car's of the advancing
-      pointers.
- 
-  - Function: mapc FUNCTION SEQ &rest MORE-SEQS
-      This function is like `mapcar*', except that the values returned
-      by FUNCTION are ignored and thrown away rather than being
-      collected into a list.  The return value of `mapc' is SEQ, the
-      first sequence.
- 
-  - Function: mapl FUNCTION LIST &rest MORE-LISTS
-      This function is like `maplist', except that it throws away the
-      values returned by FUNCTION.
- 
-  - Function: mapcan FUNCTION SEQ &rest MORE-SEQS
-      This function is like `mapcar*', except that it concatenates the
-      return values (which must be lists) using `nconc', rather than
-      simply collecting them into a list.
- 
-  - Function: mapcon FUNCTION LIST &rest MORE-LISTS
-      This function is like `maplist', except that it concatenates the
-      return values using `nconc'.
- 
-  - Function: some PREDICATE SEQ &rest MORE-SEQS
-      This function calls PREDICATE on each element of SEQ in turn; if
-      PREDICATE returns a non-`nil' value, `some' returns that value,
-      otherwise it returns `nil'.  Given several sequence arguments, it
-      steps through the sequences in parallel until the shortest one
-      runs out, just as in `mapcar*'.  You can rely on the left-to-right
-      order in which the elements are visited, and on the fact that
-      mapping stops immediately as soon as PREDICATE returns non-`nil'.
- 
-  - Function: every PREDICATE SEQ &rest MORE-SEQS
-      This function calls PREDICATE on each element of the sequence(s)
-      in turn; it returns `nil' as soon as PREDICATE returns `nil' for
-      any element, or `t' if the predicate was true for all elements.
- 
-  - Function: notany PREDICATE SEQ &rest MORE-SEQS
-      This function calls PREDICATE on each element of the sequence(s)
-      in turn; it returns `nil' as soon as PREDICATE returns a non-`nil'
-      value for any element, or `t' if the predicate was `nil' for all
-      elements.
- 
-  - Function: notevery PREDICATE SEQ &rest MORE-SEQS
-      This function calls PREDICATE on each element of the sequence(s)
-      in turn; it returns a non-`nil' value as soon as PREDICATE returns
-      `nil' for any element, or `t' if the predicate was true for all
-      elements.
- 
-  - Function: reduce FUNCTION SEQ &key :from-end :start :end
-           :initial-value :key
-      This function combines the elements of SEQ using an associative
-      binary operation.  Suppose FUNCTION is `*' and SEQ is the list `(2
-      3 4 5)'.  The first two elements of the list are combined with `(*
-      2 3) = 6'; this is combined with the next element, `(* 6 4) = 24',
-      and that is combined with the final element: `(* 24 5) = 120'.
-      Note that the `*' function happens to be self-reducing, so that
-      `(* 2 3 4 5)' has the same effect as an explicit call to `reduce'.
- 
-      If `:from-end' is true, the reduction is right-associative instead
-      of left-associative:
- 
-           (reduce '- '(1 2 3 4))
-                == (- (- (- 1 2) 3) 4) => -8
-           (reduce '- '(1 2 3 4) :from-end t)
-                == (- 1 (- 2 (- 3 4))) => -2
- 
-      If `:key' is specified, it is a function of one argument which is
-      called on each of the sequence elements in turn.
- 
-      If `:initial-value' is specified, it is effectively added to the
-      front (or rear in the case of `:from-end') of the sequence.  The
-      `:key' function is *not* applied to the initial value.
- 
-      If the sequence, including the initial value, has exactly one
-      element then that element is returned without ever calling
-      FUNCTION.  If the sequence is empty (and there is no initial
-      value), then FUNCTION is called with no arguments to obtain the
-      return value.
- 
-    All of these mapping operations can be expressed conveniently in
- terms of the `loop' macro.  In compiled code, `loop' will be faster
- since it generates the loop as in-line code with no function calls.
- 
- 
- File: cl,  Node: Sequence Functions,  Next: Searching Sequences,  Prev: Mapping over Sequences,  Up: Sequences
- 
- Sequence Functions
- ==================
- 
- This section describes a number of Common Lisp functions for operating
- on sequences.
- 
-  - Function: subseq SEQUENCE START &optional END
-      This function returns a given subsequence of the argument
-      SEQUENCE, which may be a list, string, or vector.  The indices
-      START and END must be in range, and START must be no greater than
-      END.  If END is omitted, it defaults to the length of the
-      sequence.  The return value is always a copy; it does not share
-      structure with SEQUENCE.
- 
-      As an extension to Common Lisp, START and/or END may be negative,
-      in which case they represent a distance back from the end of the
-      sequence.  This is for compatibility with Emacs' `substring'
-      function.  Note that `subseq' is the *only* sequence function that
-      allows negative START and END.
- 
-      You can use `setf' on a `subseq' form to replace a specified range
-      of elements with elements from another sequence.  The replacement
-      is done as if by `replace', described below.
- 
-  - Function: concatenate RESULT-TYPE &rest SEQS
-      This function concatenates the argument sequences together to form
-      a result sequence of type RESULT-TYPE, one of the symbols
-      `vector', `string', or `list'.  The arguments are always copied,
-      even in cases such as `(concatenate 'list '(1 2 3))' where the
-      result is identical to an argument.
- 
-  - Function: fill SEQ ITEM &key :start :end
-      This function fills the elements of the sequence (or the specified
-      part of the sequence) with the value ITEM.
- 
-  - Function: replace SEQ1 SEQ2 &key :start1 :end1 :start2 :end2
-      This function copies part of SEQ2 into part of SEQ1.  The sequence
-      SEQ1 is not stretched or resized; the amount of data copied is
-      simply the shorter of the source and destination (sub)sequences.
-      The function returns SEQ1.
- 
-      If SEQ1 and SEQ2 are `eq', then the replacement will work
-      correctly even if the regions indicated by the start and end
-      arguments overlap.  However, if SEQ1 and SEQ2 are lists which
-      share storage but are not `eq', and the start and end arguments
-      specify overlapping regions, the effect is undefined.
- 
-  - Function: remove* ITEM SEQ &key :test :test-not :key :count :start
-           :end :from-end
-      This returns a copy of SEQ with all elements matching ITEM
-      removed.  The result may share storage with or be `eq' to SEQ in
-      some circumstances, but the original SEQ will not be modified.
-      The `:test', `:test-not', and `:key' arguments define the matching
-      test that is used; by default, elements `eql' to ITEM are removed.
-      The `:count' argument specifies the maximum number of matching
-      elements that can be removed (only the leftmost COUNT matches are
-      removed).  The `:start' and `:end' arguments specify a region in
-      SEQ in which elements will be removed; elements outside that
-      region are not matched or removed.  The `:from-end' argument, if
-      true, says that elements should be deleted from the end of the
-      sequence rather than the beginning (this matters only if COUNT was
-      also specified).
- 
-  - Function: delete* ITEM SEQ &key :test :test-not :key :count :start
-           :end :from-end
-      This deletes all elements of SEQ which match ITEM.  It is a
-      destructive operation.  Since Emacs Lisp does not support
-      stretchable strings or vectors, this is the same as `remove*' for
-      those sequence types.  On lists, `remove*' will copy the list if
-      necessary to preserve the original list, whereas `delete*' will
-      splice out parts of the argument list.  Compare `append' and
-      `nconc', which are analogous non-destructive and destructive list
-      operations in Emacs Lisp.
- 
-    The predicate-oriented functions `remove-if', `remove-if-not',
- `delete-if', and `delete-if-not' are defined similarly.
- 
-  - Function: delete ITEM LIST
-      This MacLisp-compatible function deletes from LIST all elements
-      which are `equal' to ITEM.  The `delete' function is built-in to
-      Emacs 19; this package defines it equivalently in Emacs 18.
- 
-  - Function: remove ITEM LIST
-      This function removes from LIST all elements which are `equal' to
-      ITEM.  This package defines it for symmetry with `delete', even
-      though `remove' is not built-in to Emacs 19.
- 
-  - Function: remq ITEM LIST
-      This function removes from LIST all elements which are `eq' to
-      ITEM.  This package defines it for symmetry with `delq', even
-      though `remq' is not built-in to Emacs 19.
- 
-  - Function: remove-duplicates SEQ &key :test :test-not :key :start
-           :end :from-end
-      This function returns a copy of SEQ with duplicate elements
-      removed.  Specifically, if two elements from the sequence match
-      according to the `:test', `:test-not', and `:key' arguments, only
-      the rightmost one is retained.  If `:from-end' is true, the
-      leftmost one is retained instead.  If `:start' or `:end' is
-      specified, only elements within that subsequence are examined or
-      removed.
- 
-  - Function: delete-duplicates SEQ &key :test :test-not :key :start
-           :end :from-end
-      This function deletes duplicate elements from SEQ.  It is a
-      destructive version of `remove-duplicates'.
- 
-  - Function: substitute NEW OLD SEQ &key :test :test-not :key :count
-           :start :end :from-end
-      This function returns a copy of SEQ, with all elements matching
-      OLD replaced with NEW.  The `:count', `:start', `:end', and
-      `:from-end' arguments may be used to limit the number of
-      substitutions made.
- 
-  - Function: nsubstitute NEW OLD SEQ &key :test :test-not :key :count
-           :start :end :from-end
-      This is a destructive version of `substitute'; it performs the
-      substitution using `setcar' or `aset' rather than by returning a
-      changed copy of the sequence.
- 
-    The `substitute-if', `substitute-if-not', `nsubstitute-if', and
- `nsubstitute-if-not' functions are defined similarly.  For these, a
- PREDICATE is given in place of the OLD argument.
- 
- 
- File: cl,  Node: Searching Sequences,  Next: Sorting Sequences,  Prev: Sequence Functions,  Up: Sequences
- 
- Searching Sequences
- ===================
- 
- These functions search for elements or subsequences in a sequence.
- (See also `member*' and `assoc*'; *note Lists::..)
- 
-  - Function: find ITEM SEQ &key :test :test-not :key :start :end
-           :from-end
-      This function searches SEQ for an element matching ITEM.  If it
-      finds a match, it returns the matching element.  Otherwise, it
-      returns `nil'.  It returns the leftmost match, unless `:from-end'
-      is true, in which case it returns the rightmost match.  The
-      `:start' and `:end' arguments may be used to limit the range of
-      elements that are searched.
- 
-  - Function: position ITEM SEQ &key :test :test-not :key :start :end
-           :from-end
-      This function is like `find', except that it returns the integer
-      position in the sequence of the matching item rather than the item
-      itself.  The position is relative to the start of the sequence as
-      a whole, even if `:start' is non-zero.  The function returns `nil'
-      if no matching element was found.
- 
-  - Function: count ITEM SEQ &key :test :test-not :key :start :end
-      This function returns the number of elements of SEQ which match
-      ITEM.  The result is always a nonnegative integer.
- 
-    The `find-if', `find-if-not', `position-if', `position-if-not',
- `count-if', and `count-if-not' functions are defined similarly.
- 
-  - Function: mismatch SEQ1 SEQ2 &key :test :test-not :key :start1 :end1
-           :start2 :end2 :from-end
-      This function compares the specified parts of SEQ1 and SEQ2.  If
-      they are the same length and the corresponding elements match
-      (according to `:test', `:test-not', and `:key'), the function
-      returns `nil'.  If there is a mismatch, the function returns the
-      index (relative to SEQ1) of the first mismatching element.  This
-      will be the leftmost pair of elements which do not match, or the
-      position at which the shorter of the two otherwise-matching
-      sequences runs out.
- 
-      If `:from-end' is true, then the elements are compared from right
-      to left starting at `(1- END1)' and `(1- END2)'.  If the sequences
-      differ, then one plus the index of the rightmost difference
-      (relative to SEQ1) is returned.
- 
-      An interesting example is `(mismatch str1 str2 :key 'upcase)',
-      which compares two strings case-insensitively.
- 
-  - Function: search SEQ1 SEQ2 &key :test :test-not :key :from-end
-           :start1 :end1 :start2 :end2
-      This function searches SEQ2 for a subsequence that matches SEQ1
-      (or part of it specified by `:start1' and `:end1'.)  Only matches
-      which fall entirely within the region defined by `:start2' and
-      `:end2' will be considered.  The return value is the index of the
-      leftmost element of the leftmost match, relative to the start of
-      SEQ2, or `nil' if no matches were found.  If `:from-end' is true,
-      the function finds the *rightmost* matching subsequence.
- 
- 
- File: cl,  Node: Sorting Sequences,  Prev: Searching Sequences,  Up: Sequences
- 
- Sorting Sequences
- =================
- 
-  - Function: sort* SEQ PREDICATE &key :key
-      This function sorts SEQ into increasing order as determined by
-      using PREDICATE to compare pairs of elements.  PREDICATE should
-      return true (non-`nil') if and only if its first argument is less
-      than (not equal to) its second argument.  For example, `<' and
-      `string-lessp' are suitable predicate functions for sorting
-      numbers and strings, respectively; `>' would sort numbers into
-      decreasing rather than increasing order.
- 
-      This function differs from Emacs' built-in `sort' in that it can
-      operate on any type of sequence, not just lists.  Also, it accepts
-      a `:key' argument which is used to preprocess data fed to the
-      PREDICATE function.  For example,
- 
-           (setq data (sort data 'string-lessp :key 'downcase))
- 
-      sorts DATA, a sequence of strings, into increasing alphabetical
-      order without regard to case.  A `:key' function of `car' would be
-      useful for sorting association lists.
- 
-      The `sort*' function is destructive; it sorts lists by actually
-      rearranging the `cdr' pointers in suitable fashion.
- 
-  - Function: stable-sort SEQ PREDICATE &key :key
-      This function sorts SEQ "stably", meaning two elements which are
-      equal in terms of PREDICATE are guaranteed not to be rearranged
-      out of their original order by the sort.
- 
-      In practice, `sort*' and `stable-sort' are equivalent in Emacs
-      Lisp because the underlying `sort' function is stable by default.
-      However, this package reserves the right to use non-stable methods
-      for `sort*' in the future.
- 
-  - Function: merge TYPE SEQ1 SEQ2 PREDICATE &key :key
-      This function merges two sequences SEQ1 and SEQ2 by interleaving
-      their elements.  The result sequence, of type TYPE (in the sense
-      of `concatenate'), has length equal to the sum of the lengths of
-      the two input sequences.  The sequences may be modified
-      destructively.  Order of elements within SEQ1 and SEQ2 is
-      preserved in the interleaving; elements of the two sequences are
-      compared by PREDICATE (in the sense of `sort') and the lesser
-      element goes first in the result.  When elements are equal, those
-      from SEQ1 precede those from SEQ2 in the result.  Thus, if SEQ1
-      and SEQ2 are both sorted according to PREDICATE, then the result
-      will be a merged sequence which is (stably) sorted according to
-      PREDICATE.
- 
- 
- File: cl,  Node: Lists,  Next: Hash Tables,  Prev: Sequences,  Up: Top
- 
- Lists
- *****
- 
- The functions described here operate on lists.
- 
- * Menu:
- 
- * List Functions::                `caddr', `first', `last', `list*', etc.
- * Substitution of Expressions::   `subst', `sublis', etc.
- * Lists as Sets::                 `member*', `adjoin', `union', etc.
- * Association Lists::             `assoc*', `rassoc*', `acons', `pairlis'
- 
- 
- File: cl,  Node: List Functions,  Next: Substitution of Expressions,  Prev: Lists,  Up: Lists
- 
- List Functions
- ==============
- 
- This section describes a number of simple operations on lists, i.e.,
- chains of cons cells.
- 
-  - Function: caddr X
-      This function is equivalent to `(car (cdr (cdr X)))'.  Likewise,
-      this package defines all 28 `cXXXr' functions where XXX is up to
-      four `a's and/or `d's.  All of these functions are `setf'-able,
-      and calls to them are expanded inline by the byte-compiler for
-      maximum efficiency.
- 
-  - Function: first X
-      This function is a synonym for `(car X)'.  Likewise, the functions
-      `second', `third', ..., through `tenth' return the given element
-      of the list X.
- 
-  - Function: rest X
-      This function is a synonym for `(cdr X)'.
- 
-  - Function: endp X
-      Common Lisp defines this function to act like `null', but
-      signalling an error if `x' is neither a `nil' nor a cons cell.
-      This package simply defines `endp' as a synonym for `null'.
- 
-  - Function: list-length X
-      This function returns the length of list X, exactly like `(length
-      X)', except that if X is a circular list (where the cdr-chain
-      forms a loop rather than terminating with `nil'), this function
-      returns `nil'.  (The regular `length' function would get stuck if
-      given a circular list.)
- 
-  - Function: last X &optional N
-      This function returns the last cons, or the Nth-to-last cons, of
-      the list X.  If N is omitted it defaults to 1.  The "last cons"
-      means the first cons cell of the list whose `cdr' is not another
-      cons cell.  (For normal lists, the `cdr' of the last cons will be
-      `nil'.)  This function returns `nil' if X is `nil' or shorter than
-      N.  Note that the last *element* of the list is `(car (last X))'.
- 
-  - Function: butlast X &optional N
-      This function returns the list X with the last element, or the
-      last N elements, removed.  If N is greater than zero it makes a
-      copy of the list so as not to damage the original list.  In
-      general, `(append (butlast X N) (last X N))' will return a list
-      equal to X.
- 
-  - Function: nbutlast X &optional N
-      This is a version of `butlast' that works by destructively
-      modifying the `cdr' of the appropriate element, rather than making
-      a copy of the list.
- 
-  - Function: list* ARG &rest OTHERS
-      This function constructs a list of its arguments.  The final
-      argument becomes the `cdr' of the last cell constructed.  Thus,
-      `(list* A B C)' is equivalent to `(cons A (cons B C))', and
-      `(list* A B nil)' is equivalent to `(list A B)'.
- 
-      (Note that this function really is called `list*' in Common Lisp;
-      it is not a name invented for this package like `member*' or
-      `defun*'.)
- 
-  - Function: ldiff LIST SUBLIST
-      If SUBLIST is a sublist of LIST, i.e., is `eq' to one of the cons
-      cells of LIST, then this function returns a copy of the part of
-      LIST up to but not including SUBLIST.  For example, `(ldiff x
-      (cddr x))' returns the first two elements of the list `x'.  The
-      result is a copy; the original LIST is not modified.  If SUBLIST
-      is not a sublist of LIST, a copy of the entire LIST is returned.
- 
-  - Function: copy-list LIST
-      This function returns a copy of the list LIST.  It copies dotted
-      lists like `(1 2 . 3)' correctly.
- 
-  - Function: copy-tree X &optional VECP
-      This function returns a copy of the tree of cons cells X.  Unlike
-      `copy-sequence' (and its alias `copy-list'), which copies only
-      along the `cdr' direction, this function copies (recursively)
-      along both the `car' and the `cdr' directions.  If X is not a cons
-      cell, the function simply returns X unchanged.  If the optional
-      VECP argument is true, this function copies vectors (recursively)
-      as well as cons cells.
- 
-  - Function: tree-equal X Y &key :test :test-not :key
-      This function compares two trees of cons cells.  If X and Y are
-      both cons cells, their `car's and `cdr's are compared recursively.
-      If neither X nor Y is a cons cell, they are compared by `eql', or
-      according to the specified test.  The `:key' function, if
-      specified, is applied to the elements of both trees.  *Note
-      Sequences::.
- 
- 
- File: cl,  Node: Substitution of Expressions,  Next: Lists as Sets,  Prev: List Functions,  Up: Lists
- 
- Substitution of Expressions
- ===========================
- 
- These functions substitute elements throughout a tree of cons cells.
- (*Note Sequence Functions::, for the `substitute' function, which works
- on just the top-level elements of a list.)
- 
-  - Function: subst NEW OLD TREE &key :test :test-not :key
-      This function substitutes occurrences of OLD with NEW in TREE, a
-      tree of cons cells.  It returns a substituted tree, which will be
-      a copy except that it may share storage with the argument TREE in
-      parts where no substitutions occurred.  The original TREE is not
-      modified.  This function recurses on, and compares against OLD,
-      both `car's and `cdr's of the component cons cells.  If OLD is
-      itself a cons cell, then matching cells in the tree are
-      substituted as usual without recursively substituting in that
-      cell.  Comparisons with OLD are done according to the specified
-      test (`eql' by default).  The `:key' function is applied to the
-      elements of the tree but not to OLD.
- 
-  - Function: nsubst NEW OLD TREE &key :test :test-not :key
-      This function is like `subst', except that it works by destructive
-      modification (by `setcar' or `setcdr') rather than copying.
- 
-    The `subst-if', `subst-if-not', `nsubst-if', and `nsubst-if-not'
- functions are defined similarly.
- 
-  - Function: sublis ALIST TREE &key :test :test-not :key
-      This function is like `subst', except that it takes an association
-      list ALIST of OLD-NEW pairs.  Each element of the tree (after
-      applying the `:key' function, if any), is compared with the `car's
-      of ALIST; if it matches, it is replaced by the corresponding `cdr'.
- 
-  - Function: nsublis ALIST TREE &key :test :test-not :key
-      This is a destructive version of `sublis'.
- 
- 
- File: cl,  Node: Lists as Sets,  Next: Association Lists,  Prev: Substitution of Expressions,  Up: Lists
- 
- Lists as Sets
- =============
- 
- These functions perform operations on lists which represent sets of
- elements.
- 
-  - Function: member ITEM LIST
-      This MacLisp-compatible function searches LIST for an element
-      which is `equal' to ITEM.  The `member' function is built-in to
-      Emacs 19; this package defines it equivalently in Emacs 18.  See
-      the following function for a Common-Lisp compatible version.
- 
-  - Function: member* ITEM LIST &key :test :test-not :key
-      This function searches LIST for an element matching ITEM.  If a
-      match is found, it returns the cons cell whose `car' was the
-      matching element.  Otherwise, it returns `nil'.  Elements are
-      compared by `eql' by default; you can use the `:test',
-      `:test-not', and `:key' arguments to modify this behavior.  *Note
-      Sequences::.
- 
-      Note that this function's name is suffixed by `*' to avoid the
-      incompatible `member' function defined in Emacs 19.  (That
-      function uses `equal' for comparisons; it is equivalent to
-      `(member* ITEM LIST :test 'equal)'.)
- 
-    The `member-if' and `member-if-not' functions analogously search for
- elements which satisfy a given predicate.
- 
-  - Function: tailp SUBLIST LIST
-      This function returns `t' if SUBLIST is a sublist of LIST, i.e.,
-      if SUBLIST is `eql' to LIST or to any of its `cdr's.
- 
-  - Function: adjoin ITEM LIST &key :test :test-not :key
-      This function conses ITEM onto the front of LIST, like `(cons ITEM
-      LIST)', but only if ITEM is not already present on the list (as
-      determined by `member*').  If a `:key' argument is specified, it
-      is applied to ITEM as well as to the elements of LIST during the
-      search, on the reasoning that ITEM is "about" to become part of
-      the list.
- 
-  - Function: union LIST1 LIST2 &key :test :test-not :key
-      This function combines two lists which represent sets of items,
-      returning a list that represents the union of those two sets.  The
-      result list will contain all items which appear in LIST1 or LIST2,
-      and no others.  If an item appears in both LIST1 and LIST2 it will
-      be copied only once.  If an item is duplicated in LIST1 or LIST2,
-      it is undefined whether or not that duplication will survive in the
-      result list.  The order of elements in the result list is also
-      undefined.
- 
-  - Function: nunion LIST1 LIST2 &key :test :test-not :key
-      This is a destructive version of `union'; rather than copying, it
-      tries to reuse the storage of the argument lists if possible.
- 
-  - Function: intersection LIST1 LIST2 &key :test :test-not :key
-      This function computes the intersection of the sets represented by
-      LIST1 and LIST2.  It returns the list of items which appear in
-      both LIST1 and LIST2.
- 
-  - Function: nintersection LIST1 LIST2 &key :test :test-not :key
-      This is a destructive version of `intersection'.  It tries to
-      reuse storage of LIST1 rather than copying.  It does *not* reuse
-      the storage of LIST2.
- 
-  - Function: set-difference LIST1 LIST2 &key :test :test-not :key
-      This function computes the "set difference" of LIST1 and LIST2,
-      i.e., the set of elements that appear in LIST1 but *not* in LIST2.
- 
-  - Function: nset-difference LIST1 LIST2 &key :test :test-not :key
-      This is a destructive `set-difference', which will try to reuse
-      LIST1 if possible.
- 
-  - Function: set-exclusive-or LIST1 LIST2 &key :test :test-not :key
-      This function computes the "set exclusive or" of LIST1 and LIST2,
-      i.e., the set of elements that appear in exactly one of LIST1 and
-      LIST2.
- 
-  - Function: nset-exclusive-or LIST1 LIST2 &key :test :test-not :key
-      This is a destructive `set-exclusive-or', which will try to reuse
-      LIST1 and LIST2 if possible.
- 
-  - Function: subsetp LIST1 LIST2 &key :test :test-not :key
-      This function checks whether LIST1 represents a subset of LIST2,
-      i.e., whether every element of LIST1 also appears in LIST2.
- 
- 
- File: cl,  Node: Association Lists,  Prev: Lists as Sets,  Up: Lists
- 
- Association Lists
- =================
- 
- An "association list" is a list representing a mapping from one set of
- values to another; any list whose elements are cons cells is an
- association list.
- 
-  - Function: assoc* ITEM A-LIST &key :test :test-not :key
-      This function searches the association list A-LIST for an element
-      whose `car' matches (in the sense of `:test', `:test-not', and
-      `:key', or by comparison with `eql') a given ITEM.  It returns the
-      matching element, if any, otherwise `nil'.  It ignores elements of
-      A-LIST which are not cons cells.  (This corresponds to the
-      behavior of `assq' and `assoc' in Emacs Lisp; Common Lisp's
-      `assoc' ignores `nil's but considers any other non-cons elements
-      of A-LIST to be an error.)
- 
-  - Function: rassoc* ITEM A-LIST &key :test :test-not :key
-      This function searches for an element whose `cdr' matches ITEM.
-      If A-LIST represents a mapping, this applies the inverse of the
-      mapping to ITEM.
- 
-  - Function: rassoc ITEM A-LIST
-      This function searches like `rassoc*' with a `:test' argument of
-      `equal'.  It is analogous to Emacs Lisp's standard `assoc'
-      function, which derives from the MacLisp rather than the Common
-      Lisp tradition.
- 
-    The `assoc-if', `assoc-if-not', `rassoc-if', and `rassoc-if-not'
- functions are defined similarly.
- 
-    Two simple functions for constructing association lists are:
- 
-  - Function: acons KEY VALUE ALIST
-      This is equivalent to `(cons (cons KEY VALUE) ALIST)'.
- 
-  - Function: pairlis KEYS VALUES &optional ALIST
-      This is equivalent to `(nconc (mapcar* 'cons KEYS VALUES) ALIST)'.
- 
- 
- File: cl,  Node: Hash Tables,  Next: Structures,  Prev: Lists,  Up: Top
- 
- Hash Tables
- ***********
- 
- A "hash table" is a data structure that maps "keys" onto "values."
- Keys and values can be arbitrary Lisp data objects.  Hash tables have
- the property that the time to search for a given key is roughly
- constant; simpler data structures like association lists take time
- proportional to the number of entries in the list.
- 
-  - Function: make-hash-table &key :test :size
-      This function creates and returns a hash-table object whose
-      function for comparing elements is `:test' (`eql' by default), and
-      which is allocated to fit about `:size' elements.  The `:size'
-      argument is purely advisory; the table will stretch automatically
-      if you store more elements in it.  If `:size' is omitted, a
-      reasonable default is used.
- 
-      Common Lisp allows only `eq', `eql', `equal', and `equalp' as
-      legal values for the `:test' argument.  In this package, any
-      reasonable predicate function will work, though if you use
-      something else you should check the details of the hashing
-      function described below to make sure it is suitable for your
-      predicate.
- 
-      Some versions of Emacs (like Lucid Emacs 19) include a built-in
-      hash table type; in these versions, `make-hash-table' with a test
-      of `eq' will use these built-in hash tables.  In all other cases,
-      it will return a hash-table object which takes the form of a list
-      with an identifying "tag" symbol at the front.  All of the hash
-      table functions in this package can operate on both types of hash
-      table; normally you will never know which type is being used.
- 
-      This function accepts the additional Common Lisp keywords
-      `:rehash-size' and `:rehash-threshold', but it ignores their
-      values.
- 
-  - Function: gethash KEY TABLE &optional DEFAULT
-      This function looks up KEY in TABLE.  If KEY exists in the table,
-      in the sense that it matches any of the existing keys according to
-      the table's test function, then the associated value is returned.
-      Otherwise, DEFAULT (or `nil') is returned.
- 
-      To store new data in the hash table, use `setf' on a call to
-      `gethash'.  If KEY already exists in the table, the corresponding
-      value is changed to the stored value.  If KEY does not already
-      exist, a new entry is added to the table and the table is
-      reallocated to a larger size if necessary.  The DEFAULT argument
-      is allowed but ignored in this case.  The situation is exactly
-      analogous to that of `get*'; *note Property Lists::..
- 
-  - Function: remhash KEY TABLE
-      This function removes the entry for KEY from TABLE.  If an entry
-      was removed, it returns `t'.  If KEY does not appear in the table,
-      it does nothing and returns `nil'.
- 
-  - Function: clrhash TABLE
-      This function removes all the entries from TABLE, leaving an empty
-      hash table.
- 
-  - Function: maphash FUNCTION TABLE
-      This function calls FUNCTION for each entry in TABLE.  It passes
-      two arguments to FUNCTION, the key and the value of the given
-      entry.  The return value of FUNCTION is ignored; MAPHASH itself
-      returns `nil'.  *Note Loop Facility::, for an alternate way of
-      iterating over hash tables.
- 
-  - Function: hash-table-count TABLE
-      This function returns the number of entries in TABLE.  *Warning:*
-      The current implementation of Lucid Emacs 19 hash-tables does not
-      decrement the stored `count' when `remhash' removes an entry.
-      Therefore, the return value of this function is not dependable if
-      you have used `remhash' on the table and the table's test is `eq'.
-      A slower, but reliable, way to count the entries is `(loop for x
-      being the hash-keys of TABLE count t)'.
- 
-  - Function: hash-table-p OBJECT
-      This function returns `t' if OBJECT is a hash table, `nil'
-      otherwise.  It recognizes both types of hash tables (both Lucid
-      Emacs built-in tables and tables implemented with special lists.)
- 
-    Sometimes when dealing with hash tables it is useful to know the
- exact "hash function" that is used.  This package implements hash
- tables using Emacs Lisp "obarrays," which are the same data structure
- that Emacs Lisp uses to keep track of symbols.  Each hash table
- includes an embedded obarray.  Key values given to `gethash' are
- converted by various means into strings, which are then looked up in
- the obarray using `intern' and `intern-soft'.  The symbol, or "bucket,"
- corresponding to a given key string includes as its `symbol-value' an
- association list of all key-value pairs which hash to that string.
- Depending on the test function, it is possible for many entries to hash
- to the same bucket.  For example, if the test is `eql', then the symbol
- `foo' and two separately built strings `"foo"' will create three
- entries in the same bucket.  Search time is linear within buckets, so
- hash tables will be most effective if you arrange not to store too many
- things that hash the same.
- 
-    The following algorithm is used to convert Lisp objects to hash
- strings:
- 
-    * Strings are used directly as hash strings.  (However, if the test
-      function is `equalp', strings are `downcase'd first.)
- 
-    * Symbols are hashed according to their `symbol-name'.
- 
-    * Integers are hashed into one of 16 buckets depending on their value
-      modulo 16.  Floating-point numbers are truncated to integers and
-      hashed modulo 16.
- 
-    * Cons cells are hashed according to their `car's; nonempty vectors
-      are hashed according to their first element.
- 
-    * All other types of objects hash into a single bucket named `"*"'.
- 
- Thus, for example, searching among many buffer objects in a hash table
- will devolve to a (still fairly fast) linear-time search through a
- single bucket, whereas searching for different symbols will be very
- fast since each symbol will, in general, hash into its own bucket.
- 
-    The size of the obarray in a hash table is automatically adjusted as
- the number of elements increases.
- 
-    As a special case, `make-hash-table' with a `:size' argument of 0 or
- 1 will create a hash-table object that uses a single association list
- rather than an obarray of many lists.  For very small tables this
- structure will be more efficient since lookup does not require
- converting the key to a string or looking it up in an obarray.
- However, such tables are guaranteed to take time proportional to their
- size to do a search.
- 
--- 0 ----
Index: emacs/info/cl-5
diff -c emacs/info/cl-5:1.1.1.1 emacs/info/cl-5:removed
*** emacs/info/cl-5:1.1.1.1	Fri Jul 19 01:55:01 1996
--- emacs/info/cl-5	Fri Aug  2 19:59:54 1996
***************
*** 1,917 ****
- This is Info file ../info/cl, produced by Makeinfo-1.55 from the input
- file cl.texi.
- 
-    This file documents the GNU Emacs Common Lisp emulation package.
- 
-    Copyright (C) 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "GNU General Public License" is included
- exactly as in the original, and provided that the entire resulting
- derived work is distributed under the terms of a permission notice
- identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the section entitled "GNU General Public License"
- may be included in a translation approved by the author instead of in
- the original English.
- 
- 
- File: cl,  Node: Structures,  Next: Assertions,  Prev: Hash Tables,  Up: Top
- 
- Structures
- **********
- 
- The Common Lisp "structure" mechanism provides a general way to define
- data types similar to C's `struct' types.  A structure is a Lisp object
- containing some number of "slots", each of which can hold any Lisp data
- object.  Functions are provided for accessing and setting the slots,
- creating or copying structure objects, and recognizing objects of a
- particular structure type.
- 
-    In true Common Lisp, each structure type is a new type distinct from
- all existing Lisp types.  Since the underlying Emacs Lisp system
- provides no way to create new distinct types, this package implements
- structures as vectors (or lists upon request) with a special "tag"
- symbol to identify them.
- 
-  - Special Form: defstruct NAME SLOTS...
-      The `defstruct' form defines a new structure type called NAME,
-      with the specified SLOTS.  (The SLOTS may begin with a string
-      which documents the structure type.) In the simplest case, NAME
-      and each of the SLOTS are symbols.  For example,
- 
-           (defstruct person name age sex)
- 
-      defines a struct type called `person' which contains three slots.
-      Given a `person' object P, you can access those slots by calling
-      `(person-name P)', `(person-age P)', and `(person-sex P)'.  You
-      can also change these slots by using `setf' on any of these place
-      forms:
- 
-           (incf (person-age birthday-boy))
- 
-      You can create a new `person' by calling `make-person', which
-      takes keyword arguments `:name', `:age', and `:sex' to specify the
-      initial values of these slots in the new object.  (Omitting any of
-      these arguments leaves the corresponding slot "undefined,"
-      according to the Common Lisp standard; in Emacs Lisp, such
-      uninitialized slots are filled with `nil'.)
- 
-      Given a `person', `(copy-person P)' makes a new object of the same
-      type whose slots are `eq' to those of P.
- 
-      Given any Lisp object X, `(person-p X)' returns true if X looks
-      like a `person', false otherwise.  (Again, in Common Lisp this
-      predicate would be exact; in Emacs Lisp the best it can do is
-      verify that X is a vector of the correct length which starts with
-      the correct tag symbol.)
- 
-      Accessors like `person-name' normally check their arguments
-      (effectively using `person-p') and signal an error if the argument
-      is the wrong type.  This check is affected by `(optimize (safety
-      ...))' declarations.  Safety level 1, the default, uses a somewhat
-      optimized check that will detect all incorrect arguments, but may
-      use an uninformative error message (e.g., "expected a vector"
-      instead of "expected a `person'").  Safety level 0 omits all
-      checks except as provided by the underlying `aref' call; safety
-      levels 2 and 3 do rigorous checking that will always print a
-      descriptive error message for incorrect inputs.  *Note
-      Declarations::.
- 
-           (setq dave (make-person :name "Dave" :sex 'male))
-                => [cl-struct-person "Dave" nil male]
-           (setq other (copy-person dave))
-                => [cl-struct-person "Dave" nil male]
-           (eq dave other)
-                => nil
-           (eq (person-name dave) (person-name other))
-                => t
-           (person-p dave)
-                => t
-           (person-p [1 2 3 4])
-                => nil
-           (person-p "Bogus")
-                => nil
-           (person-p '[cl-struct-person counterfeit person object])
-                => t
- 
-      In general, NAME is either a name symbol or a list of a name
-      symbol followed by any number of "struct options"; each SLOT is
-      either a slot symbol or a list of the form `(SLOT-NAME
-      DEFAULT-VALUE SLOT-OPTIONS...)'.  The DEFAULT-VALUE is a Lisp form
-      which is evaluated any time an instance of the structure type is
-      created without specifying that slot's value.
- 
-      Common Lisp defines several slot options, but the only one
-      implemented in this package is `:read-only'.  A non-`nil' value
-      for this option means the slot should not be `setf'-able; the
-      slot's value is determined when the object is created and does not
-      change afterward.
- 
-           (defstruct person
-             (name nil :read-only t)
-             age
-             (sex 'unknown))
- 
-      Any slot options other than `:read-only' are ignored.
- 
-      For obscure historical reasons, structure options take a different
-      form than slot options.  A structure option is either a keyword
-      symbol, or a list beginning with a keyword symbol possibly followed
-      by arguments.  (By contrast, slot options are key-value pairs not
-      enclosed in lists.)
- 
-           (defstruct (person (:constructor create-person)
-                              (:type list)
-                              :named)
-             name age sex)
- 
-      The following structure options are recognized.
- 
-     `:conc-name'
-           The argument is a symbol whose print name is used as the
-           prefix for the names of slot accessor functions.  The default
-           is the name of the struct type followed by a hyphen.  The
-           option `(:conc-name p-)' would change this prefix to `p-'.
-           Specifying `nil' as an argument means no prefix, so that the
-           slot names themselves are used to name the accessor functions.
- 
-     `:constructor'
-           In the simple case, this option takes one argument which is an
-           alternate name to use for the constructor function.  The
-           default is `make-NAME', e.g., `make-person'.  The above
-           example changes this to `create-person'.  Specifying `nil' as
-           an argument means that no standard constructor should be
-           generated at all.
- 
-           In the full form of this option, the constructor name is
-           followed by an arbitrary argument list.  *Note Program
-           Structure::, for a description of the format of Common Lisp
-           argument lists.  All options, such as `&rest' and `&key', are
-           supported.  The argument names should match the slot names;
-           each slot is initialized from the corresponding argument.
-           Slots whose names do not appear in the argument list are
-           initialized based on the DEFAULT-VALUE in their slot
-           descriptor.  Also, `&optional' and `&key' arguments which
-           don't specify defaults take their defaults from the slot
-           descriptor.  It is legal to include arguments which don't
-           correspond to slot names; these are useful if they are
-           referred to in the defaults for optional, keyword, or `&aux'
-           arguments which *do* correspond to slots.
- 
-           You can specify any number of full-format `:constructor'
-           options on a structure.  The default constructor is still
-           generated as well unless you disable it with a simple-format
-           `:constructor' option.
- 
-                (defstruct
-                 (person
-                  (:constructor nil)   ; no default constructor
-                  (:constructor new-person (name sex &optional (age 0)))
-                  (:constructor new-hound (&key (name "Rover")
-                                                (dog-years 0)
-                                           &aux (age (* 7 dog-years))
-                                                (sex 'canine))))
-                 name age sex)
- 
-           The first constructor here takes its arguments positionally
-           rather than by keyword.  (In official Common Lisp
-           terminology, constructors that work By Order of Arguments
-           instead of by keyword are called "BOA constructors."  No, I'm
-           not making this up.)  For example, `(new-person "Jane"
-           'female)' generates a person whose slots are `"Jane"', 0, and
-           `female', respectively.
- 
-           The second constructor takes two keyword arguments, `:name',
-           which initializes the `name' slot and defaults to `"Rover"',
-           and `:dog-years', which does not itself correspond to a slot
-           but which is used to initialize the `age' slot.  The `sex'
-           slot is forced to the symbol `canine' with no syntax for
-           overriding it.
- 
-     `:copier'
-           The argument is an alternate name for the copier function for
-           this type.  The default is `copy-NAME'.  `nil' means not to
-           generate a copier function.  (In this implementation, all
-           copier functions are simply synonyms for `copy-sequence'.)
- 
-     `:predicate'
-           The argument is an alternate name for the predicate which
-           recognizes objects of this type.  The default is `NAME-p'.
-           `nil' means not to generate a predicate function.  (If the
-           `:type' option is used without the `:named' option, no
-           predicate is ever generated.)
- 
-           In true Common Lisp, `typep' is always able to recognize a
-           structure object even if `:predicate' was used.  In this
-           package, `typep' simply looks for a function called
-           `TYPENAME-p', so it will work for structure types only if
-           they used the default predicate name.
- 
-     `:include'
-           This option implements a very limited form of C++-style
-           inheritance.  The argument is the name of another structure
-           type previously created with `defstruct'.  The effect is to
-           cause the new structure type to inherit all of the included
-           structure's slots (plus, of course, any new slots described
-           by this struct's slot descriptors).  The new structure is
-           considered a "specialization" of the included one.  In fact,
-           the predicate and slot accessors for the included type will
-           also accept objects of the new type.
- 
-           If there are extra arguments to the `:include' option after
-           the included-structure name, these options are treated as
-           replacement slot descriptors for slots in the included
-           structure, possibly with modified default values.  Borrowing
-           an example from Steele:
- 
-                (defstruct person name (age 0) sex)
-                     => person
-                (defstruct (astronaut (:include person (age 45)))
-                  helmet-size
-                  (favorite-beverage 'tang))
-                     => astronaut
-                
-                (setq joe (make-person :name "Joe"))
-                     => [cl-struct-person "Joe" 0 nil]
-                (setq buzz (make-astronaut :name "Buzz"))
-                     => [cl-struct-astronaut "Buzz" 45 nil nil tang]
-                
-                (list (person-p joe) (person-p buzz))
-                     => (t t)
-                (list (astronaut-p joe) (astronaut-p buzz))
-                     => (nil t)
-                
-                (person-name buzz)
-                     => "Buzz"
-                (astronaut-name joe)
-                     => error: "astronaut-name accessing a non-astronaut"
- 
-           Thus, if `astronaut' is a specialization of `person', then
-           every `astronaut' is also a `person' (but not the other way
-           around).  Every `astronaut' includes all the slots of a
-           `person', plus extra slots that are specific to astronauts.
-           Operations that work on people (like `person-name') work on
-           astronauts just like other people.
- 
-     `:print-function'
-           In full Common Lisp, this option allows you to specify a
-           function which is called to print an instance of the
-           structure type.  The Emacs Lisp system offers no hooks into
-           the Lisp printer which would allow for such a feature, so
-           this package simply ignores `:print-function'.
- 
-     `:type'
-           The argument should be one of the symbols `vector' or `list'.
-           This tells which underlying Lisp data type should be used to
-           implement the new structure type.  Vectors are used by
-           default, but `(:type list)' will cause structure objects to
-           be stored as lists instead.
- 
-           The vector representation for structure objects has the
-           advantage that all structure slots can be accessed quickly,
-           although creating vectors is a bit slower in Emacs Lisp.
-           Lists are easier to create, but take a relatively long time
-           accessing the later slots.
- 
-     `:named'
-           This option, which takes no arguments, causes a
-           characteristic "tag" symbol to be stored at the front of the
-           structure object.  Using `:type' without also using `:named'
-           will result in a structure type stored as plain vectors or
-           lists with no identifying features.
- 
-           The default, if you don't specify `:type' explicitly, is to
-           use named vectors.  Therefore, `:named' is only useful in
-           conjunction with `:type'.
- 
-                (defstruct (person1) name age sex)
-                (defstruct (person2 (:type list) :named) name age sex)
-                (defstruct (person3 (:type list)) name age sex)
-                
-                (setq p1 (make-person1))
-                     => [cl-struct-person1 nil nil nil]
-                (setq p2 (make-person2))
-                     => (person2 nil nil nil)
-                (setq p3 (make-person3))
-                     => (nil nil nil)
-                
-                (person1-p p1)
-                     => t
-                (person2-p p2)
-                     => t
-                (person3-p p3)
-                     => error: function person3-p undefined
- 
-           Since unnamed structures don't have tags, `defstruct' is not
-           able to make a useful predicate for recognizing them.  Also,
-           accessors like `person3-name' will be generated but they will
-           not be able to do any type checking.  The `person3-name'
-           function, for example, will simply be a synonym for `car' in
-           this case.  By contrast, `person2-name' is able to verify
-           that its argument is indeed a `person2' object before
-           proceeding.
- 
-     `:initial-offset'
-           The argument must be a nonnegative integer.  It specifies a
-           number of slots to be left "empty" at the front of the
-           structure.  If the structure is named, the tag appears at the
-           specified position in the list or vector; otherwise, the first
-           slot appears at that position.  Earlier positions are filled
-           with `nil' by the constructors and ignored otherwise.  If the
-           type `:include's another type, then `:initial-offset'
-           specifies a number of slots to be skipped between the last
-           slot of the included type and the first new slot.
- 
-    Except as noted, the `defstruct' facility of this package is
- entirely compatible with that of Common Lisp.
- 
- 
- File: cl,  Node: Assertions,  Next: Efficiency Concerns,  Prev: Structures,  Up: Top
- 
- Assertions and Errors
- *********************
- 
- This section describes two macros that test "assertions", i.e.,
- conditions which must be true if the program is operating correctly.
- Assertions never add to the behavior of a Lisp program; they simply
- make "sanity checks" to make sure everything is as it should be.
- 
-    If the optimization property `speed' has been set to 3, and `safety'
- is less than 3, then the byte-compiler will optimize away the following
- assertions.  Because assertions might be optimized away, it is a bad
- idea for them to include side-effects.
- 
-  - Special Form: assert TEST-FORM [SHOW-ARGS STRING ARGS...]
-      This form verifies that TEST-FORM is true (i.e., evaluates to a
-      non-`nil' value).  If so, it returns `nil'.  If the test is not
-      satisfied, `assert' signals an error.
- 
-      A default error message will be supplied which includes TEST-FORM.
-      You can specify a different error message by including a STRING
-      argument plus optional extra arguments.  Those arguments are simply
-      passed to `error' to signal the error.
- 
-      If the optional second argument SHOW-ARGS is `t' instead of `nil',
-      then the error message (with or without STRING) will also include
-      all non-constant arguments of the top-level FORM.  For example:
- 
-           (assert (> x 10) t "x is too small: %d")
- 
-      This usage of SHOW-ARGS is an extension to Common Lisp.  In true
-      Common Lisp, the second argument gives a list of PLACES which can
-      be `setf''d by the user before continuing from the error.  Since
-      Emacs Lisp does not support continuable errors, it makes no sense
-      to specify PLACES.
- 
-  - Special Form: check-type FORM TYPE [STRING]
-      This form verifies that FORM evaluates to a value of type TYPE.
-      If so, it returns `nil'.  If not, `check-type' signals a
-      `wrong-type-argument' error.  The default error message lists the
-      erroneous value along with TYPE and FORM themselves.  If STRING is
-      specified, it is included in the error message in place of TYPE.
-      For example:
- 
-           (check-type x (integer 1 *) "a positive integer")
- 
-      *Note Type Predicates::, for a description of the type specifiers
-      that may be used for TYPE.
- 
-      Note that in Common Lisp, the first argument to `check-type' must
-      be a PLACE suitable for use by `setf', because `check-type'
-      signals a continuable error that allows the user to modify PLACE.
- 
-    The following error-related macro is also defined:
- 
-  - Special Form: ignore-errors FORMS...
-      This executes FORMS exactly like a `progn', except that errors are
-      ignored during the FORMS.  More precisely, if an error is
-      signalled then `ignore-errors' immediately aborts execution of the
-      FORMS and returns `nil'.  If the FORMS complete successfully,
-      `ignore-errors' returns the result of the last FORM.
- 
- 
- File: cl,  Node: Efficiency Concerns,  Next: Common Lisp Compatibility,  Prev: Assertions,  Up: Top
- 
- Efficiency Concerns
- *******************
- 
- Macros
- ======
- 
- Many of the advanced features of this package, such as `defun*',
- `loop', and `setf', are implemented as Lisp macros.  In byte-compiled
- code, these complex notations will be expanded into equivalent Lisp
- code which is simple and efficient.  For example, the forms
- 
-      (incf i n)
-      (push x (car p))
- 
- are expanded at compile-time to the Lisp forms
- 
-      (setq i (+ i n))
-      (setcar p (cons x (car p)))
- 
- which are the most efficient ways of doing these respective operations
- in Lisp.  Thus, there is no performance penalty for using the more
- readable `incf' and `push' forms in your compiled code.
- 
-    *Interpreted* code, on the other hand, must expand these macros
- every time they are executed.  For this reason it is strongly
- recommended that code making heavy use of macros be compiled.  (The
- features labelled "Special Form" instead of "Function" in this manual
- are macros.)  A loop using `incf' a hundred times will execute
- considerably faster if compiled, and will also garbage-collect less
- because the macro expansion will not have to be generated, used, and
- thrown away a hundred times.
- 
-    You can find out how a macro expands by using the `cl-prettyexpand'
- function.
- 
-  - Function: cl-prettyexpand FORM &optional FULL
-      This function takes a single Lisp form as an argument and inserts
-      a nicely formatted copy of it in the current buffer (which must be
-      in Lisp mode so that indentation works properly).  It also expands
-      all Lisp macros which appear in the form.  The easiest way to use
-      this function is to go to the `*scratch*' buffer and type, say,
- 
-           (cl-prettyexpand '(loop for x below 10 collect x))
- 
-      and type `C-x C-e' immediately after the closing parenthesis; the
-      expansion
- 
-           (block nil
-             (let* ((x 0)
-                    (G1004 nil))
-               (while (< x 10)
-                 (setq G1004 (cons x G1004))
-                 (setq x (+ x 1)))
-               (nreverse G1004)))
- 
-      will be inserted into the buffer.  (The `block' macro is expanded
-      differently in the interpreter and compiler, so `cl-prettyexpand'
-      just leaves it alone.  The temporary variable `G1004' was created
-      by `gensym'.)
- 
-      If the optional argument FULL is true, then *all* macros are
-      expanded, including `block', `eval-when', and compiler macros.
-      Expansion is done as if FORM were a top-level form in a file being
-      compiled.  For example,
- 
-           (cl-prettyexpand '(pushnew 'x list))
-                -| (setq list (adjoin 'x list))
-           (cl-prettyexpand '(pushnew 'x list) t)
-                -| (setq list (if (memq 'x list) list (cons 'x list)))
-           (cl-prettyexpand '(caddr (member* 'a list)) t)
-                -| (car (cdr (cdr (memq 'a list))))
- 
-      Note that `adjoin', `caddr', and `member*' all have built-in
-      compiler macros to optimize them in common cases.
- 
- 
- Error Checking
- ==============
- 
- Common Lisp compliance has in general not been sacrificed for the sake
- of efficiency.  A few exceptions have been made for cases where
- substantial gains were possible at the expense of marginal
- incompatibility.  One example is the use of `memq' (which is treated
- very efficiently by the byte-compiler) to scan for keyword arguments;
- this can become confused in rare cases when keyword symbols are used as
- both keywords and data values at once.  This is extremely unlikely to
- occur in practical code, and the use of `memq' allows functions with
- keyword arguments to be nearly as fast as functions that use
- `&optional' arguments.
- 
-    The Common Lisp standard (as embodied in Steele's book) uses the
- phrase "it is an error if" to indicate a situation which is not
- supposed to arise in complying programs; implementations are strongly
- encouraged but not required to signal an error in these situations.
- This package sometimes omits such error checking in the interest of
- compactness and efficiency.  For example, `do' variable specifiers are
- supposed to be lists of one, two, or three forms; extra forms are
- ignored by this package rather than signalling a syntax error.  The
- `endp' function is simply a synonym for `null' in this package.
- Functions taking keyword arguments will accept an odd number of
- arguments, treating the trailing keyword as if it were followed by the
- value `nil'.
- 
-    Argument lists (as processed by `defun*' and friends) *are* checked
- rigorously except for the minor point just mentioned; in particular,
- keyword arguments are checked for validity, and `&allow-other-keys' and
- `:allow-other-keys' are fully implemented.  Keyword validity checking
- is slightly time consuming (though not too bad in byte-compiled code);
- you can use `&allow-other-keys' to omit this check.  Functions defined
- in this package such as `find' and `member*' do check their keyword
- arguments for validity.
- 
- 
- Optimizing Compiler
- ===================
- 
- The byte-compiler that comes with Emacs 18 normally fails to expand
- macros that appear in top-level positions in the file (i.e., outside of
- `defun's or other enclosing forms).  This would have disastrous
- consequences to programs that used such top-level macros as `defun*',
- `eval-when', and `defstruct'.  To work around this problem, the "CL"
- package patches the Emacs 18 compiler to expand top-level macros.  This
- patch will apply to your own macros, too, if they are used in a
- top-level context.  The patch will not harm versions of the Emacs 18
- compiler which have already had a similar patch applied, nor will it
- affect the optimizing Emacs 19 byte-compiler written by Jamie Zawinski
- and Hallvard Furuseth.  The patch is applied to the byte compiler's
- code in Emacs' memory, *not* to the `bytecomp.elc' file stored on disk.
- 
-    The Emacs 19 compiler (for Emacs 18) is available from various Emacs
- Lisp archive sites such as `archive.cis.ohio-state.edu'.  Its use is
- highly recommended; many of the Common Lisp macros emit code which can
- be improved by optimization.  In particular, `block's (whether explicit
- or implicit in constructs like `defun*' and `loop') carry a fair
- run-time penalty; the optimizing compiler removes `block's which are
- not actually referenced by `return' or `return-from' inside the block.
- 
- 
- File: cl,  Node: Common Lisp Compatibility,  Next: Old CL Compatibility,  Prev: Efficiency Concerns,  Up: Top
- 
- Common Lisp Compatibility
- *************************
- 
- Following is a list of all known incompatibilities between this package
- and Common Lisp as documented in Steele (2nd edition).
- 
-    Certain function names, such as `member', `assoc', and `floor', were
- already taken by (incompatible) Emacs Lisp functions; this package
- appends `*' to the names of its Common Lisp versions of these functions.
- 
-    The word `defun*' is required instead of `defun' in order to use
- extended Common Lisp argument lists in a function.  Likewise,
- `defmacro*' and `function*' are versions of those forms which
- understand full-featured argument lists.  The `&whole' keyword does not
- work in `defmacro' argument lists (except inside recursive argument
- lists).
- 
-    In order to allow an efficient implementation, keyword arguments use
- a slightly cheesy parser which may be confused if a keyword symbol is
- passed as the *value* of another keyword argument.  (Specifically,
- `(memq :KEYWORD REST-OF-ARGUMENTS)' is used to scan for `:KEYWORD'
- among the supplied keyword arguments.)
- 
-    The `eql' and `equal' predicates do not distinguish between IEEE
- floating-point plus and minus zero.  The `equalp' predicate has several
- differences with Common Lisp; *note Predicates::..
- 
-    The `setf' mechanism is entirely compatible, except that
- setf-methods return a list of five values rather than five values
- directly.  Also, the new "`setf' function" concept (typified by `(defun
- (setf foo) ...)') is not implemented.
- 
-    The `do-all-symbols' form is the same as `do-symbols' with no
- OBARRAY argument.  In Common Lisp, this form would iterate over all
- symbols in all packages.  Since Emacs obarrays are not a first-class
- package mechanism, there is no way for `do-all-symbols' to locate any
- but the default obarray.
- 
-    The `loop' macro is complete except that `loop-finish' and type
- specifiers are unimplemented.
- 
-    The multiple-value return facility treats lists as multiple values,
- since Emacs Lisp cannot support multiple return values directly.  The
- macros will be compatible with Common Lisp if `values' or `values-list'
- is always used to return to a `multiple-value-bind' or other
- multiple-value receiver; if `values' is used without
- `multiple-value-...' or vice-versa the effect will be different from
- Common Lisp.
- 
-    Many Common Lisp declarations are ignored, and others match the
- Common Lisp standard in concept but not in detail.  For example, local
- `special' declarations, which are purely advisory in Emacs Lisp, do not
- rigorously obey the scoping rules set down in Steele's book.
- 
-    The variable `*gensym-counter*' starts out with a pseudo-random
- value rather than with zero.  This is to cope with the fact that
- generated symbols become interned when they are written to and loaded
- back from a file.
- 
-    The `defstruct' facility is compatible, except that structures are
- of type `:type vector :named' by default rather than some special,
- distinct type.  Also, the `:type' slot option is ignored.
- 
-    The second argument of `check-type' is treated differently.
- 
- 
- File: cl,  Node: Old CL Compatibility,  Next: Porting Common Lisp,  Prev: Common Lisp Compatibility,  Up: Top
- 
- Old CL Compatibility
- ********************
- 
- Following is a list of all known incompatibilities between this package
- and the older Quiroz `cl.el' package.
- 
-    This package's emulation of multiple return values in functions is
- incompatible with that of the older package.  That package attempted to
- come as close as possible to true Common Lisp multiple return values;
- unfortunately, it could not be 100% reliable and so was prone to
- occasional surprises if used freely.  This package uses a simpler
- method, namely replacing multiple values with lists of values, which is
- more predictable though more noticeably different from Common Lisp.
- 
-    The `defkeyword' form and `keywordp' function are not implemented in
- this package.
- 
-    The `member', `floor', `ceiling', `truncate', `round', `mod', and
- `rem' functions are suffixed by `*' in this package to avoid collision
- with existing functions in Emacs 18 or Emacs 19.  The older package
- simply redefined these functions, overwriting the built-in meanings and
- causing serious portability problems with Emacs 19.  (Some more recent
- versions of the Quiroz package changed the names to `cl-member', etc.;
- this package defines the latter names as aliases for `member*', etc.)
- 
-    Certain functions in the old package which were buggy or inconsistent
- with the Common Lisp standard are incompatible with the conforming
- versions in this package.  For example, `eql' and `member' were
- synonyms for `eq' and `memq' in that package, `setf' failed to preserve
- correct order of evaluation of its arguments, etc.
- 
-    Finally, unlike the older package, this package is careful to prefix
- all of its internal names with `cl-'.  Except for a few functions which
- are explicitly defined as additional features (such as `floatp-safe'
- and `letf'), this package does not export any non-`cl-' symbols which
- are not also part of Common Lisp.
- 
- 
- The `cl-compat' package
- =======================
- 
- The "CL" package includes emulations of some features of the old
- `cl.el', in the form of a compatibility package `cl-compat'.  To use
- it, put `(require 'cl-compat)' in your program.
- 
-    The old package defined a number of internal routines without `cl-'
- prefixes or other annotations.  Call to these routines may have crept
- into existing Lisp code.  `cl-compat' provides emulations of the
- following internal routines: `pair-with-newsyms', `zip-lists',
- `unzip-lists', `reassemble-arglists', `duplicate-symbols-p',
- `safe-idiv'.
- 
-    Some `setf' forms translated into calls to internal functions that
- user code might call directly.  The functions `setnth', `setnthcdr',
- and `setelt' fall in this category; they are defined by `cl-compat',
- but the best fix is to change to use `setf' properly.
- 
-    The `cl-compat' file defines the keyword functions `keywordp',
- `keyword-of', and `defkeyword', which are not defined by the new "CL"
- package because the use of keywords as data is discouraged.
- 
-    The `build-klist' mechanism for parsing keyword arguments is
- emulated by `cl-compat'; the `with-keyword-args' macro is not, however,
- and in any case it's best to change to use the more natural keyword
- argument processing offered by `defun*'.
- 
-    Multiple return values are treated differently by the two Common
- Lisp packages.  The old package's method was more compatible with true
- Common Lisp, though it used heuristics that caused it to report
- spurious multiple return values in certain cases.  The `cl-compat'
- package defines a set of multiple-value macros that are compatible with
- the old CL package; again, they are heuristic in nature, but they are
- guaranteed to work in any case where the old package's macros worked.
- To avoid name collision with the "official" multiple-value facilities,
- the ones in `cl-compat' have capitalized names:  `Values',
- `Values-list', `Multiple-value-bind', etc.
- 
-    The functions `cl-floor', `cl-ceiling', `cl-truncate', and
- `cl-round' are defined by `cl-compat' to use the old-style
- multiple-value mechanism, just as they did in the old package.  The
- newer `floor*' and friends return their two results in a list rather
- than as multiple values.  Note that older versions of the old package
- used the unadorned names `floor', `ceiling', etc.; `cl-compat' cannot
- use these names because they conflict with Emacs 19 built-ins.
- 
- 
- File: cl,  Node: Porting Common Lisp,  Next: Function Index,  Prev: Old CL Compatibility,  Up: Top
- 
- Porting Common Lisp
- *******************
- 
- This package is meant to be used as an extension to Emacs Lisp, not as
- an Emacs implementation of true Common Lisp.  Some of the remaining
- differences between Emacs Lisp and Common Lisp make it difficult to
- port large Common Lisp applications to Emacs.  For one, some of the
- features in this package are not fully compliant with ANSI or Steele;
- *note Common Lisp Compatibility::..  But there are also quite a few
- features that this package does not provide at all.  Here are some
- major omissions that you will want watch out for when bringing Common
- Lisp code into Emacs.
- 
-    * Case-insensitivity.  Symbols in Common Lisp are case-insensitive
-      by default.  Some programs refer to a function or variable as
-      `foo' in one place and `Foo' or `FOO' in another.  Emacs Lisp will
-      treat these as three distinct symbols.
- 
-      Some Common Lisp code is written in all upper-case.  While Emacs
-      is happy to let the program's own functions and variables use this
-      convention, calls to Lisp builtins like `if' and `defun' will have
-      to be changed to lower-case.
- 
-    * Lexical scoping.  In Common Lisp, function arguments and `let'
-      bindings apply only to references physically within their bodies
-      (or within macro expansions in their bodies).  Emacs Lisp, by
-      contrast, uses "dynamic scoping" wherein a binding to a variable
-      is visible even inside functions called from the body.
- 
-      Variables in Common Lisp can be made dynamically scoped by
-      declaring them `special' or using `defvar'.  In Emacs Lisp it is
-      as if all variables were declared `special'.
- 
-      Often you can use code that was written for lexical scoping even
-      in a dynamically scoped Lisp, but not always.  Here is an example
-      of a Common Lisp code fragment that would fail in Emacs Lisp:
- 
-           (defun map-odd-elements (func list)
-             (loop for x in list
-                   for flag = t then (not flag)
-                   collect (if flag x (funcall func x))))
-           
-           (defun add-odd-elements (list x)
-             (map-odd-elements (function (lambda (a) (+ a x))) list))
- 
-      In Common Lisp, the two functions' usages of `x' are completely
-      independent.  In Emacs Lisp, the binding to `x' made by
-      `add-odd-elements' will have been hidden by the binding in
-      `map-odd-elements' by the time the `(+ a x)' function is called.
- 
-      (This package avoids such problems in its own mapping functions by
-      using names like `cl-x' instead of `x' internally; as long as you
-      don't use the `cl-' prefix for your own variables no collision can
-      occur.)
- 
-      *Note Lexical Bindings::, for a description of the `lexical-let'
-      form which establishes a Common Lisp-style lexical binding, and
-      some examples of how it differs from Emacs' regular `let'.
- 
-    * Common Lisp allows the shorthand `#'x' to stand for `(function
-      x)', just as `'x' stands for `(quote x)'.  In Common Lisp, one
-      traditionally uses `#'' notation when referring to the name of a
-      function.  In Emacs Lisp, it works just as well to use a regular
-      quote:
- 
-           (loop for x in y by #'cddr collect (mapcar #'plusp x))  ; Common Lisp
-           (loop for x in y by 'cddr collect (mapcar 'plusp x))    ; Emacs Lisp
- 
-      When `#'' introduces a `lambda' form, it is best to write out
-      `(function ...)' longhand in Emacs Lisp.  You can use a regular
-      quote, but then the byte-compiler won't know that the `lambda'
-      expression is code that can be compiled.
- 
-           (mapcar #'(lambda (x) (* x 2)) list)            ; Common Lisp
-           (mapcar (function (lambda (x) (* x 2))) list)   ; Emacs Lisp
- 
-      Lucid Emacs supports `#'' notation starting with version 19.8.
- 
-    * The "backquote" feature uses a different syntax in Emacs Lisp.
- 
-           (defmacro foo (v &rest body) `(let ((,v 0)) @,body))  ; Common Lisp
-           (defmacro foo (v &rest body) (` (let (((, v) 0)) (@, body)))  ; Emacs
- 
-    * Reader macros.  Common Lisp includes a second type of macro that
-      works at the level of individual characters.  For example, Common
-      Lisp implements the quote notation by a reader macro called `'',
-      whereas Emacs Lisp's parser just treats quote as a special case.
-      Some Lisp packages use reader macros to create special syntaxes
-      for themselves, which the Emacs parser is incapable of reading.
- 
-      The lack of reader macros, incidentally, is the reason behind
-      Emacs Lisp's unusual backquote syntax.  Since backquotes are
-      implemented as a Lisp package and not built-in to the Emacs
-      parser, they are forced to use a regular macro named ``' which is
-      used with the standard function/macro call notation.
- 
-    * Other syntactic features.  Common Lisp provides a number of
-      notations beginning with `#' that the Emacs Lisp parser won't
-      understand.  For example, `#| ... |#' is an alternate comment
-      notation, and `#+lucid (foo)' tells the parser to ignore the
-      `(foo)' except in Lucid Common Lisp.
- 
-    * Packages.  In Common Lisp, symbols are divided into "packages".
-      Symbols that are Lisp built-ins are typically stored in one
-      package; symbols that are vendor extensions are put in another,
-      and each application program would have a package for its own
-      symbols.  Certain symbols are "exported" by a package and others
-      are internal; certain packages "use" or import the exported symbols
-      of other packages.  To access symbols that would not normally be
-      visible due to this importing and exporting, Common Lisp provides
-      a syntax like `package:symbol' or `package::symbol'.
- 
-      Emacs Lisp has a single namespace for all interned symbols, and
-      then uses a naming convention of putting a prefix like `cl-' in
-      front of the name.  Some Emacs packages adopt the Common Lisp-like
-      convention of using `cl:' or `cl::' as the prefix.  However, the
-      Emacs parser does not understand colons and just treats them as
-      part of the symbol name.  Thus, while `mapcar' and `lisp:mapcar'
-      may refer to the same symbol in Common Lisp, they are totally
-      distinct in Emacs Lisp.  Common Lisp programs which refer to a
-      symbol by the full name sometimes and the short name other times
-      will not port cleanly to Emacs.
- 
-      Emacs Lisp does have a concept of "obarrays," which are
-      package-like collections of symbols, but this feature is not
-      strong enough to be used as a true package mechanism.
- 
-    * Keywords.  The notation `:test-not' in Common Lisp really is a
-      shorthand for `keyword:test-not'; keywords are just symbols in a
-      built-in `keyword' package with the special property that all its
-      symbols are automatically self-evaluating.  Common Lisp programs
-      often use keywords liberally to avoid having to use quotes.
- 
-      In Emacs Lisp a keyword is just a symbol whose name begins with a
-      colon; since the Emacs parser does not treat them specially, they
-      have to be explicitly made self-evaluating by a statement like
-      `(setq :test-not ':test-not)'.  This package arranges to execute
-      such a statement whenever `defun*' or some other form sees a
-      keyword being used as an argument.  Common Lisp code that assumes
-      that a symbol `:mumble' will be self-evaluating even though it was
-      never introduced by a `defun*' will have to be fixed.
- 
-    * The `format' function is quite different between Common Lisp and
-      Emacs Lisp.  It takes an additional "destination" argument before
-      the format string.  A destination of `nil' means to format to a
-      string as in Emacs Lisp; a destination of `t' means to write to
-      the terminal (similar to `message' in Emacs).  Also, format
-      control strings are utterly different; `~' is used instead of `%'
-      to introduce format codes, and the set of available codes is much
-      richer.  There are no notations like `\n' for string literals;
-      instead, `format' is used with the "newline" format code, `~%'.
-      More advanced formatting codes provide such features as paragraph
-      filling, case conversion, and even loops and conditionals.
- 
-      While it would have been possible to implement most of Common Lisp
-      `format' in this package (under the name `format*', of course), it
-      was not deemed worthwhile.  It would have required a huge amount
-      of code to implement even a decent subset of `format*', yet the
-      functionality it would provide over Emacs Lisp's `format' would
-      rarely be useful.
- 
-    * Vector constants use square brackets in Emacs Lisp, but `#(a b c)'
-      notation in Common Lisp.  To further complicate matters, Emacs 19
-      introduces its own `#(' notation for something entirely
-      different--strings with properties.
- 
-    * Characters are distinct from integers in Common Lisp.  The
-      notation for character constants is also different:  `#\A' instead
-      of `?A'.  Also, `string=' and `string-equal' are synonyms in Emacs
-      Lisp whereas the latter is case-insensitive in Common Lisp.
- 
-    * Data types.  Some Common Lisp data types do not exist in Emacs
-      Lisp.  Rational numbers and complex numbers are not present, nor
-      are large integers (all integers are "fixnums").  All arrays are
-      one-dimensional.  There are no readtables or pathnames; streams
-      are a set of existing data types rather than a new data type of
-      their own.  Hash tables, random-states, structures, and packages
-      (obarrays) are built from Lisp vectors or lists rather than being
-      distinct types.
- 
-    * The Common Lisp Object System (CLOS) is not implemented, nor is
-      the Common Lisp Condition System.
- 
-    * Common Lisp features that are completely redundant with Emacs Lisp
-      features of a different name generally have not been implemented.
-      For example, Common Lisp writes `defconstant' where Emacs Lisp
-      uses `defconst'.  Similarly, `make-list' takes its arguments in
-      different ways in the two Lisps but does exactly the same thing,
-      so this package has not bothered to implement a Common Lisp-style
-      `make-list'.
- 
-    * A few more notable Common Lisp features not included in this
-      package:  `compiler-let', `tagbody', `prog', `ldb/dpb',
-      `parse-integer', `cerror'.
- 
-    * Recursion.  While recursion works in Emacs Lisp just like it does
-      in Common Lisp, various details of the Emacs Lisp system and
-      compiler make recursion much less efficient than it is in most
-      Lisps.  Some schools of thought prefer to use recursion in Lisp
-      over other techniques; they would sum a list of numbers using
-      something like
- 
-           (defun sum-list (list)
-             (if list
-                 (+ (car list) (sum-list (cdr list)))
-               0))
- 
-      where a more iteratively-minded programmer might write one of
-      these forms:
- 
-           (let ((total 0)) (dolist (x my-list) (incf total x)) total)
-           (loop for x in my-list sum x)
- 
-      While this would be mainly a stylistic choice in most Common Lisps,
-      in Emacs Lisp you should be aware that the iterative forms are
-      much faster than recursion.  Also, Lisp programmers will want to
-      note that the current Emacs Lisp compiler does not optimize tail
-      recursion.
- 
--- 0 ----
Index: emacs/info/cl-6
diff -c emacs/info/cl-6:1.1.1.1 emacs/info/cl-6:removed
*** emacs/info/cl-6:1.1.1.1	Fri Jul 19 01:55:02 1996
--- emacs/info/cl-6	Fri Aug  2 20:00:23 1996
***************
*** 1,251 ****
- This is Info file ../info/cl, produced by Makeinfo-1.55 from the input
- file cl.texi.
- 
-    This file documents the GNU Emacs Common Lisp emulation package.
- 
-    Copyright (C) 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "GNU General Public License" is included
- exactly as in the original, and provided that the entire resulting
- derived work is distributed under the terms of a permission notice
- identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the section entitled "GNU General Public License"
- may be included in a translation approved by the author instead of in
- the original English.
- 
- 
- File: cl,  Node: Function Index,  Next: Variable Index,  Prev: Porting Common Lisp,  Up: Top
- 
- Function Index
- **************
- 
- * Menu:
- 
- * abs:                                  Numerical Functions.
- * acons:                                Association Lists.
- * adjoin:                               Lists as Sets.
- * assert:                               Assertions.
- * assoc*:                               Association Lists.
- * assoc-if:                             Association Lists.
- * assoc-if-not:                         Association Lists.
- * block:                                Blocks and Exits.
- * butlast:                              List Functions.
- * caddr:                                List Functions.
- * callf:                                Modify Macros.
- * callf2:                               Modify Macros.
- * case:                                 Conditionals.
- * ceiling*:                             Numerical Functions.
- * check-type:                           Assertions.
- * cl-float-limits:                      Implementation Parameters.
- * cl-prettyexpand:                      Efficiency Concerns.
- * clrhash:                              Hash Tables.
- * coerce:                               Type Predicates.
- * compiler-macroexpand:                 Macros.
- * concatenate:                          Sequence Functions.
- * copy-list:                            List Functions.
- * copy-tree:                            List Functions.
- * count:                                Searching Sequences.
- * count-if:                             Searching Sequences.
- * count-if-not:                         Searching Sequences.
- * decf:                                 Modify Macros.
- * declaim:                              Declarations.
- * declare:                              Declarations.
- * defalias:                             Function Aliases.
- * define-compiler-macro:                Macros.
- * define-modify-macro:                  Customizing Setf.
- * define-setf-method:                   Customizing Setf.
- * defmacro*:                            Argument Lists.
- * defsetf:                              Customizing Setf.
- * defsetf:                              Customizing Setf.
- * defstruct:                            Structures.
- * defsubst*:                            Argument Lists.
- * deftype:                              Type Predicates.
- * defun*:                               Argument Lists.
- * delete:                               Sequence Functions.
- * delete*:                              Sequence Functions.
- * delete-duplicates:                    Sequence Functions.
- * delete-if:                            Sequence Functions.
- * delete-if-not:                        Sequence Functions.
- * destructuring-bind:                   Macros.
- * do:                                   Iteration.
- * do*:                                  Iteration.
- * do-all-symbols:                       Iteration.
- * do-symbols:                           Iteration.
- * dolist:                               Iteration.
- * dotimes:                              Iteration.
- * ecase:                                Conditionals.
- * endp:                                 List Functions.
- * eql:                                  Equality Predicates.
- * equalp:                               Equality Predicates.
- * etypecase:                            Conditionals.
- * eval-when:                            Time of Evaluation.
- * eval-when-compile:                    Time of Evaluation.
- * evenp:                                Predicates on Numbers.
- * every:                                Mapping over Sequences.
- * expt:                                 Numerical Functions.
- * fill:                                 Sequence Functions.
- * find:                                 Searching Sequences.
- * find-if:                              Searching Sequences.
- * find-if-not:                          Searching Sequences.
- * first:                                List Functions.
- * flet:                                 Function Bindings.
- * floatp-safe:                          Predicates on Numbers.
- * floor*:                               Numerical Functions.
- * function*:                            Argument Lists.
- * gcd:                                  Numerical Functions.
- * gensym:                               Creating Symbols.
- * gentemp:                              Creating Symbols.
- * get*:                                 Property Lists.
- * get-setf-method:                      Customizing Setf.
- * getf:                                 Property Lists.
- * gethash:                              Hash Tables.
- * hash-table-count:                     Hash Tables.
- * hash-table-p:                         Hash Tables.
- * ignore-errors:                        Assertions.
- * incf:                                 Modify Macros.
- * intersection:                         Lists as Sets.
- * isqrt:                                Numerical Functions.
- * labels:                               Function Bindings.
- * last:                                 List Functions.
- * lcm:                                  Numerical Functions.
- * ldiff:                                List Functions.
- * letf:                                 Modify Macros.
- * letf*:                                Modify Macros.
- * lexical-let:                          Lexical Bindings.
- * lexical-let*:                         Lexical Bindings.
- * list*:                                List Functions.
- * list-length:                          List Functions.
- * load-time-value:                      Time of Evaluation.
- * locally:                              Declarations.
- * loop:                                 Iteration.
- * loop:                                 Loop Basics.
- * macrolet:                             Macro Bindings.
- * make-hash-table:                      Hash Tables.
- * make-random-state:                    Random Numbers.
- * map:                                  Mapping over Sequences.
- * mapc:                                 Mapping over Sequences.
- * mapcan:                               Mapping over Sequences.
- * mapcar*:                              Mapping over Sequences.
- * mapcon:                               Mapping over Sequences.
- * maphash:                              Hash Tables.
- * mapl:                                 Mapping over Sequences.
- * maplist:                              Mapping over Sequences.
- * member:                               Lists as Sets.
- * member*:                              Lists as Sets.
- * member-if:                            Lists as Sets.
- * member-if-not:                        Lists as Sets.
- * merge:                                Sorting Sequences.
- * minusp:                               Predicates on Numbers.
- * mismatch:                             Searching Sequences.
- * mod*:                                 Numerical Functions.
- * multiple-value-bind:                  Multiple Values.
- * multiple-value-setq:                  Multiple Values.
- * nbutlast:                             List Functions.
- * nintersection:                        Lists as Sets.
- * notany:                               Mapping over Sequences.
- * notevery:                             Mapping over Sequences.
- * nset-difference:                      Lists as Sets.
- * nset-exclusive-or:                    Lists as Sets.
- * nsublis:                              Substitution of Expressions.
- * nsubst:                               Substitution of Expressions.
- * nsubst-if:                            Substitution of Expressions.
- * nsubst-if-not:                        Substitution of Expressions.
- * nsubstitute:                          Sequence Functions.
- * nsubstitute-if:                       Sequence Functions.
- * nsubstitute-if-not:                   Sequence Functions.
- * nunion:                               Lists as Sets.
- * oddp:                                 Predicates on Numbers.
- * pairlis:                              Association Lists.
- * plusp:                                Predicates on Numbers.
- * pop:                                  Modify Macros.
- * position:                             Searching Sequences.
- * position-if:                          Searching Sequences.
- * position-if-not:                      Searching Sequences.
- * proclaim:                             Declarations.
- * progv:                                Dynamic Bindings.
- * psetf:                                Modify Macros.
- * psetq:                                Assignment.
- * push:                                 Modify Macros.
- * pushnew:                              Modify Macros.
- * random*:                              Random Numbers.
- * random-state-p:                       Random Numbers.
- * rassoc:                               Association Lists.
- * rassoc*:                              Association Lists.
- * rassoc-if:                            Association Lists.
- * rassoc-if-not:                        Association Lists.
- * reduce:                               Mapping over Sequences.
- * rem*:                                 Numerical Functions.
- * remf:                                 Property Lists.
- * remhash:                              Hash Tables.
- * remove:                               Sequence Functions.
- * remove*:                              Sequence Functions.
- * remove-duplicates:                    Sequence Functions.
- * remove-if:                            Sequence Functions.
- * remove-if-not:                        Sequence Functions.
- * remprop:                              Property Lists.
- * remq:                                 Sequence Functions.
- * replace:                              Sequence Functions.
- * rest:                                 List Functions.
- * return:                               Blocks and Exits.
- * return-from:                          Blocks and Exits.
- * rotatef:                              Modify Macros.
- * round*:                               Numerical Functions.
- * search:                               Searching Sequences.
- * set-difference:                       Lists as Sets.
- * set-exclusive-or:                     Lists as Sets.
- * setf:                                 Basic Setf.
- * shiftf:                               Modify Macros.
- * some:                                 Mapping over Sequences.
- * sort*:                                Sorting Sequences.
- * stable-sort:                          Sorting Sequences.
- * sublis:                               Substitution of Expressions.
- * subseq:                               Sequence Functions.
- * subsetp:                              Lists as Sets.
- * subst:                                Substitution of Expressions.
- * subst-if:                             Substitution of Expressions.
- * subst-if-not:                         Substitution of Expressions.
- * substitute:                           Sequence Functions.
- * substitute-if:                        Sequence Functions.
- * substitute-if-not:                    Sequence Functions.
- * symbol-macrolet:                      Macro Bindings.
- * tailp:                                Lists as Sets.
- * the:                                  Declarations.
- * tree-equal:                           List Functions.
- * truncate*:                            Numerical Functions.
- * typecase:                             Conditionals.
- * typep:                                Type Predicates.
- * union:                                Lists as Sets.
- * unless:                               Conditionals.
- * when:                                 Conditionals.
- 
- 
- File: cl,  Node: Variable Index,  Prev: Function Index,  Up: Top
- 
- Variable Index
- **************
- 
- * Menu:
- 
- * *gensym-counter*:                     Creating Symbols.
- * *random-state*:                       Random Numbers.
- * float-epsilon:                        Implementation Parameters.
- * float-negative-epsilon:               Implementation Parameters.
- * least-negative-float:                 Implementation Parameters.
- * least-negative-normalized-float:      Implementation Parameters.
- * least-positive-float:                 Implementation Parameters.
- * least-positive-normalized-float:      Implementation Parameters.
- * most-negative-fixnum:                 Implementation Parameters.
- * most-negative-float:                  Implementation Parameters.
- * most-positive-fixnum:                 Implementation Parameters.
- * most-positive-float:                  Implementation Parameters.
- 
- 
--- 0 ----
Index: emacs/info/dir
diff -c emacs/info/dir:1.1.1.2 emacs/info/dir:1.4
*** emacs/info/dir:1.1.1.2	Mon Jul 22 01:51:32 1996
--- emacs/info/dir	Thu Aug  1 02:33:43 1996
***************
*** 13,28 ****
  
  * Menu: The list of major topics begins on the next line.
  
! * Info: (info).		Documentation browsing system.
! * Emacs: (emacs).	The extensible self-documenting text editor.
! * VIP: (vip).		A VI-emulation for Emacs.
! * VIPER: (viper).       The new VI-emulation mode in Emacs-19.29.
! * Forms: (forms).	Emacs package for editing data bases
! 			  by filling in forms.
! * GNUS: (gnus).		The news reader GNUS.
! * MH-E: (mh-e).		Emacs interface to the MH mail system.
! * CL: (cl).		Partial Common Lisp support for Emacs Lisp.
! * SC: (sc).		Supercite lets you cite parts of messages you're 
! 			  replying to, in hairy ways.
! * Dired-X: (dired-x).   Dired Extra Features.
! * Ediff: (ediff).	A comprehensive visual interface to diff & patch.
--- 13,44 ----
  
  * Menu: The list of major topics begins on the next line.
  
! * Info: (info.info).
! 		Documentation browsing system.
! * Emacs: (emacs.info).
! 		The extensible self-documenting text editor.
! * Emacs-lisp: (elisp.info).
! 		And how to program it.
! * Emacs-for-NS: (ns-emacs.info).
! 		Information specific to Emacs 19 for NeXTstep.
! * VIP: (vip.info).
! 		A VI-emulation for Emacs.
! * VIPER: (viper.info).
! 		The new VI-emulation mode in Emacs-19.29.
! * Forms: (forms.info).
! 		Emacs package for editing data bases by filling in forms.
! * GNUS: (gnus.info).
! 		The news reader GNUS.
! * MH-E: (mh-e.info).
! 		Emacs interface to the MH mail system.
! * CL: (cl.info).
! 		Partial Common Lisp support for Emacs Lisp.
! * SC: (sc.info).
! 		Supercite lets you cite parts of messages you're
! 		replying to, in hairy ways.
! * Dired-X: (dired-x.info).
! 		Dired Extra Features.
! * Ediff: (ediff.info).
! 		A comprehensive visual interface to diff & patch.
! * Makeinfo: (makeinfo.info).
! 		A program for converting "Texinfo" files into "Info" files.
Index: emacs/info/dired-x
diff -c emacs/info/dired-x:1.1.1.2 emacs/info/dired-x:removed
*** emacs/info/dired-x:1.1.1.2	Mon Jul 22 01:51:34 1996
--- emacs/info/dired-x	Fri Aug  2 20:00:35 1996
***************
*** 1,1227 ****
- This is Info file ../info/dired-x, produced by Makeinfo-1.55 from the
- input file dired-x.texi.
- 
- 
- File: dired-x,  Node: Copyright,  Next: Top,  Prev: (dir),  Up: (dir)
- 
-    This documents the "extra" features for Dired Mode for GNU Emacs 19
- found in the file `dired-x.el'.
- 
-    Copyright (C) 1993, 1994 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that this permission notice may be stated in a
- translation approved by the Free Software Foundation.
- 
-    The file used to create this is called `dired-x.texi', but the
- original work that was altered to make that file was called
- `dired.texi' written by Sebastian Kremer.
- 
- 
- File: dired-x,  Node: Top,  Next: Introduction,  Prev: Copyright,  Up: (dir)
- 
- This documents the "extra" features for Dired Mode for GNU Emacs 19
- that are provided by the file `dired-x.el'.
- 
-    * Based on `dired.texi' by Sebastian Kremer <sk@thp.uni-koeln.de>
- 
-    * For `dired-x.el' revision 2
- 
-    * Revision of this manual: 2.52 (1994/08/09 16:51:31)
- 
-    * Bugs to Lawrence R. Dodd <dodd@roebling.poly.edu>.  *Please* type
-      `M-x dired-x-submit-report' to submit a bug report (*Note Bugs::).
- 
-    * You can obtain a copy of this package via anonymous ftp in
-      /roebling.poly.edu:/pub/packages/dired-x.tar.gz
- 
- * Menu:
- 
- * Introduction::
- * Installation::
- * Omitting Files in Dired::
- * Local Variables::
- * Shell Command Guessing::
- * Virtual Dired::
- * Advanced Mark Commands::
- * Multiple Dired Directories::
- * Find File At Point::
- * Miscellaneous Commands::
- * Bugs::
- 
- * Concept Index::
- * Command Index::
- * Key Index::
- * Variable Index::
- 
- 
- File: dired-x,  Node: Introduction,  Next: Features,  Prev: Top,  Up: Top
- 
- Introduction
- ************
- 
-    This documents the *extra* features for Dired Mode for GNU Emacs 19.
- It is derived from version 1.191 of Sebastian Kremer's `dired-x.el'
- and is GNU Emacs v19 compatible.
- 
-    In adopting this `dired-x.el' to GNU Emacs v19 some material that has
- been incorported into `dired.el' and `dired-aux.el' of the GNU Emacs 19
- distribution has been removed and some material was modifed for
- agreement with the functions in `dired.el' and `dired-aux.el'.  For
- example, the code using `gmhist' history functions was replaced with
- code using the mini-buffer history now built into GNU Emacs 19.
- Finally, a few other features have been added and a few more functions
- have been bound to keys.
- 
-    Please note that `dired-x.el' and this texinfo file `dired-x.texi'
- are bundled with GNU Emacs versions 19.23 and later.
- 
- * Menu:
- 
- * Features::
- * Technical Details::
- 
- 
- File: dired-x,  Node: Features,  Next: Technical Details,  Prev: Introduction,  Up: Introduction
- 
- Features
- ========
- 
-    Some features provided by Dired Extra
- 
-   1. Omitting of uninteresting files from dired listing.
-           *Note Omitting Files in Dired::
- 
-   2. Local variables for dired directories.
-           *Note Local Variables::
- 
-   3. Guessing shell commands in dired buffers.
-           *Note Shell Command Guessing::
- 
-   4. Running dired command in non-dired buffers.
-           *Note Virtual Dired::
- 
-   5. Finding a file mentioned in a buffer
-           *Note Find File At Point::
- 
-   6. Commands using file marking.
-           *Note Advanced Mark Commands::
- 
- `dired-x.el' binds some functions to keys in Dired Mode (*Note Key
- Index::) and also binds `C-x C-j' and `C-x 4 C-j' *globally* to
- `dired-jump' (*Note Miscellaneous Commands::).  It may also bind `C-x
- C-f' and `C-x 4 C-f' to `dired-x-find-file' and
- `dired-x-find-file-other-window', respectively (*Note Find File At
- Point::).
- 
- 
- File: dired-x,  Node: Technical Details,  Next: Installation,  Prev: Features,  Up: Introduction
- 
- Technical Details
- =================
- 
-    When loaded this code *redefines* the following functions of GNU
- Emacs from `dired.el'
- 
-    * `dired-clean-up-after-deletion'
- 
-    * `dired-find-buffer-nocreate'
- 
-    * `dired-initial-position'
- 
-    * `dired-up-directory'
- 
- and the following functions from `dired-aux.el'
- 
-    * `dired-add-entry'
- 
-    * `dired-read-shell-command'
- 
-    One drawback is that `dired-x.el' will load `dired-aux.el' as soon
- as dired is loaded.  Thus, the advantage of separating out
- non-essential dired stuff into `dired-aux.el' and only loading when
- necessary will be lost when `dired-x.el' is used.
- 
- 
- File: dired-x,  Node: Installation,  Next: Optional Installation Dired Jump,  Prev: Technical Details,  Up: Top
- 
- Installation
- ************
- 
- This manual describes the dired features provided by the file
- `dired-x.el'.  To take advantage of these features, you must load the
- file and (optionally) set some variables.
- 
- In your `.emacs' file in your home directory, or in the system-wide
- initialization file `default.el' in the `site-lisp' directory, put
- 
-      (add-hook 'dired-load-hook
-                (function (lambda ()
-                            (load "dired-x")
-                            ;; Set dired-x global variables here.  For example:
-                            ;; (setq dired-guess-shell-gnutar "gtar")
-                            ;; (setq dired-x-hands-off-my-keys nil)
-                            )))
-      (add-hook 'dired-mode-hook
-                (function (lambda ()
-                            ;; Set dired-x buffer-local variables here.  For example:
-                            ;; (setq dired-omit-files-p t)
-                            )))
- 
- This will load `dired-x.el' when dired is first invoked (for example,
- when you first do `C-x d').
- 
- * Menu:
- 
- * Optional Installation Dired Jump::
- * Optional Installation File At Point::
- * Special Notes::
- 
- 
- File: dired-x,  Node: Optional Installation Dired Jump,  Next: Optional Installation File At Point,  Prev: Installation,  Up: Installation
- 
- Optional Installation Dired Jump
- ================================
- 
-    In order to have `dired-jump' and `dired-jump-other-window' (*Note
- Miscellaneous Commands::) work *before* `dired' and `dired-x' have been
- properly loaded the user should set-up an autoload for these functions.
- In your `.emacs' file put
- 
-      ;;; Autoload `dired-jump' and `dired-jump-other-window'.
-      ;;; We autoload from FILE dired.el.  This will then load dired-x.el
-      ;;; and hence define `dired-jump' and `dired-jump-other-window'.
-      (define-key global-map "\C-x\C-j" 'dired-jump)
-      (define-key global-map "\C-x4\C-j" 'dired-jump-other-window)
-      
-      (autoload (quote dired-jump) "dired" "\
-      Jump to dired buffer corresponding to current buffer.
-      If in a file, dired the current directory and move to file's line.
-      If in dired already, pop up a level and goto old directory's line.
-      In case the proper dired file line cannot be found, refresh the dired
-      buffer and try again." t nil)
-      
-      (autoload (quote dired-jump-other-window) "dired" "\
-      Like \\[dired-jump] (dired-jump) but in other window." t nil)
- 
-    Note that in recent releases of GNU Emacs 19 (i.e., 19.25 or later)
- the file `../lisp/loaddefs.el' of the Emacs distribution already
- contains the proper auto-loading for `dired-jump' so you need only put
- 
-      (define-key global-map "\C-x\C-j" 'dired-jump)
- 
- in your `.emacs' file in order to have `C-x C-j' work before `dired' is
- loaded.
- 
- 
- File: dired-x,  Node: Optional Installation File At Point,  Next: Special Notes,  Prev: Optional Installation Dired Jump,  Up: Installation
- 
- Optional Installation File At Point
- ===================================
- 
-    If you choose to have `dired-x.el' bind `dired-x-find-file' over
- `find-file' (*Note Find File At Point::), then you will need to set
- `dired-x-hands-off-my-keys' and make a call to the function
- `dired-x-bind-find-file' in the `dired-load-hook':
- 
-      (add-hook 'dired-load-hook
-                (function (lambda ()
-                            (load "dired-x")
-                            ;; Bind dired-x-find-file.
-                            (setq dired-x-hands-off-my-keys nil)
-                            ;; Make sure our binding preference is invoked.
-                            (dired-x-bind-find-file)
-                            )))
- 
-    Alternatively, you can set the variable *before* `dired-x.el' is
- loaded
- 
-      (add-hook 'dired-load-hook
-                (function (lambda ()
-                            ;; Bind dired-x-find-file.
-                            (setq dired-x-hands-off-my-keys nil)
-                            (load "dired-x")
-                            )))
- 
- 
- File: dired-x,  Node: Special Notes,  Next: Omitting Files in Dired,  Prev: Optional Installation File At Point,  Up: Installation
- 
- Special Notes
- =============
- 
-    If `dired-x.el' was *not* bundled with the version of GNU Emacs
- installed at your site (i.e., not in the default `../lisp' directory)
- then you must put the file `dired-x.el' in a directory known to GNU
- Emacs.  Examine the variable `load-path' for a list of these
- directories.  If you wish to add a new directory on this list of
- directories use something like this in your `.emacs' file
- 
-      ;;; LOAD PATH
-      (setq load-path (append
-                       load-path ; default at top
-                       (list
-                        "/the/directory/where/you/put/dired-x")))
- 
- If you wish to put the new directory at the head of the list (where it
- will be found first) then you should use instead
- 
-      ;;; LOAD PATH
-      (setq load-path (append
-                       (list
-                        "/the/directory/where/you/put/dired-x")
-                       load-path)) ; default at bottom
- 
-    You must also byte compile the file (for example, hitting `B' in
- `dired-mode').  When byte-compiling `dired-x.el' you may get messages
- about functions `vm-visit-folder', `Man-notify-when-ready', and
- `reporter-submit-bug-report' not being defined.  These are warnings and
- should be ignored.
- 
- CAUTION: If you are using a version of GNU Emacs earlier than 19.20
- than you may have to edit `dired.el'.  The copy of `dired.el' in GNU
- Emacs versions earlier than 19.20 incorrectly had the call to
- `run-hooks' *before* the call to `provide'.  In such a case, it is
- possible that byte-compiling and/or loading dired can cause an infinite
- loop.  To prevent this, make sure the line of code
- 
-              (run-hooks 'dired-load-hook)
- 
- is the *last* executable line in the file `dired.el'.  That is, make
- sure it comes *after* the line
- 
-              (provide 'dired)
- 
- 
- File: dired-x,  Node: Omitting Files in Dired,  Next: Omitting Variables,  Prev: Special Notes,  Up: Top
- 
- Omitting Files in Dired
- ***********************
- 
-    "Omitting" a file means removing it from the directory listing.
- Omitting is useful for keeping Dired buffers free of "uninteresting"
- files (for instance, auto-save, auxiliary, backup, and revision control
- files) so that the user can concentrate on the interesting files.  Like
- hidden files, omitted files are never seen by Dired.  Omitting differs
- from hiding in several respects:
- 
-    * Omitting works on individual files, not on directories; an entire
-      directory cannot be omitted (though each of its files could be).
- 
-    * Omitting is wholesale; if omitting is turned on for a dired
-      buffer, then all uninteresting files listed in that buffer are
-      omitted.  The user does not omit (or unomit) files one at a time.
- 
-    * Omitting can be automatic; uninteresting file lines in the buffer
-      can be removed before the user ever sees them.
- 
-    * Marked files are never omitted.
- 
- `M-o'
-      (`dired-omit-toggle') Toggle between displaying and omitting
-      "uninteresting" files.  With a prefix argument, don't toggle and
-      just mark the files, but don't actually omit them.
- 
- In order to make Dired Omit work you first need to load `dired-x.el'
- inside `dired-load-hook' (*Note Installation::) and then set
- `dired-omit-files-p' in some way (*Note Omitting Variables::).
- 
- * Menu:
- 
- * Omitting Variables::
- * Omitting Examples::
- * Omitting Technical::
- 
- 
- File: dired-x,  Node: Omitting Variables,  Next: Omitting Examples,  Prev: Omitting Files in Dired,  Up: Omitting Files in Dired
- 
- Omitting Variables
- ==================
- 
-    The following variables can be used to customize omitting.
- 
- `dired-omit-files-p'
-      Default: `nil'
- 
-      If non-`nil', "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'.
-      `M-o' (`dired-omit-toggle') toggles its value, which is
-      buffer-local.  Put
- 
-           (setq dired-omit-files-p t)
- 
-      inside your `dired-mode-hook' to have omitting initially turned on
-      in *every* Dired buffer (*Note Installation::).  You can then use
-      `M-o' to unomit in that buffer.
- 
-      To enable omitting automatically only in certain directories one
-      can use Dired Local Variables and put
- 
-           Local Variables:
-           dired-omit-files-p: t
-           End:
- 
-      into a file `.dired' (the default value of
-      `dired-local-variables-file') in that directory (*Note Local
-      Variables::).
- 
-     `dired-omit-here-always'
-           This is an interactive function that creates a local
-           variables file exactly like the example above (if it does not
-           already exist) in the file `dired-local-variables-file' in
-           the current directory and then refreshes the directory
-           listing (*Note Local Variables::).
- 
- `dired-omit-files'
-      Default: `"^#\\|\\.$"'
- 
-      Filenames matching this buffer-local regexp will not be displayed.
-      This only has effect when `dired-omit-files-p' is t.
- 
-      The default value omits the special directories `.' and `..'  and
-      autosave files (plus other files ending in ".") (*Note Omitting
-      Examples::).
- 
- `dired-omit-extensions'
-      Default: The elements of `completion-ignored-extensions' (as
-      defined in the file `loaddefs.el' of the GNU Emacs distribution),
-      `dired-latex-unclean-extensions', `dired-bibtex-unclean-extensions'
-      and `dired-texinfo-unclean-extensions'.
- 
-      If non-`nil', a list of extensions (strings) to omit from Dired
-      listings.  Its format is the same as that of
-      `completion-ignored-extensions'.
- 
- `dired-omit-localp'
-      Default:  `'no-dir'
- 
-      The LOCALP argument `dired-omit-expunge' passes to
-      `dired-get-filename'.  If it is `'no-dir', omitting is much faster,
-      but you can only match against the non-directory part of the
-      filename.  Set it to `nil' if you need to match the whole pathname
-      or `t' to match the pathname relative to the buffer's top-level
-      directory.
- 
- `dired-omit-marker-char'
-      Default: `C-o'
- 
-      Temporary marker used by by Dired to implement omitting.  Should
-      never be used as marker by the user or other packages.  There is
-      one exception to this rule: by doing
- 
-           (setq dired-mark-keys "\C-o")
-           ;; i.e., the value of dired-omit-marker-char
-           ;; (which is not defined yet)
- 
-      anywhere in your `~/.emacs', you will bind the `C-o' key to insert
-      a `C-o' marker, thus causing these files to be omitted in addition
-      to the usually omitted files.  Unfortunately the files you omitted
-      manually this way will show up again after reverting the buffer,
-      unlike the others.
- 
- 
- File: dired-x,  Node: Omitting Examples,  Next: Omitting Technical,  Prev: Omitting Variables,  Up: Omitting Files in Dired
- 
- Examples of Omitting Various File Types
- =======================================
- 
-    * If you wish to avoid seeing RCS files and the RCS directory, then
-      put
- 
-           (setq dired-omit-files
-                 (concat dired-omit-files "\\|^RCS$\\|,v$"))
- 
-      in the `dired-load-hook' (*Note Installation::).  This assumes
-      `dired-omit-localp' has its default value of `'no-dir' to make the
-      `^'-anchored matches work.  As a slower alternative, with
-      `dired-omit-localp' set to `nil', you can use `/' instead of `^'
-      in the regexp.
- 
-    * If you use tib, the bibliography program for use with TeX and
-      LaTeX, you might want to omit the `INDEX' and the `-t.tex' files,
-      then put
- 
-           (setq dired-omit-files
-                 (concat dired-omit-files "\\|^INDEX$\\|-t\\.tex$"))
- 
-      in the `dired-load-hook' (*Note Installation::).
- 
-    * If you do not wish to see `dot' files (files starting with a `.'),
-      then put
- 
-           (setq dired-omit-files
-                 (concat dired-omit-files "\\|^\\..+$"))
- 
-      in the `dired-load-hook' (*Note Installation::).
- 
- 
- File: dired-x,  Node: Omitting Technical,  Next: Local Variables,  Prev: Omitting Examples,  Up: Omitting Files in Dired
- 
- Some Technical Details of Omitting
- ==================================
- 
-    Loading `dired-x.el' will install Dired Omit by putting
- `dired-omit-expunge' on your `dired-after-readin-hook', and will call
- `dired-extra-startup', which in turn calls `dired-omit-startup' in your
- `dired-mode-hook'.
- 
- 
- File: dired-x,  Node: Local Variables,  Next: Shell Command Guessing,  Prev: Omitting Technical,  Up: Top
- 
- Local Variables for Dired Directories
- *************************************
- 
- When Dired visits a directory, it looks for a file whose name is the
- value of variable `dired-local-variables-file' (default: `.dired').  If
- such a file is found, Dired will temporarily insert it into the Dired
- buffer and run `hack-local-variables'.
- 
- For example, if the user puts
- 
-      Local Variables:
-      dired-actual-switches: "-lat"
-      dired-omit-files-p: t
-      End:
- 
- into a file called `.dired' in a directory then when that directory is
- viewed it will be
- 
-   1. sorted by date
- 
-   2. omitted automatically
- 
- You can set `dired-local-variables-file' to `nil' to suppress this.
- The value of `dired-enable-local-variables' controls if and how these
- local variables are read.  This variable exists so that if may override
- the default value of `enable-local-variables'.
- 
- Please see the GNU Emacs Manual to learn more about local variables.
- *Note Local Variables in Files: (emacs)File Variables.
- 
- The following variables affect Dired Local Variables
- 
- `dired-local-variables-file'
-      Default: `".dired"'
- 
-      If non-`nil', filename for local variables for Dired.  If Dired
-      finds a file with that name in the current directory, it will
-      temporarily insert it into the dired buffer and run
-      `hack-local-variables'.
- 
- `dired-enable-local-variables'
-      Default: `t'
- 
-      Controls use of local-variables lists in dired.  The value can be
-      `t', `nil', or something else.  A value of `t' means
-      local-variables lists are obeyed in the
-      `dired-local-variables-file'; `nil' means they are ignored;
-      anything else means query.  This variable temporarily overrides
-      the value of `enable-local-variables' when the Dired Local
-      Variables are hacked.
- 
- 
- File: dired-x,  Node: Shell Command Guessing,  Next: Virtual Dired,  Prev: Local Variables,  Up: Top
- 
- Shell Command Guessing
- **********************
- 
-    Based upon the name of a filename, Dired tries to guess what shell
- command you might want to apply to it.  For example, if you have point
- on a file named `foo.tar' and you press `!', Dired will guess you want
- to `tar xvf' it and suggest that as the default shell command.
- 
-    The default will be mentioned in brackets and you can type `M-p' to
- get the default into the minibuffer so that you can edit it, e.g.,
- changing `tar xvf' to `tar tvf'.  If there are several commands for a
- given file, e.g., `xtex' and `dvips' for a `.dvi' file, you can type
- `M-p' several times to see each of the matching commands.
- 
-    Dired only tries to guess a command for a single file, never for a
- list of marked files.
- 
- `dired-guess-shell-alist-default'
-      Predefined rules for shell commands.  Set this to `nil' to turn
-      guessing off.  The elements of `dired-guess-shell-alist-user'
-      (defined by the user) will override these rules.
- 
- `dired-guess-shell-alist-user'
-      If non-`nil', a user-defined alist of file regexps and their
-      suggested commands.  These rules take precedence over the
-      predefined rules in the variable `dired-guess-shell-alist-default'
-      (to which they are prepended) when `dired-do-shell-command' is
-      run).
- 
-      Each element of the alist looks like
- 
-           (REGEXP COMMAND...)
- 
-      where each COMMAND can either be a string or a lisp expression
-      that evaluates to a string.  If several COMMANDs are given, all
-      will temporarily be pushed on the history.
- 
-      You can set this variable in your `~/.emacs'.  For example, to add
-      rules for `.foo' and `.bar' file extensions, write
- 
-           (setq dired-guess-shell-alist-user
-                 (list
-                  (list "\\.foo$" "FOO-COMMAND");; fixed rule
-                  ;; possibly more rules...
-                  (list "\\.bar$";; rule with condition test
-                         '(if CONDITION
-                              "BAR-COMMAND-1"
-                            "BAR-COMMAND-2"))))
- 
-      This will override any predefined rules for the same extensions.
- 
- `dired-guess-shell-gnutar'
-      Default: `nil'
- 
-      If non-`nil', name of the GNU tar executable (e.g., `"tar"' or
-      `"gnutar"').  GNU tar's `z' switch is used for compressed tar
-      files.  If you don't have GNU tar, set this to `nil': a pipe using
-      `zcat' is then used.
- 
- `dired-guess-shell-gzip-quiet'
-      Default: `t'
- 
-      A non-`nil' value means that `-q' is passed to gzip overriding a
-      verbose GNU zip's `GZIP' environment variable.
- 
- `dired-guess-shell-znew-switches nil'
-      Default: `nil'
- 
-      A string of switches passed to GNU zip's `znew'.  An example is
-      `"-K"' which will make `znew' keep a .Z file when it is smaller
-      than the .gz file.
- 
- `dired-shell-command-history nil'
-      History list for commands that read dired-shell commands.
- 
- 
- File: dired-x,  Node: Virtual Dired,  Next: Advanced Mark Commands,  Prev: Shell Command Guessing,  Up: Top
- 
- Virtual Dired
- *************
- 
-    Using "Virtual Dired" means putting a buffer with Dired-like
- contents in Dired mode.  The files described by the buffer contents need
- not actually exist.  This is useful if you want to peruse an `ls -lR'
- output file, for example one you got from an FTP server.  You can use
- all motion commands usually available in Dired.  You can also use it to
- save a Dired buffer in a file and resume it in a later session.
- 
-    Type `M-x dired-virtual' to put the current buffer into virtual
- Dired mode.  You will be prompted for the top level directory of this
- buffer, with a default value guessed from the buffer contents.  To
- convert the virtual to a real Dired buffer again, type `g' (which calls
- `dired-virtual-revert') in the virtual Dired buffer and answer `y'.
- You don't have to do this, though: you can relist single subdirectories
- using `l' (`dired-do-redisplay') on the subdirectory headerline,
- leaving the buffer in virtual Dired mode all the time.
- 
-    The function `dired-virtual-mode' is specially designed to turn on
- virtual Dired mode from the `auto-mode-alist'.  To edit all `*.dired'
- files automatically in virtual Dired mode, put this into your
- `~/.emacs':
- 
-      (setq auto-mode-alist (cons '("[^/]\\.dired$" . dired-virtual-mode)
-                                    auto-mode-alist))
- 
-    The regexp is a bit more complicated than usual to exclude ".dired"
- local variable files.
- 
- 
- File: dired-x,  Node: Advanced Mark Commands,  Next: Advanced Cleaning Functions,  Prev: Virtual Dired,  Up: Top
- 
- Advanced Mark Commands
- **********************
- 
- `F'
-      (`dired-do-find-marked-files') Find all marked files at once
-      displaying simultaneously.  If optional NOSELECT is non-`nil' then
-      just find the files but do not select.  If you want to keep the
-      dired buffer displayed, type `C-x 2' first.  If you want just the
-      marked files displayed and nothing else, type `C-x 1' first.
- 
-      The current window is split across all files marked, as evenly as
-      possible.  Remaining lines go to the bottom-most window.  The
-      number of files that can be displayed this way is restricted by
-      the height of the current window and the variable
-      `window-min-height'.
- 
- `dired-mark-extension'
-      Mark all files with a certain extension for use in later commands.
-      A `.' is not automatically prepended to the string entered.
- 
-      When called from lisp, EXTENSION may also be a list of extensions
-      and an optional argument MARKER-CHAR specifies the marker used.
- 
- `dired-flag-extension'
-      Flag all files with a certain extension for deletion.  A `.' is
-      *not* automatically prepended to the string entered.
- 
- * Menu:
- 
- * Advanced Cleaning Functions::
- * Advanced Cleaning Variables::
- * Special Marking Function::
- 
- 
- File: dired-x,  Node: Advanced Cleaning Functions,  Next: Advanced Cleaning Variables,  Prev: Advanced Mark Commands,  Up: Advanced Mark Commands
- 
- Advanced Cleaning Functions
- ===========================
- 
- `dired-clean-patch'
-      Flag dispensable files created by the `patch' program for
-      deletion.  See variable `dired-patch-unclean-extensions'.
- 
- `dired-clean-tex'
-      Flag dispensable files created by TeX, LaTeX, and `texinfo' for
-      deletion.  See the following variables (*Note Advanced Cleaning
-      Variables::)
- 
-         * `dired-tex-unclean-extensions'
- 
-         * `dired-texinfo-unclean-extensions'
- 
-         * `dired-latex-unclean-extensions'
- 
-         * `dired-bibtex-unclean-extensions'
- 
- `dired-very-clean-tex'
-      Flag dispensable files created by TeX, LaTeX, `texinfo', and ".dvi"
-      files for deletion.
- 
- 
- File: dired-x,  Node: Advanced Cleaning Variables,  Next: Special Marking Function,  Prev: Advanced Cleaning Functions,  Up: Advanced Mark Commands
- 
- Advanced Cleaning Variables
- ===========================
- 
- Variables used by the above cleaning commands (and in the default value
- for variable `dired-omit-extensions', *Note Omitting Variables::)
- 
- `dired-patch-unclean-extensions'
-      Default: `'(".rej" ".orig")'
- 
-      List of extensions of dispensable files created by the `patch'
-      program.
- 
- `dired-tex-unclean-extensions'
-      Default:  `'(".toc" ".log" ".aux")'
- 
-      List of extensions of dispensable files created by TeX.
- 
- `dired-texinfo-unclean-extensions'
-      Default: `'(".cp" ".cps" ".fn" ".fns" ".ky" ".kys"' `".pg" ".pgs"
-      ".tp" ".tps" ".vr" ".vrs")'
- 
-      List of extensions of dispensable files created by `texinfo'.
- 
- `dired-latex-unclean-extensions'
-      Default: `'(".idx" ".lof" ".lot" ".glo")'
- 
-      List of extensions of dispensable files created by LaTeX.
- 
- `dired-bibtex-unclean-extensions'
-      Default:  `'(".blg" ".bbl")'
- 
-      List of extensions of dispensable files created by BibTeX.
- 
- 
- File: dired-x,  Node: Special Marking Function,  Next: Multiple Dired Directories,  Prev: Advanced Cleaning Variables,  Up: Advanced Mark Commands
- 
- Special Marking Function
- ========================
- 
- `M-('
-      (`dired-mark-sexp') Mark files for which PREDICATE returns
-      non-`nil'.  With a prefix argument, unflag those files instead.
- 
-      The PREDICATE is a lisp expression that can refer to the following
-      symbols:
-     `inode'
-           [integer] the inode of the file (only for `ls -i' output)
- 
-     `s'
-           [integer] the size of the file for `ls -s' output (usually in
-           blocks or, with `-k', in KBytes)
- 
-     `mode'
-           [string]  file permission bits, e.g., `"-rw-r--r--"'
- 
-     `nlink'
-           [integer] number of links to file
- 
-     `uid'
-           [string]  owner
- 
-     `gid'
-           [string]  group  (If the gid is not displayed by `ls', this
-           will still be set (to the same as uid))
- 
-     `size'
-           [integer] file size in bytes
- 
-     `time'
-           [string]  the time that `ls' displays, e.g., `"Feb 12 14:17"'
- 
-     `name'
-           [string]  the name of the file
- 
-     `sym'
-           [string]  if file is a symbolic link, the linked-to name,
-           else `""'
- 
-      For example, use
-           (equal 0 size)
-      to mark all zero length files.
- 
-      To find out all not yet compiled Emacs lisp files in a directory,
-      dired all `.el' files in the lisp directory using the wildcard
-      `*.el'.  Then use `M-(' with
-           (not (file-exists-p (concat name "c")))
-      to mark all `.el' files without a corresponding `.elc' file.
- 
- 
- File: dired-x,  Node: Multiple Dired Directories,  Next: Find File At Point,  Prev: Special Marking Function,  Up: Top
- 
- Multiple Dired Directories and Non-Dired Commands
- *************************************************
- 
-    An Emacs buffer can have but one working directory, stored in the
- buffer-local variable `default-directory'.  A Dired buffer may have
- several subdirectories inserted, but still has but one working
- directory: that of the top level Dired directory in that buffer.  For
- some commands it is appropriate that they use the current Dired
- directory instead of `default-directory', e.g., `find-file' and
- `compile'.
- 
-    A general mechanism is provided for special handling of the working
- directory in special major modes:
- 
- `default-directory-alist'
-      Default: `((dired-mode . (dired-current-directory)))'
- 
-      Alist of major modes and their opinion on `default-directory', as a
-      lisp expression to evaluate.  A resulting value of `nil' is ignored
-      in favor of `default-directory'.
- 
- `default-directory'
-      Function with usage like variable `default-directory', but knows
-      about the special cases in variable `default-directory-alist'.
- 
- 
- File: dired-x,  Node: Find File At Point,  Next: Miscellaneous Commands,  Prev: Multiple Dired Directories,  Up: Top
- 
- Find File At Point
- ==================
- 
-    `dired-x' provides a method of visiting or editing a file mentioned
- in the buffer you are viewing (e.g., a mail buffer, a news article, a
- README file, etc.) or to test if that file exists.  You can then modify
- this in the minibuffer after snatching the filename.
- 
-    When installed `dired-x' will substitute `dired-x-find-file' for
- `find-file' (normally bound to `C-x C-f') and
- `dired-x-find-file-other-window' for `find-file-other-window' (normally
- bound to `C-x 4 C-f').
- 
-    In order to use this feature, you will need to set
- `dired-x-hands-off-my-keys' to `nil' inside `dired-load-hook' (*Note
- Optional Installation File At Point::).
- 
- `dired-x-find-file'
-      `dired-x-find-file' behaves exactly like `find-file' (normally
-      bound to `C-x C-f') unless a prefix argument is passed to the
-      function in which case it will use the filename at point as a
-      guess for the file to visit.
- 
-      For example, if the buffer you were reading contained the words
- 
-           Available via anonymous ftp in
-           
-              /roebling.poly.edu:/pub/lisp/crypt++.el.gz
- 
-      then you could move your cursor to the line containing the ftp
-      address and type `C-u C-x C-f' (the `C-u' is a universal
-      argument).  The minibuffer would read
- 
-           Find file: /roebling.poly.edu:/pub/lisp/crypt++.el.gz
- 
-      with the point after the last `/'.  If you hit return emacs will
-      visit the file at that address.  This also works with files on
-      your own computer.
- 
- `dired-x-find-file-other-window'
-      `dired-x-find-file-other-window' behaves exactly like
-      `find-file-other-window' (normally bound to `C-x 4 C-f') unless a
-      prefix argument is used.  See `dired-x-find-file' for more
-      information.
- 
- `dired-x-hands-off-my-keys'
-      If set to `t', then it means that `dired-x' should *not* bind
-      `dired-x-find-file' over `find-file' on keyboard.  Similarly, it
-      should not bind `dired-x-find-file-other-window' over
-      `find-file-other-window'.  If you change this variable after
-      `dired-x.el' is loaded then do `M-x dired-x-bind-find-file'.  The
-      default value of this variable is `t'; by default, the binding is
-      not done.  See *Note Optional Installation File At Point::.
- 
- `dired-x-bind-find-file'
-      A function, which can be called interactively or in your
-      `~/.emacs' file, that uses the value of
-      `dired-x-hands-off-my-keys' to determine if `dired-x-find-file'
-      should be bound over `find-file' and
-      `dired-x-find-file-other-window' bound over
-      `find-file-other-window'.  See *Note Optional Installation File At
-      Point::.
- 
- 
- File: dired-x,  Node: Miscellaneous Commands,  Next: Bugs,  Prev: Find File At Point,  Up: Top
- 
- Miscellaneous Commands
- **********************
- 
-    Miscellaneous features not fitting anywhere else:
- 
- `dired-find-subdir'
-      Default: `nil'
- 
-      If non-`nil', Dired does not make a new buffer for a directory if
-      it can be found (perhaps as subdirectory) in some existing Dired
-      buffer.
- 
-      If there are several Dired buffers for a directory, the most
-      recently used is chosen.
- 
-      Dired avoids switching to the current buffer, so that if you have a
-      normal and a wildcard buffer for the same directory, `C-x d RET'
-      will toggle between those two.
- 
- `M-g'
-      (`dired-goto-file') Goto file line of a file (or directory).
- 
- `M-G'
-      (`dired-goto-subdir') Goto headerline of an inserted directory.
-      This commands reads its argument with completion over the names of
-      the inserted subdirectories.
- 
- `w'
-      (`dired-copy-filename-as-kill') The `w' command puts the names of
-      the marked (or next N) files into the kill ring, as if you had
-      killed them with `C-w'.  With a zero prefix argument N=0, use the
-      complete pathname of each file.  With a raw (just `C-u') prefix
-      argument, use the relative pathname of each marked file.  As a
-      special case, if no prefix argument is given and point is on a
-      directory headerline, it gives you the name of that directory,
-      without looking for marked files.
- 
-      The list of names is also stored onto the variable
-      `dired-marked-files' for use, e.g., in an `ESC ESC'
-      (`eval-expression') command.
- 
-      As this command also displays what was pushed onto the kill ring
-      you can use it to display the list of currently marked files in the
-      echo area (unless you happen to be on a subdirectory headerline).
- 
-      You can then feed the file name to other Emacs commands with `C-y'.
-      For example, say you want to rename a long filename to a slightly
-      different name.  First type `w' to push the old name onto the kill
-      ring.  Then type `R' to rename it and use `C-y' inside `R''s
-      minibuffer prompt to insert the old name at a convenient place.
- 
- `T'
-      (`dired-do-toggle') Toggle marks.  That is, currently marked files
-      become unmarked and vice versa.  Files marked with other flags
-      (such as `D') are not affected.  The special directories `.' and
-      `..' are never toggled.
- 
- `dired-smart-shell-command'
-      Like function `shell-command', but in the current Dired directory.
-      Bound to `M-!' in Dired buffers.
- 
- `dired-jump'
-      Bound to `C-x C-j'.  Jump back to dired: If in a file, dired the
-      current directory and move to file's line.  If in Dired already,
-      pop up a level and goto old directory's line.  In case the proper
-      Dired file line cannot be found, refresh the Dired buffer and try
-      again.
- 
- `dired-jump-other-window'
-      Bound to `C-x 4 C-j'. Like `dired-jump', but to other window.
- 
-      These functions can be autoloaded so they work even though
-      `dired-x.el' has not been loaded yet (*Note Optional Installation
-      Dired Jump::).
- 
-      If the variable `dired-bind-jump' is `nil', `dired-jump' will not
-      be bound to `C-x C-j' and `dired-jump-other-window' will not be
-      bound to `C-x 4 C-j'.
- 
- `dired-vm'
-      Bound to `V' if `dired-bind-vm' is t.  Run VM on this file (assumed
-      to be a UNIX mail folder).
- 
-      If you give this command a prefix argument, it will visit the
-      folder read-only.  This only works in VM~5, not VM~4.
- 
-      If the variable `dired-vm-read-only-folders' is t, `dired-vm' will
-      visit all folders read-only.  If it is neither `nil' nor `t', e.g.,
-      the symbol `'if-file-read-only', only files not writable by you are
-      visited read-only.  This is the recommended value if you run VM 5.
- 
-      If the variable `dired-bind-vm' is t, `dired-vm' will be bound to
-      `V'.  Otherwise, `dired-bind-rmail' will be bound.
- 
- `dired-rmail'
-      Bound to `V' if `dired-bind-vm' is `nil'.  Run Rmail on this file
-      (assumed to be mail folder in Rmail/BABYL format).
- 
- `dired-info'
-      Bound to `I'.  Run Info on this file (assumed to be a file in Info
-      format).
- 
-      If the variable `dired-bind-info' is `nil', `dired-info' will not
-      be bound to I.
- 
- `dired-man'
-      Bound to `N'.  Run man on this file (assumed to be a file in nroff
-      format).
- 
-      If the variable `dired-bind-man' is `nil', `dired-man' will not be
-      bound to N.
- 
- `dired-do-relative-symlink'
-      Bound to `Y'.  Relative symlink all marked (or next ARG) files
-      into a directory, or make a relative symbolic link to the current
-      file.  This creates relative symbolic links like
- 
-      foo -> ../bar/foo
- 
-      not absolute ones like
- 
-      foo -> /ugly/path/that/may/change/any/day/bar/foo
- 
- `dired-do-relative-symlink-regexp'
-      Bound to `%Y'.  Relative symlink all marked files containing
-      REGEXP to NEWNAME.  See functions `dired-do-rename-regexp' and
-      `dired-do-relsymlink' for more info.
- 
- 
- File: dired-x,  Node: Bugs,  Next: Concept Index,  Prev: Miscellaneous Commands,  Up: Top
- 
- Bugs
- ****
- 
- If you encounter a bug in this package, wish to suggest an enhancement,
- or want to make a smart remark, then type
- 
-      `M-x dired-x-submit-report'
- 
- to set up an outgoing mail buffer, with the proper address to the
- `dired-x.el' maintainer automatically inserted in the `To:' field.
- This command also inserts information that the Dired X maintainer can
- use to recreate your exact setup, making it easier to verify your bug
- or social maladjustment.
- 
-    Lawrence R. Dodd <dodd@roebling.poly.edu>
- 
- 
- File: dired-x,  Node: Concept Index,  Next: Command Index,  Prev: Bugs,  Up: Top
- 
- Concept Index
- *************
- 
- * Menu:
- 
- * dired-aux.el:                         Technical Details.
- * Adding to the kill ring in dired.:    Miscellaneous Commands.
- * Autoloading dired-jump and dired-jump-other-window: Optional Installation Dired Jump.
- * Binding dired-x-find-file:            Optional Installation File At Point.
- * Bugs:                                 Bugs.
- * Dot files, how to omit them in Dired: Omitting Examples.
- * Features:                             Features.
- * Finding a file at point:              Find File At Point.
- * GNU zip.:                             Shell Command Guessing.
- * GNU zip.:                             Shell Command Guessing.
- * Guessing shell commands for files.:   Shell Command Guessing.
- * How to make omitting the default in Dired: Omitting Variables.
- * Jumping to dired listing containing file.: Miscellaneous Commands.
- * Lisp expression, marking files with in Dired: Special Marking Function.
- * Local Variables for Dired Directories: Local Variables.
- * ls listings, how to peruse them in Dired: Virtual Dired.
- * Mark file by lisp expression:         Special Marking Function.
- * Multiple Dired directories:           Multiple Dired Directories.
- * Omitting additional files:            Omitting Variables.
- * Omitting dot files in Dired:          Omitting Examples.
- * Omitting Files in Dired:              Omitting Files in Dired.
- * Omitting RCS files in Dired:          Omitting Examples.
- * Omitting tib files in Dired:          Omitting Examples.
- * Passing GNU tar its `z' switch.:      Shell Command Guessing.
- * Perusing ls listings:                 Virtual Dired.
- * RCS files, how to omit them in Dired: Omitting Examples.
- * Reading mail.:                        Miscellaneous Commands.
- * Reading mail.:                        Miscellaneous Commands.
- * Redefined functions:                  Technical Details.
- * Relative symbolic links.:             Miscellaneous Commands.
- * Running info.:                        Miscellaneous Commands.
- * Running man.:                         Miscellaneous Commands.
- * Simultaneous visiting of several files: Advanced Mark Commands.
- * Tib files, how to omit them in Dired: Omitting Examples.
- * Toggling marks.:                      Miscellaneous Commands.
- * Virtual Dired:                        Virtual Dired.
- * Visiting a file mentioned in a buffer: Find File At Point.
- * Visiting several files at once:       Advanced Mark Commands.
- * Working directory:                    Multiple Dired Directories.
- 
- 
- File: dired-x,  Node: Command Index,  Next: Key Index,  Prev: Concept Index,  Up: Top
- 
- Function Index
- **************
- 
- * Menu:
- 
- * default-directory:                    Multiple Dired Directories.
- * dired-clean-patch:                    Advanced Cleaning Functions.
- * dired-clean-tex:                      Advanced Cleaning Functions.
- * dired-copy-filename-as-kill:          Miscellaneous Commands.
- * dired-do-find-marked-files:           Advanced Mark Commands.
- * dired-do-relative-symlink:            Miscellaneous Commands.
- * dired-do-relative-symlink-regexp:     Miscellaneous Commands.
- * dired-do-toggle:                      Miscellaneous Commands.
- * dired-flag-extension:                 Advanced Mark Commands.
- * dired-goto-file:                      Miscellaneous Commands.
- * dired-goto-subdir:                    Miscellaneous Commands.
- * dired-info:                           Miscellaneous Commands.
- * dired-jump:                           Miscellaneous Commands.
- * dired-jump-other-window:              Miscellaneous Commands.
- * dired-man:                            Miscellaneous Commands.
- * dired-mark-extension:                 Advanced Mark Commands.
- * dired-mark-sexp:                      Special Marking Function.
- * dired-omit-here-always:               Omitting Variables.
- * dired-omit-toggle:                    Omitting Files in Dired.
- * dired-rmail:                          Miscellaneous Commands.
- * dired-smart-shell-command:            Miscellaneous Commands.
- * dired-very-clean-tex:                 Advanced Cleaning Functions.
- * dired-virtual:                        Virtual Dired.
- * dired-virtual-mode:                   Virtual Dired.
- * dired-virtual-revert:                 Virtual Dired.
- * dired-vm:                             Miscellaneous Commands.
- * dired-x-bind-find-file:               Find File At Point.
- * dired-x-find-file:                    Find File At Point.
- * dired-x-find-file-other-window:       Find File At Point.
- * dired-x-submit-report:                Bugs.
- * shell-command:                        Miscellaneous Commands.
- 
- 
- File: dired-x,  Node: Key Index,  Next: Variable Index,  Prev: Command Index,  Up: Top
- 
- Key Index
- *********
- 
- * Menu:
- 
- * %Y:                                   Miscellaneous Commands.
- * C-x 4 C-f:                            Find File At Point.
- * C-x 4 C-j:                            Miscellaneous Commands.
- * C-x C-f:                              Find File At Point.
- * C-x C-j:                              Miscellaneous Commands.
- * F:                                    Advanced Mark Commands.
- * g:                                    Virtual Dired.
- * I:                                    Miscellaneous Commands.
- * M-!:                                  Miscellaneous Commands.
- * M-(:                                  Special Marking Function.
- * M-G:                                  Miscellaneous Commands.
- * M-g:                                  Miscellaneous Commands.
- * M-o:                                  Omitting Files in Dired.
- * N:                                    Miscellaneous Commands.
- * T:                                    Miscellaneous Commands.
- * V:                                    Miscellaneous Commands.
- * w:                                    Miscellaneous Commands.
- * Y:                                    Miscellaneous Commands.
- 
- 
- File: dired-x,  Node: Variable Index,  Prev: Key Index,  Up: Top
- 
- Variable Index
- **************
- 
- * Menu:
- 
- * auto-mode-alist:                      Virtual Dired.
- * default-directory-alist:              Multiple Dired Directories.
- * dired-bibtex-unclean-extensions:      Advanced Cleaning Variables.
- * dired-bind-info:                      Miscellaneous Commands.
- * dired-bind-jump:                      Miscellaneous Commands.
- * dired-bind-man:                       Miscellaneous Commands.
- * dired-bind-vm:                        Miscellaneous Commands.
- * dired-enable-local-variables:         Local Variables.
- * dired-enable-local-variables:         Local Variables.
- * dired-find-subdir:                    Miscellaneous Commands.
- * dired-guess-shell-alist-default:      Shell Command Guessing.
- * dired-guess-shell-alist-user:         Shell Command Guessing.
- * dired-guess-shell-gnutar:             Shell Command Guessing.
- * dired-guess-shell-gzip-quiet:         Shell Command Guessing.
- * dired-guess-shell-znew-switches nil:  Shell Command Guessing.
- * dired-latex-unclean-extensions:       Advanced Cleaning Variables.
- * dired-local-variables-file:           Local Variables.
- * dired-local-variables-file:           Local Variables.
- * dired-marked-files:                   Miscellaneous Commands.
- * dired-omit-extensions:                Omitting Variables.
- * dired-omit-files:                     Omitting Variables.
- * dired-omit-files-p:                   Omitting Variables.
- * dired-omit-localp:                    Omitting Variables.
- * dired-omit-marker-char:               Omitting Variables.
- * dired-patch-unclean-extensions:       Advanced Cleaning Variables.
- * dired-shell-command-history nil:      Shell Command Guessing.
- * dired-tex-unclean-extensions:         Advanced Cleaning Variables.
- * dired-texinfo-unclean-extensions:     Advanced Cleaning Variables.
- * dired-vm-read-only-folders:           Miscellaneous Commands.
- * dired-x-hands-off-my-keys:            Find File At Point.
- 
- 
- 
- Tag Table:
- Node: Copyright96
- Node: Top1176
- Node: Introduction2117
- Node: Features3071
- Node: Technical Details4065
- Node: Installation4778
- Node: Optional Installation Dired Jump6036
- Node: Optional Installation File At Point7647
- Node: Special Notes8838
- Node: Omitting Files in Dired10756
- Node: Omitting Variables12278
- Node: Omitting Examples15587
- Node: Omitting Technical16806
- Node: Local Variables17222
- Node: Shell Command Guessing19089
- Node: Virtual Dired22080
- Node: Advanced Mark Commands23607
- Node: Advanced Cleaning Functions24964
- Node: Advanced Cleaning Variables25791
- Node: Special Marking Function26911
- Node: Multiple Dired Directories28504
- Node: Find File At Point29673
- Node: Miscellaneous Commands32434
- Node: Bugs37441
- Node: Concept Index38039
- Node: Command Index40612
- Node: Key Index42687
- Node: Variable Index43946
- 
- End Tag Table
--- 0 ----
Index: emacs/info/ediff
diff -c emacs/info/ediff:1.1.1.1 emacs/info/ediff:removed
*** emacs/info/ediff:1.1.1.1	Mon Jul 22 01:51:36 1996
--- emacs/info/ediff	Fri Aug  2 20:01:22 1996
***************
*** 1,1365 ****
- This is Info file ../info/ediff, produced by Makeinfo-1.55 from the
- input file ediff.texi.
- 
-    %
- 
-    This file documents Ediff, a comprehensive visual interface to Unix
- diff and patch utilities.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
- 
- File: ediff,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
- 
- * Menu:
- 
- * Introduction::                About Ediff.
- * Major Entry Points::          How to use Ediff.
- * Commands::                    Ediff commands.
- * Remote and Compressed Files::  You may want to know about this.
- * Customization::               How to make Ediff work the way YOU want.
- * Credits::                     Thanks to those who helped.
- * Index::
- 
- 
- File: ediff,  Node: Introduction,  Next: Major Entry Points,  Prev: Top,  Up: Top
- 
- Introduction
- ************
- 
-    Ediff provides a convenient way for simultaneous browsing through
- the differences between a pair (or a triple) of files or buffers.  The
- files being compared, file-A, file-B, and file-C (if applicable) are
- shown in separate windows (side by side, one above the another, or in
- separate frames), and the differences are highlighted as you step
- through them.  You can also copy difference regions from one buffer to
- another (and recover old differences if you change your mind).
- 
-    In addition, Ediff can apply a patch to a file and then let you step
- though both files, the patched and the original one, simultaneously,
- difference-by-difference.  You can even apply a patch right out of a
- mail buffer, i.e., patches received by mail don't even have to be
- saved.  Since Ediff lets you copy differences between buffers, you can,
- in effect, apply patches selectively (i.e., you can copy a difference
- region from `file_orig' to `file', thereby undoing any particular patch
- that you don't like).
- 
-    Ediff is aware of version control, which lets the user compare files
- with their older versions. Ediff also works with remote and compressed
- files, automatically ftp-ing them over and uncompressing them *Note
- Remote and Compressed Files::, for details.
- 
-    This package builds upon the ideas borrowed from emerge.el and
- several Ediff's functions are adaptations from emerge.el.  Much of the
- functionality of Ediff is also influenced by emerge.el.
- 
- 
- File: ediff,  Node: Major Entry Points,  Next: Commands,  Prev: Introduction,  Up: Top
- 
- Major Entry Points
- ******************
- 
-    Ediff can be invoked interactively using the following functions,
- which can be run either from the minibuffer of from the menu bar. In
- the menu bar, all Ediff's entry points belong to three submenus of the
- `Tools' menu: `Compare,' `Merge,' and `Apply Patch.'
- 
- `ediff-files'
-      Compare two files.
- 
- `ediff'
-      Alias for ediff-files.
- 
- `ediff-buffers'
-      Compare two buffers.
- 
- `ediff-files3'
-      Compare three files.
- 
- `ediff3'
-      Alias for ediff-files3.
- 
- `ediff-buffers3'
-      Compare three buffers.
- 
- `ediff-windows-wordwise'
-      Compare windows word-by-word.
- 
- `ediff-windows-linewise'
-      Compare windows line-by-line.
- 
- `ediff-regions-wordwise'
-      Compare regions word-by-word.
- 
- `ediff-regions-linewise'
-      Compare regions line-by-line.
- 
- `ediff-revision'
-      Compare current buffer with one of its versions, if the buffer is
-      visiting  a file under version control.   With a prefix argument,
-      compares two versions of the file visited by the  current buffer.
- 
- `ediff-patch-file'
-      Patch file then compare.
- 
- `epatch'
-      Alias for ediff-patch-file.
- 
- `ediff-patch-buffer'
-      Patch buffer then compare.   Alias for ediff-patch-buffer.
- 
- `ediff-merge-files'
-      Merge two files.
- 
- `ediff-merge'
-      Alias for ediff-merge-files.
- 
- `ediff-merge-files-with-ancestor'
-      Same but with ancestor.
- 
- `ediff-merge-with-ancestor'
-      Alias for `ediff-merge-files-with-ancestor'.
- 
- `ediff-merge-buffers'
-      Merge two buffers.
- 
- `ediff-merge-buffers-with-ancestor'
-      Same but with ancestor.
- 
- `ediff-merge-revisions'
-      Merge two versions of the file visited by the current buffer.
-      Same but with ancestor.
- 
- If you want Ediff to be loaded from the very beginning, you should have
-      (require 'ediff)
- 
- in your .emacs file. Otherwise, Ediff will be loaded automatically when
- you use one of the above functions, either directly or through the
- menus.
- 
-    All the above functions use the Unix `diff' utility to find
- difference regions. They process `diff' output and display it to the
- user in a convenient form. At present, Ediff understands only the plain
- output from diff. Options such as `-c' are not supported, nor is the
- format produced by VMS diff.
- 
-    The functions `ediff-files', `ediff-buffers', `ediff-files3',
- `ediff-buffers3' first display the coarse, line-based difference
- regions, as reported by the `diff' program.  Since diff may report
- fairly large chunks of text as being different, even though the
- difference may be localized to just a few words or even to the white
- space or line breaks, Ediff will further *refine* the regions to
- indicate which exact words differ. If the only difference is in the
- white space and line breaks, Ediff will say so.  On a color display,
- fine differences are highlighted with color; on a monochrome display,
- they are underlined. *Note Highlighting Difference Regions::, to learn
- how to change that.
- 
-    The functions `ediff-windows-wordwise', `ediff-windows-line-wise',
- `ediff-regions-wordwise' and `ediff-regions-linewise' do comparison on
- parts of buffers (which must already exist).  Since
- `ediff-windows-wordwise'  and `ediff-regions-wordwise' are intended for
- relatively small segments of buffers, comparison is done on the basis
- of words rather than lines. No refinement is necessary in this case.
- This technique is effective only for relatively small regions (perhaps,
- up to 100 lines), as these functions have a relatively slow startup.
- 
-    To compare large regions, use ediff-regions-linewise. In this mode,
- Ediff displays differences as it would if invoked via `ediff-files' or
- `ediff-buffers.'
- 
-    The functions `ediff-patch-file' and `ediff-patch-buffer' apply a
- patch to a file or a buffer and then run Ediff on these buffers,
- displaying the difference regions.
- 
-    Finally, for files under version control, `ediff-revisions' lets the
- user compare the file visited by the current buffer to one of its older
- versions (or two versions of the file visited by that buffer).
- 
- 
- File: ediff,  Node: Commands,  Next: Remote and Compressed Files,  Prev: Major Entry Points,  Up: Top
- 
- Commands
- ********
- 
-    All Ediff commands are displayed in a quick help window, unless you
- type `?' to shrink the window to just one line.  You can redisplay the
- help window by hitting `?' again. In this section we comment only on the
- features that cannot be readily deduced from the quick help window.
- 
-    Many Ediff commands take numeric prefix arguments.  For instance, if
- you type a number, say 3, and then `j' (ediff-jump-to-difference), Ediff
- will take you to the 3d difference region.  Typing 3 and then `a'
- (`ediff-diff-to-diff') will copy the 3d difference region from buffer A
- to buffer B.  Hitting `b' does copying in the opposite direction. (In
- 3-way comparison mode, the commands for copying are `ab', `ba', `ca',
- etc.) Likewise, 4 followed by `ra' will restore the 4th difference
- region in buffer A (if it was previously saved as a result of copying
- from, say, buffer B to A).
- 
-    Without the prefix argument, all commands operate on the current
- difference region.
- 
-    The total number of differences and the current difference number are
- always displayed in the mode line of the control window.
- 
-    If, after making changes to buffers A, B, or C, you decide to save
- them, it is recommended to use `ediff-save-buffer', which is bound to
- `wa', `wb', and `wc' (`wa' will save buffer A, `wb' saves buffer B,
- etc.).
- 
-    Typing `wd' saves the output from the `diff' utility to a file, so
- you can later refer to it.
- 
-    The command `s' is used only for merging. It allows the user to
- shrink window C to its minimal size, thereby exposing as much of
- buffers A and B as possible.  This command is intended only for
- temporary viewing. Therefore, Ediff will restore the original window
- size for buffer C whenever window configuration is changed by the user
- (on toggling the help, changing the manner in which windows are split,
- etc.). However, recentering and jumping to a difference does not affect
- window C. Typing `s' again restores the original size of the merge
- window.
- 
-    With a positive prefix argument, the command `s' makes the merge
- window, window C, slightly taller. With `-' or a negative prefix
- argument, `s' makes window C slightly shorter.
- 
-    In the merge mode, Ediff uses a default variant (one of the two
- files being merged) when it cannot decide which of the difference
- regions (that of buffer A or buffer B) should be copied into the merge
- buffer.  A user may decide that the default variant was chosen
- inappropriately and may wish to change that while merging is in
- progress.  To facilitate this, Ediff has a command, bound to `&', which
- will cause Ediff to start merging anew beginning with the current
- difference, using an alternative default variant (the user is asked to
- type in the new default for merging), which can be either `default-A',
- `default-B', or `combined'.  *Note Merging and diff3::, for details.
- 
-    Such repeated merging affects only difference regions that have
- default-A/B status, and only if they were not changed with respect to
- their originals.
- 
-    Another command that is used only for merging is `+'. Its effect is
- to combine the current difference regions of buffers A and B and put the
- combination into the merge buffer. *Note Merging and diff3::,
- specifically, the variables `ediff-combine-diffs' and
- `ediff-combination-pattern'.
- 
-    Some commands are not bound to any key:
- `ediff-revert-buffers-then-recompute-diffs'
-      This is useful when, after making changes, you decided to make a
-      fresh start, or if at some point you changed the files being
-      compared but want to discard any changes to comparison buffers
-      that were done since then.  This command will ask for confirmation
-      before reverting files. With a prefix argument, it will revert
-      files without asking.
- 
- `ediff-toggle-multiframe'
-      Changes the display from the multi-frame mode (where the quick
-      help window is in a separate frame) to the single-frame mode
-      (where all Ediff buffers share the same frame), and vice versa.
- 
- `ediff-profile'
-      Ediff has an admittedly primitive (but useful) facility for
-      profiling Ediff's commands. Users should not be concerned with this
-      feature, unless they are willing to put time into improving the
-      efficiency of Ediff. The function `ediff-profile' toggles
-      profiling of ediff commands.
- 
- 
- File: ediff,  Node: Remote and Compressed Files,  Next: Customization,  Prev: Commands,  Up: Top
- 
- Remote and Compressed Files
- ***************************
- 
-    Ediff works with remote, compressed, and encrypted files. Ediff
- supports ange-ftp.el, jka-compr.el, uncompress.el and crypt++.el, but
- it may work with other similar packages as well. This means that you
- can compare files residing on another machine, or you can apply a patch
- to a file on another machine (even the patch itself can be a remote
- file!).
- 
-    When patching compressed or remote files, Ediff does not rename the
- source file (unlike what the `patch' utility would usually do).
- Instead, the source file retains its name and the result of applying
- the patch is placed in a temporary file that has the suffix `_patched'
- attached.  Generally, this applies to files that are handled using
- black magic, such as special file handlers (ange-ftp and some
- compression and encryption packages all use this method).
- 
-    Regular files are treated by the `patch' utility in the usual manner,
- i.e., the original is renamed into `source-name_orig' and the result of
- the patch is placed into the file source-name. (Ediff uses `_orig'
- instead of the usual `.orig' to placate systems like VMS.)
- 
- 
- File: ediff,  Node: Customization,  Next: Credits,  Prev: Remote and Compressed Files,  Up: Top
- 
- Customization
- *************
- 
-    Ediff has a rather self-explanatory interface, and in most cases the
- user won't need to change anything. However, should the need arise,
- there are extensive facilities to change the default behavior.
- 
- * Menu:
- 
- * Hooks::                       Customization via the hooks.
- * Quick Help::                  How to customize Ediff's quick help feature.
- * Window and Frame Configuration::  Controling the way Ediff displays things.
- * Selective Browsing::          Advanced browsing through difference regions.
- * Highlighting Difference Regions::  Controling over highlighting.
- * Narrowing::                   Comparing regions, windows, etc.
- * Refinement of Difference Regions::  How to control the refinement process.
- * Patch and Diff Programs::     Changing the utilities that compute differences
-                           and apply patches.
- * Merging and diff3::           How to customize Ediff in its Merge Mode.
- * Support for Version Control::  Changing the version control package.
-                           You are not likely to do that.
- * Customizing the Mode Line::   Changing the look of the mode line in Ediff.
- * Miscellaneous::               Other customization.
- * Notes on Heavy-duty Customization::  Customization for the gurus.
- 
- 
- File: ediff,  Node: Hooks,  Next: Quick Help,  Prev: Customization,  Up: Customization
- 
- Hooks
- =====
- 
-    The bulk of customization can be done via the following hooks:
- `ediff-load-hooks'
-      Can be used to change defaults after Ediff is loaded.  These hooks
-      are executed right after the default bindings are set.
- 
- `ediff-keymap-setup-hooks'
-      Can be used to alter bindings in Ediff's keymap. These hooks are
-      called right after the default bindings are set.
- 
- `ediff-before-setup-windows-hooks'
- `ediff-after-setup-windows-hooks'
-      Called before/after Ediff sets up its window configuration. Can be
-      used to save the configuration that existed before Ediff starts or
-      for whatever other purposes.
- 
- `ediff-suspend-hooks'
- `ediff-quit-hooks'
-      Can be used to set desired window configurations, delete files
-      Ediff didn't want to clean up after exiting, etc.  By default,
-      `ediff-quit-hooks' is set to a function, `ediff-cleanup-mess',
-      which cleans after Ediff, as appropriate in most cases. It is
-      rather unlikely that the user will want to change it. However, the
-      user may want add other hooks to `ediff-quit-hooks', either before
-      or after `ediff-cleanup-mess' (see the documentation for
-      `add-hook' in Emacs manual on how to do this).  One should be
-      aware that hooks executing before `ediff-cleanup-mess' start in
-      `ediff-control-buffer;' they should also leave
-      `ediff-control-buffer' as the current buffer when they finish.
-      Hooks that are executed after `ediff-cleanup-mess' should expect
-      the current buffer be either buffer A or buffer B.
-      `ediff-cleanup-mess' doesn't kill the buffers being compared or
-      merged (see `ediff-cleanup-hooks', below).
- 
- `ediff-cleanup-hooks'
-      Default is `nil'.  Hooks to run just before running
-      `ediff-quit-hooks'.  This is a good place to do various cleanups,
-      such as deleting the variant buffers.  Ediff provides a function,
-      `ediff-janitor', as one such possible hook, which the user can
-      `add-hooks' to `ediff-cleanup-hooks'.  This function kills buffers
-      A, B, and, possibly, C, if these buffers aren't modified. In merge
-      jobs, buffer C is never deleted.  However, the side effect of
-      using this function is that you may not be able to compare the
-      same buffer in two separate Ediff sessions: quitting one of them
-      will delete this buffer in another session as well.
- 
- `ediff-before-setup-control-frame-hooks'
- `ediff-after-setup-control-frame-hooks'
-      Can be used to relocate Ediff control frame when Ediff runs in a
-      multiframe mode (i.e., when the control buffer is in its own
-      dedicated frame).  Be aware that many variables that drive Ediff
-      are local to Ediff Control Panel (`ediff-control-buffer'), which
-      requires special care in writing these hooks.  Take a look at
-      `ediff-default-suspend-hook' and `ediff-default-quit-hook' to see
-      what's involved.
- 
- `ediff-startup-hooks'
-      Last hook called after Ediff starts up.
- 
- `ediff-select-hooks'
-      Called after Ediff selects the next difference region.
- 
- `ediff-unselect-hooks'
-      Called after Ediff unselects the current difference region.
- 
- `ediff-prepare-buffer-hooks'
-      Hooks executed for each Ediff buffer (A, B, C) right after these
-      buffers are arranged.
- 
- `ediff-display-help-hooks'
-      Ediff executes these hooks each time after setting up the help
-      message.  Can be used to alter the help message for custom
-      packages that run on top of Ediff.
- 
- `ediff-mode-hooks'
-      Called just after Ediff mode is set up in the control buffer. This
-      is done before any Ediff window is created. One can use it to set
-      local variables that alter the look of the display.
- 
- 
- File: ediff,  Node: Quick Help,  Next: Window and Frame Configuration,  Prev: Hooks,  Up: Customization
- 
- Quick Help
- ==========
- 
-    Ediff provides quick help using its control panel window. Since this
- window takes a fair share of the screen real estate, you can toggle it
- off by hitting `?'. The control window will then shrink to just one
- line and a mode line, displaying a short help message. The variable
- `ediff-prefer-long-help-message' tells Ediff whether the user wants the
- short message initially or the long one. By default, it is set to
- `nil', meaning that the short message will be shown on startup. Set
- this to `t', if you want Ediff to start with the long message.  If you
- want to change the appearance of the help message on a per-buffer basis,
- you must use `ediff-startup-hooks' to change the value of the variable
- `ediff-help-message', which is local to `ediff-control-buffer'.
- 
- 
- File: ediff,  Node: Window and Frame Configuration,  Next: Selective Browsing,  Prev: Quick Help,  Up: Customization
- 
- Window and Frame Configuration
- ==============================
- 
-    On a non-windowing display, Ediff sets things up in one frame,
- splitting it between a small control window and the windows for buffers
- A, B, and C.  The split between these windows can be horizontal or
- vertical, which can be changed interactively by typing `|' while the
- cursor is in the control window.
- 
-    On a window display, Ediff sets up a dedicated frame for Ediff
- Control Panel and then it chooses windows as follows: If one of the
- buffers is invisible, it is displayed in the currently selected frame.
- If a buffer is visible, it is displayed in the frame where it is
- visible.  If, according to the above criteria, the two buffers fall
- into the same frame, then so be it--the frame will be shared by the
- two.  The same algorithm works when you hit `C-l' (`ediff-recenter'),
- `p' (`ediff-previous-difference'), `n' (`ediff-next-difference'), etc.
- 
-    The above behavior also depends on whether the current frame is
- splittable, dedicated, etc. Unfortunately, the margin is too small to
- present this remarkable algorithm.
- 
-    The bottom line of all this is that you can compare buffers in one
- frame or in different frames.  The former is done by default, while the
- latter can be achieved by arranging buffers A, B (and C, if applicable)
- to be seen in different frames.  Ediff respects these arrangements,
- automatically adapting itself to the multi-frame mode.
- 
-    Ediff uses the following variables to set up its control panel
- (a.k.a. control buffer, a.k.a. quick help window):
- `ediff-control-frame-parameters'
-      The user can change or augment this variable including the font,
-      color, etc. The X resource name of Ediff Control Panel frames is
-      `Ediff'. Under X-windows, you can use this name to set up
-      preferences in your `~/.Xdefaults', `~/.xrdb', or whatever X
-      resource file is in use. Usually this is preferable to changing
-      `ediff-control-frame-parameters' directly.  For instance, you can
-      specify in `~/.Xdefaults' where the control frame is to be sitting
-      on the screen using the resource `Ediff*geometry'.
- 
-      In general, any X resource pertaining the control frame can be
-      reached via the prefix `Ediff*'.
- 
- `ediff-control-frame-position-function'
-      The prefered way of specifying the position of the control frame
-      is by setting the variable `ediff-control-frame-position-function'
-      to an appropriate function.  The default value of this variable is
-      `ediff-make-frame-position'. This function places the control
-      frame in the vicinity of the North-East corner of the frame
-      displaying buffer A.
- 
-    The following variables can be used to adjust the location produced
- by `ediff-make-frame-position' and for related customization.
- `ediff-narrow-control-frame-leftward-shift'
-      Specifies the number of characters for shifting the control frame
-      from the rightmost edge of frame A when the control frame is
-      displayed as a small window.
- 
- `ediff-wide-control-frame-rightward-shift'
-      Specifies the rightward shift of the control frame from the left
-      edge of frame A when the control frame shows the full menu of
-      options.
- 
- `ediff-control-frame-upward-shift'
-      Specifies the number of pixels for the upward shift of the control
-      frame.
- 
- `ediff-prefer-iconified-control-frame'
-      If t, the control frame becomes iconified automatically when the
-      quick help message is toggled off. This saves valuable real estate
-      on the screen. Toggling help back will deiconify the control frame.
- 
-      To start Ediff with an iconified Control Panel, you should set this
-      variable to t and `ediff-prefer-long-help-message' to nil.  This
-      behavior is useful only in Emacs (not in XEmacs) and only if the
-      window manager is TWM or a derivative.
- 
-    If you truly and absolutely dislike the way Ediff sets up windows
- and if you cannot change this via frame parameters, the last resort is
- to rewrite the function `ediff-setup-windows'.  However, we believe that
- detaching Ediff Control Panel from the rest and making it into a
- separate frame offers an important opportunity by allowing you to
- iconify that frame. Under Emacs, the icon will usually accept all of the
- Ediff commands, but will free up valuable real estate on your screen
- (this may depend on the window manager, though). Iconifying won't do any
- good under XEmacs since XEmacs icons are not sensitive to keyboard
- input.  The saving grace is that, even if not iconified, the control
- frame is very small, smaller than some icons, so it does not take much
- space in any case.
- 
-    The following  variable controls how windows are set up.
- `ediff-window-setup-function'
-      The multiframe setup is achieved via
-      `ediff-setup-windows-multiframe' function, which is a default on
-      windowing displays.  The plain setup, one where all windows are
-      always in one frame, is done via `ediff-setup-windows-plain',
-      which is the default on a non-windowing display (or in an xterm
-      window).  In fact, under Emacs, you can switch freely between
-      these two setups by executing the command
-      `ediff-toggle-multiframe' using the Minibuffer.
- 
-      If you don't like any of these setups, write your own function. See
-      the documentation for `ediff-window-setup-function' for the basic
-      guidelines. However, writing window setups is not easy, so before
-      embarking on this job you may want to take a close look at
-      `ediff-setup-windows-plain' and `ediff-setup-windows-multiframe'.
- 
-    The user can run multiple Ediff sessions at once, by invoking Ediff
- several times without exiting previous Ediff sessions. Different
- sessions may even operate on the same pair of files.  Each session
- would have its own Ediff Control Panel and all the regarding a
- particular session is local to the associated control panel buffer.
- You can switch between sessions by suspending one session and then
- switching to another control panel. (Different control panel buffers
- are distinguished by a numerical suffix, e.g., Ediff Control Panel<3>.)
- 
- 
- File: ediff,  Node: Selective Browsing,  Next: Highlighting Difference Regions,  Prev: Window and Frame Configuration,  Up: Customization
- 
- Selective Browsing
- ==================
- 
-    Sometimes it is convenient to be able to step through only some
- difference regions, those that satisfy certain conditions, and to
- ignore all others. The commands `#f' and `#h' let the user specify
- regular expressions to control the way Ediff skips to the next or
- previous difference. Typing `#f' lets one specify regular expressions
- for each buffer, regexp-A, regexp-B, and regexp-C.  Ediff will then
- start stepping through only those difference regions where the region
- in buffer A matches regexp-A and/or the region in buffer B matches
- regexp-B, etc. Whether `and' or `or' will be used depends on how the
- user responds to a prompt.  Similarly, using `#h', one specifies
- expressions that match difference regions to be ignored while stepping
- through the differences. That is, if the buffer A part matches
- regexp-A, the buffer B part matches regexp B and (if applicable)
- buffer-C part matches regexp-C, then the region will be ignored by the
- commands `n'/`SPC' (`ediff-next-difference') and `p'/`DEL'
- (`ediff-previous-difference') commands.
- 
-    Hitting `#f' and `#h' toggles selective browsing on/off.
- 
-    Note that selective browsing affects only `ediff-next-difference' and
- `ediff-previous-difference', i.e., the commands invoked by typing
- `n'/`SPC' and `p'/`DEL'. You can still jump directly (using `j' or
- `ga'/`gb'/`gc') to any numbered difference. Also, it should be
- understood, that `#f' and `#h' do not change the position of the point
- in the buffers. The effect of these commands is seen only when the user
- types `n' or `p', i.e., when Ediff is told to jump to the next or
- previous difference.
- 
-    Users can supply their own functions to specify how Ediff should do
- selective browsing. To change the default Ediff function, add a
- function to `ediff-load-hooks' which will do the following assignments:
-      (fset ediff-hide-regexp-matches 'your-hide-function)
-      (fset ediff-focus-on-regexp-matches 'your-focus-function)
- 
-    *Useful hint*: To specify a regexp that matches everything, don't
- simply type `RET' in response to a prompt. Typing `RET' tells Ediff to
- accept the default value, which may not be what you want. Instead, you
- should enter something like ``^'' or ``$'' -- which matches every line.
- 
-    If the user does not remember if selective browsing is in effect and
- which regexps are being used, the status command, `i', will supply the
- requisite information.
- 
-    In addition to the ability to ignore regions that match regular
- expressions, Ediff can be ordered to start skipping over certain
- `inessential' regions. This is controlled by the variable
- `ediff-ignore-similar-regions'
-      If `t', causes Ediff to skip over difference regions that deemed
-      inessential, i.e., where the only differences are those in the
-      white space and newlines.
- 
-    *Note*: In order for this feature to work, auto-refining of
- difference regions must be on, since otherwise Ediff won't know if
- there are fine differences between regions. Under X, auto-refining is a
- default, but it is nixed on dumb terminals or in Xterm windows.
- Therefore, in a non-windowing environment, the user must explicitly turn
- auto-refining on (e.g., by typing `@').
- 
-    *Caution*: If many inessential regions appear in a row, Ediff may
- take a long time to jump to the next region because it has to compute
- fine differences of all intermediate regions.
- 
- 
- File: ediff,  Node: Highlighting Difference Regions,  Next: Narrowing,  Prev: Selective Browsing,  Up: Customization
- 
- Highlighting Difference Regions
- ===============================
- 
-    The following variables control the way Ediff highlights difference
- regions.
- 
- `ediff-before-flag-bol'
- `ediff-after-flag-eol'
- `ediff-before-flag-mol'
- `ediff-after-flag-mol'
-      The above are ASCII strings that mark the beginning and the end of
-      the differences found in files A, B, and C. Ediff uses different
-      flags to highlight regions that begin/end at the beginning/end of
-      a line or in a middle of a line.
- 
- `ediff-current-diff-face-A'
- `ediff-current-diff-face-B'
- `ediff-current-diff-face-C'
-      Ediff uses these faces to highlight current differences on X
-      displays.
- 
- `ediff-fine-diff-face-A'
- `ediff-fine-diff-face-B'
- `ediff-fine-diff-face-C'
-      Faces used to show the fine differences between the current
-      differences regions in buffers A, B, and C, respectively.
- 
- `ediff-even-diff-face-A'
- `ediff-even-diff-face-B'
- `ediff-even-diff-face-C'
- `ediff-odd-diff-face-A'
- `ediff-odd-diff-face-B'
- `ediff-odd-diff-face-C'
-      Non-current difference regions are displayed using these
-      alternating faces. The odd and the even faces are actually
-      identical on monochrome displays, because without colors options
-      are limited.  So, Ediff uses italics to highlight non-current
-      differences.
- 
- `ediff-highlight-all-diffs'
-      Indicates whether--on a window system--the user wants differences
-      to be marked using ASCII strings (like on a dumb terminal) or
-      using colors and highlighting. Normally, Ediff highlights all
-      differences, but the selected difference is highlighted more
-      visibly. One can cycle through various modes of highlighting by
-      hitting `h'. By default, Ediff starts in the mode where all
-      difference regions are highlighted. If you prefer to start in the
-      mode where unselected differences are not highlighted, you should
-      set `ediff-highlight-all-diffs' to `nil'.  Typing `h' restores
-      highlighting of all differences.
- 
-      Ediff lets you switch between the two modes of highlighting.  That
-      is, you can switch interactively from highlighting using faces to
-      highlighting using ASCII flags, and back.  Of course, switching has
-      effect only under a windowing system.  On a dumb terminal or in an
-      xterm window, the only available option is highlighting with ASCII
-      flags.
- 
- If you want to change the above variables, they must be set *before*
- Ediff is loaded.
- 
-    There are two ways to change the default setting for highlighting
- faces: either change the variables, as in
-      (setq ediff-current-diff-face-A 'bold-italic)
-    or
-      (setq ediff-current-diff-face-A
-      (copy-face 'bold-italic 'ediff-current-diff-face-A))
-    or modify the defaults selectively:
-      (add-hook 'ediff-load-hooks
-                (function (lambda ()
-                            (set-face-foreground ediff-current-diff-face-B "blue")
-                            (set-face-background ediff-current-diff-face-B "red")
-                            (make-face-italic ediff-current-diff-face-B))))
- 
-    You may also want to take a look at how the above faces are defined
- in the source code of Ediff.
- 
-    *Note*: it is not recommended to use `internal-get-face' (or
- `get-face' in XEmacs) when defining Ediff's faces, since this may cause
- problems when there are several frames with different font sizes.
- Instead, use copy-face or `set/make-face-*' as shown above.
- 
- 
- File: ediff,  Node: Narrowing,  Next: Refinement of Difference Regions,  Prev: Highlighting Difference Regions,  Up: Customization
- 
- Narrowing
- =========
- 
-    If buffers being compared are narrowed at the time of invocation of
- Ediff, `ediff-buffers' will preserve the narrowing range. However, if
- `ediff-files' is invoked on the files visited by these buffers,
- narrowing will be turned off, since we assume that the user wants to
- compare the entire files.
- 
-    Invocation of `ediff-regions-wordwise/linewise' and
- `ediff-windows-wordwise/linewise' will cause Ediff to set new narrowing
- ranges (corresponding to the windows being compared). However, the old
- ranges are preserved and can be restored by typing `%'. The original
- ranges will be also restored on quitting Ediff.
- 
-    Two variables control the behavior of
- `ediff-windows-wordwise/linewise', `ediff-regions-wordwise/linewise'
- with respect to narrowing:
- 
- `ediff-start-narrowed'
-      If `t', Ediff will narrow the display to the appropriate range if
-      it is invoked as `ediff-windows-wordwise/linewise' or
-      `ediff-regions-wordwise/linewise.' If `nil', narrowing will not
-      take place. However, the user can still toggle narrowing on and
-      off by typing `%'.
- 
- `ediff-quit-widened'
-      Controls whether on exiting Ediff should restore the visibility
-      range that existed before the current invocation.
- 
- 
- File: ediff,  Node: Refinement of Difference Regions,  Next: Patch and Diff Programs,  Prev: Narrowing,  Up: Customization
- 
- Refinement of Difference Regions
- ================================
- 
-    Ediff has variables to control the way fine differences are
- highlighted. This feature give the user control over the process of
- refinement.  Note that refinement ignores spaces, tabs, and newlines.
- 
- `ediff-auto-refine'
-      The default is `on', which means that fine differences within
-      regions will be highlighted automatically. On a slow machine,
-      automatic refinement may be painful. In that case, the user can
-      toggle auto-refining on or off (or nix it completely) by hitting
-      `@'. When auto-refining is off, fine differences will be shown
-      only for regions for which these differences have been computed
-      and saved before. If auto-refining is nixed, fine differences will
-      not be shown at all. Hitting `*' will compute and redisplay fine
-      differences for the current difference region, regardless of the
-      status auto-refining.
- 
- `ediff-auto-refine-limit'
-      If auto-refining is on, this variable limits the size of the
-      regions to be auto-refined. This guards against the possible
-      slow-down that may be caused by extraordinary large difference
-      regions.  The user can always refine the current region by typing
-      `*'.
- 
- `ediff-forward-word-function'
-      Gives the user control over how fine differences are computed.
-      The value must be a lisp function that determines how the current
-      difference region should be split into words.
- 
-      Fine diferences are computed by first splitting the current
-      difference region into words and then passing this along to
-      `ediff-diff-program'. For the default
-      `ediff-forward-word-function' (which is `ediff-forward-word'), a
-      word is a string consisting of letters, `-', or `_'; a string of
-      punctuation symbols; a string of digits, or a string consisting of
-      symbols that are neither space, nor a letter.
- 
-      This default behavior is controlled by four variables:
-      `ediff-word-1', ..., `ediff-word-4'. See the on-line documentation
-      for these variables and for the function `ediff-forward-word' for
-      an explanation of how to modify these variables.
- 
-    Sometimes, when a region has too many differences between the
- variants, highlighting of fine differences stands in the way, especially
- on color displays. If that is the case, the user can type `*' with a
- negative prefix argument, which would unhighlight fine differences for
- the current region.
- 
-    To unhighlight fine differences in all `diff' regions, use the
- command `@'. Repeated typing of this key cycles through three different
- states: auto-refining, no-auto-refining, and no-highlighting of fine
- differences.
- 
- 
- File: ediff,  Node: Patch and Diff Programs,  Next: Merging and diff3,  Prev: Refinement of Difference Regions,  Up: Customization
- 
- Patch and Diff Programs
- =======================
- 
-    The next group of variables determines the programs to be used for
- applying patches and for computing the main difference regions (not the
- fine difference regions):
- 
- `ediff-patch-program'
- `ediff-diff-program'
- `ediff-diff3-program'
-      Specify the functions that produce differences and do patching.
- 
- `ediff-patch-options'
- `ediff-diff-options'
- `ediff-diff3-options'
-      Specify which options to pass to the above utilities.  It is
-      unlikely that you would want to change these.  However, sometimes
-      you may want to tell `diff' to ignore spaces and such. Use the
-      option `-w' for that.  Diff has several other useful options (type
-      `man diff' to find out).  However, Ediff does not let you use the
-      option `-c', as it doesn't recognize this format yet. If you need
-      to save the output from `diff' in a special format, Ediff lets you
-      specify "custom" `diff' format using the following two variables:
- 
- `ediff-custom-diff-program'
-      The output generated by `ediff-custom-diff-program' (which doesn't
-      even have to be a Unix-style diff!) is not used by Ediff. It is
-      provided exclusively so that the user could save if using the
-      function `ediff-save-buffer' (normally bound to `wd') and later
-      refer to it.  However, Ediff is not the preferred way of producing
-      diff output in Emacs, unless you also intend to use Ediff for
-      browsing through the diff'ed files.  This is because diff.el (`M-x
-      diff'), which also comes with Emacs, will produce the output from
-      `diff' much faster.
- 
- `ediff-custom-diff-options'
-      Specifies the options to pass to `ediff-custom-diff-program'.
- 
- *Beware of VMS Diff*: The output from VMS Diff is not yet supported.
- Instead, make sure some implementation of Unix diff, such as gnudiff,
- is used.
- 
- 
- File: ediff,  Node: Merging and diff3,  Next: Support for Version Control,  Prev: Patch and Diff Programs,  Up: Customization
- 
- Merging and diff3
- =================
- 
-    Ediff supports 3-way comparison via the functions `ediff-files3' and
- `ediff-buffers3'. The interface is the same as for 2-way comparison.
- In 3-way comparison and merging, Ediff reports if any two difference
- regions are identical. For instance, if the current region in buffer A
- is the same as the region in buffer C, then the mode line of buffer A
- will display [=diff(C)] and the mode line of buffer C will display
- [=diff(A)].
- 
-    Merging is done according to the following algorithm.
- 
-    If a difference region in one of the buffers, say B, differs from
- the ancestor file while the region in the other buffer, A, doesn't,
- then the merge buffer, C, gets B's region. Similarly when buffer A's
- region differs from the ancestor and B's doesn't.
- 
-    If both regions in buffers A and B differ from the ancestor file,
- Ediff will choose the region according to the value of the variable
- `ediff-default-variant'
-      If set to `default-A' then A's region is chosen. If set to
-      `default-B' then B's region is chosen. If set to `combined' then
-      the region in buffer C will look like this:
-           #ifdef NEW  /* variant A */
-           difference region from buffer A
-           #else  /* variant B */
-           difference region from buffer B
-           #endif  /* NEW */
-      The actual strings that separate the regions copied from bufer A
-      and B are controlled by the variable
- 
- `ediff-combination-pattern'
-      A list of three strings. The first is inserted before the
-      difference region of buffer A; the second string goes between the
-      regions; the third will trail region B, as shown in the above
-      example.
- 
-    In addition to the state of the difference, during merging Ediff
- displays the state of the merge for each region. If a difference came
- from buffer A by default (because both regions A and B were different
- from the ancestor and ediff-default-variant was set to `default-A')
- then [=diff(A) default-A] is displayed in the mode line.  If the
- difference in buffer C came, say, from buffer B because the difference
- region in that buffer differs from the ancestor, but the region in
- buffer A does not (if merging with an ancestor) then [=diff(B)
- prefer-B] is displayed. The indicators default-A/B and prefer-A/B are
- inspired by emerge.el and have the same meaning.
- 
-    Another indicator of the state of merge is `combined'. It appears
- with any difference region in buffer C that was obtained by combining
- the difference regions in buffers A and B as explained above.
- 
-    Note that the state-of-difference indicators `=diff(A)' and
- `=diff(B)' above are not redundant, even in the presence of a
- state-of-merge indicator. In fact, the two serve different purposes.
- For instance, if the mode line displays [=diff(B) prefer(B)] and you
- copy a difference region from buffer A to buffer C then `=diff(B)' will
- change to `diff-A' and the mode line will display [=diff(A) prefer-B].
- This indicates that the difference region in buffer C is identical to
- that in buffer A, but originally buffer C's region came from buffer B.
- This is useful to know because the original difference region in buffer
- C can be recovered by typing `r', if necessary.
- 
-    Ediff never changes the state-of-merge indicator, except in response
- to the `!' command (see below), in which case the indicator is lost.
- On the other hand, the state-of-difference indicator is changed
- automatically by the copying/recovery commands, `a', `b', `r', `+'.
- 
-    If Ediff is asked to recompute differences via the command `!', the
- information about origins of the regions in the merge buffer (default-A,
- prefer-B, or combined) will be lost. This is because recomputing
- differences in this case means running diff3 on buffers A, B, and the
- merge buffer, not on the ancestor buffer. (It makes no sense to
- recompute differences using the ancestor file, since in the merging
- mode Ediff assumes that the user did not edit buffers A and B, but he
- may have edited buffer C, and these changes are to be preserved.)
- Since some difference regions may disappear as a result of editing
- buffer C and others may arise, there is generally no simple way to tell
- where the various regions in the merge buffer came from.
- 
-    In 3-way comparison, Ediff tries to disregard regions that consist
- entirely of white space. For instance, if, say, the current region in
- buffer A consists of the white space only (or if it is empty), Ediff
- will not take it into account for the purpose of computing fine
- differences. The result is that Ediff can provide a better visual
- information regarding the actual fine differences in the non-white
- regions in buffers B and C. Moreover, if the regions in buffers B and C
- differ in the white space only, then a message to this effect will be
- displayed.
- 
-    In the merge mode, the share of the split between window C (the
- window displaying the merge-buffer) and the windows displaying buffers
- A and B is controlled by the variable
- `ediff-merge-window-share'
-      The default is 0.5. To make the merge-buffer window smaller,
-      reduce this amount. It is not recommended to increase the size of
-      the merge-window to more than half the frame (i.e., to increase
-      the value of `ediff-merge-window-share') to more than 0.5, since
-      it would be hard to see the contents of buffers A and B.
- 
-    The user can temporarily shrink the merge window to just one line by
- typing `s'. This change is temporary, until Ediff finds a reason to
- redraw the screen. Typing `s' again restores the original window size.
- 
-    With a positive prefix argument, this command will make the merge
- window slightly taller. This change is persistent.  With ``-'' or with
- a negative prefix argument, the command `s' makes the merge window
- slightly shorter. This change also persistent.
- 
-    Ediff lets the user automatically ignore the regions where one of
- the buffer's regions is prefered because it disagrees with the
- ancestor, while the other buffer agrees with the ancestor. In this
- case, Ediff displays only the difference regions where the two buffers,
- A and B, both differ from the ancestor file. The variable that controls
- this behavior is
- `ediff-show-clashes-only'
-      The value of this variable can be toggled interactively, by typing
-      `$'.  Note that this variable controls only how Ediff chooses the
-      next/previous difference to show. The user can still jump directly
-      to any difference using the command `j' (with a prefix argument
-      specifying the difference number).
- 
- 
- File: ediff,  Node: Support for Version Control,  Next: Customizing the Mode Line,  Prev: Merging and diff3,  Up: Customization
- 
- Support for Version Control
- ===========================
- 
-    Ediff supports version control via the packages `vc.el' and
- `rcs.el'. The latter is a package written by Sebastian Kremer
- <sk@thp.Uni-Koeln.DE>, which is available in
-      `ftp.cs.buffalo.edu:pub/Emacs/rcs.tar.Z'
-      `ftp.uni-koeln.de:/pub/gnu/emacs/rcs.tar.Z'
- 
-    To specify which version control package you are using, set the
- variable `ediff-version-control-package', e.g.,
-      (setq ediff-version-control-package 'rcs)
-    A symbol. The default, is `vc'.  *Note*: both packages provide
- access to RCS, but only `vc.el' comes standard with Emacs and XEmacs.
- `ediff-revision-key'
-      A string. For files under revision control, one key can be bound
-      to the function `ediff-revision', which runs Ediff comparing
-      versions of the current buffer. This is controlled by the above
-      variable.  The default is `nil', i.e., Ediff doesn't bind any key
-      to run `ediff-revision'.
- 
-      If the version control package used is `vc.el', then
-      `ediff-revision-key' is bound in a key map accessible through the
-      prefix `C-x v', i.e., if you have e.g., `(setq ediff-revision-key
-      "=")' in your `~/.emacs' file, then to run `ediff-revision' you
-      will have to type `C-x v ='.
- 
-      If the version control package is `rcs.el' is used, then the key is
-      bound in the global Emacs map, the one available by default. For
-      that reason, it is recommended that the key should start with a
-      prefix, such as `C-c'.  For instance, if you would like to use
-      `C-c E' to run `ediff-revision', put `(setq ediff-revision-key
-      "\C-cE")' in your `~/.emacs' file.
- 
-      Note: Ediff doesn't bind `ediff-revision-key' when it is first
-      loaded. The binding takes effect only when the user invokes
-      `ediff-revision'. If you want the binding to take effect right from
-      the start, put this in your `~/emacs':
-           (setq ediff-revision-key "your-key")
-           (require 'ediff)
-           (ediff-load-version-control)
-      If you want the binding to take effect only after Ediff is first
-      loaded into your Emacs, use `ediff-load-hooks':
-           (setq ediff-revision-key "your-key")
-           (add-hook 'ediff-load-hooks 'ediff-load-version-control)
- 
- 
- File: ediff,  Node: Customizing the Mode Line,  Next: Miscellaneous,  Prev: Support for Version Control,  Up: Customization
- 
- Customizing the Mode Line
- =========================
- 
-    When Ediff is running, the mode line of Ediff Control Panel buffer
- shows the current difference number and the total number of difference
- regions in the two files.
- 
-    The mode line of the buffers being compared displays the type of the
- buffer (`A:', `B:', or `C:') and (usually) the file name. Ediff is
- trying to be intelligent in choosing the mode line buffer
- identification. In particular, it works well with uniquify.el and
- mode-line.el packages (which improve on the default way in which Emacs
- displays buffer identification).  If you don't like the way Ediff
- changes the mode line, there always is `ediff-prepare-buffer-hooks',
- which can be used to modify the mode line.
- 
- 
- File: ediff,  Node: Miscellaneous,  Next: Notes on Heavy-duty Customization,  Prev: Customizing the Mode Line,  Up: Customization
- 
- Miscellaneous
- =============
- 
-    The following is the last batch of variables that can be customized:
- `ediff-split-window-function'
-      Controls the way you want the window be split between file-A and
-      file-B (and file-C, if applicable).  It defaults to the vertical
-      split (`split-window-vertically', but you can set it to
-      `split-window-horizontally', if you so wish.
- 
- `ediff-merge-split-window-function'
-      Controls how windows are split between buffers A and B in the
-      merge mode.
- 
- `ediff-make-wide-display-function'
-      The user can toggle wide/regular display by typing `m'.  In the
-      wide display mode, buffers A, B (and C, when applicable) are
-      displayed in a single frame that is as wide as the entire
-      workstation screen.  This is useful when files are compared
-      side-by-side.  By default, the display is widened without changing
-      its height. However, the user can set the above variable to
-      indicate the name of a function to be called to widen the frame in
-      which to display the buffers. See the on-line documentation for
-      `ediff-make-wide-display-function' for details. It is also
-      recommended to look into the source of the default function
-      `ediff-make-wide-display'.
- 
- `ediff-use-last-dir'
-      Controls the way Ediff presents the default directory when it
-      prompts the user for files to compare.  If `nil', Ediff will use
-      the default directory of the current buffer when it prompts the
-      user for file names.  Otherwise, it will use the directories it
-      had previously used for files A, B, or C, respectively.
- 
- `ediff-no-emacs-help-in-control-buffer'
-      If t, makes `C-h' behave like the `DEL' key, i.e., it will move
-      you back to the previous difference rather than invoking help.
-      This is useful when, in an xterm window or on a dumb terminal, the
-      Backspace key is bound to `C-h' and is positioned more
-      conveniently than the `DEL' key.
- 
- `ediff-toggle-read-only-function'
-      Can be used to change the way Ediff toggles the read-only property
-      in its buffers.  By default, Ediff uses `toggle-read-only'. For
-      files under version control, Ediff first tries to check the files
-      out.
- 
-    Ediff lets you toggle the way windows are split, so you can try
- different settings interactively.  *Note*: if buffers A and B (and C,
- if applicable) are in different frames, windows are not split,
- regardless of the value `ediff-split-window-function'.  Instead, other
- windows on these frames are deleted and Ediff starts displaying these
- buffers using these frames, one file per frame.  You can switch to the
- one-frame mode by hiding one of the buffers A/B/C.
- 
-    Note that if Ediff detects that the two buffers it compares are
- residing in separate frames, it assumes that the user wants them to be
- so displayed and stops splitting windows.  Instead, it will arrange
- each buffer to occupy its own frame.
- 
-    The user can also swap the windows where buffers are displayed by
- typing `~'.
- 
- 
- File: ediff,  Node: Notes on Heavy-duty Customization,  Prev: Miscellaneous,  Up: Customization
- 
- Notes on Heavy-duty Customization
- =================================
- 
-    Some users need to customize Ediff in rather sophisticated ways,
- which requires different defaults for different kinds of files (e.g.,
- SGML, etc.).  Ediff supports this kind of customization is several
- ways.  First, most customization variables are buffer-local. Those that
- aren't are usually accessible from within Ediff Control Panel, so one
- can make them local to the panel by calling make-local-variable from
- within `ediff-startup-hooks'.  Second, there is now a new optional
- (6-th) argument to `ediff-setup', which has the form `( (var-name-1 .
- val-1) (var-name-2 . val-2) ...)'.  The function `ediff-setup' will set
- the variables on the list to the respective values in the Ediff control
- buffer. This is an easy way to throw in custom variables (which usually
- should be buffer-local) that can then be tested in various hooks.  Make
- sure the variable `ediff-job-name' and `ediff-word-mode' are set
- properly in this case, as some things in Ediff depend on this.
- Finally, if custom-tailored help messages are desired, Ediff has
- `ediff-brief-help-message-custom' and `ediff-long-help-message-custom',
- which are local variables that can be set to a function that returns a
- string.
- 
-    When customizing Ediff, some other variables are useful, although
- they are not user-definable. First, it should be kept in mind that most
- of the Ediff variables are local to the Ediff control buffer, so this
- buffer must be current at the time these variables are accessed. The
- control buffer is acessible via the variable `ediff-control-buffer',
- which is also local to that buffer.
- 
-    Other variables of interest are:
- `ediff-buffer-A'
-      The first of the data buffers being compared.
- 
- `ediff-buffer-B'
-      The second of the data buffers being compared.
- 
- `ediff-buffer-C'
-      In three-way comparisons, this is the third buffer being compared.
-      In merging, this is the merge buffer.  In two-way comparison, this
-      variable is nil.
- 
- `ediff-window-A'
-      The window displaying buffer A. If buffer A is not visible, this
-      variable is nil or it may be a dead window.
- 
- `ediff-window-B'
-      The window displaying buffer B.
- 
- `ediff-window-C'
-      The window displaying buffer C, if any.
- 
- `ediff-control-frame'
-      A dedicated frame displaying the control buffer, if it exists.  It
-      is non-nil only if Ediff uses the multiframe display, i.e., when
-      the control buffer is in its own frame.
- 
- 
- File: ediff,  Node: Credits,  Next: Index,  Prev: Customization,  Up: Top
- 
- Credits
- *******
- 
-    Ediff was inspired by emerge.el written by Dale R. Worley
- <drw@math.mit.edu>.
- 
-    The following people provided help with bug reports, patches, and
- advice.  Without them, Ediff would not be where it is today.
- 
-      Alastair Burt <burt@dfki.uni-kl.de>, Kevin Broadey
-      <KevinB@bartley.demon.co.uk>, Harald Boegeholz
-      <hwb@machnix.mathematik.uni-stuttgart.de>, Jin S. Choi
-      <jin@atype.com>, Eric Eide <eeide@asylum.cs.utah.edu>,
-      Kevin Esler <esler@ch.hp.com>, Robert Estes
-      <estes@ece.ucdavis.edu>, Eric Freudenthal
-      <freudent@jan.ultra.nyu.edu>, Job Ganzevoort
-      <Job.Ganzevoort@cwi.nl>, Boris Goldowsky
-      <boris@cs.rochester.edu>, Allan Gottlieb
-      <gottlieb@allan.ultra.nyu.edu>, Xiaoli Huang <hxl@epic.com>,
-      Larry Gouge <larry@itginc.com>, Karl Heuer
-      <kwzh@gnu.ai.mit.edu>, <irvine@lks.csi.com>,
-      <jaffe@chipmunk.cita.utoronto.ca>, David Karr
-      <dkarr@nmo.gtegsc.com>, Norbert Kiesel
-      <norbert@i3.informatik.rwth-aachen.de>, Fritz Knabe
-      <Fritz.Knabe@ecrc.de>, Heinz Knutzen
-      <hk@informatik.uni-kiel.d400.de>, Ken Laprade
-      <laprade@dw3f.ess.harris.com>, Richard Levitte
-      <levitte@e.kth.se>, Martin Maechler
-      <maechler@stat.math.ethz.ch>, Richard Mlynarik
-      <mly@adoc.xerox.com>, Chris Murphy <murphycm@sun.aston.ac.uk>,
-      Eyvind Ness <Eyvind.Ness@hrp.no>, Ray Nickson
-      <nickson@cs.uq.oz.au>, Paul Raines <raines@slac.stanford.edu>,
-      Tibor Polgar <tlp00@spg.amdahl.com>, C.S. Roberson
-      <roberson@aur.alcatel.com>, Kevin Rodgers <kevin.rodgers@ihs.com>,
-      Sandy Rutherford <sandy@ibm550.sissa.it>, Heribert Schuetz
-      <schuetz@ecrc.de>, Andy Scott <ascott@pcocd2.intel.com>,
-      Axel Seibert <axel@tumbolia.ppp.informatik.uni-muenchen.de>,
-      Richard Stallman <rms@gnu.ai.mit.edu>, Richard Stanton
-      <stanton@haas.berkeley.edu>, Ake Stenhoff
-      <etxaksf@aom.ericsson.se>, Stig <stig@hackvan.com>, Peter Stout
-      <Peter_Stout@cs.cmu.edu>, Raymond Toy <toy@rtp.ericsson.se>,
-      Ilya Zakharevich <ilya@math.ohio-state.edu>
- 
- 
- File: ediff,  Node: Index,  Prev: Credits,  Up: Top
- 
- Index
- *****
- 
- * Menu:
- 
- * ediff-after-flag-eol:                 Highlighting Difference Regions.
- * ediff-after-flag-mol:                 Highlighting Difference Regions.
- * ediff-after-setup-control-frame-hooks: Hooks.
- * ediff-after-setup-windows-hooks:      Hooks.
- * ediff-auto-refine-limit:              Refinement of Difference Regions.
- * ediff-auto-refine:                    Refinement of Difference Regions.
- * ediff-before-flag-bol:                Highlighting Difference Regions.
- * ediff-before-flag-mol:                Highlighting Difference Regions.
- * ediff-before-setup-control-frame-hooks: Hooks.
- * ediff-before-setup-windows-hooks:     Hooks.
- * ediff-brief-help-message-custom:      Notes on Heavy-duty Customization.
- * ediff-buffers3:                       Major Entry Points.
- * ediff-buffers:                        Major Entry Points.
- * ediff-cleanup-hooks:                  Hooks.
- * ediff-combination-pattern:            Merging and diff3.
- * ediff-control-buffer:                 Quick Help.
- * ediff-control-frame-parameters:       Window and Frame Configuration.
- * ediff-control-frame-position-function: Window and Frame Configuration.
- * ediff-control-frame-upward-shift:     Window and Frame Configuration.
- * ediff-current-diff-face-A:            Highlighting Difference Regions.
- * ediff-current-diff-face-B:            Highlighting Difference Regions.
- * ediff-current-diff-face-C:            Highlighting Difference Regions.
- * ediff-custom-diff-options:            Patch and Diff Programs.
- * ediff-custom-diff-program:            Patch and Diff Programs.
- * ediff-default-variant:                Merging and diff3.
- * ediff-diff-options:                   Patch and Diff Programs.
- * ediff-diff-program:                   Refinement of Difference Regions.
- * ediff-diff-program:                   Patch and Diff Programs.
- * ediff-diff3-options:                  Patch and Diff Programs.
- * ediff-diff3-program:                  Patch and Diff Programs.
- * ediff-display-help-hooks:             Hooks.
- * ediff-even-diff-face-A:               Highlighting Difference Regions.
- * ediff-even-diff-face-B:               Highlighting Difference Regions.
- * ediff-even-diff-face-C:               Highlighting Difference Regions.
- * ediff-files3:                         Major Entry Points.
- * ediff-files:                          Major Entry Points.
- * ediff-fine-diff-face-A:               Highlighting Difference Regions.
- * ediff-fine-diff-face-B:               Highlighting Difference Regions.
- * ediff-fine-diff-face-C:               Highlighting Difference Regions.
- * ediff-forward-word-function:          Refinement of Difference Regions.
- * ediff-forward-word-function:          Refinement of Difference Regions.
- * ediff-forward-word:                   Refinement of Difference Regions.
- * ediff-help-message:                   Quick Help.
- * ediff-highlight-all-diffs:            Highlighting Difference Regions.
- * ediff-ignore-similar-regions:         Selective Browsing.
- * ediff-janitor:                        Hooks.
- * ediff-job-name:                       Notes on Heavy-duty Customization.
- * ediff-keymap-setup-hooks:             Hooks.
- * ediff-load-hooks:                     Hooks.
- * ediff-long-help-message-custom:       Notes on Heavy-duty Customization.
- * ediff-make-frame-position:            Window and Frame Configuration.
- * ediff-make-wide-display-function:     Miscellaneous.
- * ediff-merge-buffers-with-ancestor:    Major Entry Points.
- * ediff-merge-buffers:                  Major Entry Points.
- * ediff-merge-files-with-ancestor:      Major Entry Points.
- * ediff-merge-files:                    Major Entry Points.
- * ediff-merge-revisions-with-ancestor:  Major Entry Points.
- * ediff-merge-revisions:                Major Entry Points.
- * ediff-merge-split-window-function:    Miscellaneous.
- * ediff-merge-window-share:             Merging and diff3.
- * ediff-merge-with-ancestor:            Major Entry Points.
- * ediff-merge:                          Major Entry Points.
- * ediff-mode-hooks:                     Hooks.
- * ediff-narrow-control-frame-leftward-shift: Window and Frame Configuration.
- * ediff-no-emacs-help-in-control-buffer: Miscellaneous.
- * ediff-odd-diff-face-A:                Highlighting Difference Regions.
- * ediff-odd-diff-face-B:                Highlighting Difference Regions.
- * ediff-odd-diff-face-C:                Highlighting Difference Regions.
- * ediff-patch-buffer:                   Major Entry Points.
- * ediff-patch-file:                     Major Entry Points.
- * ediff-patch-options:                  Patch and Diff Programs.
- * ediff-patch-program:                  Patch and Diff Programs.
- * ediff-prefer-iconified-control-frame: Window and Frame Configuration.
- * ediff-prefer-long-help-message:       Window and Frame Configuration.
- * ediff-prefer-long-help-message:       Quick Help.
- * ediff-prepare-buffer-hooks:           Hooks.
- * ediff-prepare-buffer-hooks:           Customizing the Mode Line.
- * ediff-profile:                        Commands.
- * ediff-quit-hooks:                     Hooks.
- * ediff-regions-linewise:               Narrowing.
- * ediff-regions-linewise:               Major Entry Points.
- * ediff-regions-wordwise:               Narrowing.
- * ediff-regions-wordwise:               Major Entry Points.
- * ediff-revert-buffers-then-recompute-diffs: Commands.
- * ediff-revision-key:                   Support for Version Control.
- * ediff-revision:                       Major Entry Points.
- * ediff-save-buffer:                    Patch and Diff Programs.
- * ediff-select-hooks:                   Hooks.
- * ediff-setup-windows-multiframe:       Window and Frame Configuration.
- * ediff-setup-windows-plain:            Window and Frame Configuration.
- * ediff-setup-windows:                  Window and Frame Configuration.
- * ediff-setup:                          Notes on Heavy-duty Customization.
- * ediff-show-clashes-only:              Merging and diff3.
- * ediff-split-window-function:          Miscellaneous.
- * ediff-start-narrowed:                 Narrowing.
- * ediff-startup-hooks:                  Notes on Heavy-duty Customization.
- * ediff-startup-hooks:                  Hooks.
- * ediff-startup-hooks:                  Quick Help.
- * ediff-suspend-hooks:                  Hooks.
- * ediff-toggle-multiframe:              Commands.
- * ediff-toggle-multiframe:              Window and Frame Configuration.
- * ediff-toggle-read-only-function:      Miscellaneous.
- * ediff-unselect-hooks:                 Hooks.
- * ediff-use-last-dir:                   Miscellaneous.
- * ediff-version-control-package:        Support for Version Control.
- * ediff-wide-control-frame-rightward-shift: Window and Frame Configuration.
- * ediff-window-setup-function:          Window and Frame Configuration.
- * ediff-windows-linewise:               Narrowing.
- * ediff-windows-linewise:               Major Entry Points.
- * ediff-windows-wordwise:               Major Entry Points.
- * ediff-windows-wordwise:               Narrowing.
- * ediff-word-1:                         Refinement of Difference Regions.
- * ediff-word-2:                         Refinement of Difference Regions.
- * ediff-word-3:                         Refinement of Difference Regions.
- * ediff-word-4:                         Refinement of Difference Regions.
- * ediff-word-mode:                      Notes on Heavy-duty Customization.
- * ediff3:                               Major Entry Points.
- * ediff:                                Major Entry Points.
- * epatch-buffer:                        Major Entry Points.
- * epatch:                               Major Entry Points.
- * split-window-horizontally:            Miscellaneous.
- * split-window-vertically:              Miscellaneous.
- * mode-line.el:                         Customizing the Mode Line.
- * rcs.el:                               Support for Version Control.
- * uniquify.el:                          Customizing the Mode Line.
- * vc.el:                                Support for Version Control.
- * Comparing files and buffers:          Introduction.
- * Finding differences:                  Introduction.
- * Merging files and buffers:            Introduction.
- * Patching files and buffers:           Introduction.
- 
- 
- 
- Tag Table:
- Node: Top362
- Node: Introduction798
- Node: Major Entry Points2353
- Node: Commands6437
- Node: Remote and Compressed Files10838
- Node: Customization12085
- Node: Hooks13455
- Node: Quick Help17194
- Node: Window and Frame Configuration18089
- Node: Selective Browsing24279
- Node: Highlighting Difference Regions27802
- Node: Narrowing31329
- Node: Refinement of Difference Regions32701
- Node: Patch and Diff Programs35510
- Node: Merging and diff337483
- Node: Support for Version Control44109
- Node: Customizing the Mode Line46483
- Node: Miscellaneous47344
- Node: Notes on Heavy-duty Customization50472
- Node: Credits53036
- Node: Index55162
- 
- End Tag Table
--- 0 ----
Index: emacs/info/emacs
diff -c emacs/info/emacs:1.1.1.2 emacs/info/emacs:removed
*** emacs/info/emacs:1.1.1.2	Mon Jul 22 01:51:37 1996
--- emacs/info/emacs	Fri Aug  2 20:02:09 1996
***************
*** 1,473 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- Indirect:
- emacs-1: 92
- emacs-2: 49249
- emacs-3: 97320
- emacs-4: 145767
- emacs-5: 192117
- emacs-6: 240192
- emacs-7: 289826
- emacs-8: 339049
- emacs-9: 387461
- emacs-10: 435980
- emacs-11: 484682
- emacs-12: 534463
- emacs-13: 583440
- emacs-14: 629135
- emacs-15: 677655
- emacs-16: 726368
- emacs-17: 774174
- emacs-18: 821318
- emacs-19: 871099
- emacs-20: 911547
- emacs-21: 958780
- emacs-22: 999403
- emacs-23: 1038621
- emacs-24: 1059811
- emacs-25: 1091325
- emacs-26: 1137964
- 
- Tag Table:
- (Indirect)
- Node: Top92
- Node: Distrib27385
- Node: Copying30101
- Node: Intro49249
- Node: Screen52197
- Node: Point54338
- Node: Echo Area56507
- Node: Mode Line59452
- Node: User Input63177
- Node: Keys67315
- Node: Commands70092
- Node: Text Characters72826
- Node: Entering Emacs73850
- Node: Exiting76523
- Node: Basic80121
- Node: Inserting Text81224
- Node: Moving Point83744
- Node: Erasing86864
- Node: Undo88033
- Node: Basic Files91854
- Node: Basic Help93524
- Node: Blank Lines94111
- Node: Continuation Lines95677
- Node: Position Info97320
- Node: Arguments100675
- Node: Minibuffer104511
- Node: Minibuffer File107113
- Node: Minibuffer Edit108896
- Node: Completion111138
- Node: Completion Example112783
- Node: Completion Commands113819
- Node: Strict Completion116291
- Node: Completion Options118055
- Node: Minibuffer History119694
- Node: Repetition122434
- Node: M-x124642
- Node: Help126976
- Node: Help Summary128247
- Node: Key Help130491
- Node: Name Help131292
- Node: Apropos133726
- Node: Library Keywords135922
- Node: Misc Help138118
- Node: Mark140960
- Node: Setting Mark142722
- Node: Transient Mark145767
- Node: Using Region148523
- Node: Marking Objects149388
- Node: Mark Ring151371
- Node: Global Mark Ring153332
- Node: Killing154250
- Node: Deletion155546
- Node: Killing by Lines157428
- Node: Other Kill Commands158950
- Node: Yanking160656
- Node: Kill Ring161457
- Node: Appending Kills162654
- Node: Earlier Kills165004
- Node: Accumulating Text167793
- Node: Rectangles170832
- Node: Registers175294
- Node: RegPos176481
- Node: RegText177347
- Node: RegRect178264
- Node: RegConfig179109
- Node: RegFiles180007
- Node: Bookmarks180661
- Node: Display183857
- Node: Scrolling185410
- Node: Horizontal Scrolling189240
- Node: Selective Display190683
- Node: European Display192117
- Node: Optional Mode Line195801
- Node: Display Vars197263
- Node: Search201270
- Node: Incremental Search202413
- Node: Nonincremental Search210548
- Node: Word Search212005
- Node: Regexp Search213623
- Node: Regexps215562
- Node: Search Case227097
- Node: Replace228246
- Node: Unconditional Replace229358
- Node: Regexp Replace230524
- Node: Replacement and Case231444
- Node: Query Replace232547
- Node: Other Repeating Search236452
- Node: Fixit237790
- Node: Kill Errors238812
- Node: Transpose240192
- Node: Fixing Case242701
- Node: Spelling243358
- Node: Files247997
- Node: File Names249402
- Node: Visiting253633
- Node: Saving259768
- Node: Backup264492
- Node: Backup Names265842
- Node: Backup Deletion268109
- Node: Backup Copying269275
- Node: Interlocking271005
- Node: Reverting274910
- Node: Auto Save276125
- Node: Auto Save Files277265
- Node: Auto Save Control279775
- Node: Recover281640
- Node: File Aliases283286
- Node: Version Control284637
- Node: Version Systems286605
- Node: VC Concepts287949
- Node: Editing with VC289826
- Node: Check-Out291068
- Node: Check-In291813
- Node: Registering293711
- Node: Version Control Undo295078
- Node: VC Mode Line296488
- Node: CVS and VC297342
- Node: Log Entries298962
- Node: Change Logs and VC300143
- Node: Old Versions303408
- Node: Branches305924
- Node: Switching Branches307507
- Node: Creating Branches308316
- Node: Multi-User Branching309723
- Node: Status in VC310816
- Node: Renaming and VC312523
- Node: Snapshots313201
- Node: Making Snapshots313696
- Node: Snapshot Caveats314962
- Node: Version Headers316765
- Node: Customizing VC320140
- Node: Directories323005
- Node: Comparing Files324878
- Node: Misc File Ops326599
- Node: Buffers329583
- Node: Select Buffer331932
- Node: List Buffers333356
- Node: Misc Buffer334834
- Node: Kill Buffer337480
- Node: Several Buffers339049
- Node: Indirect Buffers343511
- Node: Windows344771
- Node: Basic Window345649
- Node: Split Window347849
- Node: Other Window350242
- Node: Pop Up Window352235
- Node: Force Same Window353708
- Node: Change Window355466
- Node: Frames358185
- Node: Mouse Commands360202
- Node: Secondary Selection365011
- Node: Mouse References366600
- Node: Menu Mouse Clicks367561
- Node: Mode Line Mouse368453
- Node: Creating Frames369266
- Node: Multiple Displays371149
- Node: Special Buffer Frames372496
- Node: Frame Parameters374592
- Node: Scroll Bars377352
- Node: Menu Bars379153
- Node: Faces380269
- Node: Modifying Faces384151
- Node: Misc X386485
- Node: Major Modes387461
- Node: Choosing Modes389806
- Node: Indentation393115
- Node: Indentation Commands395302
- Node: Tab Stops398369
- Node: Just Spaces400277
- Node: Text401082
- Node: Words403489
- Node: Sentences406491
- Node: Paragraphs409294
- Node: Pages411694
- Node: Filling414367
- Node: Auto Fill415102
- Node: Fill Commands417257
- Node: Fill Prefix420665
- Node: Case424359
- Node: Text Mode426663
- Node: Outline Mode429108
- Node: Outline Format431282
- Node: Outline Motion434423
- Node: Outline Visibility435980
- Node: Outline Views439696
- Node: TeX Mode441080
- Node: TeX Editing442638
- Node: LaTeX Editing445968
- Node: TeX Print447307
- Node: TeX Distrib453537
- Node: Nroff Mode454623
- Node: Formatted Text456347
- Node: Requesting Formatted Text458296
- Node: Hard and Soft Newlines460246
- Node: Editing Format Info461561
- Node: Format Faces462751
- Node: Format Colors465325
- Node: Format Indentation466735
- Node: Format Justification469366
- Node: Format Properties471816
- Node: Forcing Enriched Mode472737
- Node: Programs474175
- Node: Program Modes476860
- Node: Lists479047
- Node: List Commands481005
- Node: Defuns484682
- Node: Program Indent487339
- Node: Basic Indent488112
- Node: Multi-line Indent490161
- Node: Lisp Indent491843
- Node: C Indent495233
- Node: Matching500483
- Node: Comments502791
- Node: Comment Commands503137
- Node: Multi-Line Comments506230
- Node: Options for Comments507724
- Node: Balanced Editing510752
- Node: Symbol Completion511966
- Node: Documentation513473
- Node: Change Log515458
- Node: Tags518082
- Node: Tag Syntax519714
- Node: Create Tags Table521369
- Node: Select Tags Table526704
- Node: Find Tag528780
- Node: Tags Search531502
- Node: Tags Stepping534463
- Node: List Tags535010
- Node: Emerge536215
- Node: Overview of Emerge537157
- Node: Submodes of Emerge540421
- Node: State of Difference542126
- Node: Merge Commands544636
- Node: Exiting Emerge547155
- Node: Combining in Emerge548015
- Node: Fine Points of Emerge548880
- Node: C Mode549825
- Node: Fortran552910
- Node: Fortran Motion554032
- Node: Fortran Indent554819
- Node: ForIndent Commands555567
- Node: ForIndent Cont556984
- Node: ForIndent Num559411
- Node: ForIndent Conv560380
- Node: ForIndent Vars561427
- Node: Fortran Comments563244
- Node: Fortran Autofill567164
- Node: Fortran Columns568835
- Node: Fortran Abbrev570607
- Node: Asm Mode571513
- Node: Building572055
- Node: Compilation573213
- Node: Debuggers579670
- Node: Starting GUD580365
- Node: Debugger Operation582126
- Node: Commands of GUD583440
- Node: GUD Customization586576
- Node: Executing Lisp588538
- Node: Lisp Libraries590447
- Node: Lisp Eval593511
- Node: Lisp Interaction597284
- Node: External Lisp598425
- Node: Abbrevs600727
- Node: Abbrev Concepts601872
- Node: Defining Abbrevs603498
- Node: Expanding Abbrevs606003
- Node: Editing Abbrevs609082
- Node: Saving Abbrevs610884
- Node: Dynamic Abbrevs612992
- Node: Picture615756
- Node: Basic Picture618105
- Node: Insert in Picture620534
- Node: Tabs in Picture621944
- Node: Rectangles in Picture623545
- Node: Sending Mail625390
- Node: Mail Format627801
- Node: Mail Headers629135
- Node: Mail Aliases633443
- Node: Mail Mode636631
- Node: Distracting NSA642909
- Node: Rmail643820
- Node: Rmail Basics645296
- Node: Rmail Scrolling647413
- Node: Rmail Motion648416
- Node: Rmail Deletion651545
- Node: Rmail Inbox654297
- Node: Rmail Files657510
- Node: Rmail Output660540
- Node: Rmail Labels663812
- Node: Rmail Reply667427
- Node: Rmail Summary672259
- Node: Rmail Make Summary673214
- Node: Rmail Summary Edit675077
- Node: Rmail Sorting677655
- Node: Rmail Display679274
- Node: Rmail Editing681431
- Node: Rmail Digest682675
- Node: Out of Rmail683778
- Node: Rmail Rot13684282
- Node: Dired684901
- Node: Dired Enter686350
- Node: Dired Commands687297
- Node: Dired Deletion688314
- Node: Flagging Many Files690035
- Node: Dired Visiting692207
- Node: Marks vs Flags693690
- Node: Operating on Files696500
- Node: Shell Commands in Dired700814
- Node: Transforming File Names702499
- Node: Comparison in Dired704966
- Node: Subdirectories in Dired705785
- Node: Subdirectory Motion707351
- Node: Hiding Subdirectories708287
- Node: Dired Updating709509
- Node: Dired and Find711949
- Node: Calendar/Diary713414
- Node: Calendar Motion715080
- Node: Calendar Unit Motion715929
- Node: Move to Beginning or End718199
- Node: Specified Dates719326
- Node: Scroll Calendar720206
- Node: Counting Days721961
- Node: General Calendar722393
- Node: Holidays723716
- Node: Sunrise/Sunset726368
- Node: Lunar Phases729405
- Node: Other Calendars730784
- Node: Calendar Systems731962
- Node: To Other Calendar733935
- Node: From Other Calendar735576
- Node: Mayan Calendar737484
- Node: Diary740667
- Node: Diary Commands742341
- Node: Format of Diary File745399
- Node: Date Formats748263
- Node: Adding to Diary750831
- Node: Special Diary Entries752456
- Node: Appointments756698
- Node: Daylight Savings758627
- Node: GNUS761127
- Node: Buffers of GNUS761837
- Node: GNUS Startup762814
- Node: Summary of GNUS764240
- Node: Shell767804
- Node: Single Shell768938
- Node: Interactive Shell770902
- Node: Shell Mode774174
- Node: Shell History779966
- Node: Shell Ring780750
- Node: Shell History Copying782790
- Node: History References783834
- Node: Shell Options785178
- Node: Remote Host787925
- Node: Emacs Server789544
- Node: Hardcopy793077
- Node: Postscript794287
- Node: Sorting796582
- Node: Narrowing802019
- Node: Two-Column804302
- Node: Editing Binary Files807488
- Node: Saving Emacs Sessions808830
- Node: Recursive Edit810161
- Node: Emulation813555
- Node: Dissociated Press815917
- Node: Amusements818636
- Node: Customization819661
- Node: Minor Modes821318
- Node: Variables826620
- Node: Examining828730
- Node: Edit Options830302
- Node: Hooks832074
- Node: Locals834190
- Node: File Variables837935
- Node: Keyboard Macros843696
- Node: Basic Kbd Macro845950
- Node: Save Kbd Macro849092
- Node: Kbd Macro Query850767
- Node: Key Bindings852754
- Node: Keymaps854033
- Node: Prefix Keymaps857447
- Node: Local Keymaps858740
- Node: Minibuffer Maps862013
- Node: Rebinding862631
- Node: Init Rebinding866005
- Node: Function Keys868287
- Node: Named ASCII Chars871099
- Node: Mouse Buttons872442
- Node: Disabling877269
- Node: Keyboard Translations878998
- Node: Syntax880968
- Node: Init File882100
- Node: Init Syntax883788
- Node: Init Examples885882
- Node: Terminal Init890057
- Node: Find Init891949
- Node: Quitting892809
- Node: Lossage897092
- Node: DEL Gets Help897868
- Node: Stuck Recursive898236
- Node: Screen Garbled898942
- Node: Text Garbled900101
- Node: Unasked-for Search900764
- Node: Memory Full902243
- Node: Emergency Escape903297
- Node: Total Frustration905037
- Node: Bugs905656
- Node: Bug Criteria906386
- Node: Understanding Bug Reporting909045
- Node: Checklist911547
- Node: Sending Patches925987
- Node: Service930984
- Node: Command Arguments931631
- Node: Action Arguments934614
- Node: Initial Options935621
- Node: Command Example937963
- Node: Resume Arguments938789
- Node: Environment940436
- Node: General Variables941651
- Node: Misc Variables945969
- Node: Display X946560
- Node: Font X948852
- Node: Colors X952434
- Node: Window Size X953878
- Node: Borders X956598
- Node: Icons X957723
- Node: Resources X958780
- Node: Lucid Resources964715
- Node: Motif Resources966311
- Node: Antinews969284
- Node: MS-DOS971769
- Node: Manifesto973395
- Node: Glossary999403
- Node: Acknowledgments1038621
- Node: Key Index1059811
- Node: Command Index1091325
- Node: Variable Index1137964
- Node: Concept Index1154145
- 
- End Tag Table
--- 0 ----
Index: emacs/info/emacs-1
diff -c emacs/info/emacs-1:1.1.1.2 emacs/info/emacs-1:removed
*** emacs/info/emacs-1:1.1.1.2	Mon Jul 22 01:51:38 1996
--- emacs/info/emacs-1	Fri Aug  2 20:02:21 1996
***************
*** 1,1030 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Top,  Next: Distrib,  Prev: (dir),  Up: (dir)
- 
- The Emacs Editor
- ****************
- 
-    Emacs is the extensible, customizable, self-documenting real-time
- display editor.  This Info file describes how to edit with Emacs and
- some of how to customize it, but not how to extend it.  It corresponds
- to GNU Emacs version 19.29.
- 
- * Menu:
- 
- * Distrib::	      How to get the latest Emacs distribution.
- * Copying::	      The GNU General Public License gives you permission
- 			to redistribute GNU Emacs on certain terms;
- 			it also explains that there is no warranty.
- * Intro::	      An introduction to Emacs concepts.
- * Glossary::	      The glossary.
- * Antinews::	      Information about Emacs version 19.28.
- * MS-DOS::            Using Emacs on MS-DOS (otherwise known as "MS-DOG").
- * Manifesto::	      What's GNU?  Gnu's Not Unix!
- * Acknowledgments::   Major contributors to GNU Emacs.
- 
- Indexes, nodes containing large menus
- * Key Index::	      An item for each standard Emacs key sequence.
- * Command Index::     An item for each command name.
- * Variable Index::    An item for each documented variable.
- * Concept Index::     An item for each concept.
- 
- Important General Concepts
- * Screen::	      How to interpret what you see on the screen.
- * User Input::	      Kinds of input events (characters, buttons,
-                         function keys).
- * Keys::	      Key sequences: what you type to request one
-                         editing action.
- * Commands::	      Named functions run by key sequences to do editing.
- * Text Characters::   Character set for text (the contents of buffers
- 			and strings).
- * Entering Emacs::    Starting Emacs from the shell.
- * Exiting::	      Stopping or killing Emacs.
- * Command Arguments:: Hairy startup options.
- 
- Fundamental Editing Commands
- * Basic::	      The most basic editing commands.
- * Minibuffer::	      Entering arguments that are prompted for.
- * M-x::		      Invoking commands by their names.
- * Help::	      Commands for asking Emacs about its commands.
- 
- Important Text-Changing Commands
- * Mark::	      The mark: how to delimit a "region" of text.
- * Killing::	      Killing text.
- * Yanking::	      Recovering killed text.  Moving text.
- * Accumulating Text:: Other ways of copying text.
- * Rectangles::	      Operating on the text inside a rectangle on the screen.
- * Registers::	      Saving a text string or a location in the buffer.
- * Display::	      Controlling what text is displayed.
- * Search::	      Finding or replacing occurrences of a string.
- * Fixit::	      Commands especially useful for fixing typos.
- 
- Larger Units of Text
- * Files::	      All about handling files.
- * Buffers::	      Multiple buffers; editing several files at once.
- * Windows::	      Viewing two pieces of text at once.
- * Frames::	      Running the same Emacs session in multiple X windows.
- 
- Advanced Features
- * Major Modes::	      Text mode vs. Lisp mode vs. C mode ...
- * Indentation::	      Editing the white space at the beginnings of lines.
- * Text::	      Commands and modes for editing English.
- * Programs::	      Commands and modes for editing programs.
- * Building::	      Compiling, running and debugging programs.
- * Abbrevs::	      How to define text abbreviations to reduce
- 			the number of characters you must type.
- * Picture::	      Editing pictures made up of characters
- 			using the quarter-plane screen model.
- * Sending Mail::      Sending mail in Emacs.
- * Rmail::	      Reading mail in Emacs.
- * Dired::	      You can "edit" a directory to manage files in it.
- * Calendar/Diary::    The calendar and diary facilities.
- * GNUS::	      How to read netnews with Emacs.
- * Shell::	      Executing shell commands from Emacs.
- * Emacs Server::      Using Emacs as an editing server for `mail', etc.
- * Hardcopy::	      Printing buffers or regions.
- * Postscript::	      Printing buffers or regions as Postscript.
- * Sorting::	      Sorting lines, paragraphs or pages within Emacs.
- * Narrowing::	      Restricting display and editing to a portion
- 			of the buffer.
- * Two-Column::	      Splitting apart columns to edit them
- 			 in side-by-side windows.
- * Editing Binary Files:: Using Hexl mode to edit binary files.
- * Saving Emacs Sessions:: Saving Emacs state from one session to the next.
- * Recursive Edit::    A command can allow you to do editing
- 			"within the command".  This is called a
- 			`recursive editing level'.
- * Emulation::	      Emulating some other editors with Emacs.
- * Dissociated Press:: Dissociating text for fun.
- * Amusements::	      Various games and hacks.
- * Customization::     Modifying the behavior of Emacs.
- 
- Recovery from Problems.
- * Quitting::	      Quitting and aborting.
- * Lossage::	      What to do if Emacs is hung or malfunctioning.
- * Bugs::	      How and when to report a bug.
- * Service::	      How to get help for your own Emacs needs.
- 
- Here are some other nodes which are really inferiors of the ones
- already listed, mentioned here so you can get to them in one step:
- 
-  -- The Detailed Node Listing --
- 
- The Organization of the Screen
- 
- * Point::	The place in the text where editing commands operate.
- * Echo Area::   Short messages appear at the bottom of the screen.
- * Mode Line::	Interpreting the mode line.
- 
- Basic Editing Commands
- 
- * Inserting Text::     Inserting text by simply typing it.
- * Moving Point::       How to move the cursor to the place where you want to
- 			 change something.
- * Erasing::	       Deleting and killing text.
- * Undo::	       Undoing recently made changes in the text.
- * Files: Basic Files.  Visiting, creating, and saving files.
- * Help: Basic Help.    Asking what a character does.
- * Blank Lines::	       Commands to make or delete blank lines.
- * Continuation Lines:: Lines too wide for the screen.
- * Position Info::      What page, line, row, or column is point on?
- * Arguments::	       Numeric arguments for repeating a command.
- 
- The Minibuffer
- 
- * Minibuffer File::       Entering file names with the minibuffer.
- * Minibuffer Edit::       How to edit in the minibuffer.
- * Completion::		  An abbreviation facility for minibuffer input.
- * Minibuffer History::	  Reusing recent minibuffer arguments.
- * Repetition::		  Re-executing commands that used the minibuffer.
- 
- Help
- 
- * Help Summary::	Brief list of all Help commands.
- * Key Help::		Asking what a key does in Emacs.
- * Name Help::		Asking about a command, variable or function name.
- * Apropos::		Asking what pertains to a given topic.
- * Library Keywords::	Finding Lisp libraries by keywords (topics).
- * Misc Help::		Other help commands.
- 
- The Mark and the Region
- 
- * Setting Mark::	Commands to set the mark.
- * Transient Mark::	How to make Emacs highlight the region-
- 			  when there is one.
- * Using Region::	Summary of ways to operate on contents of the region.
- * Marking Objects::	Commands to put region around textual units.
- * Mark Ring::		Previous mark positions saved so you can go back there.
- * Global Mark Ring::	Previous mark positions in various buffers.
- 
- Deletion and Killing
- 
- * Deletion::		Commands for deleting small amounts of text and
- 			  blank areas.
- * Killing by Lines::	How to kill entire lines of text at one time.
- * Other Kill Commands:: Commands to kill large regions of text and
- 			  syntactic units such as words and sentences.
- 
- Yanking
- 
- * Kill Ring::		Where killed text is stored.  Basic yanking.
- * Appending Kills::	Several kills in a row all yank together.
- * Earlier Kills::	Yanking something killed some time ago.
- 
- Registers
- 
- * RegPos::      	   Saving positions in registers.
- * RegText::     	   Saving text in registers.
- * RegRect::     	   Saving rectangles in registers.
- * RegConfig::              Saving window configurations in registers.
- * RegFiles::    	   File names in registers.
- * Bookmarks::              Bookmarks are like registers, but persistent.
- 
- Controlling the Display
- 
- * Scrolling::		   Moving text up and down in a window.
- * Horizontal Scrolling::   Moving text left and right in a window.
- * Selective Display::	   Hiding lines with lots of indentation.
- * Optional Mode Line::	   Optional mode line features.
- * European Display::	   Displaying (and entering) European characters.
- * Display Vars::	   Information on variables for customizing display.
- 
- Searching and Replacement
- 
- * Incremental Search::	   Search happens as you type the string.
- * Nonincremental Search::  Specify entire string and then search.
- * Word Search::		   Search for sequence of words.
- * Regexp Search::	   Search for match for a regexp.
- * Regexps::		   Syntax of regular expressions.
- * Search Case::		   To ignore case while searching, or not.
- * Replace::		   Search, and replace some or all matches.
- * Other Repeating Search:: Operating on all matches for some regexp.
- 
- Replacement Commands
- 
- * Unconditional Replace::  Replacing all matches for a string.
- * Regexp Replace::	   Replacing all matches for a regexp.
- * Replacement and Case::   How replacements preserve case of letters.
- * Query Replace::	   How to use querying.
- 
- Commands for Fixing Typos
- 
- * Kill Errors:: Commands to kill a batch of recently entered text.
- * Transpose::	Exchanging two characters, words, lines, lists...
- * Fixing Case:: Correcting case of last word entered.
- * Spelling::	Apply spelling checker to a word, or a whole file.
- 
- File Handling
- 
- * File Names::	     How to type and edit file name arguments.
- * Visiting::	     Visiting a file prepares Emacs to edit the file.
- * Saving::	     Saving makes your changes permanent.
- * Reverting::	     Reverting cancels all the changes not saved.
- * Auto Save::	     Auto Save periodically protects against loss of data.
- * File Aliases::     Handling multiple names for one file.
- * Version Control::  Version control systems (RCS and SCCS).
- * Directories::	     Listing the contents of a file directory.
- * Comparing Files::  Finding where two files differ.
- * Misc File Ops::    Other things you can do on files.
- 
- Saving Files
- 
- * Backup::	  How Emacs saves the old version of your file.
- * Interlocking::  How Emacs protects against simultaneous editing
- 		    of one file by two users.
- 
- Version Control
- 
- * Version Systems::             Supported version control back end systems.
- * VC Concepts::                 Basic version control information;
-                                   checking files in and out.
- * Editing with VC::             Commands for editing a file maintained
-                                   with version control.
- * Log Entries::                 Logging your changes.
- * Change Logs and VC::          Generating a change log file from log entries.
- * Old Versions::                Examining and comparing old versions.
- * Branches::                    Selecting a branch to put your changes in,
-                                   and creating a new branch.
- * Status in VC::                Commands to view the VC status of files and
-                                   look at log entries.
- * Renaming and VC::             A command to rename both the source and
-                                   master file correctly.
- * Snapshots::                   How to make and use snapshots, a set of
-                                   file versions that can be treated as a unit.
- * Version Headers::             Inserting version control headers into
-                                   working files.
- * Customizing VC::              Variables to change VC's behavior.
- 
- Using Multiple Buffers
- 
- * Select Buffer::      Creating a new buffer or reselecting an old one.
- * List Buffers::       Getting a list of buffers that exist.
- * Misc Buffer::	       Renaming; changing read-onliness; copying text.
- * Kill Buffer::	       Killing buffers you no longer need.
- * Several Buffers::    How to go through the list of all buffers
- 			 and operate variously on several of them.
- * Indirect Buffers::   An indirect buffer shares the text of another buffer.
- 
- Multiple Windows
- 
- * Basic Window::       Introduction to Emacs windows.
- * Split Window::       New windows are made by splitting existing windows.
- * Other Window::       Moving to another window or doing something to it.
- * Pop Up Window::      Finding a file or buffer in another window.
- * Change Window::      Deleting windows and changing their sizes.
- 
- Frames and X Windows
- 
- * Mouse Commands::     Moving, cutting, and pasting, with the mouse.
- * Secondary Selection::Cutting without altering point and mark.
- * Mouse References::   Using the mouse to select an item from a list.
- * Mode Line Mouse::    Mouse clicks on the mode line.
- * Creating Frames::    Creating additional Emacs frames with various contents.
- * Special Buffer Frames::  You can make certain buffers have their own frames.
- * Frame Parameters::   Changing the colors and other modes of frames.
- * Scroll Bars::	       How to enable and disable scroll bars; how to use them.
- * Menu Bars::	       Enabling and disabling the menu bar.
- * Faces::	       How to change the display style using faces.
- * Modifying Faces::    How to change what a particular face looks like.
- * Misc X::	       Iconifying and deleting frames.	Region highlighting.
- 
- Major Modes
- 
- * Choosing Modes::     How major modes are specified or chosen.
- 
- Indentation
- 
- * Indentation Commands::  Various commands and techniques for indentation.
- * Tab Stops::		  You can set arbitrary "tab stops" and then
- 			    indent to the next tab stop when you want to.
- * Just Spaces::		  You can request indentation using just spaces.
- 
- Commands for Human Languages
- 
- * Words::	  Moving over and killing words.
- * Sentences::	  Moving over and killing sentences.
- * Paragraphs::	  Moving over paragraphs.
- * Pages::	  Moving over pages.
- * Filling::	  Filling or justifying text.
- * Case::	  Changing the case of text.
- * Text Mode::	  The major modes for editing text files.
- * Outline Mode::  The major mode for editing outlines.
- * TeX Mode::	  The major modes for editing input to the formatter TeX.
- * Nroff Mode::	  The major mode for editing input to the formatter nroff.
- * Formatted Text::Editing formatted text directly in WYSIWYG fashion.
- 
- Filling Text
- 
- * Auto Fill::	  Auto Fill mode breaks long lines automatically.
- * Fill Commands:: Commands to refill paragraphs and center lines.
- * Fill Prefix::	  Filling when every line is indented or in a comment, etc.
- 
- Editing Programs
- 
- * Program Modes::     Major modes for editing programs.
- * Lists::	      Expressions with balanced parentheses.
- * List Commands::     The commands for working with list and sexps.
- * Defuns::	      Each program is made up of separate functions.
- 			There are editing commands to operate on them.
- * Program Indent::    Adjusting indentation to show the nesting.
- * Matching::	      Insertion of a close-delimiter flashes matching open.
- * Comments::	      Inserting, killing, and aligning comments.
- * Balanced Editing::  Inserting two matching parentheses at once, etc.
- * Symbol Completion:: Completion on symbol names of your program or language.
- * Documentation::     Getting documentation of functions you plan to call.
- * Change Log::	      Maintaining a change history for your program.
- * Tags::	      Go direct to any function in your program in one
- 			command.  Tags remembers which file it is in.
- * Emerge::	      A convenient way of merging two versions of a program.
- * C Mode::	      Special commands of C mode (and C++ mode).
- * Fortran::	      Fortran mode and its special features.
- * Asm Mode::	      Asm mode and its special features.
- 
- Indentation for Programs
- 
- * Basic Indent::	Indenting a single line.
- * Multi-line Indent::	Commands to reindent many lines at once.
- * Lisp Indent::		Specifying how each Lisp function should be indented.
- * C Indent::		Choosing an indentation style for C code.
- 
- Tags Tables
- 
- * Tag Syntax::		Tag syntax for various types of code and text files.
- * Create Tags Table::	Creating a tags table with `etags'.
- * Select Tags Table::	How to visit a tags table.
- * Find Tag::		Commands to find the definition of a specific tag.
- * Tags Search::		Using a tags table for searching and replacing.
- * Tags Stepping::	Visiting files in a tags table, one by one.
- * List Tags::		Listing and finding tags defined in a file.
- 
- Merging Files with Emerge
- 
- * Overview of Emerge::	    How to start Emerge.  Basic concepts.
- * Submodes of Emerge::	    Fast mode vs. Edit mode.
- 			      Skip Prefers mode and Auto Advance mode.
- * State of Difference::	    You do the merge by specifying state A or B
- 			      for each difference.
- * Merge Commands::	    Commands for selecting a difference,
- 			      changing states of differences, etc.
- * Exiting Emerge::	    What to do when you've finished the merge.
- * Combining in Emerge::	    How to keep both alternatives for a difference.
- * Fine Points of Emerge::   Misc.
- 
- Compiling and Testing Programs
- 
- * Compilation::			  Compiling programs in languages other
- 				    than Lisp (C, Pascal, etc.)
- * Debuggers::			  Running symbolic debuggers for
- 				    non-Lisp programs.
- * Executing Lisp::		  Various modes for editing Lisp programs,
- 				    with different facilities for running
- 				    the Lisp programs.
- * Libraries: Lisp Libraries.	  Creating Lisp programs to run in Emacs.
- * Interaction: Lisp Interaction.  Executing Lisp in an Emacs buffer.
- * Eval: Lisp Eval.		  Executing a single Lisp expression in Emacs.
- * External Lisp::		  Communicating through Emacs with a
- 				    separate Lisp.
- 
- Running Debuggers Under Emacs
- 
- * Starting GUD::	How to start a debugger subprocess.
- * Debugger Operation::	Connection between the debugger and source buffers.
- * Commands of GUD::	Key bindings for common commands.
- * GUD Customization::	Defining your own commands for GUD.
- 
- Abbrevs
- 
- * Abbrev Concepts::   Fundamentals of defined abbrevs.
- * Defining Abbrevs::  Defining an abbrev, so it will expand when typed.
- * Expanding Abbrevs:: Controlling expansion: prefixes, canceling expansion.
- * Editing Abbrevs::   Viewing or editing the entire list of defined abbrevs.
- * Saving Abbrevs::    Saving the entire list of abbrevs for another session.
- * Dynamic Abbrevs::   Abbreviations for words already in the buffer.
- 
- Editing Pictures
- 
- * Basic Picture::	  Basic concepts and simple commands of Picture Mode.
- * Insert in Picture::	  Controlling direction of cursor motion
- 			    after "self-inserting" characters.
- * Tabs in Picture::	  Various features for tab stops and indentation.
- * Rectangles in Picture:: Clearing and superimposing rectangles.
- 
- Sending Mail
- 
- * Mail Format:: 	     Format of the mail being composed.
- * Mail Headers::             Details of permitted mail header fields.
- * Mail Aliases::             Abbreviating and grouping mail addresses.
- * Mail Mode::   	     Special commands for editing mail being composed.
- * Distracting NSA::          How to distract the NSA's attention.
- 
- Reading Mail with Rmail
- 
- * Rmail Basics::             Basic concepts of Rmail, and simple use.
- * Rmail Scrolling::          Scrolling through a message.
- * Rmail Motion::             Moving to another message.
- * Rmail Deletion::           Deleting and expunging messages.
- * Rmail Inbox::              How mail gets into the Rmail file.
- * Rmail Files::              Using multiple Rmail files.
- * Rmail Output::             Copying message out to files.
- * Rmail Labels::             Classifying messages by labeling them.
- * Rmail Reply::              Sending replies to messages you are viewing.
- * Rmail Summary::            Summaries show brief info on many messages.
- * Rmail Sorting::            Sorting messages in Rmail.
- * Rmail Display::            How Rmail displays a message; customization.
- * Rmail Editing::            Editing message text and headers in Rmail.
- * Rmail Digest::             Extracting the messages from a digest message.
- * Out of Rmail::	     Converting an Rmail file to mailbox format.
- * Rmail Rot13::              Reading messages encoded in the rot13 code.
- 
- Dired, the Directory Editor
- 
- * Dired Enter:: 	     How to invoke Dired.
- * Dired Commands::           Commands in the Dired buffer.
- * Dired Deletion::           Deleting files with Dired.
- * Flagging Many Files::      Flagging files based on their names.
- * Dired Visiting::           Other file operations through Dired.
- * Marks vs Flags::	     Flagging for deletion vs marking.
- * Operating on Files::	     How to copy, rename, print, compress, etc.
- 			       either one file or several files.
- * Shell Commands in Dired::  Running a shell command on the marked files.
- * Transforming File Names::  Using patterns to rename multiple files.
- * Comparison in Dired::	     Running `diff' by way of Dired.
- * Subdirectories in Dired::  Adding subdirectories to the Dired buffer.
- * Subdirectory Motion::	     Moving across subdirectories, and up and down.
- * Hiding Subdirectories::    Making subdirectories visible or invisible.
- * Dired Updating::           Discarding lines for files of no interest.
- * Dired and Find::	     Using `find' to choose the files for Dired.
- 
- The Calendar and the Diary
- 
- * Calendar Motion::	  Moving through the calendar; selecting a date.
- * Scroll Calendar::	  Bringing earlier or later months onto the screen.
- * Counting Days::	  How many days are there between two dates?
- * General Calendar::	  Exiting or recomputing the calendar.
- * Holidays::		  Displaying dates of holidays.
- * Sunrise/Sunset::	  Displaying local times of sunrise and sunset.
- * Lunar Phases::	  Displaying phases of the moon.
- * Other Calendars::	  Converting dates to other calendar systems.
- * Diary::		  Displaying events from your diary.
- * Appointments::	  Reminders when it's time to do something.
- * Daylight Savings::	  How to specify when daylight savings time is active.
- 
- Movement in the Calendar
- 
- * Calendar Unit Motion::      Moving by days, weeks, months, and years.
- * Move to Beginning or End::  Moving to start/end of weeks, months, and years.
- * Specified Dates::	      Moving to the current date or another
- 				specific date.
- 
- Conversion To and From Other Calendars
- 
- * Calendar Systems::	   The calendars Emacs understands
- 			     (aside from Gregorian).
- * To Other Calendar::	   Converting the selected date to various calendars.
- * From Other Calendar::	   Moving to a date specified in another calendar.
- * Mayan Calendar::	   Moving to a date specified in a Mayan calendar.
- 
- The Diary
- 
- * Diary Commands::	   Viewing diary entries and associated calendar dates.
- * Format of Diary File::   Entering events in your diary.
- * Date Formats::	   Various ways you can specify dates.
- * Adding to Diary::	   Commands to create diary entries.
- * Special Diary Entries::  Anniversaries, blocks of dates, cyclic entries, etc.
- 
- GNUS
- 
- * Buffers of GNUS::	   The Newsgroups, Summary and Article buffers.
- * GNUS Startup::	   What you should know about starting GNUS.
- * Summary of GNUS::	   A short description of the basic GNUS commands.
- 
- Running Shell Commands from Emacs
- 
- * Single Shell::	   How to run one shell command and return.
- * Interactive Shell::	   Permanent shell taking input via Emacs.
- * Shell Mode::		   Special Emacs commands used with permanent shell.
- * Shell History::          Repeating previous commands in a shell buffer.
- * Shell Options::          Options for customizing Shell mode.
- * Remote Host::		   Connecting to another computer.
- 
- Customization
- 
- * Minor Modes::		   Each minor mode is one feature you can turn on
- 			     independently of any others.
- * Variables::		   Many Emacs commands examine Emacs variables
- 			     to decide what to do; by setting variables,
- 			     you can control their functioning.
- * Keyboard Macros::	   A keyboard macro records a sequence of
- 			     keystrokes to be replayed with a single
- 			     command.
- * Key Bindings::	   The keymaps say what command each key runs.
- 			     By changing them, you can "redefine keys".
- * Keyboard Translations::  If your keyboard passes an undesired code
- 			     for a key, you can tell Emacs to
- 			     substitute another code.
- * Syntax::		   The syntax table controls how words and
- 			      expressions are parsed.
- * Init File::		   How to write common customizations in the
- 			     `.emacs' file.
- 
- Variables
- 
- * Examining::	     Examining or setting one variable's value.
- * Edit Options::     Examining or editing list of all variables' values.
- * Hooks::	     Hook variables let you specify programs for parts
- 		       of Emacs to run on particular occasions.
- * Locals::	     Per-buffer values of variables.
- * File Variables::   How files can specify variable values.
- 
- Keyboard Macros
- 
- * Basic Kbd Macro::  Defining and running keyboard macros.
- * Save Kbd Macro::   Giving keyboard macros names; saving them in files.
- * Kbd Macro Query::  Keyboard macros that do different things each use.
- 
- Customizing Key Bindings
- 
- * Keymaps::	     Generalities.  The global keymap.
- * Prefix Keymaps::   Keymaps for prefix keys.
- * Local Keymaps::    Major and minor modes have their own keymaps.
- * Minibuffer Maps::  The minibuffer uses its own local keymaps.
- * Rebinding::	     How to redefine one key's meaning conveniently.
- * Init Rebinding::   Rebinding keys with your init file, `.emacs'.
- * Function Keys::    Rebinding terminal function keys.
- * Named ASCII Chars::Distinguishing TAB from `C-i', and so on.
- * Mouse Buttons::    Rebinding mouse buttons in Emacs.
- * Disabling::	     Disabling a command means confirmation is required
- 		       before it can be executed.  This is done to protect
- 		       beginners from surprises.
- 
- The Init File, `~/.emacs'
- 
- * Init Syntax::	     Syntax of constants in Emacs Lisp.
- * Init Examples::    How to do some things with an init file.
- * Terminal Init::    Each terminal type can have an init file.
- * Find Init::	     How Emacs finds the init file.
- 
- Dealing with Emacs Trouble
- 
- * DEL Gets Help::       What to do if DEL doesn't delete.
- * Stuck Recursive::     `[...]' in mode line around the parentheses.
- * Screen Garbled::      Garbage on the screen.
- * Text Garbled::        Garbage in the text.
- * Unasked-for Search::  Spontaneous entry to incremental search.
- * Memory Full::         How to cope when you run out of memory.
- * Emergency Escape::    Emergency escape--
-                           What to do if Emacs stops responding.
- * Total Frustration::   When you are at your wits' end.
- 
- Reporting Bugs
- 
- * Criteria:  Bug Criteria.	 Have you really found a bug?
- * Understanding Bug Reporting::	 How to report a bug effectively.
- * Checklist::			 Steps to follow for a good bug report.
- * Sending Patches::		 How to send a patch for GNU Emacs.
- 
- Command Line Options and Arguments
- 
- * Action Arguments::	Arguments to visit files, load libraries,
- 			  and call functions.
- * Initial Options::     Arguments that take effect while starting Emacs.
- * Command Example::     Examples of using command line arguments.
- * Resume Arguments::	Specifying arguments when you resume a running Emacs.
- * Environment::         Environment variables that Emacs uses.
- 
- * Display X::           Changing the default display and using remote login.
- * Font X::	        Choosing a font for text, under X.
- * Colors X::	        Choosing colors, under X.
- * Window Size X::       Start-up window size, under X.
- * Borders X::	        Internal and external borders, under X.
- * Icons X::             Choosing what sort of icon to use, under X.
- * Resources X::         Advanced use of classes and resources, under X.
- * Lucid Resources::     X resources for Lucid menus.
- * Motif Resources::     X resources for Motif menus.
- 
- Environment Variables
- 
- * General Variables::	  Environment variables that all versions of Emacs use.
- * Misc Variables::	  Certain system specific variables.
- 
- 
- File: emacs,  Node: Distrib,  Next: Copying,  Prev: Top,  Up: Top
- 
- Distribution
- ************
- 
-    GNU Emacs is "free software"; this means that everyone is free to
- use it and free to redistribute it on certain conditions.  GNU Emacs is
- not in the public domain; it is copyrighted and there are restrictions
- on its distribution, but these restrictions are designed to permit
- everything that a good cooperating citizen would want to do.  What is
- not allowed is to try to prevent others from further sharing any version
- of GNU Emacs that they might get from you.  The precise conditions are
- found in the GNU General Public License that comes with Emacs and also
- appears following this section.
- 
-    One way to get a copy of GNU Emacs is from someone else who has it.
- You need not ask for our permission to do so, or tell any one else; just
- copy it.  If you have access to the Internet, you can get the latest
- distribution version of GNU Emacs by anonymous FTP; see the file
- `etc/FTP' in the Emacs distribution for more information.
- 
-    You may also receive GNU Emacs when you buy a computer.  Computer
- manufacturers are free to distribute copies on the same terms that
- apply to everyone else.  These terms require them to give you the full
- sources, including whatever changes they may have made, and to permit
- you to redistribute the GNU Emacs received from them under the usual
- terms of the General Public License.  In other words, the program must
- be free for you when you get it, not just free for the manufacturer.
- 
-    You can also order copies of GNU Emacs from the Free Software
- Foundation, on various magnetic media or on CD-ROM.  This is a
- convenient and reliable way to get a copy; it is also a good way to help
- fund our work.  (The Foundation has always received most of its funds in
- this way.)  An order form is included at the end of manuals printed by
- the Foundation.  It is also included in the file `etc/ORDERS' in the
- Emacs distribution.  For further information, write to
- 
-      Free Software Foundation
-      59 Temple Place, Suite 330
-      Boston, MA  02111-1307 USA
-      USA
- 
-    The income from distribution fees goes to support the foundation's
- purpose: the development of new free software, and improvements to our
- existing programs including GNU Emacs.
- 
-    If you find GNU Emacs useful, please *send a donation* to the Free
- Software Foundation to support our work.  Donations to the Free
- Software Foundation are tax deductible.  If you use GNU Emacs at your
- workplace, suggest that the company make a donation.  If company policy
- is unsympathetic to the idea of donating to charity, you might instead
- suggest ordering a CD-ROM from the Foundation occasionally, or
- subscribing to periodic updates.
- 
- 
- File: emacs,  Node: Copying,  Next: Intro,  Prev: Distrib,  Up: Top
- 
- GNU GENERAL PUBLIC LICENSE
- **************************
- 
-                          Version 2, June 1991
- 
-      Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-      675 Mass Ave, Cambridge, MA 02139, USA
-      
-      Everyone is permitted to copy and distribute verbatim copies
-      of this license document, but changing it is not allowed.
- 
- Preamble
- ========
- 
-    The licenses for most software are designed to take away your
- freedom to share and change it.  By contrast, the GNU General Public
- License is intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users.  This
- General Public License applies to most of the Free Software
- Foundation's software and to any other program whose authors commit to
- using it.  (Some other Free Software Foundation software is covered by
- the GNU Library General Public License instead.)  You can apply it to
- your programs, too.
- 
-    When we speak of free software, we are referring to freedom, not
- price.  Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.
- 
-    To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the software, or if you modify it.
- 
-    For example, if you distribute copies of such a program, whether
- gratis or for a fee, you must give the recipients all the rights that
- you have.  You must make sure that they, too, receive or can get the
- source code.  And you must show them these terms so they know their
- rights.
- 
-    We protect your rights with two steps: (1) copyright the software,
- and (2) offer you this license which gives you legal permission to copy,
- distribute and/or modify the software.
- 
-    Also, for each author's protection and ours, we want to make certain
- that everyone understands that there is no warranty for this free
- software.  If the software is modified by someone else and passed on, we
- want its recipients to know that what they have is not the original, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.
- 
-    Finally, any free program is threatened constantly by software
- patents.  We wish to avoid the danger that redistributors of a free
- program will individually obtain patent licenses, in effect making the
- program proprietary.  To prevent this, we have made it clear that any
- patent must be licensed for everyone's free use or not licensed at all.
- 
-    The precise terms and conditions for copying, distribution and
- modification follow.
- 
-     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- 
-   0. This License applies to any program or other work which contains a
-      notice placed by the copyright holder saying it may be distributed
-      under the terms of this General Public License.  The "Program",
-      below, refers to any such program or work, and a "work based on
-      the Program" means either the Program or any derivative work under
-      copyright law: that is to say, a work containing the Program or a
-      portion of it, either verbatim or with modifications and/or
-      translated into another language.  (Hereinafter, translation is
-      included without limitation in the term "modification".)  Each
-      licensee is addressed as "you".
- 
-      Activities other than copying, distribution and modification are
-      not covered by this License; they are outside its scope.  The act
-      of running the Program is not restricted, and the output from the
-      Program is covered only if its contents constitute a work based on
-      the Program (independent of having been made by running the
-      Program).  Whether that is true depends on what the Program does.
- 
-   1. You may copy and distribute verbatim copies of the Program's
-      source code as you receive it, in any medium, provided that you
-      conspicuously and appropriately publish on each copy an appropriate
-      copyright notice and disclaimer of warranty; keep intact all the
-      notices that refer to this License and to the absence of any
-      warranty; and give any other recipients of the Program a copy of
-      this License along with the Program.
- 
-      You may charge a fee for the physical act of transferring a copy,
-      and you may at your option offer warranty protection in exchange
-      for a fee.
- 
-   2. You may modify your copy or copies of the Program or any portion
-      of it, thus forming a work based on the Program, and copy and
-      distribute such modifications or work under the terms of Section 1
-      above, provided that you also meet all of these conditions:
- 
-        a. You must cause the modified files to carry prominent notices
-           stating that you changed the files and the date of any change.
- 
-        b. You must cause any work that you distribute or publish, that
-           in whole or in part contains or is derived from the Program
-           or any part thereof, to be licensed as a whole at no charge
-           to all third parties under the terms of this License.
- 
-        c. If the modified program normally reads commands interactively
-           when run, you must cause it, when started running for such
-           interactive use in the most ordinary way, to print or display
-           an announcement including an appropriate copyright notice and
-           a notice that there is no warranty (or else, saying that you
-           provide a warranty) and that users may redistribute the
-           program under these conditions, and telling the user how to
-           view a copy of this License.  (Exception: if the Program
-           itself is interactive but does not normally print such an
-           announcement, your work based on the Program is not required
-           to print an announcement.)
- 
-      These requirements apply to the modified work as a whole.  If
-      identifiable sections of that work are not derived from the
-      Program, and can be reasonably considered independent and separate
-      works in themselves, then this License, and its terms, do not
-      apply to those sections when you distribute them as separate
-      works.  But when you distribute the same sections as part of a
-      whole which is a work based on the Program, the distribution of
-      the whole must be on the terms of this License, whose permissions
-      for other licensees extend to the entire whole, and thus to each
-      and every part regardless of who wrote it.
- 
-      Thus, it is not the intent of this section to claim rights or
-      contest your rights to work written entirely by you; rather, the
-      intent is to exercise the right to control the distribution of
-      derivative or collective works based on the Program.
- 
-      In addition, mere aggregation of another work not based on the
-      Program with the Program (or with a work based on the Program) on
-      a volume of a storage or distribution medium does not bring the
-      other work under the scope of this License.
- 
-   3. You may copy and distribute the Program (or a work based on it,
-      under Section 2) in object code or executable form under the terms
-      of Sections 1 and 2 above provided that you also do one of the
-      following:
- 
-        a. Accompany it with the complete corresponding machine-readable
-           source code, which must be distributed under the terms of
-           Sections 1 and 2 above on a medium customarily used for
-           software interchange; or,
- 
-        b. Accompany it with a written offer, valid for at least three
-           years, to give any third party, for a charge no more than your
-           cost of physically performing source distribution, a complete
-           machine-readable copy of the corresponding source code, to be
-           distributed under the terms of Sections 1 and 2 above on a
-           medium customarily used for software interchange; or,
- 
-        c. Accompany it with the information you received as to the offer
-           to distribute corresponding source code.  (This alternative is
-           allowed only for noncommercial distribution and only if you
-           received the program in object code or executable form with
-           such an offer, in accord with Subsection b above.)
- 
-      The source code for a work means the preferred form of the work for
-      making modifications to it.  For an executable work, complete
-      source code means all the source code for all modules it contains,
-      plus any associated interface definition files, plus the scripts
-      used to control compilation and installation of the executable.
-      However, as a special exception, the source code distributed need
-      not include anything that is normally distributed (in either
-      source or binary form) with the major components (compiler,
-      kernel, and so on) of the operating system on which the executable
-      runs, unless that component itself accompanies the executable.
- 
-      If distribution of executable or object code is made by offering
-      access to copy from a designated place, then offering equivalent
-      access to copy the source code from the same place counts as
-      distribution of the source code, even though third parties are not
-      compelled to copy the source along with the object code.
- 
-   4. You may not copy, modify, sublicense, or distribute the Program
-      except as expressly provided under this License.  Any attempt
-      otherwise to copy, modify, sublicense or distribute the Program is
-      void, and will automatically terminate your rights under this
-      License.  However, parties who have received copies, or rights,
-      from you under this License will not have their licenses
-      terminated so long as such parties remain in full compliance.
- 
-   5. You are not required to accept this License, since you have not
-      signed it.  However, nothing else grants you permission to modify
-      or distribute the Program or its derivative works.  These actions
-      are prohibited by law if you do not accept this License.
-      Therefore, by modifying or distributing the Program (or any work
-      based on the Program), you indicate your acceptance of this
-      License to do so, and all its terms and conditions for copying,
-      distributing or modifying the Program or works based on it.
- 
-   6. Each time you redistribute the Program (or any work based on the
-      Program), the recipient automatically receives a license from the
-      original licensor to copy, distribute or modify the Program
-      subject to these terms and conditions.  You may not impose any
-      further restrictions on the recipients' exercise of the rights
-      granted herein.  You are not responsible for enforcing compliance
-      by third parties to this License.
- 
-   7. If, as a consequence of a court judgment or allegation of patent
-      infringement or for any other reason (not limited to patent
-      issues), conditions are imposed on you (whether by court order,
-      agreement or otherwise) that contradict the conditions of this
-      License, they do not excuse you from the conditions of this
-      License.  If you cannot distribute so as to satisfy simultaneously
-      your obligations under this License and any other pertinent
-      obligations, then as a consequence you may not distribute the
-      Program at all.  For example, if a patent license would not permit
-      royalty-free redistribution of the Program by all those who
-      receive copies directly or indirectly through you, then the only
-      way you could satisfy both it and this License would be to refrain
-      entirely from distribution of the Program.
- 
-      If any portion of this section is held invalid or unenforceable
-      under any particular circumstance, the balance of the section is
-      intended to apply and the section as a whole is intended to apply
-      in other circumstances.
- 
-      It is not the purpose of this section to induce you to infringe any
-      patents or other property right claims or to contest validity of
-      any such claims; this section has the sole purpose of protecting
-      the integrity of the free software distribution system, which is
-      implemented by public license practices.  Many people have made
-      generous contributions to the wide range of software distributed
-      through that system in reliance on consistent application of that
-      system; it is up to the author/donor to decide if he or she is
-      willing to distribute software through any other system and a
-      licensee cannot impose that choice.
- 
-      This section is intended to make thoroughly clear what is believed
-      to be a consequence of the rest of this License.
- 
-   8. If the distribution and/or use of the Program is restricted in
-      certain countries either by patents or by copyrighted interfaces,
-      the original copyright holder who places the Program under this
-      License may add an explicit geographical distribution limitation
-      excluding those countries, so that distribution is permitted only
-      in or among countries not thus excluded.  In such case, this
-      License incorporates the limitation as if written in the body of
-      this License.
- 
-   9. The Free Software Foundation may publish revised and/or new
-      versions of the General Public License from time to time.  Such
-      new versions will be similar in spirit to the present version, but
-      may differ in detail to address new problems or concerns.
- 
-      Each version is given a distinguishing version number.  If the
-      Program specifies a version number of this License which applies
-      to it and "any later version", you have the option of following
-      the terms and conditions either of that version or of any later
-      version published by the Free Software Foundation.  If the Program
-      does not specify a version number of this License, you may choose
-      any version ever published by the Free Software Foundation.
- 
-  10. If you wish to incorporate parts of the Program into other free
-      programs whose distribution conditions are different, write to the
-      author to ask for permission.  For software which is copyrighted
-      by the Free Software Foundation, write to the Free Software
-      Foundation; we sometimes make exceptions for this.  Our decision
-      will be guided by the two goals of preserving the free status of
-      all derivatives of our free software and of promoting the sharing
-      and reuse of software generally.
- 
-                                 NO WARRANTY
- 
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
-      WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
-      LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-      HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
-      WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
-      NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-      FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE
-      QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-      PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
-      SERVICING, REPAIR OR CORRECTION.
- 
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-      WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
-      MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
-      LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
-      INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
-      INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-      DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
-      OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
-      OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
-      ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- 
-                       END OF TERMS AND CONDITIONS
- 
- How to Apply These Terms to Your New Programs
- =============================================
- 
-    If you develop a new program, and you want it to be of the greatest
- possible use to the public, the best way to achieve this is to make it
- free software which everyone can redistribute and change under these
- terms.
- 
-    To do so, attach the following notices to the program.  It is safest
- to attach them to the start of each source file to most effectively
- convey the exclusion of warranty; and each file should have at least
- the "copyright" line and a pointer to where the full notice is found.
- 
-      ONE LINE TO GIVE THE PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES.
-      Copyright (C) 19YY  NAME OF AUTHOR
-      
-      This program is free software; you can redistribute it and/or
-      modify it under the terms of the GNU General Public License
-      as published by the Free Software Foundation; either version 2
-      of the License, or (at your option) any later version.
-      
-      This program is distributed in the hope that it will be useful,
-      but WITHOUT ANY WARRANTY; without even the implied warranty of
-      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-      GNU General Public License for more details.
-      
-      You should have received a copy of the GNU General Public License
-      along with this program; if not, write to the Free Software
-      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- 
-    Also add information on how to contact you by electronic and paper
- mail.
- 
-    If the program is interactive, make it output a short notice like
- this when it starts in an interactive mode:
- 
-      Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
-      Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-      type `show w'.  This is free software, and you are welcome
-      to redistribute it under certain conditions; type `show c'
-      for details.
- 
-    The hypothetical commands `show w' and `show c' should show the
- appropriate parts of the General Public License.  Of course, the
- commands you use may be called something other than `show w' and `show
- c'; they could even be mouse-clicks or menu items--whatever suits your
- program.
- 
-    You should also get your employer (if you work as a programmer) or
- your school, if any, to sign a "copyright disclaimer" for the program,
- if necessary.  Here is a sample; alter the names:
- 
-      Yoyodyne, Inc., hereby disclaims all copyright
-      interest in the program `Gnomovision'
-      (which makes passes at compilers) written
-      by James Hacker.
-      
-      SIGNATURE OF TY COON, 1 April 1989
-      Ty Coon, President of Vice
- 
-    This General Public License does not permit incorporating your
- program into proprietary programs.  If your program is a subroutine
- library, you may consider it more useful to permit linking proprietary
- applications with the library.  If this is what you want to do, use the
- GNU Library General Public License instead of this License.
- 
--- 0 ----
Index: emacs/info/emacs-10
diff -c emacs/info/emacs-10:1.1.1.2 emacs/info/emacs-10:removed
*** emacs/info/emacs-10:1.1.1.2	Mon Jul 22 01:51:41 1996
--- emacs/info/emacs-10	Fri Aug  2 20:03:00 1996
***************
*** 1,1145 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Outline Visibility,  Next: Outline Views,  Prev: Outline Motion,  Up: Outline Mode
- 
- Outline Visibility Commands
- ---------------------------
- 
-    The other special commands of outline mode are used to make lines
- visible or invisible.  Their names all start with `hide' or `show'.
- Most of them fall into pairs of opposites.  They are not undoable;
- instead, you can undo right past them.  Making lines visible or
- invisible is simply not recorded by the undo mechanism.
- 
- `C-c C-t'
-      Make all body lines in the buffer invisible (`hide-body').
- 
- `C-c C-a'
-      Make all lines in the buffer visible (`show-all').
- 
- `C-c C-d'
-      Make everything under this heading invisible, not including this
-      heading itself
-      (`hide-subtree').
- 
- `C-c C-s'
-      Make everything under this heading visible, including body,
-      subheadings, and their bodies (`show-subtree').
- 
- `C-c C-l'
-      Make the body of this heading line, and of all its subheadings,
-      invisible (`hide-leaves').
- 
- `C-c C-k'
-      Make all subheadings of this heading line, at all levels, visible
-      (`show-branches').
- 
- `C-c C-i'
-      Make immediate subheadings (one level down) of this heading line
-      visible (`show-children').
- 
- `C-c C-c'
-      Make this heading line's body invisible (`hide-entry').
- 
- `C-c C-e'
-      Make this heading line's body visible (`show-entry').
- 
- `C-c C-q'
-      Hide everything except the top N levels of heading lines
-      (`hide-sublevels').
- 
- `C-c C-o'
-      Hide everything except for the heading or body that point is in,
-      plus the headings leading up from there to the top level of the
-      outline (`hide-other').
- 
-    Two commands that are exact opposites are `C-c C-c' (`hide-entry')
- and `C-c C-e' (`show-entry').  They are used with point on a heading
- line, and apply only to the body lines of that heading.  Subheadings
- and their bodies are not affected.
- 
-    Two more powerful opposites are `C-c C-d' (`hide-subtree') and `C-c
- C-s' (`show-subtree').  Both expect to be used when point is on a
- heading line, and both apply to all the lines of that heading's
- "subtree": its body, all its subheadings, both direct and indirect, and
- all of their bodies.  In other words, the subtree contains everything
- following this heading line, up to and not including the next heading of
- the same or higher rank.
- 
-    Intermediate between a visible subtree and an invisible one is having
- all the subheadings visible but none of the body.  There are two
- commands for doing this, depending on whether you want to hide the
- bodies or make the subheadings visible.  They are `C-c C-l'
- (`hide-leaves') and `C-c C-k' (`show-branches').
- 
-    A little weaker than `show-branches' is `C-c C-i' (`show-children').
- It makes just the direct subheadings visible--those one level down.
- Deeper subheadings remain invisible, if they were invisible.
- 
-    Two commands have a blanket effect on the whole file.  `C-c C-t'
- (`hide-body') makes all body lines invisible, so that you see just the
- outline structure.  `C-c C-a' (`show-all') makes all lines visible.
- These commands can be thought of as a pair of opposites even though
- `C-c C-a' applies to more than just body lines.
- 
-    The command `C-c C-q' (`hide-sublevels') hides all but the top level
- headings.  With a numeric argument N, it hides everything except the
- top N levels of heading lines.
- 
-    The command `C-c C-o' (`hide-other') hides everything except the
- heading or body text that point is in, plus its parents (the headers
- leading up from there to top level in the outline).
- 
-    You can turn off the use of ellipses at the ends of visible lines by
- setting `selective-display-ellipses' to `nil'.  Then there is no
- visible indication of the presence of invisible lines.
- 
- 
- File: emacs,  Node: Outline Views,  Prev: Outline Visibility,  Up: Outline Mode
- 
- Viewing One Outline in Multiple Views
- -------------------------------------
- 
-    You can display two views of a single outline at the same time, in
- different windows, by means of an alternative implementation of Outline
- mode called `noutline'.
- 
-    To do this, first load the library `noutline' with `M-x load-library
- RET noutline RET'.  This loads the alternative implementation of
- Outline mode.  It provides the same command names and key bindings as
- regular Outline mode, but it implements them differently.
- 
-    Then, to display a second view of an outline buffer, you must create
- an indirect buffer using `M-x make-indirect-buffer'.  The first
- argument of this command is the existing outline buffer name, and its
- second argument is the name to use for the new indirect buffer.  *Note
- Indirect Buffers::.
- 
-    Once the indirect buffer exists, you can display it in a window in
- the normal fashion, with `C-x 4 b' or other Emacs commands.  The Outline
- mode commands to show and hide parts of the text operate on each buffer
- independently; as a result, each buffer can have its own view.  If you
- want more than two views on the same outline, create additional indirect
- buffers.
- 
-    In a future Emacs version, the alternative `noutline' implementation
- will probably become the principal implementation.
- 
- 
- File: emacs,  Node: TeX Mode,  Next: Nroff Mode,  Prev: Outline Mode,  Up: Text
- 
- TeX Mode
- ========
- 
-    TeX is a powerful text formatter written by Donald Knuth; it is also
- free, like GNU Emacs.  LaTeX is a simplified input format for TeX,
- implemented by TeX macros; it comes with TeX.  SliTeX is a special form
- of LaTeX.
- 
-    Emacs has a special TeX mode for editing TeX input files.  It
- provides facilities for checking the balance of delimiters and for
- invoking TeX on all or part of the file.
- 
-    TeX mode has three variants, Plain TeX mode, LaTeX mode, and SliTeX
- mode (these three distinct major modes differ only slightly).  They are
- designed for editing the three different formats.  The command `M-x
- tex-mode' looks at the contents of the buffer to determine whether the
- contents appear to be either LaTeX input or SliTeX input; if so, it
- selects the appropriate mode.  If the file contents do not appear to be
- LaTeX or SliTeX, it selects Plain TeX mode.  If the contents are
- insufficient to determine this, the variable `tex-default-mode'
- controls which mode is used.
- 
-    When `M-x tex-mode' does not guess right, you can use the commands
- `M-x plain-tex-mode', `M-x latex-mode', and `M-x slitex-mode' to select
- explicitly the particular variants of TeX mode.
- 
- * Menu:
- 
- * Editing: TeX Editing.   Special commands for editing in TeX mode.
- * LaTeX: LaTeX Editing.   Additional commands for LaTeX input files.
- * Printing: TeX Print.    Commands for printing part of a file with TeX.
- * Getting: TeX Distrib.   Getting the latest Unix TeX distribution.
- 
- 
- File: emacs,  Node: TeX Editing,  Next: LaTeX Editing,  Up: TeX Mode
- 
- TeX Editing Commands
- --------------------
- 
-    Here are the special commands provided in TeX mode for editing the
- text of the file.
- 
- `"'
-      Insert, according to context, either ```' or `"' or `'''
-      (`tex-insert-quote').
- 
- `LFD'
-      Insert a paragraph break (two newlines) and check the previous
-      paragraph for unbalanced braces or dollar signs
-      (`tex-terminate-paragraph').
- 
- `M-x validate-tex-region'
-      Check each paragraph in the region for unbalanced braces or dollar
-      signs.
- 
- `C-c {'
-      Insert `{}' and position point between them (`tex-insert-braces').
- 
- `C-c }'
-      Move forward past the next unmatched close brace (`up-list').
- 
-    In TeX, the character `"' is not normally used; we use ```' to start
- a quotation and `''' to end one.  To make editing easier under this
- formatting convention, TeX mode overrides the normal meaning of the key
- `"' with a command that inserts a pair of single-quotes or backquotes
- (`tex-insert-quote').  To be precise, this command inserts ```' after
- whitespace or an open brace, `"' after a backslash, and `''' after any
- other character.
- 
-    If you need the character `"' itself in unusual contexts, use `C-q'
- to insert it.  Also, `"' with a numeric argument always inserts that
- number of `"' characters.
- 
-    In TeX mode, `$' has a special syntax code which attempts to
- understand the way TeX math mode delimiters match.  When you insert a
- `$' that is meant to exit math mode, the position of the matching `$'
- that entered math mode is displayed for a second.  This is the same
- feature that displays the open brace that matches a close brace that is
- inserted.  However, there is no way to tell whether a `$' enters math
- mode or leaves it; so when you insert a `$' that enters math mode, the
- previous `$' position is shown as if it were a match, even though they
- are actually unrelated.
- 
-    TeX uses braces as delimiters that must match.  Some users prefer to
- keep braces balanced at all times, rather than inserting them singly.
- Use `C-c {' (`tex-insert-braces') to insert a pair of braces.  It
- leaves point between the two braces so you can insert the text that
- belongs inside.  Afterward, use the command `C-c }' (`up-list') to move
- forward past the close brace.
- 
-    There are two commands for checking the matching of braces.  LFD
- (`tex-terminate-paragraph') checks the paragraph before point, and
- inserts two newlines to start a new paragraph.  It prints a message in
- the echo area if any mismatch is found.  `M-x validate-tex-region'
- checks a region, paragraph by paragraph.  When it finds a paragraph that
- contains a mismatch, it displays point at the beginning of the paragraph
- for a few seconds and sets the mark at that spot.  Scanning continues
- until the whole buffer has been checked or until you type another key.
- Afterward, you can use the mark ring to find the last several paragraphs
- that had mismatches (*note Mark Ring::.).
- 
-    Note that Emacs commands count square brackets and parentheses in
- TeX mode, not just braces.  This is not strictly correct for the
- purpose of checking TeX syntax.  However, parentheses and square
- brackets are likely to be used in text as matching delimiters and it is
- useful for the various motion commands and automatic match display to
- work with them.
- 
- 
- File: emacs,  Node: LaTeX Editing,  Next: TeX Print,  Prev: TeX Editing,  Up: TeX Mode
- 
- LaTeX Editing Commands
- ----------------------
- 
-    LaTeX mode, and its variant, SliTeX mode, provide a few extra
- features not applicable to plain TeX.
- 
- `C-c C-o'
-      Insert `\begin' and `\end' for LaTeX block and position point on a
-      line between them. (`tex-latex-block').
- 
- `C-c C-e'
-      Close the last unended block for LaTeX (`tex-close-latex-block').
- 
-    In LaTeX input, `\begin' and `\end' commands are used to group
- blocks of text.  To insert a `\begin' and a matching `\end' (on a new
- line following the `\begin'), use `C-c C-o' (`tex-latex-block').  A
- blank line is inserted between the two, and point is left there.  You
- can use completion when you enter the block type; to specify additional
- block type names beyond the standard list, set the variable
- `latex-block-names'.  For example, here's how to add `theorem',
- `corollary', and `proof':
- 
-      (setq latex-block-names '("theorem" "corollary" "proof"))
- 
-    In LaTeX input, `\begin' and `\end' commands must balance.  You can
- use `C-c C-e' (`tex-close-latex-block') to insert automatically a
- matching `\end' to match the last unmatched `\begin'.  It indents the
- `\end' to match the corresponding `\begin'.  It inserts a newline after
- `\end' if point is at the beginning of a line.
- 
- 
- File: emacs,  Node: TeX Print,  Next: TeX Distrib,  Prev: LaTeX Editing,  Up: TeX Mode
- 
- TeX Printing Commands
- ---------------------
- 
-    You can invoke TeX as an inferior of Emacs on either the entire
- contents of the buffer or just a region at a time.  Running TeX in this
- way on just one chapter is a good way to see what your changes look
- like without taking the time to format the entire file.
- 
- `C-c C-r'
-      Invoke TeX on the current region, together with the buffer's header
-      (`tex-region').
- 
- `C-c C-b'
-      Invoke TeX on the entire current buffer (`tex-buffer').
- 
- `C-c TAB'
-      Invoke BibTeX on the current file (`tex-bibtex-file').
- 
- `C-c C-f'
-      Invoke TeX on the current file (`tex-file').
- 
- `C-c C-l'
-      Recenter the window showing output from the inferior TeX so that
-      the last line can be seen (`tex-recenter-output-buffer').
- 
- `C-c C-k'
-      Kill the TeX subprocess (`tex-kill-job').
- 
- `C-c C-p'
-      Print the output from the last `C-c C-r', `C-c C-b', or `C-c C-f'
-      command (`tex-print').
- 
- `C-c C-v'
-      Preview the output from the last `C-c C-r', `C-c C-b', or `C-c
-      C-f' command (`tex-view').
- 
- `C-c C-q'
-      Show the printer queue (`tex-show-print-queue').
- 
-    You can pass the current buffer through an inferior TeX by means of
- `C-c C-b' (`tex-buffer').  The formatted output appears in a temporary
- file; to print it, type `C-c C-p' (`tex-print').  Afterward, you can
- use `C-c C-q' (`tex-show-print-queue') to view the progress of your
- output towards being printed.  If your terminal has the ability to
- display TeX output files, you can preview the output on the terminal
- with `C-c C-v' (`tex-view').
- 
-    You can specify the directory to use for running TeX by setting the
- variable `tex-directory'.  `"."' is the default value.  If your
- environment variable `TEXINPUTS' contains relative directory names, or
- if your files contains `\input' commands with relative file names, then
- `tex-directory' *must* be `"."' or you will get the wrong results.
- Otherwise, it is safe to specify some other directory, such as `"/tmp"'.
- 
-    If you want to specify which shell commands are used in the inferior
- TeX, you can do so by setting the values of the variables
- `tex-run-command', `latex-run-command', `slitex-run-command',
- `tex-dvi-print-command', `tex-dvi-view-command', and
- `tex-show-queue-command'.  You *must* set the value of
- `tex-dvi-view-command' for your particular terminal; this variable has
- no default value.  The other variables have default values that may (or
- may not) be appropriate for your system.
- 
-    Normally, the file name given to these commands comes at the end of
- the command string; for example, `latex FILENAME'.  In some cases,
- however, the file name needs to be embedded in the command; an example
- is when you need to provide the file name as an argument to one command
- whose output is piped to another.  You can specify where to put the
- file name with `*' in the command string.  For example,
- 
-      (setq tex-dvi-print-command "dvips -f * | lpr")
- 
-    The terminal output from TeX, including any error messages, appears
- in a buffer called `*tex-shell*'.  If TeX gets an error, you can switch
- to this buffer and feed it input (this works as in Shell mode; *note
- Interactive Shell::.).  Without switching to this buffer you can scroll
- it so that its last line is visible by typing `C-c C-l'.
- 
-    Type `C-c C-k' (`tex-kill-job') to kill the TeX process if you see
- that its output is no longer useful.  Using `C-c C-b' or `C-c C-r' also
- kills any TeX process still running.
- 
-    You can also pass an arbitrary region through an inferior TeX by
- typing `C-c C-r' (`tex-region').  This is tricky, however, because most
- files of TeX input contain commands at the beginning to set parameters
- and define macros, without which no later part of the file will format
- correctly.  To solve this problem, `C-c C-r' allows you to designate a
- part of the file as containing essential commands; it is included before
- the specified region as part of the input to TeX.  The designated part
- of the file is called the "header".
- 
-    To indicate the bounds of the header in Plain TeX mode, you insert
- two special strings in the file.  Insert `%**start of header' before the
- header, and `%**end of header' after it.  Each string must appear
- entirely on one line, but there may be other text on the line before or
- after.  The lines containing the two strings are included in the header.
- If `%**start of header' does not appear within the first 100 lines of
- the buffer, `C-c C-r' assumes that there is no header.
- 
-    In LaTeX mode, the header begins with `\documentstyle' and ends with
- `\begin{document}'.  These are commands that LaTeX requires you to use
- in any case, so nothing special needs to be done to identify the header.
- 
-    The commands (`tex-buffer') and (`tex-region') do all of their work
- in a temporary directory, and do not have available any of the auxiliary
- files needed by TeX for cross-references; these commands are generally
- not suitable for running the final copy in which all of the
- cross-references need to be correct.  When you want the auxiliary
- files, use `C-c C-f' (`tex-file') which runs TeX on the current
- buffer's file, in that file's directory.  Before TeX runs, you will be
- asked about saving any modified buffers.  Generally, you need to use
- (`tex-file') twice to get cross-references correct.
- 
-    For LaTeX files, you can use BibTeX to process the auxiliary file
- for the current buffer's file.  BibTeX looks up bibliographic citations
- in a data base and prepares the cited references for the bibliography
- section.  The command `C-c TAB' (`tex-bibtex-file') runs the shell
- command (`tex-bibtex-command') to produce a `.bbl' file for the current
- buffer's file.  Generally, you need to do `C-c C-f' (`tex-file') once
- to generate the `.aux' file, then do `C-c TAB' (`tex-bibtex-file'), and
- then repeat `C-c C-f' (`tex-file') twice more to get the
- cross-references correct.
- 
-    Entering any kind of TeX mode runs the hooks `text-mode-hook' and
- `tex-mode-hook'.  Then it runs either `plain-tex-mode-hook' or
- `latex-mode-hook', whichever is appropriate.  For SliTeX files, it
- calls `slitex-mode-hook'.  Starting the TeX shell runs the hook
- `tex-shell-hook'.  *Note Hooks::.
- 
- 
- File: emacs,  Node: TeX Distrib,  Prev: TeX Print,  Up: TeX Mode
- 
- Unix TeX Distribution
- ---------------------
- 
-    TeX for Unix systems can be obtained from the University of
- Washington for a distribution fee.
- 
-    To order a full distribution, specify whether you prefer 1/4 inch
- QIC-24 or 4mm DAT tape (9-track reel-to-reel is no longer available)
- and send $210.00 for a (tar or cpio) cartridge, payable to the
- University of Washington to:
- 
-      Pierre MacKay
-      Department of Classics
-      Denny Hall, Mail Stop DH-10
-      University of Washington
-      Seattle, Washington 98195
- 
- Purchase orders are acceptable, but there is an extra charge of $10.00,
- to pay for processing charges.
- 
- For overseas orders please add $20.00 to the base cost for shipment via
- air parcel post, or $30.00 for shipment via courier.
- 
-    The normal distribution is a tar tape, blocked 20, 1600 bpi, on an
- industry standard 2400 foot half-inch reel.  The physical format for the
- 1/4 inch streamer cartridges is QIC-24.  System V tapes can be written
- in cpio format, blocked 5120 bytes, with ASCII headers.
- 
- 
- File: emacs,  Node: Nroff Mode,  Next: Formatted Text,  Prev: TeX Mode,  Up: Text
- 
- Nroff Mode
- ==========
- 
-    Nroff mode is a mode like Text mode but modified to handle nroff
- commands present in the text.  Invoke `M-x nroff-mode' to enter this
- mode.  It differs from Text mode in only a few ways.  All nroff command
- lines are considered paragraph separators, so that filling will never
- garble the nroff commands.  Pages are separated by `.bp' commands.
- Comments start with backslash-doublequote.  Also, three special
- commands are provided that are not in Text mode:
- 
- `M-n'
-      Move to the beginning of the next line that isn't an nroff command
-      (`forward-text-line').  An argument is a repeat count.
- 
- `M-p'
-      Like `M-n' but move up (`backward-text-line').
- 
- `M-?'
-      Prints in the echo area the number of text lines (lines that are
-      not nroff commands) in the region (`count-text-lines').
- 
-    The other feature of Nroff mode is that you can turn on Electric
- Nroff mode.  This is a minor mode that you can turn on or off with `M-x
- electric-nroff-mode' (*note Minor Modes::.).  When the mode is on, each
- time you use RET to end a line that contains an nroff command that
- opens a kind of grouping, the matching nroff command to close that
- grouping is automatically inserted on the following line.  For example,
- if you are at the beginning of a line and type `. ( b RET', this
- inserts the matching command `.)b' on a new line following point.
- 
-    If you use Outline minor mode with Nroff mode (*note Outline
- Mode::.), heading lines are lines of the form `.H' followed by a number
- (the header level).
- 
-    Entering Nroff mode runs the hook `text-mode-hook', followed by the
- hook `nroff-mode-hook' (*note Hooks::.).
- 
- 
- File: emacs,  Node: Formatted Text,  Prev: Nroff Mode,  Up: Text
- 
- Editing Formatted Text
- ======================
- 
-    "Enriched mode" is a minor mode for editing files that contain
- formatted text in WYSIWYG fashion, as in a word processor.  Currently,
- formatted text in Enriched mode can specify fonts, colors, underlining,
- margins, and types of filling and justification.  In the future, we plan
- to implement other formatting features as well.
- 
-    Enriched mode is a minor mode (*note Minor Modes::.).  Typically it
- is used in conjunction with Text mode (*note Text Mode::.).  However,
- you can also use it with other major modes such as Outline mode and
- Indented Text mode.
- 
-    Potentially, Emacs can store formatted text files in various file
- formats.  Currently, only one format is implemented: "text/enriched"
- format, which is defined by the MIME protocol.  *Note Format
- Conversion: (elisp)Format Conversion, for details of how Emacs
- recognizes and converts file formats.
- 
-    The Emacs distribution contains a formatted text file that can serve
- as an example.  Its name is `etc/enriched.doc'.  It contains samples
- illustrating all the features described in this section.  It also
- contains a list of ideas for future enhancements.
- 
- * Menu:
- 
- * Requesting Formatted Text::   Entering and exiting Enriched mode.
- * Hard and Soft Newlines::      There are two different kinds of newlines.
- * Editing Format Info::         How to edit text properties.
- * Faces: Format Faces.          Bold, italic, underline, etc.
- * Color: Format Colors.         Changing the color of text.
- * Indent: Format Indentation.   Changing the left and right margins.
- * Justification: Format Justification.
-                                 Centering, setting text flush with the
-                                   left or right margin, etc.
- * Other: Format Properties.     The "special" text properties submenu.
- * Forcing Enriched Mode::       How to force use of Enriched mode.
- 
- 
- File: emacs,  Node: Requesting Formatted Text,  Next: Hard and Soft Newlines,  Up: Formatted Text
- 
- Requesting to Edit Formatted Text
- ---------------------------------
- 
-    Whenever you visit a file that Emacs saved in the text/enriched
- format, Emacs automatically converts the formatting information in the
- file into Emacs's own internal format (text properties), and turns on
- Enriched mode.
- 
-    To create a new file of formatted text, first visit the nonexistent
- file, then type `M-x enriched-mode' before you start inserting text.
- This command turns on Enriched mode.  Do this before you begin inserting
- text, to ensure that the text you insert is handled properly.
- 
-    More generally, the command `enriched-mode' turns Enriched mode on
- if it was off, and off if it was on.  With a prefix argument, this
- command turns Enriched mode on if the argument is positive, and turns
- the mode off otherwise.
- 
-    When you save a buffer while Enriched mode is enabled in it, Emacs
- automatically converts the text to text/enriched format while writing it
- into the file.  When you visit the file again, Emacs will automatically
- recognize the format, reconvert the text, and turn on Enriched mode
- again.
- 
-    Normally, after reading a file in text/enriched format, Emacs refills
- each paragraph to fit the width of the window.  You can turn off this
- refilling, to save time, by setting the variable
- `enriched-fill-after-visiting' to `nil' or to `ask'.
- 
-    In any case, if the window width is the same as the width with which
- the file was saved, Emacs trusts that the file is already properly
- filled.
- 
-    You can add annotations for saving additional text properties, which
- Emacs normally does not save, by adding to `enriched-translations'.
- Note that the text/enriched standard requires any non-standard
- annotations to have names starting with `x-', as in `x-read-only'.
- This ensures that they will not conflict with standard annotations that
- may be added later.
- 
- 
- File: emacs,  Node: Hard and Soft Newlines,  Next: Editing Format Info,  Prev: Requesting Formatted Text,  Up: Formatted Text
- 
- Hard and Soft Newlines
- ----------------------
- 
-    In formatted text, Emacs distinguishes between two different kinds of
- newlines, "hard" newlines and "soft" newlines.
- 
-    Hard newlines are used to separate paragraphs, or items in a list, or
- anywhere that there should always be a line break regardless of the
- margins.  The `RET' command (`newline') and `C-o' (`open-line') insert
- hard newlines.
- 
-    Soft newlines are used to make text fit between the margins.  All the
- fill commands, including Auto Fill, insert soft newlines--and they
- delete only soft newlines.
- 
-    Although hard and soft newlines look the same, it is important to
- bear the difference in mind.  Do not use RET to break lines in the
- middle of filled paragraphs, or else you will get hard newlines that are
- barriers to further filling.  Instead, let Auto Fill mode break lines,
- so that if the text or the margins change, Emacs can refill the lines
- properly.  *Note Auto Fill::.
- 
-    On the other hand, in tables and lists, where the lines should always
- remain as you type them, you can use RET to end lines.  For these
- lines, you may also want to set the justification style to `unfilled'.
- *Note Format Justification::.
- 
- 
- File: emacs,  Node: Editing Format Info,  Next: Format Faces,  Prev: Hard and Soft Newlines,  Up: Formatted Text
- 
- Editing Format Information
- --------------------------
- 
-    There are two ways to alter the formatting information for a
- formatted text file: with keyboard commands, and with the mouse.
- 
-    The easiest way to add properties to your document is by using the
- Text Properties menu.  You can get to this menu in two ways: from the
- Edit menu in the menu bar, or with `C-mouse-2' (hold the CTRL key and
- press the middle mouse button).
- 
-    Most of the items in the Text Properties menu lead to other submenus.
- These are described in the sections that follow.  Some items run
- commands directly:
- 
- `Remove Properties'
-      Delete from the region all the text properties that the Text
-      Properties menu works with (`facemenu-remove-props').
- 
- `Remove All'
-      Delete *all* text properties from the region
-      (`facemenu-remove-all').
- 
- `List Properties'
-      List all the text properties of the character following point
-      (`list-text-properties-at').
- 
- `Display Faces'
-      Display a list of all the defined faces.
- 
- `Display Colors'
-      Display a list of all the defined colors.
- 
- 
- File: emacs,  Node: Format Faces,  Next: Format Colors,  Prev: Editing Format Info,  Up: Formatted Text
- 
- Faces in Formatted Text
- -----------------------
- 
-    The Faces submenu lists various Emacs faces including `bold',
- `italic', and `underline'.  Selecting one of these adds the chosen face
- to the region.  *Note Faces::.  You can also specify a face with these
- keyboard commands:
- 
- `M-g d'
-      Set the region, or the next inserted character, to the `default'
-      face (`facemenu-set-default').
- 
- `M-g b'
-      Set the region, or the next inserted character, to the `bold' face
-      (`facemenu-set-bold').
- 
- `M-g i'
-      Set the region, or the next inserted character, to the `italic'
-      face (`facemenu-set-italic').
- 
- `M-g l'
-      Set the region, or the next inserted character, to the
-      `bold-italic' face (`facemenu-set-bold-italic').
- 
- `M-g u'
-      Set the region, or the next inserted character, to the `underline'
-      face (`facemenu-set-underline').
- 
- `M-g o FACE RET'
-      Set the region, or the next inserted character, to the face FACE
-      (`facemenu-set-face').
- 
-    If you use these commands with a prefix argument--or, in Transient
- Mark mode, if the region is not active--then these commands specify a
- face to use for your next self-inserting input.  *Note Transient
- Mark::.  This applies to both the keyboard commands and the menu
- commands.
- 
-    Enriched mode defines two additional faces: `excerpt' and `fixed'.
- These correspond to codes used in the text/enriched file format.
- 
-    The `excerpt' face is intended for quotations.  This face is the
- same as `italic' unless you customize it (*note Modifying Faces::.).
- 
-    The `fixed' face is meant to say, "Use a fixed-width font for this
- part of the text."  Emacs currently supports only fixed-width fonts;
- therefore, the `fixed' annotation is not necessary now.  However, we
- plan to support variable width fonts in future Emacs versions, and
- other systems that display text/enriched format may not use a
- fixed-width font as the default.  So if you specifically want a certain
- part of the text to use a fixed-width font, you should specify the
- `fixed' face for that part.
- 
-    The `fixed' face is normally defined to use a different font from
- the default.  However, systems have different fonts installed, you may
- need to customize this.
- 
-    If your terminal cannot display different faces, you will not be able
- to see them, but you can still edit documents containing faces.  You can
- even add faces and colors to documents.  They will be visible when the
- file is viewed on a terminal that can display them.
- 
- 
- File: emacs,  Node: Format Colors,  Next: Format Indentation,  Prev: Format Faces,  Up: Formatted Text
- 
- Colors in Formatted Text
- ------------------------
- 
-    You can specify foreground and background colors for portions of the
- text.  There is a menu for specifying the foreground color and a menu
- for specifying the background color.  Each color menu lists all the
- colors that you have used in Enriched mode in the current Emacs session.
- 
-    If you specify a color with a prefix argument--or, in Transient Mark
- mode, if the region is not active--then it applies to your next
- self-inserting input.  *Note Transient Mark::.  Otherwise, the command
- applies to the region.
- 
-    Each color menu contains one additional item: `Other'.  You can use
- this item to specify a color that is not listed in the menu; it reads
- the color name with the minibuffer.  To display list of available colors
- and their names, use the `Display Colors' menu item in the Text
- Properties menu (*note Editing Format Info::.).
- 
-    Any color that you specify in this way, or that is mentioned in a
- formatted text file that you read in, is added to both color menus for
- the duration of the Emacs session.
- 
-    There are no key bindings for specifying colors, but you can do so
- with the extended commands `M-x facemenu-set-foreground' and `M-x
- facemenu-set-background'.  Both of these commands read the name of the
- color with the minibuffer.
- 
- 
- File: emacs,  Node: Format Indentation,  Next: Format Justification,  Prev: Format Colors,  Up: Formatted Text
- 
- Indentation in Formatted Text
- -----------------------------
- 
-    When editing formatted text, you can specify different amounts of
- indentation for the right or left margin of an entire paragraph or a
- part of a paragraph.  The margins you specify automatically affect the
- Emacs fill commands (*note Filling::.) and line-breaking commands.
- 
-    The Indentation submenu provides a convenient interface for
- specifying these properties.  The submenu contains four items:
- 
- `Indent More'
-      Indent the region by 4 columns (`increase-left-margin').  In
-      Enriched mode, this command is also available on `C-x TAB'; if you
-      supply a numeric argument, that says how many columns to add to the
-      margin (a negative argument reduces the number of columns).
- 
- `Indent Less'
-      Remove 4 columns of indentation from the region.
- 
- `Indent Right More'
-      Make the text narrower by indenting 4 columns at the right margin.
- 
- `Indent Right Less'
-      Remove 4 columns of indentation from the right margin.
- 
-    You can use these commands repeatedly to increase or decrease the
- indentation.
- 
-    The most common way to use these commands is to change the
- indentation of an entire paragraph.  However, that is not the only use.
- You can change the margins at any point; the new values take effect at
- the end of the line (for right margins) or the beginning of the next
- line (for left margins).
- 
-    This makes it possible to format paragraphs with "hanging indents",
- which means that the first line is indented less than subsequent lines.
- To set up a hanging indent, increase the indentation of the region
- starting after the first word of the paragraph and running until the end
- of the paragraph.
- 
-    Indenting the first line of a paragraph is easier.  Set the margin
- for the whole paragraph where you want it to be for the body of the
- paragraph, then indent the first line by inserting extra spaces or tabs.
- 
-    Sometimes, as a result of editing, the filling of a paragraph becomes
- messed up--parts of the paragraph may extend past the left or right
- margins.  When this happens, use `M-q' (`fill-paragraph') to refill the
- paragraph.
- 
-    The variable `standard-indent' specifies how many columns these
- commands should add to or subtract from the indentation.  The default
- value is 4.
- 
-    Enriched mode automatically sets the variable `fill-column' based on
- the window width: it leaves a certain number of columns for the right
- margin.  The variable `enriched-default-right-margin' says how many
- columns.  The default value is 10.
- 
- 
- File: emacs,  Node: Format Justification,  Next: Format Properties,  Prev: Format Indentation,  Up: Formatted Text
- 
- Justification in Formatted Text
- -------------------------------
- 
-    When editing formatted text, you can specify various styles of
- justification for a paragraph.  The style you specify automatically
- affects the Emacs fill commands.
- 
-    The Justification submenu provides a convenient interface for
- specifying the style.  The submenu contains five items:
- 
- `Flush Left'
-      This is the most common style of justification (at least for
-      English).  Lines are aligned at the left margin but left uneven at
-      the right.
- 
- `Flush Right'
-      This aligns each line with the right margin.  Spaces and tabs are
-      added on the left, if necessary, to make lines line up on the
-      right.
- 
- `Full'
-      This justifies the text, aligning both edges of each line.
-      Justified text looks very nice in a printed book, where the spaces
-      can all be adjusted equally, but it does not look as nice with a
-      fixed-width font on the screen.  Perhaps a future version of Emacs
-      will be able to adjust the width of spaces in a line to achieve
-      elegant justification.
- 
- `Center'
-      This centers every line between the current margins.
- 
- `None'
-      This turns off filling entirely.  Each line will remain as you
-      wrote it; the fill and auto-fill functions will have no effect on
-      text which has this setting.  You can, however, still indent the
-      left margin.  In unfilled regions, all newlines are treated as
-      hard newlines (*note Hard and Soft Newlines::.) .
- 
-    In Enriched mode, you can also specify justification from the
- keyboard using the `M-j' prefix character:
- 
- `M-j l'
-      Make the region left-filled (`set-justification-left').
- 
- `M-j r'
-      Make the region right-filled (`set-justification-right').
- 
- `M-j f'
-      Make the region fully-justified (`set-justification-full').
- 
- `M-j c'
- `M-S'
-      Make the region centered (`set-justification-center').
- 
- `M-j u'
-      Make the region unfilled (`set-justification-none').
- 
-    Justification styles apply to entire paragraphs.  All the
- justification-changing commands operate on the paragraph containing
- point, or, if the region is active, on all paragraphs which overlap the
- region.
- 
-    The default justification style is specified by the variable
- `default-justification'.  Its value should be one of the symbols
- `left', `right', `full', `center', or `none'.
- 
- 
- File: emacs,  Node: Format Properties,  Next: Forcing Enriched Mode,  Prev: Format Justification,  Up: Formatted Text
- 
- Setting Other Text Properties
- -----------------------------
- 
-    The Other Properties menu lets you add or remove three other useful
- text properties: `read-only', `invisible' and `intangible'.  The
- `intangible' property disallows moving point within the text, the
- `invisible' text property hides text from display, and the `read-only'
- property disallows alteration of the text.
- 
-    Each of these special properties has a menu item to add it to the
- region.  The last menu item, `Remove Special', removes all of these
- special properties from the text in the region.
- 
-    Currently, the `invisible' and `intangible' properties are *not*
- saved in the text/enriched format.  The `read-only' property is saved,
- but it is not a standard part of the text/enriched format, so other
- editors may not respect it.
- 
- 
- File: emacs,  Node: Forcing Enriched Mode,  Prev: Format Properties,  Up: Formatted Text
- 
- Forcing Enriched Mode
- ---------------------
- 
-    Normally, Emacs knows when you are editing formatted text because it
- recognizes the special annotations used in the file that you visited.
- However, there are situations in which you must take special actions to
- convert file contents or turn on Enriched mode:
- 
-    * When you visit a file that was created with some other editor,
-      Emacs may not recognize the file as being in the text/enriched
-      format.  In this case, when you visit the file you will see the
-      formatting commands rather than the formatted text.  Type `M-x
-      format-decode-buffer' to translate it.
- 
-    * When you *insert* a file into a buffer, rather than visiting it.
-      Emacs does the necessary conversions on the text which you insert,
-      but it does not enable Enriched mode.  If you wish to do that,
-      type `M-x enriched-mode'.
- 
-    The command `format-decode-buffer' translates text in various
- formats into Emacs's internal format.  It asks you to specify the format
- to translate from; however, normally you can type just RET, which tells
- Emacs to guess the format.
- 
-    If you wish to look at a file in text/enriched format in its raw
- form, as a sequence of characters with no formatting, use `M-x
- format-find-file RET FILENAME RET RET'.  The empty second argument
- means, "read without format conversion."
- 
- 
- File: emacs,  Node: Programs,  Next: Building,  Prev: Text,  Up: Top
- 
- Editing Programs
- ****************
- 
-    Emacs has many commands designed to understand the syntax of
- programming languages such as Lisp and C.  These commands can
- 
-    * Move over or kill balanced expressions or "sexps" (*note Lists::.).
- 
-    * Move over or mark top-level expressions--"defuns", in Lisp;
-      functions, in C (*note Defuns::.).
- 
-    * Show how parentheses balance (*note Matching::.).
- 
-    * Insert, kill or align comments (*note Comments::.).
- 
-    * Follow the usual indentation conventions of the language (*note
-      Program Indent::.).
- 
-    The commands for words, sentences and paragraphs are very useful in
- editing code even though their canonical application is for editing
- human language text.  Most symbols contain words (*note Words::.);
- sentences can be found in strings and comments (*note Sentences::.).
- Paragraphs per se don't exist in code, but the paragraph commands are
- useful anyway, because programming language major modes define
- paragraphs to begin and end at blank lines (*note Paragraphs::.).
- Judicious use of blank lines to make the program clearer will also
- provide useful chunks of text for the paragraph commands to work on.
- 
-    The selective display feature is useful for looking at the overall
- structure of a function (*note Selective Display::.).  This feature
- causes only the lines that are indented less than a specified amount to
- appear on the screen.
- 
- * Menu:
- 
- * Program Modes::     Major modes for editing programs.
- * Lists::             Expressions with balanced parentheses.
- * List Commands::     The commands for working with list and sexps.
- * Defuns::            Each program is made up of separate functions.
-                         There are editing commands to operate on them.
- * Program Indent::    Adjusting indentation to show the nesting.
- * Matching::          Insertion of a close-delimiter flashes matching open.
- * Comments::          Inserting, killing, and aligning comments.
- * Balanced Editing::  Inserting two matching parentheses at once, etc.
- * Symbol Completion:: Completion on symbol names of your program or language.
- * Documentation::     Getting documentation of functions you plan to call.
- * Change Log::        Maintaining a change history for your program.
- * Tags::              Go direct to any function in your program in one
-                         command.  Tags remembers which file it is in.
- * Emerge::	      A convenient way of merging two versions of a program.
- * C Mode::	      Special commands of C mode (and C++ mode).
- * Fortran::	      Fortran mode and its special features.
- * Asm Mode::	      Asm mode and its special features.
- 
- 
- File: emacs,  Node: Program Modes,  Next: Lists,  Up: Programs
- 
- Major Modes for Programming Languages
- =====================================
- 
-    Emacs also has major modes for the programming languages Lisp, Scheme
- (a variant of Lisp), Awk, C, C++, Fortran, Icon, Pascal, Perl and Tcl.
- There is also a major mode for makefiles, called Makefile mode.
- 
-    Ideally, a major mode should be implemented for each programming
- language that you might want to edit with Emacs; but often the mode for
- one language can serve for other syntactically similar languages.  The
- language modes that exist are those that someone decided to take the
- trouble to write.
- 
-    There are several forms of Lisp mode, which differ in the way they
- interface to Lisp execution.  *Note Executing Lisp::.
- 
-    Each of the programming language modes defines the TAB key to run an
- indentation function that knows the indentation conventions of that
- language and updates the current line's indentation accordingly.  For
- example, in C mode TAB is bound to `c-indent-line'.  LFD is normally
- defined to do RET followed by TAB; thus, it too indents in a
- mode-specific fashion.
- 
-    In most programming languages, indentation is likely to vary from
- line to line.  So the major modes for those languages rebind DEL to
- treat a tab as if it were the equivalent number of spaces (using the
- command `backward-delete-char-untabify').  This makes it possible to
- rub out indentation one column at a time without worrying whether it is
- made up of spaces or tabs.  Use `C-b C-d' to delete a tab character
- before point, in these modes.
- 
-    Programming language modes define paragraphs to be separated only by
- blank lines, so that the paragraph commands remain useful.  Auto Fill
- mode, if enabled in a programming language major mode, indents the new
- lines which it creates.
- 
-    Turning on a major mode runs a normal hook called the "mode hook",
- which is the value of a Lisp variable.  Each major mode has a mode hook,
- and the hook's name is always made from the mode command's name by
- adding `-hook'.  For example, turning on C mode runs the hook
- `c-mode-hook', while turning on Lisp mode runs the hook
- `lisp-mode-hook'.  *Note Hooks::.
- 
- 
- File: emacs,  Node: Lists,  Next: List Commands,  Prev: Program Modes,  Up: Programs
- 
- Lists and Sexps
- ===============
- 
-    By convention, Emacs keys for dealing with balanced expressions are
- usually Control-Meta characters.  They tend to be analogous in function
- to their Control and Meta equivalents.  These commands are usually
- thought of as pertaining to expressions in programming languages, but
- can be useful with any language in which some sort of parentheses exist
- (including human languages).
- 
-    These commands fall into two classes.  Some deal only with "lists"
- (parenthetical groupings).  They see nothing except parentheses,
- brackets, braces (whichever ones must balance in the language you are
- working with), and escape characters that might be used to quote those.
- 
-    The other commands deal with expressions or "sexps".  The word `sexp'
- is derived from "s-expression", the ancient term for an expression in
- Lisp.  But in Emacs, the notion of `sexp' is not limited to Lisp.  It
- refers to an expression in whatever language your program is written in.
- Each programming language has its own major mode, which customizes the
- syntax tables so that expressions in that language count as sexps.
- 
-    Sexps typically include symbols, numbers, and string constants, as
- well as anything contained in parentheses, brackets or braces.
- 
-    In languages that use prefix and infix operators, such as C, it is
- not possible for all expressions to be sexps.  For example, C mode does
- not recognize `foo + bar' as a sexp, even though it *is* a C expression;
- it recognizes `foo' as one sexp and `bar' as another, with the `+' as
- punctuation between them.  This is a fundamental ambiguity: both `foo +
- bar' and `foo' are legitimate choices for the sexp to move over if
- point is at the `f'.  Note that `(foo + bar)' is a single sexp in C
- mode.
- 
-    Some languages have obscure forms of expression syntax that nobody
- has bothered to make Emacs understand properly.
- 
- 
- File: emacs,  Node: List Commands,  Next: Defuns,  Prev: Lists,  Up: Programs
- 
- List And Sexp Commands
- ======================
- 
- `C-M-f'
-      Move forward over a sexp (`forward-sexp').
- 
- `C-M-b'
-      Move backward over a sexp (`backward-sexp').
- 
- `C-M-k'
-      Kill sexp forward (`kill-sexp').
- 
- `C-M-DEL'
-      Kill sexp backward (`backward-kill-sexp').
- 
- `C-M-u'
-      Move up and backward in list structure (`backward-up-list').
- 
- `C-M-d'
-      Move down and forward in list structure (`down-list').
- 
- `C-M-n'
-      Move forward over a list (`forward-list').
- 
- `C-M-p'
-      Move backward over a list (`backward-list').
- 
- `C-M-t'
-      Transpose expressions (`transpose-sexps').
- 
- `C-M-@'
-      Put mark after following expression (`mark-sexp').
- 
-    To move forward over a sexp, use `C-M-f' (`forward-sexp').  If the
- first significant character after point is an opening delimiter (`(' in
- Lisp; `(', `[' or `{' in C), `C-M-f' moves past the matching closing
- delimiter.  If the character begins a symbol, string, or number,
- `C-M-f' moves over that.
- 
-    The command `C-M-b' (`backward-sexp') moves backward over a sexp.
- The detailed rules are like those above for `C-M-f', but with
- directions reversed.  If there are any prefix characters (single-quote,
- backquote and comma, in Lisp) preceding the sexp, `C-M-b' moves back
- over them as well.  The sexp commands move across comments as if they
- were whitespace in most modes.
- 
-    `C-M-f' or `C-M-b' with an argument repeats that operation the
- specified number of times; with a negative argument, it moves in the
- opposite direction.
- 
-    Killing a sexp at a time can be done with `C-M-k' (`kill-sexp') or
- `C-M-DEL' (`backward-kill-sexp').  `C-M-k' kills the characters that
- `C-M-f' would move over, and `C-M-DEL' kills the characters that
- `C-M-b' would move over.
- 
-    The "list commands" move over lists like the sexp commands but skip
- blithely over any number of other kinds of sexps (symbols, strings,
- etc).  They are `C-M-n' (`forward-list') and `C-M-p' (`backward-list').
- The main reason they are useful is that they usually ignore comments
- (since the comments usually do not contain any lists).
- 
-    `C-M-n' and `C-M-p' stay at the same level in parentheses, when
- that's possible.  To move *up* one (or N) levels, use `C-M-u'
- (`backward-up-list').  `C-M-u' moves backward up past one unmatched
- opening delimiter.  A positive argument serves as a repeat count; a
- negative argument reverses direction of motion and also requests
- repetition, so it moves forward and up one or more levels.
- 
-    To move *down* in list structure, use `C-M-d' (`down-list').  In
- Lisp mode, where `(' is the only opening delimiter, this is nearly the
- same as searching for a `('.  An argument specifies the number of levels
- of parentheses to go down.
- 
-    A somewhat random-sounding command which is nevertheless handy is
- `C-M-t' (`transpose-sexps'), which drags the previous sexp across the
- next one.  An argument serves as a repeat count, and a negative
- argument drags backwards (thus canceling out the effect of `C-M-t' with
- a positive argument).  An argument of zero, rather than doing nothing,
- transposes the sexps ending after point and the mark.
- 
-    To set the region around the next sexp in the buffer, use `C-M-@'
- (`mark-sexp'), which sets mark at the same place that `C-M-f' would
- move to.  `C-M-@' takes arguments like `C-M-f'.  In particular, a
- negative argument is useful for putting the mark at the beginning of
- the previous sexp.
- 
-    The list and sexp commands' understanding of syntax is completely
- controlled by the syntax table.  Any character can, for example, be
- declared to be an opening delimiter and act like an open parenthesis.
- *Note Syntax::.
- 
--- 0 ----
Index: emacs/info/emacs-11
diff -c emacs/info/emacs-11:1.1.1.2 emacs/info/emacs-11:removed
*** emacs/info/emacs-11:1.1.1.2	Mon Jul 22 01:51:43 1996
--- emacs/info/emacs-11	Fri Aug  2 20:03:43 1996
***************
*** 1,1146 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Defuns,  Next: Program Indent,  Prev: List Commands,  Up: Programs
- 
- Defuns
- ======
- 
-    In Emacs, a parenthetical grouping at the top level in the buffer is
- called a "defun".  The name derives from the fact that most top-level
- lists in a Lisp file are instances of the special form `defun', but any
- top-level parenthetical grouping counts as a defun in Emacs parlance
- regardless of what its contents are, and regardless of the programming
- language in use.  For example, in C, the body of a function definition
- is a defun.
- 
- `C-M-a'
-      Move to beginning of current or preceding defun
-      (`beginning-of-defun').
- 
- `C-M-e'
-      Move to end of current or following defun (`end-of-defun').
- 
- `C-M-h'
-      Put region around whole current or following defun (`mark-defun').
- 
-    The commands to move to the beginning and end of the current defun
- are `C-M-a' (`beginning-of-defun') and `C-M-e' (`end-of-defun').
- 
-    If you wish to operate on the current defun, use `C-M-h'
- (`mark-defun') which puts point at the beginning and mark at the end of
- the current or next defun.  For example, this is the easiest way to get
- ready to move the defun to a different place in the text.  In C mode,
- `C-M-h' runs the function `mark-c-function', which is almost the same
- as `mark-defun'; the difference is that it backs up over the argument
- declarations, function name and returned data type so that the entire C
- function is inside the region.  *Note Marking Objects::.
- 
-    Emacs assumes that any open-parenthesis found in the leftmost column
- is the start of a defun.  Therefore, *never put an open-parenthesis at
- the left margin in a Lisp file unless it is the start of a top level
- list.  Never put an open-brace or other opening delimiter at the
- beginning of a line of C code unless it starts the body of a function.*
- The most likely problem case is when you want an opening delimiter at
- the start of a line inside a string.  To avoid trouble, put an escape
- character (`\', in C and Emacs Lisp, `/' in some other Lisp dialects)
- before the opening delimiter.  It will not affect the contents of the
- string.
- 
-    In the remotest past, the original Emacs found defuns by moving
- upward a level of parentheses until there were no more levels to go up.
- This always required scanning all the way back to the beginning of the
- buffer, even for a small function.  To speed up the operation, Emacs
- was changed to assume that any `(' (or other character assigned the
- syntactic class of opening-delimiter) at the left margin is the start
- of a defun.  This heuristic is nearly always right and avoids the
- costly scan; however, it mandates the convention described above.
- 
- 
- File: emacs,  Node: Program Indent,  Next: Matching,  Prev: Defuns,  Up: Programs
- 
- Indentation for Programs
- ========================
- 
-    The best way to keep a program properly indented is to use Emacs to
- re-indent it as you change it.  Emacs has commands to indent properly
- either a single line, a specified number of lines, or all of the lines
- inside a single parenthetical grouping.
- 
- * Menu:
- 
- * Basic Indent::	Indenting a single line.
- * Multi-line Indent::   Commands to reindent many lines at once.
- * Lisp Indent::		Specifying how each Lisp function should be indented.
- * C Indent::		Choosing an indentation style for C code.
- 
-    Emacs also provides a Lisp pretty-printer in the library `pp'.  This
- program prints a Lisp object with indentation chosen to look nice.
- 
- 
- File: emacs,  Node: Basic Indent,  Next: Multi-line Indent,  Up: Program Indent
- 
- Basic Program Indentation Commands
- ----------------------------------
- 
- `TAB'
-      Adjust indentation of current line.
- 
- `LFD'
-      Equivalent to RET followed by TAB (`newline-and-indent').
- 
-    The basic indentation command is TAB, which gives the current line
- the correct indentation as determined from the previous lines.  The
- function that TAB runs depends on the major mode; it is
- `lisp-indent-line' in Lisp mode, `c-indent-line' in C mode, etc.  These
- functions understand different syntaxes for different languages, but
- they all do about the same thing.  TAB in any programming language
- major mode inserts or deletes whitespace at the beginning of the
- current line, independent of where point is in the line.  If point is
- inside the whitespace at the beginning of the line, TAB leaves it at
- the end of that whitespace; otherwise, TAB leaves point fixed with
- respect to the characters around it.
- 
-    Use `C-q TAB' to insert a tab at point.
- 
-    When entering lines of new code, use LFD (`newline-and-indent'),
- which is equivalent to a RET followed by a TAB.  LFD creates a blank
- line, and then gives it the appropriate indentation.
- 
-    TAB indents the second and following lines of the body of a
- parenthetical grouping each under the preceding one; therefore, if you
- alter one line's indentation to be nonstandard, the lines below will
- tend to follow it.  This behavior is convenient in cases where you have
- overridden the standard result of TAB because you find it unaesthetic
- for a particular line.
- 
-    Remember that an open-parenthesis, open-brace or other opening
- delimiter at the left margin is assumed by Emacs (including the
- indentation routines) to be the start of a function.  Therefore, you
- must never have an opening delimiter in column zero that is not the
- beginning of a function, not even inside a string.  This restriction is
- vital for making the indentation commands fast; you must simply accept
- it.  *Note Defuns::, for more information on this.
- 
- 
- File: emacs,  Node: Multi-line Indent,  Next: Lisp Indent,  Prev: Basic Indent,  Up: Program Indent
- 
- Indenting Several Lines
- -----------------------
- 
-    When you wish to re-indent several lines of code which have been
- altered or moved to a different level in the list structure, you have
- several commands available.
- 
- `C-M-q'
-      Re-indent all the lines within one list (`indent-sexp').
- 
- `C-u TAB'
-      Shift an entire list rigidly sideways so that its first line is
-      properly indented.
- 
- `C-M-\'
-      Re-indent all lines in the region (`indent-region').
- 
-    You can re-indent the contents of a single list by positioning point
- before the beginning of it and typing `C-M-q' (`indent-sexp' in Lisp
- mode, `indent-c-exp' in C mode; also bound to other suitable commands
- in other modes).  The indentation of the line the sexp starts on is not
- changed; therefore, only the relative indentation within the list, and
- not its position, is changed.  To correct the position as well, type a
- TAB before the `C-M-q'.
- 
-    If the relative indentation within a list is correct but the
- indentation of its first line is not, go to that line and type `C-u
- TAB'.  TAB with a numeric argument reindents the current line as usual,
- then reindents by the same amount all the lines in the grouping
- starting on the current line.  In other words, it reindents the whole
- grouping rigidly as a unit.  It is clever, though, and does not alter
- lines that start inside strings, or C preprocessor lines when in C mode.
- 
-    Another way to specify the range to be re-indented is with the
- region.  The command `C-M-\' (`indent-region') applies TAB to every
- line whose first character is between point and mark.
- 
- 
- File: emacs,  Node: Lisp Indent,  Next: C Indent,  Prev: Multi-line Indent,  Up: Program Indent
- 
- Customizing Lisp Indentation
- ----------------------------
- 
-    The indentation pattern for a Lisp expression can depend on the
- function called by the expression.  For each Lisp function, you can
- choose among several predefined patterns of indentation, or define an
- arbitrary one with a Lisp program.
- 
-    The standard pattern of indentation is as follows: the second line
- of the expression is indented under the first argument, if that is on
- the same line as the beginning of the expression; otherwise, the second
- line is indented underneath the function name.  Each following line is
- indented under the previous line whose nesting depth is the same.
- 
-    If the variable `lisp-indent-offset' is non-`nil', it overrides the
- usual indentation pattern for the second line of an expression, so that
- such lines are always indented `lisp-indent-offset' more columns than
- the containing list.
- 
-    The standard pattern is overridden for certain functions.  Functions
- whose names start with `def' always indent the second line by
- `lisp-body-indent' extra columns beyond the open-parenthesis starting
- the expression.
- 
-    The standard pattern can be overridden in various ways for individual
- functions, according to the `lisp-indent-function' property of the
- function name.  There are four possibilities for this property:
- 
- `nil'
-      This is the same as no property; the standard indentation pattern
-      is used.
- 
- `defun'
-      The pattern used for function names that start with `def' is used
-      for this function also.
- 
- a number, NUMBER
-      The first NUMBER arguments of the function are "distinguished"
-      arguments; the rest are considered the "body" of the expression.
-      A line in the expression is indented according to whether the
-      first argument on it is distinguished or not.  If the argument is
-      part of the body, the line is indented `lisp-body-indent' more
-      columns than the open-parenthesis starting the containing
-      expression.  If the argument is distinguished and is either the
-      first or second argument, it is indented *twice* that many extra
-      columns.  If the argument is distinguished and not the first or
-      second argument, the standard pattern is followed for that line.
- 
- a symbol, SYMBOL
-      SYMBOL should be a function name; that function is called to
-      calculate the indentation of a line within this expression.  The
-      function receives two arguments:
-     STATE
-           The value returned by `parse-partial-sexp' (a Lisp primitive
-           for indentation and nesting computation) when it parses up to
-           the beginning of this line.
- 
-     POS
-           The position at which the line being indented begins.
- 
-      It should return either a number, which is the number of columns of
-      indentation for that line, or a list whose car is such a number.
-      The difference between returning a number and returning a list is
-      that a number says that all following lines at the same nesting
-      level should be indented just like this one; a list says that
-      following lines might call for different indentations.  This makes
-      a difference when the indentation is being computed by `C-M-q'; if
-      the value is a number, `C-M-q' need not recalculate indentation
-      for the following lines until the end of the list.
- 
- 
- File: emacs,  Node: C Indent,  Prev: Lisp Indent,  Up: Program Indent
- 
- Customizing C Indentation
- -------------------------
- 
-    Two variables control which commands perform C indentation and when.
- 
-    If `c-auto-newline' is non-`nil', newlines are inserted both before
- and after braces that you insert, and after colons and semicolons.
- Correct C indentation is done on all the lines that are made this way.
- 
-    If `c-tab-always-indent' is `nil', the TAB command in C mode does
- indentation only if point is at the left margin or within the line's
- indentation.  If there is non-whitespace to the left of point, then TAB
- just inserts a tab character in the buffer.  Normally, this variable is
- `t', and TAB always reindents the current line.  The default behavior
- means that to insert a real tab character you must quote it by typing
- `C-q' TAB.
- 
-    C does not have anything analogous to particular function names for
- which special forms of indentation are desirable.  However, it has a
- different need for customization facilities: many different styles of C
- indentation are in common use.
- 
-    There are six variables you can set to control the style that Emacs C
- mode uses.
- 
- `c-indent-level'
-      Indentation of C statements within surrounding block.  The
-      surrounding block's indentation is the indentation of the line on
-      which the open-brace appears.
- 
- `c-continued-statement-offset'
-      Extra indentation given to a substatement, such as the then-clause
-      of an if or body of a while.
- 
- `c-brace-offset'
-      Extra indentation for line if it starts with an open brace.
- 
- `c-brace-imaginary-offset'
-      An open brace following other text is treated as if it were this
-      far to the right of the start of its line.
- 
- `c-argdecl-indent'
-      Indentation level of declarations of C function arguments.
- 
- `c-label-offset'
-      Extra indentation for line that is a label, or case or default.
- 
-    The variable `c-indent-level' controls the indentation for C
- statements with respect to the surrounding block.  In the example
- 
-          {
-            foo ();
- 
- the difference in indentation between the lines is `c-indent-level'.
- Its standard value is 2.
- 
-    If the open-brace beginning the compound statement is not at the
- beginning of its line, the `c-indent-level' is added to the indentation
- of the line, not the column of the open-brace.  For example,
- 
-      if (losing) {
-        do_this ();
- 
- One popular indentation style is that which results from setting
- `c-indent-level' to 8 and putting open-braces at the end of a line in
- this way.  I prefer to put the open-brace on a separate line.
- 
-    In fact, the value of the variable `c-brace-imaginary-offset' is
- also added to the indentation of such a statement.  Normally this
- variable is zero.  Think of this variable as the imaginary position of
- the open brace, relative to the first nonblank character on the line.
- By setting this variable to 4 and `c-indent-level' to 0, you can get
- this style:
- 
-      if (x == y) {
-          do_it ();
-          }
- 
-    When `c-indent-level' is zero, the statements inside most braces
- will line up right under the open brace.  But there is an exception made
- for braces in column zero, such as surrounding a function's body.  The
- statements just inside it do not go at column zero.  Instead,
- `c-brace-offset' and `c-continued-statement-offset' (see below) are
- added to produce a typical offset between brace levels, and the
- statements are indented that far.
- 
-    `c-continued-statement-offset' controls the extra indentation for a
- line that starts within a statement (but not within parentheses or
- brackets).  These lines are usually statements that are within other
- statements, such as the then-clauses of `if' statements and the bodies
- of `while' statements.  This parameter is the difference in indentation
- between the two lines in
- 
-      if (x == y)
-        do_it ();
- 
- Its standard value is 2.  Some popular indentation styles correspond to
- a value of zero for `c-continued-statement-offset'.
- 
-    `c-brace-offset' is the extra indentation given to a line that
- starts with an open-brace.  Its standard value is zero; compare
- 
-      if (x == y)
-        {
- 
- with
- 
-      if (x == y)
-        do_it ();
- 
- if `c-brace-offset' were set to 4, the first example would become
- 
-      if (x == y)
-            {
- 
-    `c-argdecl-indent' controls the indentation of declarations of the
- arguments of a C function.  It is absolute: argument declarations
- receive exactly `c-argdecl-indent' spaces.  The standard value is 5,
- resulting in code like this:
- 
-      char *
-      index (string, c)
-           char *string;
-           int c;
- 
-    `c-label-offset' is the extra indentation given to a line that
- contains a label, a case statement, or a `default:' statement.  Its
- standard value is -2, resulting in code like this
- 
-      switch (c)
-        {
-        case 'x':
- 
- If `c-label-offset' were zero, the same code would be indented as
- 
-      switch (c)
-        {
-          case 'x':
- 
- This example assumes that the other variables above also have their
- standard values.
- 
-    I strongly recommend that you try out the indentation style produced
- by the standard settings of these variables, together with putting open
- braces on separate lines.  You can see how it looks in all the C source
- files of GNU Emacs.
- 
- 
- File: emacs,  Node: Matching,  Next: Comments,  Prev: Program Indent,  Up: Programs
- 
- Automatic Display Of Matching Parentheses
- =========================================
- 
-    The Emacs parenthesis-matching feature is designed to show
- automatically how parentheses match in the text.  Whenever you type a
- self-inserting character that is a closing delimiter, the cursor moves
- momentarily to the location of the matching opening delimiter, provided
- that is on the screen.  If it is not on the screen, some text near it is
- displayed in the echo area.  Either way, you can tell what grouping is
- being closed off.
- 
-    In Lisp, automatic matching applies only to parentheses.  In C, it
- applies to braces and brackets too.  Emacs knows which characters to
- regard as matching delimiters based on the syntax table, which is set
- by the major mode.  *Note Syntax::.
- 
-    If the opening delimiter and closing delimiter are mismatched--such
- as in `[x)'--a warning message is displayed in the echo area.  The
- correct matches are specified in the syntax table.
- 
-    Three variables control parenthesis match display.
- `blink-matching-paren' turns the feature on or off; `nil' turns it off,
- but the default is `t' to turn match display on.
- `blink-matching-delay' says how many seconds to wait; the default is 1,
- but on some systems it is useful to specify a fraction of a second.
- `blink-matching-paren-distance' specifies how many characters back to
- search to find the matching opening delimiter.  If the match is not
- found in that far, scanning stops, and nothing is displayed.  This is
- to prevent scanning for the matching delimiter from wasting lots of
- time when there is no match.  The default is 12,000.
- 
-    When using X Windows, you can request a more powerful kind of
- automatic parenthesis matching by loading the `paren' library.  To load
- it, type `M-x load-library RET paren RET'.  This library turns off the
- usual kind of matching parenthesis display and substitutes another:
- whenever point is after a close parenthesis, the close parenthesis and
- its matching open parenthesis are both highlighted; otherwise, if point
- is before an open parenthesis, the matching close parenthesis is
- highlighted.  (There is no need to highlight the open parenthesis after
- point because the cursor appears on top of that character.)
- 
- 
- File: emacs,  Node: Comments,  Next: Balanced Editing,  Prev: Matching,  Up: Programs
- 
- Manipulating Comments
- =====================
- 
-    Because comments are such an important part of programming, Emacs
- provides special commands for editing and inserting comments.
- 
- * Menu:
- 
- * Comment Commands::
- * Multi-Line Comments::
- * Options for Comments::
- 
- 
- File: emacs,  Node: Comment Commands,  Next: Multi-Line Comments,  Up: Comments
- 
- Comment Commands
- ----------------
- 
-    The comment commands insert, kill and align comments.
- 
- `M-;'
-      Insert or align comment (`indent-for-comment').
- 
- `C-x ;'
-      Set comment column (`set-comment-column').
- 
- `C-u - C-x ;'
-      Kill comment on current line (`kill-comment').
- 
- `M-LFD'
-      Like RET followed by inserting and aligning a comment
-      (`indent-new-comment-line').
- 
- `M-x comment-region'
-      Add or remove comment delimiters on all the lines in the region.
- 
-    The command that creates a comment is `M-;' (`indent-for-comment').
- If there is no comment already on the line, a new comment is created,
- aligned at a specific column called the "comment column".  The comment
- is created by inserting the string Emacs thinks comments should start
- with (the value of `comment-start'; see below).  Point is left after
- that string.  If the text of the line extends past the comment column,
- then the indentation is done to a suitable boundary (usually, at least
- one space is inserted).  If the major mode has specified a string to
- terminate comments, that is inserted after point, to keep the syntax
- valid.
- 
-    `M-;' can also be used to align an existing comment.  If a line
- already contains the string that starts comments, then `M-;' just moves
- point after it and re-indents it to the conventional place.  Exception:
- comments starting in column 0 are not moved.
- 
-    Some major modes have special rules for indenting certain kinds of
- comments in certain contexts.  For example, in Lisp code, comments which
- start with two semicolons are indented as if they were lines of code,
- instead of at the comment column.  Comments which start with three
- semicolons are supposed to start at the left margin.  Emacs understands
- these conventions by indenting a double-semicolon comment using TAB,
- and by not changing the indentation of a triple-semicolon comment at
- all.
- 
-      ;; This function is just an example
-      ;;; Here either two or three semicolons are appropriate.
-      (defun foo (x)
-      ;;; And now, the first part of the function:
-        ;; The following line adds one.
-        (1+ x))           ; This line adds one.
- 
-    In C code, a comment preceded on its line by nothing but whitespace
- is indented like a line of code.
- 
-    Even when an existing comment is properly aligned, `M-;' is still
- useful for moving directly to the start of the comment.
- 
-    `C-u - C-x ;' (`kill-comment') kills the comment on the current line,
- if there is one.  The indentation before the start of the comment is
- killed as well.  If there does not appear to be a comment in the line,
- nothing is done.  To reinsert the comment on another line, move to the
- end of that line, do `C-y', and then do `M-;' to realign it.  Note that
- `C-u - C-x ;' is not a distinct key; it is `C-x ;'
- (`set-comment-column') with a negative argument.  That command is
- programmed so that when it receives a negative argument it calls
- `kill-comment'.  However, `kill-comment' is a valid command which you
- could bind directly to a key if you wanted to.
- 
- 
- File: emacs,  Node: Multi-Line Comments,  Next: Options for Comments,  Prev: Comment Commands,  Up: Comments
- 
- Multiple Lines of Comments
- --------------------------
- 
-    If you are typing a comment and wish to continue it on another line,
- you can use the command `M-LFD' (`indent-new-comment-line').  This
- terminates the comment you are typing, creates a new blank line
- afterward, and begins a new comment indented under the old one.  When
- Auto Fill mode is on, going past the fill column while typing a comment
- causes the comment to be continued in just this fashion.  If point is
- not at the end of the line when `M-LFD' is typed, the text on the rest
- of the line becomes part of the new comment line.
- 
-    To turn existing lines into comment lines, use the `M-x
- comment-region' command.  It adds comment delimiters to the lines that
- start in the region, thus commenting them out.  With a negative
- argument, it does the opposite--it deletes comment delimiters from the
- lines in the region.
- 
-    With a positive argument, `comment-region' duplicates the last
- character of the comment start sequence it adds; the argument specifies
- how many copies of the character to insert.  Thus, in Lisp mode, `C-u 2
- M-x comment-region' adds `;;' to each line.  Duplicating the comment
- delimiter is a way of calling attention to the comment.  It can also
- affect how the comment is indented.  In Lisp, for proper indentation,
- you should use an argument of two, if between defuns, and three, if
- within a defun.
- 
- 
- File: emacs,  Node: Options for Comments,  Prev: Multi-Line Comments,  Up: Comments
- 
- Options Controlling Comments
- ----------------------------
- 
-    The comment column is stored in the variable `comment-column'.  You
- can set it to a number explicitly.  Alternatively, the command `C-x ;'
- (`set-comment-column') sets the comment column to the column point is
- at.  `C-u C-x ;' sets the comment column to match the last comment
- before point in the buffer, and then does a `M-;' to align the current
- line's comment under the previous one.  Note that `C-u - C-x ;' runs
- the function `kill-comment' as described above.
- 
-    The variable `comment-column' is per-buffer: setting the variable in
- the normal fashion affects only the current buffer, but there is a
- default value which you can change with `setq-default'.  *Note
- Locals::.  Many major modes initialize this variable for the current
- buffer.
- 
-    The comment commands recognize comments based on the regular
- expression that is the value of the variable `comment-start-skip'.
- Make sure this regexp does not match the null string.  It may match more
- than the comment starting delimiter in the strictest sense of the word;
- for example, in C mode the value of the variable is `"/\\*+ *"', which
- matches extra stars and spaces after the `/*' itself.  (Note that `\\'
- is needed in Lisp syntax to include a `\' in the string, which is
- needed to deny the first star its special meaning in regexp syntax.
- *Note Regexps::.)
- 
-    When a comment command makes a new comment, it inserts the value of
- `comment-start' to begin it.  The value of `comment-end' is inserted
- after point, so that it will follow the text that you will insert into
- the comment.  In C mode, `comment-start' has the value `"/* "' and
- `comment-end' has the value `" */"'.
- 
-    The variable `comment-multi-line' controls how `M-LFD'
- (`indent-new-comment-line') behaves when used inside a comment.  If
- `comment-multi-line' is `nil', as it normally is, then the comment on
- the starting line is terminated and a new comment is started on the new
- following line.  If `comment-multi-line' is not `nil', then the new
- following line is set up as part of the same comment that was found on
- the starting line.  This is done by not inserting a terminator on the
- old line, and not inserting a starter on the new line.  In languages
- where multi-line comments work, the choice of value for this variable
- is a matter of taste.
- 
-    The variable `comment-indent-function' should contain a function
- that will be called to compute the indentation for a newly inserted
- comment or for aligning an existing comment.  It is set differently by
- various major modes.  The function is called with no arguments, but with
- point at the beginning of the comment, or at the end of a line if a new
- comment is to be inserted.  It should return the column in which the
- comment ought to start.  For example, in Lisp mode, the indent hook
- function bases its decision on how many semicolons begin an existing
- comment, and on the code in the preceding lines.
- 
- 
- File: emacs,  Node: Balanced Editing,  Next: Symbol Completion,  Prev: Comments,  Up: Programs
- 
- Editing Without Unbalanced Parentheses
- ======================================
- 
- `M-('
-      Put parentheses around next sexp(s) (`insert-parentheses').
- 
- `M-)'
-      Move past next close parenthesis and re-indent
-      (`move-over-close-and-reindent').
- 
-    The commands `M-(' (`insert-parentheses') and `M-)'
- (`move-over-close-and-reindent') are designed to facilitate a style of
- editing which keeps parentheses balanced at all times.  `M-(' inserts a
- pair of parentheses, either together as in `()', or, if given an
- argument, around the next several sexps.  It leaves point after the
- open parenthesis.  The command `M-)' moves past the close parenthesis,
- deleting any indentation preceding it (in this example there is none),
- and indenting with LFD after it.
- 
-    For example, instead of typing `( F O O )', you can type `M-( F O
- O', which has the same effect except for leaving the cursor before the
- close parenthesis.
- 
-    `M-(' may insert a space before the open parenthesis, depending on
- the syntax class of the preceding character.  Set
- `parens-dont-require-spaces' to a non-`nil' value if you wish to
- inhibit this.
- 
- 
- File: emacs,  Node: Symbol Completion,  Next: Documentation,  Prev: Balanced Editing,  Up: Programs
- 
- Completion for Symbol Names
- ===========================
- 
-    Usually completion happens in the minibuffer.  But one kind of
- completion is available in all buffers: completion for symbol names.
- 
-    The character `M-TAB' runs a command to complete the partial symbol
- before point against the set of meaningful symbol names.  Any
- additional characters determined by the partial name are inserted at
- point.
- 
-    If the partial name in the buffer has more than one possible
- completion and they have no additional characters in common, a list of
- all possible completions is displayed in another window.
- 
-    There are two ways of determining the set of legitimate symbol names
- to complete against.  In most major modes, this uses a tags table
- (*note Tags::.); the legitimate symbol names are the tag names listed in
- the tags table file.  The command which implements this is
- `complete-tag'.
- 
-    In Emacs-Lisp mode, the name space for completion normally consists
- of nontrivial symbols present in Emacs--those that have function
- definitions, values or properties.  However, if there is an
- open-parenthesis immediately before the beginning of the partial symbol,
- only symbols with function definitions are considered as completions.
- The command which implements this is `lisp-complete-symbol'.
- 
-    In Text mode and related modes, `M-TAB' completes words based on the
- spell-checker's dictionary.  *Note Spelling::.
- 
- 
- File: emacs,  Node: Documentation,  Next: Change Log,  Prev: Symbol Completion,  Up: Programs
- 
- Documentation Commands
- ======================
- 
-    As you edit Lisp code to be run in Emacs, the commands `C-h f'
- (`describe-function') and `C-h v' (`describe-variable') can be used to
- print documentation of functions and variables that you want to call.
- These commands use the minibuffer to read the name of a function or
- variable to document, and display the documentation in a window.
- 
-    For extra convenience, these commands provide default arguments
- based on the code in the neighborhood of point.  `C-h f' sets the
- default to the function called in the innermost list containing point.
- `C-h v' uses the symbol name around or adjacent to point as its default.
- 
-    Documentation on operating system commands, library functions and
- system calls can be obtained with the `M-x manual-entry' command.  This
- reads a topic as an argument, and displays the "man page" on that
- topic.  `manual-entry' starts a background process that formats the
- manual page, by running the `man' program.  The result goes in a buffer
- named `*man TOPIC*'.  These buffers use a special major mode, Man mode,
- that facilitates scrolling and examining other manual pages.  For
- details, type `C-h m' while in a man page buffer.
- 
-    For a long man page, setting the faces properly can take substantial
- time.  By default, Emacs uses faces in man pages if you are using X
- Windows.  You can turn off use of faces in man pages by setting the
- variable `Man-fontify-manpage-flag' to `nil'.
- 
-    If you insert the text of a man page into an Emacs buffer in some
- other fashion, you can use the command `M-x Man-fontify-manpage' to
- perform the same conversions that `M-x manual-entry' does.
- 
-    Eventually the GNU project hopes to replace most man pages with
- better-organized manuals that you can browse with Info.  *Note Misc
- Help::.  Since this process is only partially completed, it is still
- useful to read manual pages.
- 
- 
- File: emacs,  Node: Change Log,  Next: Tags,  Prev: Documentation,  Up: Programs
- 
- Change Logs
- ===========
- 
-    The Emacs command `C-x 4 a' adds a new entry to the change log file
- for the file you are editing (`add-change-log-entry-other-window').
- 
-    A change log file contains a chronological record of when and why you
- have changed a program, consisting of a sequence of entries describing
- individual changes.  Normally it is kept in a file called `ChangeLog'
- in the same directory as the file you are editing, or one of its parent
- directories.  A single `ChangeLog' file can record changes for all the
- files in its directory and all its subdirectories.
- 
-    A change log entry starts with a header line that contains your name,
- your email address (taken from the variable `user-mail-address'), and
- the current date and time.  Aside from these header lines, every line
- in the change log starts with a space or a tab.  The bulk of the entry
- consists of "items", each of which starts with a line starting with
- whitespace and a star.  Here are two entries, each with two items:
- 
-      Wed May  5 14:11:45 1993  Richard Stallman  <rms@gnu.ai.mit.edu>
-      
-              * man.el: Rename symbols `man-*' to `Man-*'.
-              (manual-entry): Make prompt string clearer.
-      
-              * simple.el (blink-matching-paren-distance):
-              Change default to 12,000.
-      
-      Tue May  4 12:42:19 1993  Richard Stallman  <rms@gnu.ai.mit.edu>
-      
-              * vc.el (minor-mode-map-alist): Don't use it if it's void.
-              (vc-cancel-version): Doc fix.
- 
-    One entry can describe several changes; each change should have its
- own item.  Normally there should be a blank line between items.  When
- items are related (parts of the same change, in different places), group
- them by leaving no blank line between them.  The second entry above
- contains two items grouped in this way.
- 
-    `C-x 4 a' visits the change log file and creates a new entry unless
- the most recent entry is for today's date and your name.  It also
- creates a new item for the current file.  For many languages, it can
- even guess the name of the function or other object that was changed.
- 
-    The change log file is visited in Change Log mode.  In this major
- mode, each bunch of grouped items counts as one paragraph, and each
- entry is considered a page.  This facilitates editing the entries.  LFD
- and auto-fill indent each new line like the previous line; this is
- convenient for entering the contents of an entry.
- 
-    Version control systems are another way keep track of changes in your
- program and keep a change log.  *Note Log Entries::.
- 
- 
- File: emacs,  Node: Tags,  Next: Emerge,  Prev: Change Log,  Up: Programs
- 
- Tags Tables
- ===========
- 
-    A "tags table" is a description of how a multi-file program is
- broken up into files.  It lists the names of the component files and the
- names and positions of the functions (or other named subunits) in each
- file.  Grouping the related files makes it possible to search or replace
- through all the files with one command.  Recording the function names
- and positions makes possible the `M-.'  command which finds the
- definition of a function by looking up which of the files it is in.
- 
-    Tags tables are stored in files called "tags table files".  The
- conventional name for a tags table file is `TAGS'.
- 
-    Each entry in the tags table records the name of one tag, the name
- of the file that the tag is defined in (implicitly), and the position
- in that file of the tag's definition.
- 
-    Just what names from the described files are recorded in the tags
- table depends on the programming language of the described file.  They
- normally include all functions and subroutines, and may also include
- global variables, data types, and anything else convenient.  Each name
- recorded is called a "tag".
- 
- * Menu:
- 
- * Tag Syntax::		Tag syntax for various types of code and text files.
- * Create Tags Table::	Creating a tags table with `etags'.
- * Select Tags Table::	How to visit a tags table.
- * Find Tag::		Commands to find the definition of a specific tag.
- * Tags Search::		Using a tags table for searching and replacing.
- * Tags Stepping::	Visiting files in a tags table, one by one.
- * List Tags::		Listing and finding tags defined in a file.
- 
- 
- File: emacs,  Node: Tag Syntax,  Next: Create Tags Table,  Up: Tags
- 
- Source File Tag Syntax
- ----------------------
- 
-    * In Lisp code, any function defined with `defun', any variable
-      defined with `defvar' or `defconst', and in general the first
-      argument of any expression that starts with `(def' in column zero,
-      is a tag.
- 
-    * In Scheme code, tags include anything defined with `def' or with a
-      construct whose name starts with `def'.  They also include
-      variables set with `set!' at top level in the file.
- 
-    * In C code, any C function or typedef is a tag, and so are
-      definitions of struct, union and enum.  Any `#define' is also a
-      tag, unless `--no-defines' is specified when the tags table is
-      constructed, which sometimes makes the tags file much smaller.  In
-      C++ code, member functions are also recognized.
- 
-    * In Yacc or Bison input files, each rule defines as a tag the
-      nonterminal it constructs.  The portions of the file that contain
-      C code are parsed as C code.
- 
-    * In Fortran code, functions and subroutines are tags.
- 
-    * In Pascal code, the tags are the functions and procedures defined
-      in the file.
- 
-    * In Prolog code, a tag name appears at the left margin.
- 
-    * In assembler code, labels appearing at the beginning of a line,
-      followed by a colon, are tags.
- 
-    * In LaTeX text, the argument of any of the commands `\chapter',
-      `\section', `\subsection', `\subsubsection', `\eqno', `\label',
-      `\ref', `\cite', `\bibitem' and `\typeout' is a tag.
- 
-    * You can also generate tags based on regexp matching (*note Create
-      Tags Table::.) for any text file.
- 
- 
- File: emacs,  Node: Create Tags Table,  Next: Select Tags Table,  Prev: Tag Syntax,  Up: Tags
- 
- Creating Tags Tables
- --------------------
- 
-    The `etags' program is used to create a tags table file.  It knows
- the syntax of several languages, as described in *Note Tag Syntax::.
- Here is how to run `etags':
- 
-      etags INPUTFILES...
- 
- The `etags' program reads the specified files, and writes a tags table
- named `TAGS' in the current working directory.  `etags' recognizes the
- language used in an input file based on its file name and contents.
- You can specify the language with the `--language=NAME' option,
- described below.
- 
-    If the tags table data become outdated due to changes in the files
- described in the table, the way to update the tags table is the same
- way it was made in the first place.  It is not necessary to do this
- often.
- 
-    If the tags table fails to record a tag, or records it for the wrong
- file, then Emacs cannot possibly find its definition.  However, if the
- position recorded in the tags table becomes a little bit wrong (due to
- some editing in the file that the tag definition is in), the only
- consequence is a slight delay in finding the tag.  Even if the stored
- position is very wrong, Emacs will still find the tag, but it must
- search the entire file for it.
- 
-    So you should update a tags table when you define new tags that you
- want to have listed, or when you move tag definitions from one file to
- another, or when changes become substantial.  Normally there is no need
- to update the tags table after each edit, or even every day.
- 
-    One tags table can effectively include another.  Specify the included
- tags file name with the `--include=FILE' option when creating the file
- that is to include it.  The latter file then acts as if it contained
- all the files specified in the included file, as well as the files it
- directly contains.
- 
-    When you want to make a tags table from a great number of files, you
- may have problems listing them on the command line, because some systems
- have a limit on its length.  The simplest way to circumvent this limit
- is to tell `etags' to read the file names from its standard input, by
- typing a dash in place of the file names, like this:
- 
-      find . -name "*.[chCH]" -print | etags -
- 
-    Use the option `--language=NAME' to specify the language explicitly.
- You can intermix these options with file names; each one applies to
- the file names that follow it.  Specify `--language=auto' to tell
- `etags' to resume guessing the language from the file names and file
- contents.  Specify `--language=none' to turn off language-specific
- processing entirely; then `etags' recognizes tags by regexp matching
- alone.  `etags --help' prints the list of the languages `etags' knows,
- and the file name rules for guessing the language.
- 
-    The `--regex' option provides a general way of recognizing tags
- based on regexp matching.  You can freely intermix it with file names.
- Each `--regex' option adds to the preceding ones, and applies only to
- the following files.  The syntax is:
- 
-      --regex=/TAGREGEXP[/NAMEREGEXP]/
- 
- where TAGREGEXP is used to match the lines to tag.  It is always
- anchored, that is, it behaves as if preceded by `^'.  If you want to
- account for indentation, just match any initial number of blanks by
- beginning your regular expression with `[ \t]*'.  In the regular
- expressions, `\' quotes the next character, and `\t' stands for the tab
- character.  Note that `etags' does not handle the other C escape
- sequences for special characters.
- 
-    You should not match more characters with TAGREGEXP than that needed
- to recognize what you want to tag.  If the match is such that more
- characters than needed are unavoidably matched by TAGREGEXP, you may
- find useful to add a NAMEREGEXP, in order to narrow the tag scope.  You
- can find some examples below.
- 
-    The `-R' option deletes all the regexps defined with `--regex'
- options.  It applies to the file names following it, as you can see
- from the following example:
- 
-      etags --regex=/REG1/ voo.doo --regex=/REG2/ \
-          bar.ber -R --lang=lisp los.er
- 
- Here `etags' chooses the parsing language for `voo.doo' and `bar.ber'
- according to their contents.  `etags' also uses REG1 to recognize
- additional tags in `voo.doo', and both REG1 and REG2 to recognize
- additional tags in `bar.ber'.  `etags' uses the Lisp tags rules, and no
- regexp matching, to recognize tags in `los.er'.
- 
-    Here are some more examples.  The regexps are quoted to protect them
- from shell interpretation.
- 
- Tag the `DEFVAR' macros in the emacs source files:
- 
-      --regex='/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/'
- 
- Tag VHDL files (this example is a single long line, broken here for
- formatting reasons):
- 
-      --language=none
-      --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ ]* +OF/'
-      --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\
-      \( BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'
- 
- Tag Cobol files (every label starting in column seven):
- 
-      --language=none --regex='/.......[a-zA-Z0-9-]+\./'
- 
- Tag Postscript files (every label starting in column one):
- 
-      --language=none --regex='#/[^ \t{]+#/'
- 
- Tag TCL files (this last example shows the usage of a NAMEREGEXP):
- 
-      --lang=none --regex='/proc[ \t]+\([^ \t]+\)/\1/'
- 
-    For a list of the other available `etags' options, execute `etags
- --help'.
- 
- 
- File: emacs,  Node: Select Tags Table,  Next: Find Tag,  Prev: Create Tags Table,  Up: Tags
- 
- Selecting a Tags Table
- ----------------------
- 
-    Emacs has at any time one "selected" tags table, and all the commands
- for working with tags tables use the selected one.  To select a tags
- table, type `M-x visit-tags-table', which reads the tags table file
- name as an argument.  The name `TAGS' in the default directory is used
- as the default file name.
- 
-    All this command does is store the file name in the variable
- `tags-file-name'.  Emacs does not actually read in the tags table
- contents until you try to use them.  Setting this variable yourself is
- just as good as using `visit-tags-table'.  The variable's initial value
- is `nil'; that value tells all the commands for working with tags tables
- that they must ask for a tags table file name to use.
- 
-    Using `visit-tags-table' when a tags table is already loaded gives
- you a choice: you can add the new tags table to the current list of
- tags tables, or start a new list.  The tags commands use all the tags
- tables in the current list.  If you start a new list, the new tags table
- is used *instead* of others.  If you add the new table to the current
- list, it is used *as well as* the others.  When the tags commands scan
- the list of tags tables, they don't always start at the beginning of
- the list; they start with the first tags table (if any) that describes
- the current file, proceed from there to the end of the list, and then
- scan from the beginning of the list until they have covered all the
- tables in the list.
- 
-    You can specify a precise list of tags tables by setting the variable
- `tags-table-list' to a list of strings, like this:
- 
-      (setq tags-table-list
-            '("~/emacs" "/usr/local/lib/emacs/src"))
- 
- This tells the tags commands to look at the `TAGS' files in your
- `~/emacs' directory and in the `/usr/local/lib/emacs/src' directory.
- The order depends on which file you are in and which tags table
- mentions that file, as explained above.
- 
-    Do not set both `tags-file-name' and `tags-table-list'.
- 
- 
- File: emacs,  Node: Find Tag,  Next: Tags Search,  Prev: Select Tags Table,  Up: Tags
- 
- Finding a Tag
- -------------
- 
-    The most important thing that a tags table enables you to do is to
- find the definition of a specific tag.
- 
- `M-. TAG RET'
-      Find first definition of TAG (`find-tag').
- 
- `C-u M-.'
-      Find next alternate definition of last tag specified.
- 
- `C-u - M-.'
-      Go back to previous tag found.
- 
- `C-M-. PATTERN RET'
-      Find a tag whose name matches PATTERN (`find-tag-regexp').
- 
- `C-u C-M-.'
-      Find the next tag whose name matches the last pattern used.
- 
- `C-x 4 . TAG RET'
-      Find first definition of TAG, but display it in another window
-      (`find-tag-other-window').
- 
- `C-x 5 . TAG RET'
-      Find first definition of TAG, and create a new frame to select the
-      buffer (`find-tag-other-frame').
- 
-    `M-.' (`find-tag') is the command to find the definition of a
- specified tag.  It searches through the tags table for that tag, as a
- string, and then uses the tags table info to determine the file that the
- definition is in and the approximate character position in the file of
- the definition.  Then `find-tag' visits that file, moves point to the
- approximate character position, and searches ever-increasing distances
- away to find the tag definition.
- 
-    If an empty argument is given (just type RET), the sexp in the
- buffer before or around point is used as the TAG argument.  *Note
- Lists::, for info on sexps.
- 
-    You don't need to give `M-.' the full name of the tag; a part will
- do.  This is because `M-.' finds tags in the table which contain TAG as
- a substring.  However, it prefers an exact match to a substring match.
- To find other tags that match the same substring, give `find-tag' a
- numeric argument, as in `C-u M-.'; this does not read a tag name, but
- continues searching the tags table's text for another tag containing
- the same substring last used.  If you have a real META key, `M-0 M-.'
- is an easier alternative to `C-u M-.'.
- 
-    Like most commands that can switch buffers, `find-tag' has a variant
- that displays the new buffer in another window, and one that makes a
- new frame for it.  The former is `C-x 4 .', which invokes the command
- `find-tag-other-window'.  The latter is `C-x 5 .', which invokes
- `find-tag-other-frame'.
- 
-    To move back to places you've found tags recently, use `C-u - M-.';
- more generally, `M-.' with a negative numeric argument.  This command
- can take you to another buffer.  `C-x 4 .' with a negative argument
- finds the previous tag location in another window.
- 
-    The command `C-M-.' (`find-tag-regexp') visits the tags that match a
- specified regular expression.  It is just like `M-.'  except that it
- does regexp matching instead of substring matching.
- 
- 
- File: emacs,  Node: Tags Search,  Next: Tags Stepping,  Prev: Find Tag,  Up: Tags
- 
- Searching and Replacing with Tags Tables
- ----------------------------------------
- 
-    The commands in this section visit and search all the files listed
- in the selected tags table, one by one.  For these commands, the tags
- table serves only to specify a sequence of files to search.
- 
- `M-x tags-search RET REGEXP RET'
-      Search for REGEXP through the files in the selected tags table.
- 
- `M-x tags-query-replace RET REGEXP RET REPLACEMENT RET'
-      Perform a `query-replace-regexp' on each file in the selected tags
-      table.
- 
- `M-,'
-      Restart one of the commands above, from the current location of
-      point (`tags-loop-continue').
- 
-    `M-x tags-search' reads a regexp using the minibuffer, then searches
- for matches in all the files in the selected tags table, one file at a
- time.  It displays the name of the file being searched so you can
- follow its progress.  As soon as it finds an occurrence, `tags-search'
- returns.
- 
-    Having found one match, you probably want to find all the rest.  To
- find one more match, type `M-,' (`tags-loop-continue') to resume the
- `tags-search'.  This searches the rest of the current buffer, followed
- by the remaining files of the tags table.
- 
-    `M-x tags-query-replace' performs a single `query-replace-regexp'
- through all the files in the tags table.  It reads a regexp to search
- for and a string to replace with, just like ordinary `M-x
- query-replace-regexp'.  It searches much like `M-x tags-search', but
- repeatedly, processing matches according to your input.  *Note
- Replace::, for more information on query replace.
- 
-    It is possible to get through all the files in the tags table with a
- single invocation of `M-x tags-query-replace'.  But often it is useful
- to exit temporarily, which you can do with any input event that has no
- special query replace meaning.  You can resume the query replace
- subsequently by typing `M-,'; this command resumes the last tags search
- or replace command that you did.
- 
-    The commands in this section carry out much broader searches than the
- `find-tag' family.  The `find-tag' commands search only for definitions
- of tags that match your substring or regexp.  The commands
- `tags-search' and `tags-query-replace' find every occurrence of the
- regexp, as ordinary search commands and replace commands do in the
- current buffer.
- 
-    These commands create buffers only temporarily for the files that
- they have to search (those which are not already visited in Emacs
- buffers).  Buffers in which no match is found are quickly killed; the
- others continue to exist.
- 
-    It may have struck you that `tags-search' is a lot like `grep'.  You
- can also run `grep' itself as an inferior of Emacs and have Emacs show
- you the matching lines one by one.  This works much like running a
- compilation; finding the source locations of the `grep' matches works
- like finding the compilation errors.  *Note Compilation::.
- 
--- 0 ----
Index: emacs/info/emacs-12
diff -c emacs/info/emacs-12:1.1.1.2 emacs/info/emacs-12:removed
*** emacs/info/emacs-12:1.1.1.2	Mon Jul 22 01:51:45 1996
--- emacs/info/emacs-12	Fri Aug  2 20:04:22 1996
***************
*** 1,1227 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Tags Stepping,  Next: List Tags,  Prev: Tags Search,  Up: Tags
- 
- Stepping Through a Tags Table
- -----------------------------
- 
-    If you wish to process all the files in the selected tags table, but
- not in the specific ways that `M-x tags-search' and `M-x
- tags-query-replace' do, you can use `M-x next-file' to visit the files
- one by one.
- 
- `C-u M-x next-file'
-      Visit the first file in the tags table, and prepare to advance
-      sequentially by files.
- 
- `M-x next-file'
-      Visit the next file in the selected tags table.
- 
- 
- File: emacs,  Node: List Tags,  Prev: Tags Stepping,  Up: Tags
- 
- Tags Table Inquiries
- --------------------
- 
- `M-x list-tags RET FILE RET'
-      Display a list of the tags defined in the program file `file'.
- 
- `M-x tags-apropos RET REGEXP RET'
-      Display a list of all tags matching REGEXP.
- 
-    `M-x list-tags' reads the name of one of the files described by the
- selected tags table, and displays a list of all the tags defined in
- that file.  The "file name" argument is really just a string to compare
- against the file names recorded in the tags table; it is read as a
- string rather than as a file name.  Therefore, completion and
- defaulting are not available, and you must enter the file name the same
- way it appears in the tags table.  Do not include a directory as part of
- the file name unless the file name recorded in the tags table includes a
- directory.
- 
-    `M-x tags-apropos' is like `apropos' for tags (*note Apropos::.).
- It reads a regexp, then finds all the tags in the selected tags table
- whose entries match that regexp, and displays the tag names found.
- 
-    You can also perform completion in the buffer on the name space of
- tag names in the current tags tables.  *Note Symbol Completion::.
- 
- 
- File: emacs,  Node: Emerge,  Next: C Mode,  Prev: Tags,  Up: Programs
- 
- Merging Files with Emerge
- =========================
- 
-    It's not unusual for programmers to get their signals crossed and
- modify the same program in two different directions.  To recover from
- this confusion, you need to merge the two versions.  Emerge makes this
- easier.  See also *Note Comparing Files::.
- 
- * Menu:
- 
- * Overview of Emerge::	    How to start Emerge.  Basic concepts.
- * Submodes of Emerge::      Fast mode vs. Edit mode.
- 			      Skip Prefers mode and Auto Advance mode.
- * State of Difference::	    You do the merge by specifying state A or B
- 			      for each difference.
- * Merge Commands::	    Commands for selecting a difference,
- 			      changing states of differences, etc.
- * Exiting Emerge::	    What to do when you've finished the merge.
- * Combining in Emerge::	    How to keep both alternatives for a difference.
- * Fine Points of Emerge::   Misc.
- 
- 
- File: emacs,  Node: Overview of Emerge,  Next: Submodes of Emerge,  Up: Emerge
- 
- Overview of Emerge
- ------------------
- 
-    To start Emerge, run one of these four commands:
- 
- `M-x emerge-files'
-      Merge two specified files.
- 
- `M-x emerge-files-with-ancestor'
-      Merge two specified files, with reference to a common ancestor.
- 
- `M-x emerge-buffers'
-      Merge two buffers.
- 
- `M-x emerge-buffers-with-ancestor'
-      Merge two buffers with reference to a common ancestor in a third
-      buffer.
- 
-    The Emerge commands compare two files or buffers, and display the
- comparison in three buffers: one for each input text (the "A buffer"
- and the "B buffer"), and one (the "merge buffer") where merging takes
- place.  The merge buffer shows the full merged text, not just the
- differences.  Wherever the two input texts differ, you can choose which
- one of them to include in the merge buffer.
- 
-    The Emerge commands that take input from existing buffers use only
- the accessible portions of those buffers, if they are narrowed (*note
- Narrowing::.).
- 
-    If a common ancestor version is available, from which the two texts
- to be merged were both derived, Emerge can use it to guess which
- alternative is right.  Wherever one current version agrees with the
- ancestor, Emerge presumes that the other current version is a deliberate
- change which should be kept in the merged version.  Use the
- `with-ancestor' commands if you want to specify a common ancestor text.
- These commands read three file or buffer names--variant A, variant B,
- and the common ancestor.
- 
-    After the comparison is done and the buffers are prepared, the
- interactive merging starts.  You control the merging by typing special
- "merge commands" in the merge buffer.  The merge buffer shows you a
- full merged text, not just differences.  For each run of differences
- between the input texts, you can choose which one of them to keep, or
- edit them both together.
- 
-    The merge buffer uses a special major mode, Emerge mode, with
- commands for making these choices.  But you can also edit the buffer
- with ordinary Emacs commands.
- 
-    At any given time, the attention of Emerge is focused on one
- particular difference, called the "selected" difference.  This
- difference is marked off in the three buffers like this:
- 
-      vvvvvvvvvvvvvvvvvvvv
-      TEXT THAT DIFFERS
-      ^^^^^^^^^^^^^^^^^^^^
- 
- Emerge numbers all the differences sequentially and the mode line
- always shows the number of the selected difference.
- 
-    Normally, the merge buffer starts out with the A version of the text.
- But when the A version of a difference agrees with the common ancestor,
- then the B version is initially preferred for that difference.
- 
-    Emerge leaves the merged text in the merge buffer when you exit.  At
- that point, you can save it in a file with `C-x C-w'.  If you give a
- numeric argument to `emerge-files' or `emerge-files-with-ancestor', it
- reads the name of the output file using the minibuffer.  (This is the
- last file name those commands read.) Then exiting from Emerge saves the
- merged text in the output file.
- 
-    Normally, Emerge commands save the output buffer in its file when you
- exit.  If you abort Emerge with `C-]', the Emerge command does not save
- the output buffer, but you can save it yourself if you wish.
- 
- 
- File: emacs,  Node: Submodes of Emerge,  Next: State of Difference,  Prev: Overview of Emerge,  Up: Emerge
- 
- Submodes of Emerge
- ------------------
- 
-    You can choose between two modes for giving merge commands: Fast mode
- and Edit mode.  In Fast mode, basic merge commands are single
- characters, but ordinary Emacs commands are disabled.  This is
- convenient if you use only merge commands.  In Edit mode, all merge
- commands start with the prefix key `C-c C-c', and the normal Emacs
- commands are also available.  This allows editing the merge buffer, but
- slows down Emerge operations.
- 
-    Use `e' to switch to Edit mode, and `C-c C-c f' to switch to Fast
- mode.  The mode line indicates Edit and Fast modes with `E' and `F'.
- 
-    Emerge has two additional submodes that affect how particular merge
- commands work: Auto Advance mode and Skip Prefers mode.
- 
-    If Auto Advance mode is in effect, the `a' and `b' commands advance
- to the next difference.  This lets you go through the merge faster as
- long as you simply choose one of the alternatives from the input.  The
- mode line indicates Auto Advance mode with `A'.
- 
-    If Skip Prefers mode is in effect, the `n' and `p' commands skip
- over differences in states prefer-A and prefer-B (*note State of
- Difference::.).  Thus you see only differences for which neither version
- is presumed "correct".  The mode line indicates Skip Prefers mode with
- `S'.
- 
-    Use the command `s a' (`emerge-auto-advance-mode') to set or clear
- Auto Advance mode.  Use `s s' (`emerge-skip-prefers-mode') to set or
- clear Skip Prefers mode.  These commands turn on the mode with a
- positive argument, turns it off with a negative or zero argument, and
- toggle the mode with no argument.
- 
- 
- File: emacs,  Node: State of Difference,  Next: Merge Commands,  Prev: Submodes of Emerge,  Up: Emerge
- 
- State of a Difference
- ---------------------
- 
-    In the merge buffer, a difference is marked with lines of `v' and
- `^' characters.  Each difference has one of these seven states:
- 
- A
-      The difference is showing the A version.  The `a' command always
-      produces this state; the mode line indicates it with `A'.
- 
- B
-      The difference is showing the B version.  The `b' command always
-      produces this state; the mode line indicates it with `B'.
- 
- default-A
- default-B
-      The difference is showing the A or the B state by default, because
-      you haven't made a choice.  All differences start in the default-A
-      state (and thus the merge buffer is a copy of the A buffer),
-      except those for which one alternative is "preferred" (see below).
- 
-      When you select a difference, its state changes from default-A or
-      default-B to plain A or B.  Thus, the selected difference never has
-      state default-A or default-B, and these states are never displayed
-      in the mode line.
- 
-      The command `d a' chooses default-A as the default state, and `d
-      b' chooses default-B.  This chosen default applies to all
-      differences which you haven't ever selected and for which no
-      alternative is preferred.  If you are moving through the merge
-      sequentially, the differences you haven't selected are those
-      following the selected one.  Thus, while moving sequentially, you
-      can effectively make the A version the default for some sections
-      of the merge buffer and the B version the default for others by
-      using `d a' and `d b' between sections.
- 
- prefer-A
- prefer-B
-      The difference is showing the A or B state because it is
-      "preferred".  This means that you haven't made an explicit choice,
-      but one alternative seems likely to be right because the other
-      alternative agrees with the common ancestor.  Thus, where the A
-      buffer agrees with the common ancestor, the B version is
-      preferred, because chances are it is the one that was actually
-      changed.
- 
-      These two states are displayed in the mode line as `A*' and `B*'.
- 
- combined
-      The difference is showing a combination of the A and B states, as a
-      result of the `x c' or `x C' commands.
- 
-      Once a difference is in this state, the `a' and `b' commands don't
-      do anything to it unless you give them a numeric argument.
- 
-      The mode line displays this state as `comb'.
- 
- 
- File: emacs,  Node: Merge Commands,  Next: Exiting Emerge,  Prev: State of Difference,  Up: Emerge
- 
- Merge Commands
- --------------
- 
-    Here are the Merge commands for Fast mode; in Edit mode, precede them
- with `C-c C-c':
- 
- `p'
-      Select the previous difference.
- 
- `n'
-      Select the next difference.
- 
- `a'
-      Choose the A version of this difference.
- 
- `b'
-      Choose the B version of this difference.
- 
- `C-u N j'
-      Select difference number N.
- 
- `.'
-      Select the difference containing point.  You can use this command
-      in the merge buffer or in the A or B buffer.
- 
- `q'
-      Quit--finish the merge.
- 
- `C-]'
-      Abort--exit merging and do not save the output.
- 
- `f'
-      Go into Fast mode.  (In Edit mode, this is actually `C-c C-c f'.)
- 
- `e'
-      Go into Edit mode.
- 
- `l'
-      Recenter (like `C-l') all three windows.
- 
- `-'
-      Specify part of a prefix numeric argument.
- 
- `DIGIT'
-      Also specify part of a prefix numeric argument.
- 
- `d a'
-      Choose the A version as the default from here down in the merge
-      buffer.
- 
- `d b'
-      Choose the B version as the default from here down in the merge
-      buffer.
- 
- `c a'
-      Copy the A version of this difference into the kill ring.
- 
- `c b'
-      Copy the B version of this difference into the kill ring.
- 
- `i a'
-      Insert the A version of this difference at point.
- 
- `i b'
-      Insert the B version of this difference at point.
- 
- `m'
-      Put point and mark around the difference.
- 
- `^'
-      Scroll all three windows down (like `M-v').
- 
- `v'
-      Scroll all three windows up (like `C-v').
- 
- `<'
-      Scroll all three windows left (like `C-x <').
- 
- `>'
-      Scroll all three windows right (like `C-x >').
- 
- `|'
-      Reset horizontal scroll on all three windows.
- 
- `x 1'
-      Shrink the merge window to one line.  (Use `C-u l' to restore it
-      to full size.)
- 
- `x c'
-      Combine the two versions of this difference (*note Combining in
-      Emerge::.).
- 
- `x f'
-      Show the names of the files/buffers Emerge is operating on, in a
-      Help window.  (Use `C-u l' to restore windows.)
- 
- `x j'
-      Join this difference with the following one.  (`C-u x j' joins
-      this difference with the previous one.)
- 
- `x s'
-      Split this difference into two differences.  Before you use this
-      command, position point in each of the three buffers at the place
-      where you want to split the difference.
- 
- `x t'
-      Trim identical lines off top and bottom of the difference.  Such
-      lines occur when the A and B versions are identical but differ
-      from the ancestor version.
- 
- 
- File: emacs,  Node: Exiting Emerge,  Next: Combining in Emerge,  Prev: Merge Commands,  Up: Emerge
- 
- Exiting Emerge
- --------------
- 
-    The `q' command (`emerge-quit') finishes the merge, storing the
- results into the output file if you specified one.  It restores the A
- and B buffers to their proper contents, or kills them if they were
- created by Emerge and you haven't changed them.  It also disables the
- Emerge commands in the merge buffer, since executing them later could
- damage the contents of the various buffers.
- 
-    `C-]' aborts the merge.  This means exiting without writing the
- output file.  If you didn't specify an output file, then there is no
- real difference between aborting and finishing the merge.
- 
-    If the Emerge command was called from another Lisp program, then its
- return value is `t' for successful completion, or `nil' if you abort.
- 
- 
- File: emacs,  Node: Combining in Emerge,  Next: Fine Points of Emerge,  Prev: Exiting Emerge,  Up: Emerge
- 
- Combining the Two Versions
- --------------------------
- 
-    Sometimes you want to keep *both* alternatives for a particular
- difference.  To do this, use `x c', which edits the merge buffer like
- this:
- 
-      #ifdef NEW
-      VERSION FROM A BUFFER
-      #else /* NEW */
-      VERSION FROM B BUFFER
-      #endif /* NEW */
- 
- While this example shows C preprocessor conditionals delimiting the two
- alternative versions, you can specify the strings to use by setting the
- variable `emerge-combine-versions-template' to a string of your choice.
- In the string, `%a' says where to put version A, and `%b' says where
- to put version B.  The default setting, which produces the results
- shown above, looks like this:
- 
-      "#ifdef NEW\n%a#else /* NEW */\n%b#endif /* NEW */\n"
- 
- 
- File: emacs,  Node: Fine Points of Emerge,  Prev: Combining in Emerge,  Up: Emerge
- 
- Fine Points of Emerge
- ---------------------
- 
-    During the merge, you mustn't try to edit the A and B buffers
- yourself.  Emerge modifies them temporarily, but ultimately puts them
- back the way they were.
- 
-    You can have any number of merges going at once--just don't use any
- one buffer as input to more than one merge at once, since the temporary
- changes made in these buffers would get in each other's way.
- 
-    Starting Emerge can take a long time because it needs to compare the
- files fully.  Emacs can't do anything else until `diff' finishes.
- Perhaps in the future someone will change Emerge to do the comparison in
- the background when the input files are large--then you could keep on
- doing other things with Emacs until Emerge gets ready to accept
- commands.
- 
-    After setting up the merge, Emerge runs the hook
- `emerge-startup-hook' (*note Hooks::.).
- 
- 
- File: emacs,  Node: C Mode,  Next: Fortran,  Prev: Emerge,  Up: Programs
- 
- C Mode
- ======
- 
-    In addition to the facilities of typical programming language major
- modes (*note Program Modes::.), C mode has various special facilities.
- 
- `M-a'
- `M-e'
-      In C mode, `M-a' and `M-e' move by complete C statements
-      (`c-beginning-of-statement' and `c-end-of-statement').  These
-      commands do ordinary, textual sentence motion when in or next to a
-      comment.
- 
- `M-q'
-      `M-q' in C mode runs `c-fill-paragraph', which is designed for
-      filling C comments.  (We assume you don't want to fill the actual
-      C code in a C program.)
- 
- `C-c C-u'
-      Move back to the containing preprocessor conditional, setting the
-      mark at the starting point (`c-up-conditional').
- 
-      A numeric argument acts as a repeat count.  With a negative
-      argument, this command moves forward to the end of the containing
-      preprocessor conditional.  When going backwards, `#elif' acts like
-      `#else' followed by `#if'.  When going forwards, `#elif' is
-      ignored.
- 
- `C-c C-n'
-      Move forward across the next preprocessor conditional, setting the
-      mark at the starting point (`c-forward-conditional').
- 
- `C-c C-p'
-      Move backward across the previous preprocessor conditional,
-      setting the at the starting point (`c-backward-conditional').
- 
- `M-x c-macro-expand'
-      When you are debugging C code that uses macros, sometimes it is
-      hard to figure out precisely how the macros expand.  The command
-      `M-x c-macro-expand' runs the C preprocessor and shows you what
-      expansion results from the region.  The portion of the buffer
-      before the region is also included in preprocessing, for the sake
-      of macros defined there, but the output from this part isn't shown.
- 
- `M-x c-backslash-region'
-      Insert or align `\' characters at the ends of the lines of the
-      region, except for the last such line.  This is useful after
-      writing or editing a C macro definition.
- 
-      If a line already ends in `\', this command adjusts the amount of
-      whitespace before it.  Otherwise, it inserts a new `\'.
- 
- `M-x cpp-highlight-buffer'
-      Highlight parts of the text according to its preprocessor
-      conditionals.  This command displays another buffer named `*CPP
-      Edit*', which serves as a graphic menu for selecting how to
-      display particular kinds of conditionals and their contents.
-      After changing various settings, click on `[A]pply these settings'
-      (or go to that buffer and type `a') to rehighlight the C mode
-      buffer accordingly.
- 
-    C++ mode is like C mode, except that it understands C++ comment
- syntax and certain other differences between C and C++.  It also has a
- command `M-x fill-c++-comment', which fills a paragraph made of C++
- comment lines.
- 
-    The command `comment-region' is useful in C++ mode for commenting
- out several consecutive lines, or removing the commenting out of such
- lines.  (You don't need this command with C comment syntax because you
- don't need to put comment delimiters on each line.)  *Note Comments::.
- 
- 
- File: emacs,  Node: Fortran,  Next: Asm Mode,  Prev: C Mode,  Up: Programs
- 
- Fortran Mode
- ============
- 
-    Fortran mode provides special motion commands for Fortran statements
- and subprograms, and indentation commands that understand Fortran
- conventions of nesting, line numbers and continuation statements.
- Fortran mode has its own Auto Fill mode that breaks long lines into
- proper Fortran continuation lines.
- 
-    Special commands for comments are provided because Fortran comments
- are unlike those of other languages.  Built-in abbrevs optionally save
- typing when you insert Fortran keywords.
- 
-    Use `M-x fortran-mode' to switch to this major mode.  This command
- runs the hook `fortran-mode-hook' (*note Hooks::.).
- 
- * Menu:
- 
- * Motion: Fortran Motion.	 Moving point by statements or subprograms.
- * Indent: Fortran Indent.	 Indentation commands for Fortran.
- * Comments: Fortran Comments.	 Inserting and aligning comments.
- * Autofill: Fortran Autofill.	 Auto fill minor mode for Fortran.
- * Columns: Fortran Columns.	 Measuring columns for valid Fortran.
- * Abbrev: Fortran Abbrev.	 Built-in abbrevs for Fortran keywords.
- 
- 
- File: emacs,  Node: Fortran Motion,  Next: Fortran Indent,  Up: Fortran
- 
- Motion Commands
- ---------------
- 
-    Fortran mode provides special commands to move by subprograms
- (functions and subroutines) and by statements.  There is also a command
- to put the region around one subprogram, convenient for killing it or
- moving it.
- 
- `C-M-a'
-      Move to beginning of subprogram
-      (`beginning-of-fortran-subprogram').
- 
- `C-M-e'
-      Move to end of subprogram (`end-of-fortran-subprogram').
- 
- `C-M-h'
-      Put point at beginning of subprogram and mark at end
-      (`mark-fortran-subprogram').
- 
- `C-c C-n'
-      Move to beginning of current or next statement
-      (`fortran-next-statement').
- 
- `C-c C-p'
-      Move to beginning of current or previous statement
-      (`fortran-previous-statement').
- 
- 
- File: emacs,  Node: Fortran Indent,  Next: Fortran Comments,  Prev: Fortran Motion,  Up: Fortran
- 
- Fortran Indentation
- -------------------
- 
-    Special commands and features are needed for indenting Fortran code
- in order to make sure various syntactic entities (line numbers, comment
- line indicators and continuation line flags) appear in the columns that
- are required for standard Fortran.
- 
- * Menu:
- 
- * Commands: ForIndent Commands.  Commands for indenting Fortran.
- * Contline: ForIndent Cont.      How continuation lines indent.
- * Numbers:  ForIndent Num.       How line numbers auto-indent.
- * Conv:     ForIndent Conv.      Conventions you must obey to avoid trouble.
- * Vars:     ForIndent Vars.      Variables controlling Fortran indent style.
- 
- 
- File: emacs,  Node: ForIndent Commands,  Next: ForIndent Cont,  Up: Fortran Indent
- 
- Fortran Indentation Commands
- ............................
- 
- `TAB'
-      Indent the current line (`fortran-indent-line').
- 
- `LFD'
-      Indent the current and start a new indented line
-      (`fortran-indent-new-line').
- 
- `M-LFD'
-      Break the current line and set up a continuation line.
- 
- `C-M-q'
-      Indent all the lines of the subprogram point is in
-      (`fortran-indent-subprogram').
- 
-    Fortran mode redefines TAB to reindent the current line for Fortran
- (`fortran-indent-line').  This command indents Line numbers and
- continuation markers to their required columns, and independently
- indents the body of the statement based on its nesting in the program.
- 
-    The key `LFD' runs the command `fortran-indent-new-line', which
- reindents the current line then makes and indents a new line.  This
- command is useful to reindent the closing statement of `do' loops and
- other blocks before starting a new line.
- 
-    The key `C-M-q' runs `fortran-indent-subprogram', a command to
- reindent all the lines of the Fortran subprogram (function or
- subroutine) containing point.
- 
-    The key `M-LFD' runs `fortran-split-line', which splits a line in
- the appropriate fashion for Fortran.  In a non-comment line, the second
- half becomes a continuation line and is indented accordingly.  In a
- comment line, both halves become separate comment lines.
- 
- 
- File: emacs,  Node: ForIndent Cont,  Next: ForIndent Num,  Prev: ForIndent Commands,  Up: Fortran Indent
- 
- Continuation Lines
- ..................
- 
-    Most modern Fortran compilers allow two ways of writing continuation
- lines.  If the first non-space character on a line is in column 5, then
- that line is a continuation of the previous line.  We call this "fixed
- format".  (In GNU Emacs we always count columns from 0.)  The variable
- `fortran-continuation-string' specifies what character to put on column
- 5.  A line that starts with a tab character followed by any digit
- except `0' is also a continuation line.  We call this style of
- continuation "tab format".
- 
-    Fortran mode can make either style of continuation line, but you
- must specify which one you prefer.  The value of the variable
- `indent-tabs-mode' controls the choice: `nil' for fixed format, and
- non-`nil' for tab format.  You can tell which style is presently in
- effect by the presence or absence of the string `Tab' in the mode line.
- 
-    If the text on a line starts with the conventional Fortran
- continuation marker `$', or if it begins with any non-whitespace
- character in column 5, Fortran mode treats it as a continuation line.
- When you indent a continuation line with TAB, it converts the line to
- the current continuation style.  When you split a Fortran statement
- with `M-LFD', the continuation marker on the newline is created
- according to the continuation style.
- 
-    The setting of continuation style affects several other aspects of
- editing in Fortran mode.  In fixed format mode, the minimum column
- number for the body of a statement is 6.  Lines inside of Fortran
- blocks that are indented to larger column numbers always use only the
- space character for whitespace.  In tab format mode, the minimum column
- number for the statement body is 8, and the whitespace before column 8
- must always consist of one tab character.
- 
-    When you enter Fortran mode for an existing file, it tries to deduce
- the proper continuation style automatically from the file contents.
- The first line that begins with either a tab character or six spaces
- determines the choice.  The variable `fortran-analyze-depth' specifies
- how many lines to consider (at the beginning of the file); if none of
- those lines indicates a style, then the variable
- `fortran-tab-mode-default' specifies the style.  If it is `nil', that
- specifies fixed format, and non-`nil' specifies tab format.
- 
- 
- File: emacs,  Node: ForIndent Num,  Next: ForIndent Conv,  Prev: ForIndent Cont,  Up: Fortran Indent
- 
- Line Numbers
- ............
- 
-    If a number is the first non-whitespace in the line, Fortran
- indentation assumes it is a line number and moves it to columns 0
- through 4.  (Columns always count from 0 in GNU Emacs.)
- 
-    Line numbers of four digits or less are normally indented one space.
- The variable `fortran-line-number-indent' controls this; it specifies
- the maximum indentation a line number can have.  Line numbers are
- indented to right-justify them to end in column 4 unless that would
- require more than this maximum indentation.  The default value of the
- variable is 1.
- 
-    Simply inserting a line number is enough to indent it according to
- these rules.  As each digit is inserted, the indentation is recomputed.
- To turn off this feature, set the variable
- `fortran-electric-line-number' to `nil'.  Then inserting line numbers
- is like inserting anything else.
- 
- 
- File: emacs,  Node: ForIndent Conv,  Next: ForIndent Vars,  Prev: ForIndent Num,  Up: Fortran Indent
- 
- Syntactic Conventions
- .....................
- 
-    Fortran mode assumes that you follow certain conventions that
- simplify the task of understanding a Fortran program well enough to
- indent it properly:
- 
-    * Two nested `do' loops never share a `continue' statement.
- 
-    * Fortran keywords such as `if', `else', `then', `do' and others are
-      written without embedded whitespace or line breaks.
- 
-      Fortran compilers generally ignore whitespace outside of string
-      constants, but Fortran mode does not recognize these keywords if
-      they are not contiguous.  Constructs such as `else if' or `end do'
-      are acceptable, but the second word should be on the same line as
-      the first and not on a continuation line.
- 
- If you fail to follow these conventions, the indentation commands may
- indent some lines unaesthetically.  However, a correct Fortran program
- retains its meaning when reindented even if the conventions are not
- followed.
- 
- 
- File: emacs,  Node: ForIndent Vars,  Prev: ForIndent Conv,  Up: Fortran Indent
- 
- Variables for Fortran Indentation
- .................................
- 
-    Several additional variables control how Fortran indentation works:
- 
- `fortran-do-indent'
-      Extra indentation within each level of `do' statement (default 3).
- 
- `fortran-if-indent'
-      Extra indentation within each level of `if' statement (default 3).
-      This value is also used for extra indentation within each level of
-      the Fortran 90 `where' statement.
- 
- `fortran-structure-indent'
-      Extra indentation within each level of `structure', `union', or
-      `map' statements (default 3).
- 
- `fortran-continuation-indent'
-      Extra indentation for bodies of continuation lines (default 5).
- 
- `fortran-check-all-num-for-matching-do'
-      If this is `nil', indentation assumes that each `do' statement
-      ends on a `continue' statement.  Therefore, when computing
-      indentation for a statement other than `continue', it can save time
-      by not checking for a `do' statement ending there.  If this is
-      non-`nil', indenting any numbered statement must check for a `do'
-      that ends there.  The default is `nil'.
- 
- `fortran-blink-matching-if'
-      If this is `t', indenting an `endif' statement moves the cursor
-      momentarily to the matching `if' statement to show where it is.
-      The default is `nil'.
- 
- `fortran-minimum-statement-indent-fixed'
-      Minimum indentation for fortran statements when using fixed format
-      continuation line style.  Statement bodies are never indented less
-      than this much.  The default is 6.
- 
- `fortran-minimum-statement-indent-tab'
-      Minimum indentation for fortran statements for tab format
-      continuation line style.  Statement bodies are never indented less
-      than this much.  The default is 8.
- 
- 
- File: emacs,  Node: Fortran Comments,  Next: Fortran Autofill,  Prev: Fortran Indent,  Up: Fortran
- 
- Fortran Comments
- ----------------
- 
-    The usual Emacs comment commands assume that a comment can follow a
- line of code.  In Fortran, the standard comment syntax requires an
- entire line to be just a comment.  Therefore, Fortran mode replaces the
- standard Emacs comment commands and defines some new variables.
- 
-    Fortran mode can also handle a nonstandard comment syntax where
- comments start with `!' and can follow other text.  Because only some
- Fortran compilers accept this syntax, Fortran mode will not insert such
- comments unless you have said in advance to do so.  To do this, set the
- variable `comment-start' to `"!"' (*note Variables::.).
- 
- `M-;'
-      Align comment or insert new comment (`fortran-comment-indent').
- 
- `C-x ;'
-      Applies to nonstandard `!' comments only.
- 
- `C-c ;'
-      Turn all lines of the region into comments, or (with argument)
-      turn them back into real code (`fortran-comment-region').
- 
-    `M-;' in Fortran mode is redefined as the command
- `fortran-comment-indent'.  Like the usual `M-;' command, this
- recognizes any kind of existing comment and aligns its text
- appropriately; if there is no existing comment, a comment is inserted
- and aligned.  But inserting and aligning comments are not the same in
- Fortran mode as in other modes.
- 
-    When a new comment must be inserted, if the current line is blank, a
- full-line comment is inserted.  On a non-blank line, a nonstandard `!'
- comment is inserted if you have said you want to use them.  Otherwise a
- full-line comment is inserted on a new line before the current line.
- 
-    Nonstandard `!' comments are aligned like comments in other
- languages, but full-line comments are different.  In a standard
- full-line comment, the comment delimiter itself must always appear in
- column zero.  What can be aligned is the text within the comment.  You
- can choose from three styles of alignment by setting the variable
- `fortran-comment-indent-style' to one of these values:
- 
- `fixed'
-      Align the text at a fixed column, which is the sum of
-      `fortran-comment-line-extra-indent' and the minimum statement
-      indentation.  This is the default.
- 
-      The minimum statement indentation is
-      `fortran-minimum-statement-indent-fixed' for fixed format
-      continuation line style and `fortran-minimum-statement-indent-tab'
-      for tab format style.
- 
- `relative'
-      Align the text as if it were a line of code, but with an additional
-      `fortran-comment-line-extra-indent' columns of indentation.
- 
- `nil'
-      Don't move text in full-line columns automatically at all.
- 
-    In addition, you can specify the character to be used to indent
- within full-line comments by setting the variable
- `fortran-comment-indent-char' to the single-character string you want
- to use.
- 
-    Fortran mode introduces two variables `comment-line-start' and
- `comment-line-start-skip' which play for full-line comments the same
- roles played by `comment-start' and `comment-start-skip' for ordinary
- text-following comments.  Normally these are set properly by Fortran
- mode so you do not need to change them.
- 
-    The normal Emacs comment command `C-x ;' has not been redefined.  If
- you use `!' comments, this command can be used with them.  Otherwise it
- is useless in Fortran mode.
- 
-    The command `C-c ;' (`fortran-comment-region') turns all the lines
- of the region into comments by inserting the string `C$$$' at the front
- of each one.  With a numeric argument, it turns the region back into
- live code by deleting `C$$$' from the front of each line in it.  The
- string used for these comments can be controlled by setting the
- variable `fortran-comment-region'.  Note that here we have an example
- of a command and a variable with the same name; these two uses of the
- name never conflict because in Lisp and in Emacs it is always clear
- from the context which one is meant.
- 
- 
- File: emacs,  Node: Fortran Autofill,  Next: Fortran Columns,  Prev: Fortran Comments,  Up: Fortran
- 
- Fortran Auto Fill Mode
- ----------------------
- 
-    Fortran Auto Fill mode is a minor mode which automatically splits
- Fortran statements as you insert them when they become too wide.
- Splitting a statement involves making continuation lines using
- `fortran-continuation-string' (*Note ForIndent Cont::).  This splitting
- happens when you type SPC, RET, or TAB, and also in the Fortran
- indentation commands.
- 
-    `M-x fortran-auto-fill-mode' turns Fortran Auto Fill mode on if it
- was off, or off if it was on.  This command works the same as `M-x
- auto-fill-mode' does for normal Auto Fill mode (*note Filling::.).  A
- positive numeric argument turns Fortran Auto Fill mode on, and a
- negative argument turns it off.  You can see when Fortran Auto Fill mode
- is in effect by the presence of the word `Fill' in the mode line,
- inside the parentheses.  Fortran Auto Fill mode is a minor mode, turned
- on or off for each buffer individually.  *Note Minor Modes::.
- 
-    Fortran Auto Fill mode breaks lines at spaces or delimiters when the
- lines get longer than the desired width (the value of `fill-column').
- The delimiters that Fortran Auto Fill mode may break at are `,', `'',
- `+', `-', `/', `*', `=', and `)'.  The line break comes after the
- delimiter if the variable `fortran-break-before-delimiters' is `nil'.
- Otherwise (and by default), the break comes before the delimiter.
- 
-    By default, Fortran Auto Fill mode is not enabled.  If you want this
- feature turned on permanently, add a hook function to
- `fortran-mode-hook' to execute `(fortran-auto-fill-mode 1)'.  *Note
- Hooks::.
- 
- 
- File: emacs,  Node: Fortran Columns,  Next: Fortran Abbrev,  Prev: Fortran Autofill,  Up: Fortran
- 
- Checking Columns in Fortran
- ---------------------------
- 
- `C-c C-r'
-      Display a "column ruler" momentarily above the current line
-      (`fortran-column-ruler').
- 
- `C-c C-w'
-      Split the current window horizontally temporarily so that it is 72
-      columns wide.  This may help you avoid making lines longer than
-      the 72 character limit that some fortran compilers impose
-      (`fortran-window-create-momentarily').
- 
-    The command `C-c C-r' (`fortran-column-ruler') shows a column ruler
- momentarily above the current line.  The comment ruler is two lines of
- text that show you the locations of columns with special significance in
- Fortran programs.  Square brackets show the limits of the columns for
- line numbers, and curly brackets show the limits of the columns for the
- statement body.  Column numbers appear above them.
- 
-    Note that the column numbers count from zero, as always in GNU Emacs.
- As a result, the numbers may be one less than those you are familiar
- with; but the positions they indicate in the line are standard for
- Fortran.
- 
-    The text used to display the column ruler depends on the value of
- the variable `indent-tabs-mode'.  If `indent-tabs-mode' is `nil', then
- the value of the variable `fortran-column-ruler-fixed' is used as the
- column ruler.  Otherwise, the variable `fortran-column-ruler-tab' is
- displayed.  By changing these variables, you can change the column
- ruler display.
- 
-    For even more help, use `C-c C-w' (`fortran-window-create'), a
- command which splits the current window horizontally, making a window 72
- columns wide.  By editing in this window you can immediately see when
- you make a line too wide to be correct Fortran.
- 
- 
- File: emacs,  Node: Fortran Abbrev,  Prev: Fortran Columns,  Up: Fortran
- 
- Fortran Keyword Abbrevs
- -----------------------
- 
-    Fortran mode provides many built-in abbrevs for common keywords and
- declarations.  These are the same sort of abbrev that you can define
- yourself.  To use them, you must turn on Abbrev mode.  *Note Abbrevs::.
- 
-    The built-in abbrevs are unusual in one way: they all start with a
- semicolon.  You cannot normally use semicolon in an abbrev, but Fortran
- mode makes this possible by changing the syntax of semicolon to "word
- constituent."
- 
-    For example, one built-in Fortran abbrev is `;c' for `continue'.  If
- you insert `;c' and then insert a punctuation character such as a space
- or a newline, the `;c' expands automatically to `continue', provided
- Abbrev mode is enabled.
- 
-    Type `;?' or `;C-h' to display a list of all the built-in Fortran
- abbrevs and what they stand for.
- 
- 
- File: emacs,  Node: Asm Mode,  Prev: Fortran,  Up: Programs
- 
- Asm Mode
- ========
- 
-    Asm mode is a major mode for editing files of assembler code.  It
- defines these commands:
- 
- `TAB'
-      `tab-to-tab-stop'.
- 
- `LFD'
-      Insert a newline and then indent using `tab-to-tab-stop'.
- 
- `:'
-      Insert a colon and then remove the indentation from before the
-      label preceding colon.  Then do `tab-to-tab-stop'.
- 
- `;'
-      Insert or align a comment.
- 
-    The variable `asm-comment-char' specifies which character starts
- comments in assembler syntax.
- 
- 
- File: emacs,  Node: Building,  Next: Abbrevs,  Prev: Programs,  Up: Top
- 
- Compiling and Testing Programs
- ******************************
- 
-    The previous chapter discusses the Emacs commands that are useful for
- making changes in programs.  This chapter deals with commands that
- assist in the larger process of developing and maintaining programs.
- 
- * Menu:
- 
- * Compilation::                   Compiling programs in languages other
-                                     than Lisp (C, Pascal, etc.)
- * Debuggers::	                  Running symbolic debuggers for
-                                     non-Lisp programs.
- * Executing Lisp::                Various modes for editing Lisp programs,
-                                     with different facilities for running
-                                     the Lisp programs.
- * Libraries: Lisp Libraries.      Creating Lisp programs to run in Emacs.
- * Interaction: Lisp Interaction.  Executing Lisp in an Emacs buffer.
- * Eval: Lisp Eval.                Executing a single Lisp expression in Emacs.
- * External Lisp::                 Communicating through Emacs with a
-                                     separate Lisp.
- 
- 
- File: emacs,  Node: Compilation,  Next: Debuggers,  Up: Building
- 
- Running Compilations under Emacs
- ================================
- 
-    Emacs can run compilers for noninteractive languages such as C and
- Fortran as inferior processes, feeding the error log into an Emacs
- buffer.  It can also parse the error messages and show you the source
- lines where compilation errors occurred.
- 
- `M-x compile'
-      Run a compiler asynchronously under Emacs, with error messages to
-      `*compilation*' buffer.
- 
- `M-x grep'
-      Run `grep' asynchronously under Emacs, with matching lines listed
-      in the buffer named `*grep*'.
- 
- `M-x kill-compilation'
- `M-x kill-grep'
-      Kill the running compilation or `grep' subprocess.
- 
- `C-x `'
-      Visit the locus of the next compiler error message or `grep' match.
- 
- `RET'
-      Visit the locus of the error message that point is on.  This
-      command is used in the compilation buffer.
- 
- `Mouse-2'
-      Visit the locus of the error message that you click on.
- 
-    To run `make' or another compilation command, do `M-x compile'.
- This command reads a shell command line using the minibuffer, and then
- executes the command in an inferior shell, putting output in the buffer
- named `*compilation*'.  The current buffer's default directory is used
- as the working directory for the execution of the command; normally,
- therefore, the compilation happens in this directory.
- 
-    When the shell command line is read, the minibuffer appears
- containing a default command line, which is the command you used the
- last time you did `M-x compile'.  If you type just RET, the same command
- line is used again.  For the first `M-x compile', the default is `make
- -k'.  The default compilation command comes from the variable
- `compile-command'; if the appropriate compilation command for a file is
- something other than `make -k', it can be useful for the file to
- specify a local value for `compile-command' (*note File Variables::.).
- 
-    Starting a compilation displays the buffer `*compilation*' in
- another window but does not select it.  The buffer's mode line tells you
- whether compilation is finished, with the word `run' or `exit' inside
- the parentheses.  You do not have to keep this buffer visible;
- compilation continues in any case.  While a compilation is going on, the
- string `Compiling' appears in the mode lines of all windows.  When this
- string disappears, the compilation is finished.
- 
-    To kill the compilation process, do `M-x kill-compilation'.  When
- the compiler process terminates, the mode line of the `*compilation*'
- buffer changes to say `signal' instead of `run'.  Starting a new
- compilation also kills any running compilation, as only one can exist
- at any time.  However, `M-x compile' asks for confirmation before
- actually killing a compilation that is running.
- 
-    The `*compilation*' buffer uses a special major mode, Compilation
- mode.  This mode provides the keys SPC and DEL to scroll by screenfuls,
- and `M-n' and `M-p' to move to the next or previous error message.  You
- can also use `M-{' and `M-}' to move up or down to an error message for
- a different source file.
- 
-    You can visit the source for any particular error message by moving
- point in `*compilation*' to that error message and typing RET
- (`compile-goto-error').  Or click `Mouse-2' on the error message; you
- need not switch to the `*compilation*' buffer first.
- 
-    To parse the compiler error messages sequentially, type `C-x `'
- (`next-error').  The character following the `C-x' is the backquote or
- "grave accent," not the single-quote.  This command is available in all
- buffers, not just in `*compilation*'; it displays the next error
- message at the top of one window and source location of the error in
- another window.
- 
-    The first time `C-x `' is used after the start of a compilation, it
- moves to the first error's location.  Subsequent uses of `C-x `'
- advance down to subsequent errors.  If you visit a specific error
- message with RET or `Mouse-2', subsequent `C-x `' commands advance from
- there.  When `C-x `' gets to the end of the buffer and finds no more
- error messages to visit, it fails and signals an Emacs error.
- 
-    `C-u C-x `' starts scanning from the beginning of the compilation
- buffer.  This way, you can process the same set of errors again.
- 
-    Just as you can run a compiler, you can also run `grep' and then
- visit the lines on which matches were found.  To do this, type `M-x
- grep' with an argument line that contains the same arguments you would
- give `grep' when running it normally: a `grep'-style regexp (usually in
- single-quotes to quote the shell's special characters) followed by file
- names which may use wildcards.  The output from `grep' goes in the
- `*grep*' buffer, and you can find the matching lines in the source with
- `C-x `' and RET just like compiler errors.
- 
-    Note: a shell is used to run the compile command, but the shell is
- told that it should be noninteractive.  This means in particular that
- the shell starts up with no prompt.  If you find your usual shell prompt
- making an unsightly appearance in the `*compilation*' buffer, it means
- you have made a mistake in your shell's init file by setting the prompt
- unconditionally.  (The init file name may be `.profile', `.cshrc',
- `.shrc', or various other things, depending on the shell you use.)  The
- shell init file should set the prompt only if there already is a
- prompt.  In csh, here is how to do it:
- 
-      if ($?prompt) set prompt = ...
- 
- And here's how to do it in bash:
- 
-      if [ "${PS1+set}" = set ]
-      then prompt=...
-      fi
- 
-    There may well be other things that your shell's init file ought to
- do only for an interactive shell.  You can use the same method to
- conditionalize them.
- 
-    The features of Compilation mode are also available in a minor mode
- called Compilation Minor mode.  This lets you parse error messages in
- any buffer, not just a normal compilation output buffer.  Type `M-x
- compilation-minor-mode' to enable the minor mode.  This defines the keys
- RET and `Mouse-2', as in the Compilation major mode.  In an Rlogin
- buffer (*note Remote Host::.), Compilation minor mode automatically
- accesses remote source files by FTP (*note File Names::.).
- 
-    The MS-DOS "operating system" does not support asynchronous
- subprocesses; to work around this lack, `M-x compile' runs the
- compilation command synchronously on MS-DOS.  As a consequence, you must
- wait until the command finishes before you can do anything else in
- Emacs.  *Note MS-DOS::.
- 
- 
- File: emacs,  Node: Debuggers,  Next: Executing Lisp,  Prev: Compilation,  Up: Building
- 
- Running Debuggers Under Emacs
- =============================
- 
-    The GUD (Grand Unified Debugger) library provides an interface to
- various symbolic debuggers from within Emacs.  We recommend the debugger
- GDB, which is free software, but you can also run DBX, SDB or XDB if you
- have them.  GUD can also serve as an interface to the Perl's debugging
- mode.
- 
- * Menu:
- 
- * Starting GUD::	How to start a debugger subprocess.
- * Debugger Operation::	Connection between the debugger and source buffers.
- * Commands of GUD::	Key bindings for common commands.
- * GUD Customization::	Defining your own commands for GUD.
- 
- 
- File: emacs,  Node: Starting GUD,  Next: Debugger Operation,  Up: Debuggers
- 
- Starting GUD
- ------------
- 
-    There are five commands for starting a debugger, each corresponding
- to a particular debugger program.
- 
- `M-x gdb RET FILE RET'
-      Run GDB as a subprocess of Emacs.  This command creates a buffer
-      for input and output to GDB, and switches to it.  If a GDB buffer
-      already exists, it just switches to that buffer.
- 
- `M-x dbx RET FILE RET'
-      Similar, but run DBX instead of GDB.
- 
- `M-x xdb RET FILE RET'
-      Similar, but run XDB instead of GDB.  Use the variable
-      `gud-xdb-directories' to specify directories to search for source
-      files.
- 
- `M-x sdb RET FILE RET'
-      Similar, but run SDB instead of GDB.
- 
-      Some versions of SDB do not mention source file names in their
-      messages.  When you use them, you need to have a valid tags table
-      (*note Tags::.) in order for GUD to find functions in the source
-      code.  If you have not visited a tags table or the tags table
-      doesn't list one of the functions, you get a message saying `The
-      sdb support requires a valid tags table to work'.  If this
-      happens, generate a valid tags table in the working directory and
-      try again.
- 
- `M-x perldb RET FILE RET'
-      Run the Perl interpreter in debug mode to debug FILE, a Perl
-      program.
- 
-    You can only run one debugger process at a time.
- 
-    Each of these commands takes one argument: a command line to invoke
- the debugger.  In the simplest case, specify just the name of the
- executable file you want to debug.  You may also use options that the
- debugger supports.  However, shell wild cards and variables are not
- allowed.  GUD assumes that the first argument not preceded by a `-' is
- the executable file name.
- 
- 
- File: emacs,  Node: Debugger Operation,  Next: Commands of GUD,  Prev: Starting GUD,  Up: Debuggers
- 
- Debugger Operation
- ------------------
- 
-    When you run a debugger with GUD, the debugger uses an Emacs buffer
- for its ordinary input and output.  This is called the GUD buffer.  The
- debugger displays the source files of the program by visiting them in
- Emacs buffers.  An arrow (`=>') in one of these buffers indicates the
- current execution line.  Moving point in this buffer does not move the
- arrow.
- 
-    You can start editing these source files at any time in the buffers
- that were made to display them.  The arrow is not part of the file's
- text; it appears only on the screen.  If you do modify a source file,
- keep in mind that inserting or deleting lines will throw off the arrow's
- positioning; GUD has no way of figuring out which line corresponded
- before your changes to the line number in a debugger message.  Also,
- you'll typically have to recompile and restart the program for your
- changes to be reflected in the debugger's tables.
- 
-    If you wish, you can control your debugger process entirely through
- the debugger buffer, which uses a variant of Shell mode.  All the usual
- commands for your debugger are available, and you can use the Shell mode
- history commands to repeat them.  *Note Shell Mode::.
- 
--- 0 ----
Index: emacs/info/emacs-13
diff -c emacs/info/emacs-13:1.1.1.2 emacs/info/emacs-13:removed
*** emacs/info/emacs-13:1.1.1.2	Mon Jul 22 01:51:50 1996
--- emacs/info/emacs-13	Fri Aug  2 20:05:00 1996
***************
*** 1,1070 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Commands of GUD,  Next: GUD Customization,  Prev: Debugger Operation,  Up: Debuggers
- 
- Commands of GUD
- ---------------
- 
-    The GUD interaction buffer uses a variant of Shell mode, so the
- commands of Shell mode are available (*note Shell Mode::.).  GUD mode
- also provides commands for setting and clearing breakpoints, for
- selecting stack frames, and for stepping through the program.  These
- commands are available both in the GUD buffer and globally, but with
- different key bindings.
- 
-    The breakpoint commands are usually used in source file buffers,
- because that is the way to specify where to set or clear the breakpoint.
- Here's the global command to set a breakpoint:
- 
- `C-x SPC'
-      Set a breakpoint on the source line that point is on.
- 
-    Here are the other special commands provided by GUD.  The keys
- starting with `C-c' are available only in the GUD interaction buffer.
- The bindings that start with `C-x C-a' are available in the GUD buffer
- and also in source files.
- 
- `C-c C-l'
- `C-x C-a C-l'
-      Display in another window the last line referred to in the GUD
-      buffer (that is, the line indicated in the last location message).
-      This runs the command `gud-refresh'.
- 
- `C-c C-s'
- `C-x C-a C-s'
-      Execute a single line of code (`gud-step').  If the line contains
-      a function call, execution stops after entering the called
-      function.
- 
- `C-c C-n'
- `C-x C-a C-n'
-      Execute a single line of code, stepping across entire function
-      calls at full speed (`gud-next').
- 
- `C-c C-i'
- `C-x C-a C-i'
-      Execute a single machine instruction (`gud-stepi').
- 
- `C-c C-r'
- `C-x C-a C-r'
-      Continue execution without specifying any stopping point.  The
-      program will run until it hits a breakpoint, terminates, or gets a
-      signal that the debugger is checking for (`gud-cont').
- 
- `C-c C-d'
- `C-x C-a C-d'
-      Delete the breakpoint(s) on the current source line, if any
-      (`gud-remove').  If you use this command in the GUD interaction
-      buffer, it applies to the line where the program last stopped.
- 
- `C-c C-t'
- `C-x C-a C-t'
-      Set a temporary breakpoint on the current source line, if any.  If
-      you use this command in the GUD interaction buffer, it applies to
-      the line where the program last stopped.
- 
-    The above commands are common to all supported debuggers.  If you are
- using GDB or (some versions of) DBX, these additional commands are
- available:
- 
- `C-c <'
- `C-x C-a <'
-      Select the next enclosing stack frame (`gud-up').  This is
-      equivalent to the `up' command.
- 
- `C-c >'
- `C-x C-a >'
-      Select the next inner stack frame (`gud-down').  This is
-      equivalent to the `down' command.
- 
-    If you are using GDB, these additional key bindings are available:
- 
- `TAB'
-      With GDB, complete a symbol name (`gud-gdb-complete-command').
-      This key is available only in the GUD interaction buffer, and
-      requires GDB versions 4.13 and later.
- 
- `C-c C-f'
- `C-x C-a C-f'
-      Run the program until the selected stack frame returns (or until it
-      stops for some other reason).
- 
-    These commands interpret a numeric argument as a repeat count, when
- that makes sense.
- 
- 
- File: emacs,  Node: GUD Customization,  Prev: Commands of GUD,  Up: Debuggers
- 
- GUD Customization
- -----------------
- 
-    On startup, GUD runs one of the following hooks: `gdb-mode-hook', if
- you are using GDB; `dbx-mode-hook', if you are using DBX;
- `sdb-mode-hook', if you are using SDB; `xdb-mode-hook', if you are
- using XDB; `perldb-mode-hook', for Perl debugging mode.  You can use
- these hooks to define custom key bindings for the debugger interaction
- buffer.  *Note Hooks::.
- 
-    Here is a convenient way to define a command that sends a particular
- command string to the debugger, and set up a key binding for it in the
- debugger interaction buffer:
- 
-      (gud-def FUNCTION CMDSTRING BINDING DOCSTRING)
- 
-    This defines a command named FUNCTION which sends CMDSTRING to the
- debugger process, and gives it the documentation string DOCSTRING.  You
- can use the command thus defined in any buffer.  If BINDING is
- non-`nil', `gud-def' also binds the command to `C-c BINDING' in the GUD
- buffer's mode and to `C-x C-a BINDING' generally.
- 
-    The command string CMDSTRING may contain certain `%'-sequences that
- stand for data to be filled in at the time FUNCTION is called:
- 
- `%f'
-      The name of the current source file.  If the current buffer is the
-      GUD buffer, then the "current source file" is the file that the
-      program stopped in.
- 
- `%l'
-      The number of the current source line.  If the current buffer is
-      the GUD buffer, then the "current source line" is the line that
-      the program stopped in.
- 
- `%e'
-      The text of the C lvalue or function-call expression at or
-      adjacent to point.
- 
- `%a'
-      The text of the hexadecimal address at or adjacent to point.
- 
- `%p'
-      The numeric argument of the called function, as a decimal number.
-      If the command is used without a numeric argument, `%p' stands for
-      the empty string.
- 
-      If you don't use `%p' in the command string, the command you define
-      ignores any numeric argument.
- 
- 
- File: emacs,  Node: Executing Lisp,  Next: Lisp Libraries,  Prev: Debuggers,  Up: Building
- 
- Executing Lisp Expressions
- ==========================
- 
-    Emacs has several different major modes for Lisp and Scheme.  They
- are the same in terms of editing commands, but differ in the commands
- for executing Lisp expressions.  Each mode has its own purpose.
- 
- Emacs-Lisp mode
-      The mode for editing source files of programs to run in Emacs Lisp.
-      This mode defines `C-M-x' to evaluate the current defun.  *Note
-      Lisp Libraries::.
- 
- Lisp Interaction mode
-      The mode for an interactive session with Emacs Lisp.  It defines
-      LFD to evaluate the sexp before point and insert its value in the
-      buffer.  *Note Lisp Interaction::.
- 
- Lisp mode
-      The mode for editing source files of programs that run in Lisps
-      other than Emacs Lisp.  This mode defines `C-M-x' to send the
-      current defun to an inferior Lisp process.  *Note External Lisp::.
- 
- Inferior Lisp mode
-      The mode for an interactive session with an inferior Lisp process.
-      This mode combines the special features of Lisp mode and Shell mode
-      (*note Shell Mode::.).
- 
- Scheme mode
-      Like Lisp mode but for Scheme programs.
- 
- Inferior Scheme mode
-      The mode for an interactive session with an inferior Scheme
-      process.
- 
- * Menu:
- 
- These subnodes of the chapter on editing programs describe the editing
- commands for working with Lisp programs, which are in fact available
- globally.
- 
- * Lists::	      Expressions with balanced parentheses.
- * List Commands::     The commands for working with list and sexps.
- * Defuns::	      Each program is made up of separate functions.
- 			There are editing commands to operate on them.
- * Program Indent::    Adjusting indentation to show the nesting.
- * Matching::	      Insertion of a close-delimiter flashes matching open.
- * Comments::	      Inserting, killing, and aligning comments.
- 
- 
- File: emacs,  Node: Lisp Libraries,  Next: Lisp Interaction,  Prev: Executing Lisp,  Up: Building
- 
- Libraries of Lisp Code for Emacs
- ================================
- 
-    Lisp code for Emacs editing commands is stored in files whose names
- conventionally end in `.el'.  This ending tells Emacs to edit them in
- Emacs-Lisp mode (*note Executing Lisp::.).
- 
-    To execute a file of Emacs Lisp code, use `M-x load-file'.  This
- command reads a file name using the minibuffer and then executes the
- contents of that file as Lisp code.  It is not necessary to visit the
- file first; in any case, this command reads the file as found on disk,
- not text in an Emacs buffer.
- 
-    Once a file of Lisp code is installed in the Emacs Lisp library
- directories, users can load it using `M-x load-library'.  Programs can
- load it by calling `load-library', or with `load', a more primitive
- function that is similar but accepts some additional arguments.
- 
-    `M-x load-library' differs from `M-x load-file' in that it searches
- a sequence of directories and tries three file names in each directory.
- Suppose your argument is LIB; the three names are `LIB.elc', `LIB.el',
- and lastly just `LIB'.  If `LIB.elc' exists, it is by convention the
- result of compiling `LIB.el'; it is better to load the compiled file,
- since it will load and run faster.
- 
-    If `load-library' finds that `LIB.el' is newer than `LIB.elc' file,
- it prints a warning, because it's likely that somebody made changes to
- the `.el' file and forgot to recompile it.
- 
-    Because the argument to `load-library' is usually not in itself a
- valid file name, file name completion is not available.  Indeed, when
- using this command, you usually do not know exactly what file name will
- be used.
- 
-    The sequence of directories searched by `M-x load-library' is
- specified by the variable `load-path', a list of strings that are
- directory names.  The default value of the list contains the directory
- where the Lisp code for Emacs itself is stored.  If you have libraries
- of your own, put them in a single directory and add that directory to
- `load-path'.  `nil' in this list stands for the current default
- directory, but it is probably not a good idea to put `nil' in the list.
- If you find yourself wishing that `nil' were in the list, most likely
- what you really want to do is use `M-x load-file' this once.
- 
-    Often you do not have to give any command to load a library, because
- the commands defined in the library are set up to "autoload" that
- library.  Trying to run any of those commands calls `load' to load the
- library; this replaces the autoload definitions with the real ones from
- the library.
- 
-    Emacs Lisp code can be compiled into byte-code which loads faster,
- takes up less space when loaded, and executes faster.  *Note Byte
- Compilation: (elisp)Byte Compilation.  By convention, the compiled code
- for a library goes in a separate file whose name consists of the
- library source file with `c' appended.  Thus, the compiled code for
- `foo.el' goes in `foo.elc'.  That's why `load-library' searches for
- `.elc' files first.
- 
- 
- File: emacs,  Node: Lisp Eval,  Next: External Lisp,  Prev: Lisp Interaction,  Up: Building
- 
- Evaluating Emacs-Lisp Expressions
- =================================
- 
-    Lisp programs intended to be run in Emacs should be edited in
- Emacs-Lisp mode; this happens automatically for file names ending in
- `.el'.  By contrast, Lisp mode itself is used for editing Lisp programs
- intended for other Lisp systems.  To switch to Emacs-Lisp mode
- explicitly, use the command `M-x emacs-lisp-mode'.
- 
-    For testing of Lisp programs to run in Emacs, it is often useful to
- evaluate part of the program as it is found in the Emacs buffer.  For
- example, after changing the text of a Lisp function definition,
- evaluating the definition installs the change for future calls to the
- function.  Evaluation of Lisp expressions is also useful in any kind of
- editing, for invoking noninteractive functions (functions that are not
- commands).
- 
- `M-:'
-      Read a single Lisp expression in the minibuffer, evaluate it, and
-      print the value in the echo area (`eval-expression').
- 
- `C-x C-e'
-      Evaluate the Lisp expression before point, and print the value in
-      the echo area (`eval-last-sexp').
- 
- `C-M-x'
-      Evaluate the defun containing or after point, and print the value
-      in the echo area (`eval-defun').
- 
- `M-x eval-region'
-      Evaluate all the Lisp expressions in the region.
- 
- `M-x eval-current-buffer'
-      Evaluate all the Lisp expressions in the buffer.
- 
-    `M-:' (`eval-expression') is the most basic command for evaluating a
- Lisp expression interactively.  It reads the expression using the
- minibuffer, so you can execute any expression on a buffer regardless of
- what the buffer contains.  When the expression is evaluated, the current
- buffer is once again the buffer that was current when `M-:' was typed.
- 
-    `M-:' can easily confuse users who do not understand it.  Therefore,
- `eval-expression' is normally a disabled command.  Attempting to use
- this command asks for confirmation and gives you the option of enabling
- it; once you enable the command, confirmation will no longer be
- required for it.  *Note Disabling::.
- 
-    In Emacs-Lisp mode, the key `C-M-x' is bound to the command
- `eval-defun', which parses the defun containing or following point as a
- Lisp expression and evaluates it.  The value is printed in the echo
- area.  This command is convenient for installing in the Lisp environment
- changes that you have just made in the text of a function definition.
- 
-    `C-M-x' treats `defvar' expressions specially.  Normally, evaluating
- a `defvar' expression does nothing if the variable it defines already
- has a value.  But `C-M-x' unconditionally resets the variable to the
- initial value specified in the `defvar' expression.  This special
- feature is convenient for debugging Lisp programs.
- 
-    The command `C-x C-e' (`eval-last-sexp') evaluates the Lisp
- expression preceding point in the buffer, and displays the value in the
- echo area.  It is available in all major modes, not just Emacs-Lisp
- mode.  It does not treat `defvar' specially.
- 
-    If `C-M-x' or `C-x C-e' is given a numeric argument, it inserts the
- value into the current buffer at point, rather than displaying it in
- the echo area.  The argument's value does not matter.
- 
-    The most general command for evaluating Lisp expressions from a
- buffer is `eval-region'.  `M-x eval-region' parses the text of the
- region as one or more Lisp expressions, evaluating them one by one.
- `M-x eval-current-buffer' is similar but evaluates the entire buffer.
- This is a reasonable way to install the contents of a file of Lisp code
- that you are just ready to test.  Later, as you find bugs and change
- individual functions, use `C-M-x' on each function that you change.
- This keeps the Lisp world in step with the source file.
- 
- 
- File: emacs,  Node: Lisp Interaction,  Next: Lisp Eval,  Prev: Lisp Libraries,  Up: Building
- 
- Lisp Interaction Buffers
- ========================
- 
-    The buffer `*scratch*' which is selected when Emacs starts up is
- provided for evaluating Lisp expressions interactively inside Emacs.
- 
-    The simplest way to use the `*scratch*' buffer is to insert Lisp
- expressions and type LFD after each expression.  This command reads the
- Lisp expression before point, evaluates it, and inserts the value in
- printed representation before point.  The result is a complete
- typescript of the expressions you have evaluated and their values.
- 
-    The `*scratch*' buffer's major mode is Lisp Interaction mode, which
- is the same as Emacs-Lisp mode except for the binding of LFD.
- 
-    The rationale for this feature is that Emacs must have a buffer when
- it starts up, but that buffer is not useful for editing files since a
- new buffer is made for every file that you visit.  The Lisp interpreter
- typescript is the most useful thing I can think of for the initial
- buffer to do.  Type `M-x lisp-interaction-mode' to put the current
- buffer in Lisp Interaction mode.
- 
- 
- File: emacs,  Node: External Lisp,  Prev: Lisp Eval,  Up: Building
- 
- Running an External Lisp
- ========================
- 
-    Emacs has facilities for running programs in other Lisp systems.
- You can run a Lisp process as an inferior of Emacs, and pass
- expressions to it to be evaluated.  You can also pass changed function
- definitions directly from the Emacs buffers in which you edit the Lisp
- programs to the inferior Lisp process.
- 
-    To run an inferior Lisp process, type `M-x run-lisp'.  This runs the
- program named `lisp', the same program you would run by typing `lisp'
- as a shell command, with both input and output going through an Emacs
- buffer named `*lisp*'.  That is to say, any "terminal output" from Lisp
- will go into the buffer, advancing point, and any "terminal input" for
- Lisp comes from text in the buffer.  (You can change the name of the
- Lisp executable file by setting the variable `inferior-lisp-program'.)
- 
-    To give input to Lisp, go to the end of the buffer and type the
- input, terminated by RET.  The `*lisp*' buffer is in Inferior Lisp
- mode, which combines the special characteristics of Lisp mode with most
- of the features of Shell mode (*note Shell Mode::.).  The definition of
- RET to send a line to a subprocess is one of the features of Shell mode.
- 
-    For the source files of programs to run in external Lisps, use Lisp
- mode.  This mode can be selected with `M-x lisp-mode', and is used
- automatically for files whose names end in `.l', `.lsp', or `.lisp', as
- most Lisp systems usually expect.
- 
-    When you edit a function in a Lisp program you are running, the
- easiest way to send the changed definition to the inferior Lisp process
- is the key `C-M-x'.  In Lisp mode, this runs the function
- `lisp-eval-defun', which finds the defun around or following point and
- sends it as input to the Lisp process.  (Emacs can send input to any
- inferior process regardless of what buffer is current.)
- 
-    Contrast the meanings of `C-M-x' in Lisp mode (for editing programs
- to be run in another Lisp system) and Emacs-Lisp mode (for editing Lisp
- programs to be run in Emacs): in both modes it has the effect of
- installing the function definition that point is in, but the way of
- doing so is different according to where the relevant Lisp environment
- is found.  *Note Executing Lisp::.
- 
- 
- File: emacs,  Node: Abbrevs,  Next: Picture,  Prev: Building,  Up: Top
- 
- Abbrevs
- *******
- 
-    A defined "abbrev" is a word which "expands", if you insert it, into
- some different text.  Abbrevs are defined by the user to expand in
- specific ways.  For example, you might define `foo' as an abbrev
- expanding to `find outer otter'.  Then you would be able to insert
- `find outer otter ' into the buffer by typing `f o o SPC'.
- 
-    A second kind of abbreviation facility is called "dynamic abbrev
- expansion".  You use dynamic abbrev expansion with an explicit command
- to expand the letters in the buffer before point by looking for other
- words in the buffer that start with those letters.  *Note Dynamic
- Abbrevs::.
- 
- * Menu:
- 
- * Abbrev Concepts::   Fundamentals of defined abbrevs.
- * Defining Abbrevs::  Defining an abbrev, so it will expand when typed.
- * Expanding Abbrevs:: Controlling expansion: prefixes, canceling expansion.
- * Editing Abbrevs::   Viewing or editing the entire list of defined abbrevs.
- * Saving Abbrevs::    Saving the entire list of abbrevs for another session.
- * Dynamic Abbrevs::   Abbreviations for words already in the buffer.
- 
- 
- File: emacs,  Node: Abbrev Concepts,  Next: Defining Abbrevs,  Up: Abbrevs
- 
- Abbrev Concepts
- ===============
- 
-    An "abbrev" is a word which has been defined to "expand" into a
- specified "expansion".  When you insert a word-separator character
- following the abbrev, that expands the abbrev--replacing the abbrev
- with its expansion.  For example, if `foo' is defined as an abbrev
- expanding to `find outer otter', then you can insert `find outer
- otter.'  into the buffer by typing `f o o .'.
- 
-    Abbrevs expand only when Abbrev mode (a minor mode) is enabled.
- Disabling Abbrev mode does not cause abbrev definitions to be forgotten,
- but they do not expand until Abbrev mode is enabled again.  The command
- `M-x abbrev-mode' toggles Abbrev mode; with a numeric argument, it
- turns Abbrev mode on if the argument is positive, off otherwise.  *Note
- Minor Modes::.  `abbrev-mode' is also a variable; Abbrev mode is on
- when the variable is non-`nil'.  The variable `abbrev-mode'
- automatically becomes local to the current buffer when it is set.
- 
-    Abbrev definitions can be "mode-specific"--active only in one major
- mode.  Abbrevs can also have "global" definitions that are active in
- all major modes.  The same abbrev can have a global definition and
- various mode-specific definitions for different major modes.  A mode
- specific definition for the current major mode overrides a global
- definition.
- 
-    Abbrevs can be defined interactively during the editing session.
- Lists of abbrev definitions can also be saved in files and reloaded in
- later sessions.  Some users keep extensive lists of abbrevs that they
- load in every session.
- 
- 
- File: emacs,  Node: Defining Abbrevs,  Next: Expanding Abbrevs,  Prev: Abbrev Concepts,  Up: Abbrevs
- 
- Defining Abbrevs
- ================
- 
- `C-x a g'
-      Define an abbrev, using one or more words before point as its
-      expansion (`add-global-abbrev').
- 
- `C-x a l'
-      Similar, but define an abbrev specific to the current major mode
-      (`add-mode-abbrev').
- 
- `C-x a i g'
-      Define a word in the buffer as an abbrev
-      (`inverse-add-global-abbrev').
- 
- `C-x a i l'
-      Define a word in the buffer as a mode-specific abbrev
-      (`inverse-add-mode-abbrev').
- 
- `M-x kill-all-abbrevs'
-      This command discards all abbrev definitions currently in effect,
-      leaving a blank slate.
- 
-    The usual way to define an abbrev is to enter the text you want the
- abbrev to expand to, position point after it, and type `C-x a g'
- (`add-global-abbrev').  This reads the abbrev itself using the
- minibuffer, and then defines it as an abbrev for one or more words
- before point.  Use a numeric argument to say how many words before
- point should be taken as the expansion.  For example, to define the
- abbrev `foo' as mentioned above, insert the text `find outer otter' and
- then type `C-u 3 C-x a g f o o RET'.
- 
-    An argument of zero to `C-x a g' means to use the contents of the
- region as the expansion of the abbrev being defined.
- 
-    The command `C-x a l' (`add-mode-abbrev') is similar, but defines a
- mode-specific abbrev.  Mode specific abbrevs are active only in a
- particular major mode.  `C-x a l' defines an abbrev for the major mode
- in effect at the time `C-x a l' is typed.  The arguments work the same
- as for `C-x a g'.
- 
-    If the text already in the buffer is the abbrev, rather than its
- expansion, use command `C-x a i g' (`inverse-add-global-abbrev')
- instead of `C-x a g', or use `C-x a i l' (`inverse-add-mode-abbrev')
- instead of `C-x a l'.  These commands are called "inverse" because they
- invert the meaning of the two text strings they use (one from the
- buffer and one read with the minibuffer).
- 
-    To change the definition of an abbrev, just define a new definition.
- When the abbrev has a prior definition, the abbrev definition commands
- ask for confirmation for replacing it.
- 
-    To remove an abbrev definition, give a negative argument to the
- abbrev definition command: `C-u - C-x a g' or `C-u - C-x a l'.  The
- former removes a global definition, while the latter removes a
- mode-specific definition.
- 
-    `M-x kill-all-abbrevs' removes all the abbrev definitions there are,
- both global and local.
- 
- 
- File: emacs,  Node: Expanding Abbrevs,  Next: Editing Abbrevs,  Prev: Defining Abbrevs,  Up: Abbrevs
- 
- Controlling Abbrev Expansion
- ============================
- 
-    An abbrev expands whenever it is present in the buffer just before
- point and you type a self-inserting whitespace or punctuation character
- (SPC, comma, etc.).  More precisely, any character that is not a word
- constituent expands an abbrev, and any word constituent character can
- be part of an abbrev.  The most common way to use an abbrev is to
- insert it and then insert a punctuation character to expand it.
- 
-    Abbrev expansion preserves case; thus, `foo' expands into `find
- outer otter'; `Foo' into `Find outer otter', and `FOO' into `FIND OUTER
- OTTER' or `Find Outer Otter' according to the variable
- `abbrev-all-caps' (a non-`nil' value chooses the first of the two
- expansions).
- 
-    These commands are used to control abbrev expansion:
- 
- `M-''
-      Separate a prefix from a following abbrev to be expanded
-      (`abbrev-prefix-mark').
- 
- `C-x a e'
-      Expand the abbrev before point (`expand-abbrev').  This is
-      effective even when Abbrev mode is not enabled.
- 
- `M-x expand-region-abbrevs'
-      Expand some or all abbrevs found in the region.
- 
-    You may wish to expand an abbrev with a prefix attached; for example,
- if `cnst' expands into `construction', you might want to use it to
- enter `reconstruction'.  It does not work to type `recnst', because
- that is not necessarily a defined abbrev.  What you can do is use the
- command `M-'' (`abbrev-prefix-mark') in between the prefix `re' and the
- abbrev `cnst'.  First, insert `re'.  Then type `M-''; this inserts a
- hyphen in the buffer to indicate that it has done its work.  Then
- insert the abbrev `cnst'; the buffer now contains `re-cnst'.  Now
- insert a non-word character to expand the abbrev `cnst' into
- `construction'.  This expansion step also deletes the hyphen that
- indicated `M-'' had been used.  The result is the desired
- `reconstruction'.
- 
-    If you actually want the text of the abbrev in the buffer, rather
- than its expansion, you can accomplish this by inserting the following
- punctuation with `C-q'.  Thus, `foo C-q ,' leaves `foo,' in the buffer.
- 
-    If you expand an abbrev by mistake, you can undo the expansion and
- bring back the abbrev itself by typing `C-_' to undo (*note Undo::.).
- This also undoes the insertion of the non-word character that expanded
- the abbrev.  If the result you want is the terminating non-word
- character plus the unexpanded abbrev, you must reinsert the terminating
- character, quoting it with `C-q'.
- 
-    `M-x expand-region-abbrevs' searches through the region for defined
- abbrevs, and for each one found offers to replace it with its expansion.
- This command is useful if you have typed in text using abbrevs but
- forgot to turn on Abbrev mode first.  It may also be useful together
- with a special set of abbrev definitions for making several global
- replacements at once.  This command is effective even if Abbrev mode is
- not enabled.
- 
-    Expanding an abbrev runs the hook `pre-abbrev-expand-hook' (*note
- Hooks::.).
- 
- 
- File: emacs,  Node: Editing Abbrevs,  Next: Saving Abbrevs,  Prev: Expanding Abbrevs,  Up: Abbrevs
- 
- Examining and Editing Abbrevs
- =============================
- 
- `M-x list-abbrevs'
-      Display a list of all abbrev definitions.
- 
- `M-x edit-abbrevs'
-      Edit a list of abbrevs; you can add, alter or remove definitions.
- 
-    The output from `M-x list-abbrevs' looks like this:
- 
-      (lisp-mode-abbrev-table)
-      "dk"	       0    "define-key"
-      (global-abbrev-table)
-      "dfn"	       0    "definition"
- 
- (Some blank lines of no semantic significance, and some other abbrev
- tables, have been omitted.)
- 
-    A line containing a name in parentheses is the header for abbrevs in
- a particular abbrev table; `global-abbrev-table' contains all the global
- abbrevs, and the other abbrev tables that are named after major modes
- contain the mode-specific abbrevs.
- 
-    Within each abbrev table, each nonblank line defines one abbrev.  The
- word at the beginning of the line is the abbrev.  The number that
- follows is the number of times the abbrev has been expanded.  Emacs
- keeps track of this to help you see which abbrevs you actually use, so
- that you can eliminate those that you don't use often.  The string at
- the end of the line is the expansion.
- 
-    `M-x edit-abbrevs' allows you to add, change or kill abbrev
- definitions by editing a list of them in an Emacs buffer.  The list has
- the same format described above.  The buffer of abbrevs is called
- `*Abbrevs*', and is in Edit-Abbrevs mode.  Type `C-c C-c' in this
- buffer to install the abbrev definitions as specified in the
- buffer--and delete any abbrev definitions not listed.
- 
-    The command `edit-abbrevs' is actually the same as `list-abbrevs'
- except that it selects the buffer `*Abbrevs*' whereas `list-abbrevs'
- merely displays it in another window.
- 
- 
- File: emacs,  Node: Saving Abbrevs,  Next: Dynamic Abbrevs,  Prev: Editing Abbrevs,  Up: Abbrevs
- 
- Saving Abbrevs
- ==============
- 
-    These commands allow you to keep abbrev definitions between editing
- sessions.
- 
- `M-x write-abbrev-file RET FILE RET'
-      Write a file FILE describing all defined abbrevs.
- 
- `M-x read-abbrev-file RET FILE RET'
-      Read the file FILE and define abbrevs as specified therein.
- 
- `M-x quietly-read-abbrev-file RET FILE RET'
-      Similar but do not display a message about what is going on.
- 
- `M-x define-abbrevs'
-      Define abbrevs from definitions in current buffer.
- 
- `M-x insert-abbrevs'
-      Insert all abbrevs and their expansions into current buffer.
- 
-    `M-x write-abbrev-file' reads a file name using the minibuffer and
- then writes a description of all current abbrev definitions into that
- file.  This is used to save abbrev definitions for use in a later
- session.  The text stored in the file is a series of Lisp expressions
- that, when executed, define the same abbrevs that you currently have.
- 
-    `M-x read-abbrev-file' reads a file name using the minibuffer and
- then reads the file, defining abbrevs according to the contents of the
- file.  `M-x quietly-read-abbrev-file' is the same except that it does
- not display a message in the echo area saying that it is doing its
- work; it is actually useful primarily in the `.emacs' file.  If an
- empty argument is given to either of these functions, they use the file
- name specified in the variable `abbrev-file-name', which is by default
- `"~/.abbrev_defs"'.
- 
-    Emacs will offer to save abbrevs automatically if you have changed
- any of them, whenever it offers to save all files (for `C-x s' or `C-x
- C-c').  This feature can be inhibited by setting the variable
- `save-abbrevs' to `nil'.
- 
-    The commands `M-x insert-abbrevs' and `M-x define-abbrevs' are
- similar to the previous commands but work on text in an Emacs buffer.
- `M-x insert-abbrevs' inserts text into the current buffer before point,
- describing all current abbrev definitions; `M-x define-abbrevs' parses
- the entire current buffer and defines abbrevs accordingly.
- 
- 
- File: emacs,  Node: Dynamic Abbrevs,  Prev: Saving Abbrevs,  Up: Abbrevs
- 
- Dynamic Abbrev Expansion
- ========================
- 
-    The abbrev facility described above operates automatically as you
- insert text, but all abbrevs must be defined explicitly.  By contrast,
- "dynamic abbrevs" allow the meanings of abbrevs to be determined
- automatically from the contents of the buffer, but dynamic abbrev
- expansion happens only when you request it explicitly.
- 
- `M-/'
-      Expand the word in the buffer before point as a "dynamic abbrev",
-      by searching in the buffer for words starting with that
-      abbreviation (`dabbrev-expand').
- 
- `C-M-/'
-      Complete the word before point as a dynamic abbrev
-      (`dabbrev-completion').
- 
-    For example, if the buffer contains `does this follow ' and you type
- `f o M-/', the effect is to insert `follow' because that is the last
- word in the buffer that starts with `fo'.  A numeric argument to `M-/'
- says to take the second, third, etc. distinct expansion found looking
- backward from point.  Repeating `M-/' searches for an alternative
- expansion by looking farther back.  After considering the entire buffer
- before point, it searches the text after point.  After searching all of
- the current buffer, `M-/' searches other buffers.
- 
-    A negative argument to `M-/', as in `C-u - M-/', says to search
- first for expansions after point, and second for expansions before
- point.  If you repeat the `M-/' to look for another expansion, do not
- specify an argument.  This tries all the expansions after point and
- then the expansions before point.
- 
-    After you have expanded a dynamic abbrev, you can copy additional
- words that follow the expansion in its original context.  Simply type
- `SPC M-/' for each word you want to copy.  The spacing and punctuation
- between words is copied along with the words.
- 
-    In shell scripts and makefiles, a variable name is sometimes prefixed
- with `$' and sometimes not.  Major modes for this kind of text can
- customize dynamic abbreviation to handle optional prefixes by setting
- the variable `dabbrev-abbrev-skip-leading-regexp'.  Its value should be
- a regular expression that matches the optional prefix that dynamic
- abbreviation should ignore.
- 
-    The command `C-M-/' (`dabbrev-completion') performs completion of a
- dynamic abbreviation.  Instead of trying the possible expansions one by
- one, it finds all of them, then inserts the text that they have in
- common.  If they have nothing in common, `C-M-/' displays a list of
- completions, from which you can select a choice in the usual manner.
- *Note Completion::.
- 
-    Dynamic abbrev expansion is completely independent of Abbrev mode;
- the expansion of a word with `M-/' is completely independent of whether
- it has a definition as an ordinary abbrev.
- 
- 
- File: emacs,  Node: Picture,  Next: Sending Mail,  Prev: Abbrevs,  Up: Top
- 
- Editing Pictures
- ****************
- 
-    To edit a picture made out of text characters (for example, a picture
- of the division of a register into fields, as a comment in a program),
- use the command `M-x edit-picture' to enter Picture mode.
- 
-    In Picture mode, editing is based on the "quarter-plane" model of
- text, according to which the text characters lie studded on an area that
- stretches infinitely far to the right and downward.  The concept of the
- end of a line does not exist in this model; the most you can say is
- where the last nonblank character on the line is found.
- 
-    Of course, Emacs really always considers text as a sequence of
- characters, and lines really do have ends.  But Picture mode replaces
- the most frequently-used commands with variants that simulate the
- quarter-plane model of text.  They do this by inserting spaces or by
- converting tabs to spaces.
- 
-    Most of the basic editing commands of Emacs are redefined by Picture
- mode to do essentially the same thing but in a quarter-plane way.  In
- addition, Picture mode defines various keys starting with the `C-c'
- prefix to run special picture editing commands.
- 
-    One of these keys, `C-c C-c', is pretty important.  Often a picture
- is part of a larger file that is usually edited in some other major
- mode.  `M-x edit-picture' records the name of the previous major mode
- so you can use the `C-c C-c' command (`picture-mode-exit') later to go
- back to that mode.  `C-c C-c' also deletes spaces from the ends of
- lines, unless given a numeric argument.
- 
-    The special commands of Picture mode all work in other modes
- (provided the `picture' library is loaded), but are not bound to keys
- except in Picture mode.  The descriptions below talk of moving "one
- column" and so on, but all the picture mode commands handle numeric
- arguments as their normal equivalents do.
- 
-    Turning on Picture mode runs the hook `picture-mode-hook' (*note
- Hooks::.).
- 
- * Menu:
- 
- * Basic Picture::         Basic concepts and simple commands of Picture Mode.
- * Insert in Picture::     Controlling direction of cursor motion
-                             after "self-inserting" characters.
- * Tabs in Picture::       Various features for tab stops and indentation.
- * Rectangles in Picture:: Clearing and superimposing rectangles.
- 
- 
- File: emacs,  Node: Basic Picture,  Next: Insert in Picture,  Prev: Picture,  Up: Picture
- 
- Basic Editing in Picture Mode
- =============================
- 
-    Most keys do the same thing in Picture mode that they usually do, but
- do it in a quarter-plane style.  For example, `C-f' is rebound to run
- `picture-forward-column', a command which moves point one column to the
- right, inserting a space if necessary so that the actual end of the
- line makes no difference.  `C-b' is rebound to run
- `picture-backward-column', which always moves point left one column,
- converting a tab to multiple spaces if necessary.  `C-n' and `C-p' are
- rebound to run `picture-move-down' and `picture-move-up', which can
- either insert spaces or convert tabs as necessary to make sure that
- point stays in exactly the same column.  `C-e' runs
- `picture-end-of-line', which moves to after the last nonblank character
- on the line.  There is no need to change `C-a', as the choice of screen
- model does not affect beginnings of lines.
- 
-    Insertion of text is adapted to the quarter-plane screen model
- through the use of Overwrite mode (*note Minor Modes::.).
- Self-inserting characters replace existing text, column by column,
- rather than pushing existing text to the right.  RET runs
- `picture-newline', which just moves to the beginning of the following
- line so that new text will replace that line.
- 
-    Picture mode provides erasure instead of deletion and killing of
- text.  DEL (`picture-backward-clear-column') replaces the preceding
- character with a space rather than removing it; this moves point
- backwards.  `C-d' (`picture-clear-column') replaces the next character
- or characters with spaces, but does not move point.  (If you want to
- clear characters to spaces and move forward over them, use SPC.)  `C-k'
- (`picture-clear-line') really kills the contents of lines, but does not
- delete the newlines from the buffer.
- 
-    To do actual insertion, you must use special commands.  `C-o'
- (`picture-open-line') creates a blank line after the current line; it
- never splits a line.  `C-M-o', `split-line', makes sense in Picture
- mode, so it is not changed.  LFD (`picture-duplicate-line') inserts
- below the current line another line with the same contents.
- 
-    To do actual deletion in Picture mode, use `C-w', `C-c C-d' (which
- is defined as `delete-char', as `C-d' is in other modes), or one of the
- picture rectangle commands (*note Rectangles in Picture::.).
- 
- 
- File: emacs,  Node: Insert in Picture,  Next: Tabs in Picture,  Prev: Basic Picture,  Up: Picture
- 
- Controlling Motion after Insert
- ===============================
- 
-    Since "self-inserting" characters in Picture mode overwrite and move
- point, there is no essential restriction on how point should be moved.
- Normally point moves right, but you can specify any of the eight
- orthogonal or diagonal directions for motion after a "self-inserting"
- character.  This is useful for drawing lines in the buffer.
- 
- `C-c <'
-      Move left after insertion (`picture-movement-left').
- 
- `C-c >'
-      Move right after insertion (`picture-movement-right').
- 
- `C-c ^'
-      Move up after insertion (`picture-movement-up').
- 
- `C-c .'
-      Move down after insertion (`picture-movement-down').
- 
- `C-c `'
-      Move up and left ("northwest") after insertion
-      (`picture-movement-nw').
- 
- `C-c ''
-      Move up and right ("northeast") after insertion
-      (`picture-movement-ne').
- 
- `C-c /'
-      Move down and left ("southwest") after insertion
-      (`picture-movement-sw').
- 
- `C-c \'
-      Move down and right ("southeast") after insertion
-      (`picture-movement-se').
- 
-    Two motion commands move based on the current Picture insertion
- direction.  The command `C-c C-f' (`picture-motion') moves in the same
- direction as motion after "insertion" currently does, while `C-c C-b'
- (`picture-motion-reverse') moves in the opposite direction.
- 
- 
- File: emacs,  Node: Tabs in Picture,  Next: Rectangles in Picture,  Prev: Insert in Picture,  Up: Picture
- 
- Picture Mode Tabs
- =================
- 
-    Two kinds of tab-like action are provided in Picture mode.  Use
- `M-TAB' (`picture-tab-search') for context-based tabbing.  With no
- argument, it moves to a point underneath the next "interesting"
- character that follows whitespace in the previous nonblank line.
- "Next" here means "appearing at a horizontal position greater than the
- one point starts out at."  With an argument, as in `C-u M-TAB', this
- command moves to the next such interesting character in the current
- line.  `M-TAB' does not change the text; it only moves point.
- "Interesting" characters are defined by the variable
- `picture-tab-chars', which should define a set of characters.  The
- syntax for this variable is like the syntax used inside of `[...]' in a
- regular expression--but without the `[' and the `]'.  Its default value
- is `"!-~"'.
- 
-    TAB itself runs `picture-tab', which operates based on the current
- tab stop settings; it is the Picture mode equivalent of
- `tab-to-tab-stop'.  Normally it just moves point, but with a numeric
- argument it clears the text that it moves over.
- 
-    The context-based and tab-stop-based forms of tabbing are brought
- together by the command `C-c TAB', `picture-set-tab-stops'.  This
- command sets the tab stops to the positions which `M-TAB' would
- consider significant in the current line.  The use of this command,
- together with TAB, can get the effect of context-based tabbing.  But
- `M-TAB' is more convenient in the cases where it is sufficient.
- 
- 
- File: emacs,  Node: Rectangles in Picture,  Prev: Tabs in Picture,  Up: Picture
- 
- Picture Mode Rectangle Commands
- ===============================
- 
-    Picture mode defines commands for working on rectangular pieces of
- the text in ways that fit with the quarter-plane model.  The standard
- rectangle commands may also be useful (*note Rectangles::.).
- 
- `C-c C-k'
-      Clear out the region-rectangle with spaces
-      (`picture-clear-rectangle').  With argument, delete the text.
- 
- `C-c C-w R'
-      Similar but save rectangle contents in register R first
-      (`picture-clear-rectangle-to-register').
- 
- `C-c C-y'
-      Copy last killed rectangle into the buffer by overwriting, with
-      upper left corner at point (`picture-yank-rectangle').  With
-      argument, insert instead.
- 
- `C-c C-x R'
-      Similar, but use the rectangle in register R
-      (`picture-yank-rectangle-from-register').
- 
-    The picture rectangle commands `C-c C-k' (`picture-clear-rectangle')
- and `C-c C-w' (`picture-clear-rectangle-to-register') differ from the
- standard rectangle commands in that they normally clear the rectangle
- instead of deleting it; this is analogous with the way `C-d' is changed
- in Picture mode.
- 
-    However, deletion of rectangles can be useful in Picture mode, so
- these commands delete the rectangle if given a numeric argument.  `C-c
- C-k' either with or without a numeric argument saves the rectangle for
- `C-c C-y'.
- 
-    The Picture mode commands for yanking rectangles differ from the
- standard ones in overwriting instead of inserting.  This is the same way
- that Picture mode insertion of other text differs from other modes.
- `C-c C-y' (`picture-yank-rectangle') inserts (by overwriting) the
- rectangle that was most recently killed, while `C-c C-x'
- (`picture-yank-rectangle-from-register') does likewise for the
- rectangle found in a specified register.
- 
- 
- File: emacs,  Node: Sending Mail,  Next: Rmail,  Prev: Picture,  Up: Top
- 
- Sending Mail
- ************
- 
-    To send a message in Emacs, you start by typing a command (`C-x m')
- to select and initialize the `*mail*' buffer.  Then you edit the text
- and headers of the message in this buffer, and type another command
- (`C-c C-s' or `C-c C-c') to send the message.
- 
- `C-x m'
-      Begin composing a message to send (`mail').
- 
- `C-x 4 m'
-      Likewise, but display the message in another window
-      (`mail-other-window').
- 
- `C-x 5 m'
-      Likewise, but make a new frame (`mail-other-frame').
- 
- `C-c C-s'
-      In Mail mode, send the message (`mail-send').
- 
- `C-c C-c'
-      Send the message and bury the mail buffer (`mail-send-and-exit').
- 
-    The command `C-x m' (`mail') selects a buffer named `*mail*' and
- initializes it with the skeleton of an outgoing message.  `C-x 4 m'
- (`mail-other-window') selects the `*mail*' buffer in a different
- window, leaving the previous current buffer visible.  `C-x 5 m'
- (`mail-other-frame') creates a new frame to select the `*mail*' buffer.
- 
-    Because the mail composition buffer is an ordinary Emacs buffer, you
- can switch to other buffers while in the middle of composing mail, and
- switch back later (or never).  If you use the `C-x m' command again
- when you have been composing another message but have not sent it, you
- are asked to confirm before the old message is erased.  If you answer
- `n', the `*mail*' buffer is left selected with its old contents, so you
- can finish the old message and send it.  `C-u C-x m' is another way to
- do this.  Sending the message marks the `*mail*' buffer "unmodified",
- which avoids the need for confirmation when `C-x m' is next used.
- 
-    If you are composing a message in the `*mail*' buffer and want to
- send another message before finishing the first, rename the `*mail*'
- buffer using `M-x rename-uniquely' (*note Misc Buffer::.).  Then you
- can use `C-x m' or its variants described above to make a new `*mail*'
- buffer.  Once you've done that, you can work with each mail buffer
- independently.
- 
- * Menu:
- 
- * Format: Mail Format.	     Format of the mail being composed.
- * Headers: Mail Headers.     Details of permitted mail header fields.
- * Aliases: Mail Aliases.     Abbreviating and grouping mail addresses.
- * Mode: Mail Mode.	     Special commands for editing mail being composed.
- * Spook: Distracting NSA.    How to distract the NSA's attention.
- 
- 
- File: emacs,  Node: Mail Format,  Next: Mail Headers,  Up: Sending Mail
- 
- The Format of the Mail Buffer
- =============================
- 
-    In addition to the "text" or "body", a message has "header fields"
- which say who sent it, when, to whom, why, and so on.  Some header
- fields such as the date and sender are created automatically after the
- message is sent.  Others, such as the recipient names, must be
- specified by you in order to send the message properly.
- 
-    Mail mode provides a few commands to help you edit some header
- fields, and some are preinitialized in the buffer automatically at
- times.  You can insert and edit header fields using ordinary editing
- commands.
- 
-    The line in the buffer that says
- 
-      --text follows this line--
- 
- is a special delimiter that separates the headers you have specified
- from the text.  Whatever follows this line is the text of the message;
- the headers precede it.  The delimiter line itself does not appear in
- the message actually sent.  The text used for the delimiter line is
- controlled by the variable `mail-header-separator'.
- 
-    Here is an example of what the headers and text in the mail buffer
- might look like.
- 
-      To: gnu@prep.ai.mit.edu
-      CC: lungfish@spam.org, byob@spam.org
-      Subject: The Emacs Manual
-      --Text follows this line--
-      Please ignore this message.
- 
--- 0 ----
Index: emacs/info/emacs-14
diff -c emacs/info/emacs-14:1.1.1.2 emacs/info/emacs-14:removed
*** emacs/info/emacs-14:1.1.1.2	Mon Jul 22 01:51:57 1996
--- emacs/info/emacs-14	Fri Aug  2 20:05:36 1996
***************
*** 1,1135 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Mail Headers,  Next: Mail Aliases,  Prev: Mail Format,  Up: Sending Mail
- 
- Mail Header Fields
- ==================
- 
-    A header field in the mail buffer starts with a field name at the
- beginning of a line, terminated by a colon.  Upper and lower case are
- equivalent in field names (and in mailing addresses also).  After the
- colon and optional whitespace comes the contents of the field.
- 
-    You can use any name you like for a header field, but normally people
- use only standard field names with accepted meanings.  Here is a table
- of fields commonly used in outgoing messages.
- 
- `To'
-      This field contains the mailing addresses to which the message is
-      addressed.
- 
- `Subject'
-      The contents of the `Subject' field should be a piece of text that
-      says what the message is about.  The reason `Subject' fields are
-      useful is that most mail-reading programs can provide a summary of
-      messages, listing the subject of each message but not its text.
- 
- `CC'
-      This field contains additional mailing addresses to send the
-      message to, but whose readers should not regard the message as
-      addressed to them.
- 
- `BCC'
-      This field contains additional mailing addresses to send the
-      message to, which should not appear in the header of the message
-      actually sent.  Copies sent this way are called "blind carbon
-      copies".
- 
-      To send a blind carbon copy of every outgoing message to yourself,
-      set the variable `mail-self-blind' to `t'.
- 
- `FCC'
-      This field contains the name of one file and directs Emacs to
-      append a copy of the message to that file when you send the
-      message.  If the file is in Rmail format, Emacs writes the message
-      to Rmail format; otherwise, Emacs writes the message in system
-      mail file format.
- 
-      To put a fixed file name as in `FCC' field each time you start
-      editing an outgoing message, set the variable
-      `mail-archive-file-name' to that file name.  Unless you remove the
-      `FCC' field before sending, the message will be written into that
-      file when it is sent.
- 
- `From'
-      Use the `From' field to say who you are, when the account you are
-      using to send the mail is not your own.  The contents of the
-      `From' field should be a valid mailing address, since replies will
-      normally go there.
- 
- `Reply-to'
-      Use this field to direct replies to a different address.  Most
-      mail-reading programs (including Rmail) automatically send replies
-      to the `Reply-to' address in preference to the `From' address.  By
-      adding a `Reply-to' field to your header, you can work around any
-      problems your `From' address may cause for replies.
- 
-      To put a fixed `Reply-to' address into every outgoing message, set
-      the variable `mail-default-reply-to' to that address (as a string).
-      Then `mail' initializes the message with a `Reply-to' field as
-      specified.  You can delete or alter that header field before you
-      send the message, if you wish.  When Emacs starts up, if the
-      environment variable `REPLYTO' is set, `mail-default-reply-to' is
-      initialized from that environment variable.
- 
- `In-reply-to'
-      This field contains a piece of text describing a message you are
-      replying to.  Some mail systems can use this information to
-      correlate related pieces of mail.  Normally this field is filled
-      in by Rmail when you reply to a message in Rmail, and you never
-      need to think about it (*note Rmail::.).
- 
-    The `To', `CC', `BCC' and `FCC' fields can appear any number of
- times, to specify many places to send the message.  The `To', `CC', and
- `BCC' fields can have continuation lines.  All the lines starting with
- whitespace, following the line on which the field starts, are
- considered part of the field.  For example,
- 
-      To: foo@here.net, this@there.net,
-        me@gnu.cambridge.mass.usa.earth.spiral3281
- 
-    When you send the message, if you didn't write a `From' field
- yourself, Emacs puts in one for you.  The variable `mail-from-style'
- controls the format:
- 
- `nil'
-      Just the email address, as in `king@grassland.com'.
- 
- `parens'
-      Both email address and full name, as in `king@grassland.com (Elvis
-      Parsley)'.
- 
- `angles'
-      Both email address and full name, as in `Elvis Parsley
-      <king@grassland.com>'.
- 
- 
- File: emacs,  Node: Mail Aliases,  Next: Mail Mode,  Prev: Mail Headers,  Up: Sending Mail
- 
- Mail Aliases
- ============
- 
-    You can define "mail aliases" in a file named `~/.mailrc'.  These
- are short mnemonic names which stand for mail addresses or groups of
- mail addresses.  Like many other mail programs, Emacs expands aliases
- when they occur in the `To', `From', `CC', `BCC', and `Reply-to'
- fields, plus their `Resent-' variants.
- 
-    To define an alias in `~/.mailrc', write a line in the following
- format:
- 
-      alias SHORTADDRESS FULLADDRESSES
- 
- Here FULLADDRESSES stands for one or more mail addresses for
- SHORTADDRESS to expand into.  Separate multiple addresses with spaces;
- if an address contains a space, quote the whole address with a pair of
- double-quotes.
- 
-    For instance, to make `maingnu' stand for `gnu@prep.ai.mit.edu' plus
- a local address of your own, put in this line:
- 
-      alias maingnu gnu@prep.ai.mit.edu local-gnu
- 
-    Emacs also recognizes include commands in `.mailrc' files.  They
- look like this:
- 
-      source FILENAME
- 
- The file `~/.mailrc' is used primarily by other mail-reading programs;
- it can contain various other commands.  Emacs ignores everything in it
- except for alias definitions and include commands.
- 
-    Another way to define a mail alias, within Emacs alone, is with the
- `define-mail-alias' command.  It prompts for the alias and then the
- full address.  You can use it to define aliases in your `.emacs' file,
- like this:
- 
-      (define-mail-alias "maingnu" "gnu@prep.ai.mit.edu")
- 
-    `define-mail-alias' records aliases by adding them to a variable
- named `mail-aliases'.  If you are comfortable with manipulating Lisp
- lists, you can set `mail-aliases' directly.  The initial value of
- `mail-aliases' is `t', which means that Emacs should read `.mailrc' to
- get the proper value.
- 
-    You can specify a different file name to use instead of `~/.mailrc'
- by setting the variable `mail-personal-alias-file'.
- 
-    Normally, Emacs expands aliases when you send the message.  If you
- like, you can have mail aliases expand as abbrevs, as soon as you type
- them in (*note Abbrevs::.).  To enable this feature, execute the
- following:
- 
-      (add-hook 'mail-setup-hook 'mail-abbrevs-setup)
- 
- This can go in your `.emacs' file.  *Note Hooks::.  If you use this
- feature, you must use `define-mail-abbrev' instead of
- `define-mail-alias'; the latter does not work with this package.  Note
- that the mail abbreviation package uses the variable `mail-abbrevs'
- instead of `mail-aliases', and that all alias names are converted to
- lower case.
- 
-    The mail abbreviation package also provides the `C-c C-a'
- (`mail-interactive-insert-alias') command, which reads an alias name
- (with completion) and inserts its definition at point.  This is useful
- when editing the message text itself or a header field such as
- `Subject' in which Emacs does not normally expand aliases.
- 
-    Note that abbrevs expand only if you insert a word-separator
- character afterward.  However, you can rebind `C-n' and `M->' to cause
- expansion as well.  Here's how to do that:
- 
-      (define-key mail-mode-map "\C-n" 'mail-abbrev-next-line)
-      (define-key mail-mode-map "\M->" 'mail-abbrev-end-of-buffer)
- 
- 
- File: emacs,  Node: Mail Mode,  Next: Distracting NSA,  Prev: Mail Aliases,  Up: Sending Mail
- 
- Mail Mode
- =========
- 
-    The major mode used in the mail buffer is Mail mode, which is much
- like Text mode except that various special commands are provided on the
- `C-c' prefix.  These commands all have to do specifically with editing
- or sending the message.
- 
- `C-c C-s'
-      Send the message, and leave the mail buffer selected (`mail-send').
- 
- `C-c C-c'
-      Send the message, and select some other buffer
-      (`mail-send-and-exit').
- 
- `C-c C-f C-t'
-      Move to the `To' header field, creating one if there is none
-      (`mail-to').
- 
- `C-c C-f C-s'
-      Move to the `Subject' header field, creating one if there is none
-      (`mail-subject').
- 
- `C-c C-f C-c'
-      Move to the `CC' header field, creating one if there is none
-      (`mail-cc').
- 
- `C-c C-f C-b'
-      Move to the `BCC' header field, creating one if there is none
-      (`mail-bcc').
- 
- `C-c C-f C-f'
-      Move to the `FCC' header field, creating one if there is none
-      (`mail-fcc').
- 
- `C-c C-t'
-      Move to the beginning of the message body text (`mail-text').
- 
- `C-c C-w'
-      Insert the file `~/.signature' at the end of the message text
-      (`mail-signature').
- 
- `C-c C-y'
-      Yank the selected message from Rmail (`mail-yank-original').  This
-      command does nothing unless your command to start sending a
-      message was issued with Rmail.
- 
- `C-c C-q'
-      Fill all paragraphs of yanked old messages, each individually
-      (`mail-fill-yanked-message').
- 
- `M-x ispell-message'
-      Do spelling correction on the message text, but not on citations
-      from other messages.
- 
-    There are two ways to send the message.  `C-c C-s' (`mail-send')
- sends the message and marks the mail buffer unmodified, but leaves that
- buffer selected so that you can modify the message (perhaps with new
- recipients) and send it again.  `C-c C-c' (`mail-send-and-exit') sends
- and then deletes the window or switches to another buffer.  It puts the
- mail buffer at the lowest priority for reselection by default, since
- you are finished with using it.  This is the usual way to send the
- message.
- 
-    Mail mode provides special commands for editing the headers and text
- of the message before you send it.  There are five commands defined to
- move point to particular header fields, all based on the prefix `C-c
- C-f' (`C-f' is for "field").  They are `C-c C-f C-t' (`mail-to') to
- move to the `To' field, `C-c C-f C-s' (`mail-subject') for the
- `Subject' field, `C-c C-f C-c' (`mail-cc') for the `CC' field, `C-c C-f
- C-b' (`mail-bcc') for the `BCC' field, and `C-c C-f C-f' (`mail-fcc')
- for the `FCC' field.  If the field in question does not exist, these
- commands create one.  We provide special motion commands for these
- particular fields because they are the fields users most often want to
- edit.
- 
-    `C-c C-t' (`mail-text') moves point to just after the header
- separator line--that is, to the beginning of the message body text.
- 
-    `C-c C-w' (`mail-signature') adds a standard piece text at the end
- of the message to say more about who you are.  The text comes from the
- file `.signature' in your home directory.  To insert your signature
- automatically, set the variable `mail-signature' non-`nil'; then
- starting a mail message automatically inserts the contents of your
- `.signature' file.  If you want to omit your signature from a
- particular message, delete it from the buffer before you send the
- message.
- 
-    When mail sending is invoked from the Rmail mail reader using an
- Rmail command, `C-c C-y' can be used inside the mail buffer to insert
- the text of the message you are replying to.  Normally it indents each
- line of that message four spaces and eliminates most header fields.  A
- numeric argument specifies the number of spaces to indent.  An argument
- of just `C-u' says not to indent at all and not to eliminate anything.
- `C-c C-y' always uses the current message from the Rmail buffer, so you
- can insert several old messages by selecting one in Rmail, switching to
- `*mail*' and yanking it, then switching back to Rmail to select another.
- 
-    You can specify the text for `C-c C-y' to insert at the beginning of
- each line: set `mail-yank-prefix' to the desired string.  (A value of
- `nil' means to use indentation; this is the default.) However, `C-u C-c
- C-y' never adds anything at the beginning of the inserted lines,
- regardless of the value of `mail-yank-prefix'.
- 
-    After using `C-c C-y', you can use the command `C-c C-q'
- (`mail-fill-yanked-message') to fill the paragraphs of the yanked old
- message or messages.  One use of `C-c C-q' fills all such paragraphs,
- each one individually.  *Note Filling::.
- 
-    You can do spelling correction on the message text you have written
- with the command `M-x ispell-message'.  If you have yanked an incoming
- message into the outgoing draft, this command skips what was yanked,
- but it checks the text that you yourself inserted.  (It looks for
- indentation or `mail-yank-prefix' to distinguish the cited lines from
- your input.)  *Note Spelling::.
- 
-    Mail mode defines the character `%' as a word separator; this is
- helpful for using the word commands to edit mail addresses.
- 
-    Mail mode is normally used in buffers set up automatically by the
- `mail' command and related commands.  However, you can also switch to
- Mail mode in a file-visiting buffer.  That is a useful thing to do if
- you have saved draft message text in a file.  In a file-visiting buffer,
- `C-c C-c' does not clear the modified flag, because only saving the
- file should do that.  As a result, you don't get a warning about trying
- to send the same message twice.
- 
-    Turning on Mail mode (which `C-x m' does automatically) runs the
- normal hooks `text-mode-hook' and `mail-mode-hook'.  Initializing a new
- outgoing message runs the normal hook `mail-setup-hook'; if you want to
- add special fields to your mail header or make other changes to the
- appearance of the mail buffer, use that hook.  *Note Hooks::.
- 
-    The main difference between these hooks is just when they are
- invoked.  Whenever you type `M-x mail', `mail-mode-hook' runs as soon
- as the `*mail*' buffer is created.  Then the `mail-setup' function puts
- in the default contents of the buffer.  After these default contents
- are inserted, `mail-setup-hook' runs.
- 
- 
- File: emacs,  Node: Distracting NSA,  Prev: Mail Mode,  Up: Sending Mail
- 
- Distracting the NSA
- ===================
- 
-    `M-x spook' adds a line of randomly chosen keywords to an outgoing
- mail message.  The keywords are chosen from a list of words that suggest
- you are discussing something subversive.
- 
-    The idea behind this feature is that the suspicion that the NSA
- snoops on all electronic mail messages that contain keywords suggesting
- they might be interested.  (The NSA says they don't, but that's what
- they *would* say.)  The idea is that if lots of people add suspicious
- words to their messages, the NSA will get so busy with spurious input
- that they will have to give up reading it all.
- 
-    Here's how to insert spook keywords automatically whenever you start
- entering an outgoing message:
- 
-      (add-hook 'mail-setup-hook 'spook)
- 
-    Whether or not this confuses the NSA, it at least amuses people.
- 
- 
- File: emacs,  Node: Rmail,  Next: Dired,  Prev: Sending Mail,  Up: Top
- 
- Reading Mail with Rmail
- ***********************
- 
-    Rmail is an Emacs subsystem for reading and disposing of mail that
- you receive.  Rmail stores mail messages in files called Rmail files.
- Reading the message in an Rmail file is done in a special major mode,
- Rmail mode, which redefines most letters to run commands for managing
- mail.
- 
- * Menu:
- 
- * Basic: Rmail Basics.       Basic concepts of Rmail, and simple use.
- * Scroll: Rmail Scrolling.   Scrolling through a message.
- * Motion: Rmail Motion.      Moving to another message.
- * Deletion: Rmail Deletion.  Deleting and expunging messages.
- * Inbox: Rmail Inbox.        How mail gets into the Rmail file.
- * Files: Rmail Files.        Using multiple Rmail files.
- * Output: Rmail Output.	     Copying message out to files.
- * Labels: Rmail Labels.      Classifying messages by labeling them.
- * Reply: Rmail Reply.        Sending replies to messages you are viewing.
- * Summary: Rmail Summary.    Summaries show brief info on many messages.
- * Sort: Rmail Sorting.       Sorting messages in Rmail.
- * Display: Rmail Display.    How Rmail displays a message; customization.
- * Editing: Rmail Editing.    Editing message text and headers in Rmail.
- * Digest: Rmail Digest.      Extracting the messages from a digest message.
- * Out of Rmail::	     Converting an Rmail file to mailbox format.
- * Rot13: Rmail Rot13.	     Reading messages encoded in the rot13 code.
- 
- 
- File: emacs,  Node: Rmail Basics,  Next: Rmail Scrolling,  Up: Rmail
- 
- Basic Concepts of Rmail
- =======================
- 
-    Using Rmail in the simplest fashion, you have one Rmail file
- `~/RMAIL' in which all of your mail is saved.  It is called your
- "primary Rmail file".  The command `M-x rmail' reads your primary Rmail
- file, merges new mail in from your inboxes, displays the first message
- you haven't read yet, and lets you begin reading.
- 
-    Rmail uses narrowing to hide all but one message in the Rmail file.
- The message that is shown is called the "current message".  Rmail
- mode's special commands can do such things as delete the current
- message, copy it into another file, send a reply, or move to another
- message.  You can also create multiple Rmail files and use Rmail to move
- messages between them.
- 
-    Within the Rmail file, messages are normally arranged sequentially in
- order of receipt; you can specify other ways to sort them.  Messages are
- assigned consecutive integers as their "message numbers".  The number
- of the current message is displayed in Rmail's mode line, followed by
- the total number of messages in the file.  You can move to a message by
- specifying its message number with the `j' key (*note Rmail Motion::.).
- 
-    Following the usual conventions of Emacs, changes in an Rmail file
- become permanent only when the file is saved.  You can save it with `s'
- (`rmail-save'), which also expunges deleted messages from the file
- first (*note Rmail Deletion::.).  To save the file without expunging,
- use `C-x C-s'.  Rmail also saves the Rmail file after merging new mail
- from an inbox file (*note Rmail Inbox::.).
- 
-    You can exit Rmail with `q' (`rmail-quit'); this expunges and saves
- the Rmail file and then switches to another buffer.  But there is no
- need to `exit' formally.  If you switch from Rmail to editing in other
- buffers, and never happen to switch back, you have exited.  (The Rmail
- command `b', `rmail-bury', does this for you.)  Just make sure to save
- the Rmail file eventually (like any other file you have changed).  `C-x
- s' is a good enough way to do this (*note Saving::.).
- 
- 
- File: emacs,  Node: Rmail Scrolling,  Next: Rmail Motion,  Prev: Rmail Basics,  Up: Rmail
- 
- Scrolling Within a Message
- ==========================
- 
-    When Rmail displays a message that does not fit on the screen, you
- must scroll through it to read the rest.  You could do this with `C-v',
- `M-v' and `M-<', but in Rmail scrolling is so frequent that it deserves
- to be easier to type.
- 
- `SPC'
-      Scroll forward (`scroll-up').
- 
- `DEL'
-      Scroll backward (`scroll-down').
- 
- `.'
-      Scroll to start of message (`rmail-beginning-of-message').
- 
-    Since the most common thing to do while reading a message is to
- scroll through it by screenfuls, Rmail makes SPC and DEL synonyms of
- `C-v' (`scroll-up') and `M-v' (`scroll-down')
- 
-    The command `.' (`rmail-beginning-of-message') scrolls back to the
- beginning of the selected message.  This is not quite the same as `M-<':
- for one thing, it does not set the mark; for another, it resets the
- buffer boundaries to the current message if you have changed them.
- 
- 
- File: emacs,  Node: Rmail Motion,  Next: Rmail Deletion,  Prev: Rmail Scrolling,  Up: Rmail
- 
- Moving Among Messages
- =====================
- 
-    The most basic thing to do with a message is to read it.  The way to
- do this in Rmail is to make the message current.  The usual practice is
- to move sequentially through the file, since this is the order of
- receipt of messages.  When you enter Rmail, you are positioned at the
- first message that you have not yet made current (that is, the first one
- that has the `unseen' attribute; *note Rmail Labels::.).  Move forward
- to see the other new messages; move backward to reexamine old messages.
- 
- `n'
-      Move to the next nondeleted message, skipping any intervening
-      deleted messages (`rmail-next-undeleted-message').
- 
- `p'
-      Move to the previous nondeleted message
-      (`rmail-previous-undeleted-message').
- 
- `M-n'
-      Move to the next message, including deleted messages
-      (`rmail-next-message').
- 
- `M-p'
-      Move to the previous message, including deleted messages
-      (`rmail-previous-message').
- 
- `j'
-      Move to the first message.  With argument N, move to message
-      number N (`rmail-show-message').
- 
- `>'
-      Move to the last message (`rmail-last-message').
- 
- `<'
-      Move to the first message (`rmail-first-message').
- 
- `M-s REGEXP RET'
-      Move to the next message containing a match for REGEXP
-      (`rmail-search').
- 
- `- M-s REGEXP RET'
-      Move to the previous message containing a match for REGEXP.
- 
-    `n' and `p' are the usual way of moving among messages in Rmail.
- They move through the messages sequentially, but skip over deleted
- messages, which is usually what you want to do.  Their command
- definitions are named `rmail-next-undeleted-message' and
- `rmail-previous-undeleted-message'.  If you do not want to skip deleted
- messages--for example, if you want to move to a message to undelete
- it--use the variants `M-n' and `M-p' (`rmail-next-message' and
- `rmail-previous-message').  A numeric argument to any of these commands
- serves as a repeat count.
- 
-    In Rmail, you can specify a numeric argument by typing just the
- digits.  You don't need to type `C-u' first.
- 
-    The `M-s' (`rmail-search') command is Rmail's version of search.
- The usual incremental search command `C-s' works in Rmail, but it
- searches only within the current message.  The purpose of `M-s' is to
- search for another message.  It reads a regular expression (*note
- Regexps::.) nonincrementally, then searches starting at the beginning
- of the following message for a match.  It then selects that message.
- If REGEXP is empty, `M-s' reuses the regexp used the previous time.
- 
-    To search backward in the file for another message, give `M-s' a
- negative argument.  In Rmail you can do this with `- M-s'.
- 
-    It is also possible to search for a message based on labels.  *Note
- Rmail Labels::.
- 
-    To move to a message specified by absolute message number, use `j'
- (`rmail-show-message') with the message number as argument.  With no
- argument, `j' selects the first message.  `<' (`rmail-first-message')
- also selects the first message.  `>' (`rmail-last-message') selects the
- last message.
- 
- 
- File: emacs,  Node: Rmail Deletion,  Next: Rmail Inbox,  Prev: Rmail Motion,  Up: Rmail
- 
- Deleting Messages
- =================
- 
-    When you no longer need to keep a message, you can "delete" it.  This
- flags it as ignorable, and some Rmail commands pretend it is no longer
- present; but it still has its place in the Rmail file, and still has its
- message number.
- 
-    "Expunging" the Rmail file actually removes the deleted messages.
- The remaining messages are renumbered consecutively.  Expunging is the
- only action that changes the message number of any message, except for
- undigestifying (*note Rmail Digest::.).
- 
- `d'
-      Delete the current message, and move to the next nondeleted message
-      (`rmail-delete-forward').
- 
- `C-d'
-      Delete the current message, and move to the previous nondeleted
-      message (`rmail-delete-backward').
- 
- `u'
-      Undelete the current message, or move back to a deleted message and
-      undelete it (`rmail-undelete-previous-message').
- 
- `x'
-      Expunge the Rmail file (`rmail-expunge').
- 
-    There are two Rmail commands for deleting messages.  Both delete the
- current message and select another message.  `d'
- (`rmail-delete-forward') moves to the following message, skipping
- messages already deleted, while `C-d' (`rmail-delete-backward') moves
- to the previous nondeleted message.  If there is no nondeleted message
- to move to in the specified direction, the message that was just
- deleted remains current.
- 
-    To make all the deleted messages finally vanish from the Rmail file,
- type `x' (`rmail-expunge').  Until you do this, you can still
- "undelete" the deleted messages.  The undeletion command, `u'
- (`rmail-undelete-previous-message'), is designed to cancel the effect
- of a `d' command in most cases.  It undeletes the current message if
- the current message is deleted.  Otherwise it moves backward to
- previous messages until a deleted message is found, and undeletes that
- message.
- 
-    You can usually undo a `d' with a `u' because the `u' moves back to
- and undeletes the message that the `d' deleted.  But this does not work
- when the `d' skips a few already-deleted messages that follow the
- message being deleted; then the `u' command undeletes the last of the
- messages that were skipped.  There is no clean way to avoid this
- problem.  However, by repeating the `u' command, you can eventually get
- back to the message that you intend to undelete.  You can also select a
- particular deleted message with the `M-p' command, then type `u' to
- undelete it.
- 
-    A deleted message has the `deleted' attribute, and as a result
- `deleted' appears in the mode line when the current message is deleted.
- In fact, deleting or undeleting a message is nothing more than adding
- or removing this attribute.  *Note Rmail Labels::.
- 
- 
- File: emacs,  Node: Rmail Inbox,  Next: Rmail Files,  Prev: Rmail Deletion,  Up: Rmail
- 
- Rmail Files and Inboxes
- =======================
- 
-    The operating system places incoming mail for you in a file that we
- call your "inbox".  When you start up Rmail, it runs a C program called
- `movemail' to copy the new messages from your inbox into your primary
- Rmail file, which also contains other messages saved from previous
- Rmail sessions.  It is in this file that you actually read the mail
- with Rmail.  This operation is called "getting new mail".  You can get
- new mail at any time in Rmail by typing `g'.
- 
-    The variable `rmail-primary-inbox-list' contains a list of the files
- which are inboxes for your primary Rmail file.  If you don't set this
- variable explicitly, it is initialized from the `MAIL' environment
- variable, or, as a last resort, set to `nil', which means to use the
- default inbox.  The default inbox is `/var/mail/USERNAME',
- `/usr/spool/mail/USERNAME', or `/usr/mail/USERNAME', depending on your
- operating system.
- 
-    Some sites use a method called POP for accessing users' inbox data
- instead of storing the data in inbox files.  `movemail' can work with
- POP if you compile it with the macro `MAIL_USE_POP' defined, and then
- install it setuid to `root'.  It is safe to install `movemail' in this
- way.
- 
-    Assuming you have compiled and installed `movemail' appropriately,
- you can specify a POP inbox with a "file name" of the form
- `po:USERNAME'.  `movemail' handles such a name by opening a connection
- to the POP server.  The `MAILHOST' environment variable specifies the
- machine to look for the server on.
- 
-    There are three reason for having separate Rmail files and inboxes.
- 
-   1. The inbox file format varies between operating systems and
-      according to the other mail software in use.  Only one part of
-      Rmail needs to know about the alternatives, and it need only
-      understand how to convert all of them to Rmail's own format.
- 
-   2. The inbox file format usually doesn't provide a place for all the
-      information that Rmail records.
- 
-   3. It is very cumbersome to access an inbox file without danger of
-      losing mail, because it is necessary to interlock with mail
-      delivery.  Moreover, different operating systems use different
-      interlocking techniques.  The strategy of moving mail out of the
-      inbox once and for all into a separate Rmail file avoids the need
-      for interlocking in all the rest of Rmail, since only Rmail
-      operates on the Rmail file.
- 
-    When getting new mail, Rmail first copies the new mail from the inbox
- file to the Rmail file; then it saves the Rmail file; then it truncates
- the inbox file.  This way, a system crash may cause duplication of mail
- between the inbox and the Rmail file, but cannot lose mail.
- 
-    When `movemail' copies mail from an inbox in the system's mailer
- directory, it actually puts it in an intermediate file
- `~/.newmail-INBOXNAME'.  Once it finishes, Rmail reads that file,
- merges the new mail, saves the Rmail file, and only then deletes the
- intermediate file.  If there is a crash at the wrong time, this file
- continues to exist and Rmail will use it again the next time it gets new
- mail from that inbox.
- 
- 
- File: emacs,  Node: Rmail Files,  Next: Rmail Output,  Prev: Rmail Inbox,  Up: Rmail
- 
- Multiple Rmail Files
- ====================
- 
-    Rmail operates by default on your "primary Rmail file", which is
- named `~/RMAIL' and receives your incoming mail from your system inbox
- file.  But you can also have other Rmail files and edit them with
- Rmail.  These files can receive mail through their own inboxes, or you
- can move messages into them with explicit Rmail commands (*note Rmail
- Output::.).
- 
- `i FILE RET'
-      Read FILE into Emacs and run Rmail on it (`rmail-input').
- 
- `M-x set-rmail-inbox-list RET FILES RET'
-      Specify inbox file names for current Rmail file to get mail from.
- 
- `g'
-      Merge new mail from current Rmail file's inboxes
-      (`rmail-get-new-mail').
- 
- `C-u g FILE RET'
-      Merge new mail from inbox file FILE.
- 
-    To run Rmail on a file other than your primary Rmail file, you may
- use the `i' (`rmail-input') command in Rmail.  This visits the file in
- Rmail mode.  You can use `M-x rmail-input' even when not in Rmail.
- 
-    The file you read with `i' should normally be a valid Rmail file.
- If it is not, Rmail tries to decompose it into a stream of messages in
- various known formats.  If it succeeds, it converts the whole file to an
- Rmail file.  If you specify a file name that doesn't exist, `i'
- initializes a new buffer for creating a new Rmail file.
- 
-    You can also select an Rmail file from a menu.  Choose first the menu
- bar Classify item, then from the Classify menu choose the Input Rmail
- File item; then choose the Rmail file you want.  The variables
- `rmail-secondary-file-directory' and `rmail-secondary-file-regexp'
- specify which files to offer in the menu: the first variable says which
- directory to find them in; the second says which files in that
- directory to offer (all those that match the regular expression).
- These variables also apply to choosing a file for output (*note Rmail
- Output::.).
- 
-    Each Rmail file can contain a list of inbox file names; you can
- specify this list with `M-x set-rmail-inbox-list RET FILES RET'.  The
- argument can contain any number of file names, separated by commas.  It
- can also be empty, which specifies that this file should have no
- inboxes.  Once a list of inboxes is specified, the Rmail file remembers
- it permanently until you specify a different list.
- 
-    As a special exception, if your primary Rmail file does not specify
- any inbox files, it uses your standard system inbox.
- 
-    The `g' command (`rmail-get-new-mail') merges mail into the current
- Rmail file from its specified inboxes.  If the Rmail file has no
- inboxes, `g' does nothing.  The command `M-x rmail' also merges new
- mail into your primary Rmail file.
- 
-    To merge mail from a file that is not the usual inbox, give the `g'
- key a numeric argument, as in `C-u g'.  Then it reads a file name and
- merges mail from that file.  The inbox file is not deleted or changed
- in any way when `g' with an argument is used.  This is, therefore, a
- general way of merging one file of messages into another.
- 
- 
- File: emacs,  Node: Rmail Output,  Next: Rmail Labels,  Prev: Rmail Files,  Up: Rmail
- 
- Copying Messages Out to Files
- =============================
- 
-    These commands copy messages from an Rmail file into another file.
- 
- `o FILE RET'
-      Append a copy of the current message to the file FILE, using Rmail
-      file format by default (`rmail-output-to-rmail-file').
- 
- `C-o FILE RET'
-      Append a copy of the current message to the file FILE, using
-      system inbox file format by default (`rmail-output').
- 
-    The commands `o' and `C-o' copy the current message into a specified
- file.  This file may be an Rmail file or it may be in system inbox
- format; the output commands ascertain the file's format and write the
- copied message in that format.
- 
-    The `o' and `C-o' commands differ in two ways: each has its own
- separate default file name, and each specifies a choice of format to
- use when the file does not already exist.  The `o' command uses Rmail
- format when it creates a new file, while `C-o' uses system inbox format
- for a new file.  The default file name for `o' is the file name used
- last with `o', and the default file name for `C-o' is the file name
- used last with `C-o'.
- 
-    If the output file is an Rmail file currently visited in an Emacs
- buffer, the output commands copy the message into that buffer.  It is
- up to you to save the buffer eventually in its file.
- 
-    You can also output a message to an Rmail file chosen with a menu.
- Choose first the menu bar Classify item, then from the Classify menu
- choose the Output Rmail Menu item; then choose the Rmail file you want.
- This outputs the current message to that file, like the `o' command.
- The variables `rmail-secondary-file-directory' and
- `rmail-secondary-file-regexp' specify which files to offer in the menu:
- the first variable says which directory to find them in; the second
- says which files in that directory to offer (all those that match the
- regular expression).
- 
-    Copying a message gives the original copy of the message the `filed'
- attribute, so that `filed' appears in the mode line when such a message
- is current.  If you like to keep just a single copy of every mail
- message, set the variable `rmail-delete-after-output' to `t'; then the
- `o' and `C-o' commands delete the original message after copying it.
- (You can undelete the original afterward if you wish.)
- 
-    Copying messages into files in system inbox format uses the header
- fields that are displayed in Rmail at the time.  Thus, if you use the
- `t' command to view the entire header and then copy the message, the
- entire header is copied.  *Note Rmail Display::.
- 
-    The variable `rmail-output-file-alist' lets you specify intelligent
- defaults for the output file, based on the contents of the current
- message.  The value should be a list whose elements have this form:
- 
-      (REGEXP . NAME-EXP)
- 
- If there's a match for REGEXP in the current message, then the default
- file name for output is NAME-EXP.  If multiple elements match the
- message, the first matching element decides the default file name.  The
- subexpression NAME-EXP may be a string constant giving the file name to
- use, or more generally it may be any Lisp expression that returns a
- file name as a string.  `rmail-output-file-alist' applies to both `o'
- and `C-o'.
- 
- 
- File: emacs,  Node: Rmail Labels,  Next: Rmail Reply,  Prev: Rmail Output,  Up: Rmail
- 
- Labels
- ======
- 
-    Each message can have various "labels" assigned to it as a means of
- classification.  Each label has a name; different names are different
- labels.  Any given label is either present or absent on a particular
- message.  A few label names have standard meanings and are given to
- messages automatically by Rmail when appropriate; these special labels
- are called "attributes".  All other labels are assigned only by users.
- 
- `a LABEL RET'
-      Assign the label LABEL to the current message (`rmail-add-label').
- 
- `k LABEL RET'
-      Remove the label LABEL from the current message
-      (`rmail-kill-label').
- 
- `C-M-n LABELS RET'
-      Move to the next message that has one of the labels LABELS
-      (`rmail-next-labeled-message').
- 
- `C-M-p LABELS RET'
-      Move to the previous message that has one of the labels LABELS
-      (`rmail-previous-labeled-message').
- 
- `C-M-l LABELS RET'
-      Make a summary of all messages containing any of the labels LABELS
-      (`rmail-summary-by-labels').
- 
-    The `a' (`rmail-add-label') and `k' (`rmail-kill-label') commands
- allow you to assign or remove any label on the current message.  If the
- LABEL argument is empty, it means to assign or remove the same label
- most recently assigned or removed.
- 
-    Once you have given messages labels to classify them as you wish,
- there are two ways to use the labels: in moving and in summaries.
- 
-    The command `C-M-n LABELS RET' (`rmail-next-labeled-message') moves
- to the next message that has one of the labels LABELS.  The argument
- LABELS specifies one or more label names, separated by commas.  `C-M-p'
- (`rmail-previous-labeled-message') is similar, but moves backwards to
- previous messages.  A numeric argument to either command serves as a
- repeat count.
- 
-    The command `C-M-l LABELS RET' (`rmail-summary-by-labels') displays
- a summary containing only the messages that have at least one of a
- specified set of messages.  The argument LABELS is one or more label
- names, separated by commas.  *Note Rmail Summary::, for information on
- summaries.
- 
-    If the LABELS argument to `C-M-n', `C-M-p' or `C-M-l' is empty, it
- means to use the last set of labels specified for any of these commands.
- 
-    Some labels such as `deleted' and `filed' have built-in meanings and
- are assigned to or removed from messages automatically at appropriate
- times; these labels are called "attributes".  Here is a list of Rmail
- attributes:
- 
- `unseen'
-      Means the message has never been current.  Assigned to messages
-      when they come from an inbox file, and removed when a message is
-      made current.  When you start Rmail, it initially shows the first
-      message that has this attribute.
- 
- `deleted'
-      Means the message is deleted.  Assigned by deletion commands and
-      removed by undeletion commands (*note Rmail Deletion::.).
- 
- `filed'
-      Means the message has been copied to some other file.  Assigned by
-      the file output commands (*note Rmail Files::.).
- 
- `answered'
-      Means you have mailed an answer to the message.  Assigned by the
-      `r' command (`rmail-reply').  *Note Rmail Reply::.
- 
- `forwarded'
-      Means you have forwarded the message.  Assigned by the `f' command
-      (`rmail-forward').  *Note Rmail Reply::.
- 
- `edited'
-      Means you have edited the text of the message within Rmail.  *Note
-      Rmail Editing::.
- 
- `resent'
-      Means you have resent the message.  Assigned by the command `M-x
-      rmail-resend'.  *Note Rmail Reply::.
- 
-    All other labels are assigned or removed only by the user, and have
- no standard meaning.
- 
- 
- File: emacs,  Node: Rmail Reply,  Next: Rmail Summary,  Prev: Rmail Labels,  Up: Rmail
- 
- Sending Replies
- ===============
- 
-    Rmail has several commands that use Mail mode to send outgoing mail.
- *Note Sending Mail::, for information on using Mail mode.  What are
- documented here are the special commands of Rmail for entering Mail
- mode.  Note that the usual keys for sending mail--`C-x m', `C-x 4 m',
- and `C-x 5 m'--are available in Rmail mode and work just as they
- usually do.
- 
- `m'
-      Send a message (`rmail-mail').
- 
- `c'
-      Continue editing already started outgoing message
-      (`rmail-continue').
- 
- `r'
-      Send a reply to the current Rmail message (`rmail-reply').
- 
- `f'
-      Forward current message to other users (`rmail-forward').
- 
- `C-u f'
-      Resend the current message to other users (`rmail-resend').
- 
- `M-m'
-      Try sending a bounced message a second time
-      (`rmail-retry-failure').
- 
-    The most common reason to send a message while in Rmail is to reply
- to the message you are reading.  To do this, type `r' (`rmail-reply').
- This displays the `*mail*' buffer in another window, much like `C-x 4
- m', but preinitializes the `Subject', `To', `CC' and `In-reply-to'
- header fields based on the message you are replying to.  The `To' field
- starts out as the address of the person who sent the message you
- received, and the `CC' field starts out with all the other recipients
- of that message.
- 
-    You can exclude certain recipients from being placed automatically in
- the `CC', using the variable `rmail-dont-reply-to-names'.  Its value
- should be a regular expression (as a string); any recipient that the
- regular expression matches, is excluded from the `CC' field.  The
- default value matches your own name, and any name starting with
- `info-'.  (Those names are excluded because there is a convention of
- using them for large mailing lists to broadcast announcements.)
- 
-    To omit the `CC' field completely for a particular reply, enter the
- reply command with a numeric argument: `C-u r' or `1 r'.
- 
-    Once the `*mail*' buffer has been initialized, editing and sending
- the mail goes as usual (*note Sending Mail::.).  You can edit the
- presupplied header fields if they are not right for you.  You can also
- use the commands of Mail mode, including `C-c C-y' to yank in the
- message that you are replying to, and `C-c C-q' to fill what was thus
- yanked.  You can also switch to the Rmail buffer, select a different
- message, switch back, and yank the new current message.
- 
-    Sometimes a message does not reach its destination.  Mailers usually
- send the failed message back to you, enclosed in a "failure message".
- The Rmail command `M-m' (`rmail-retry-failure') prepares to send the
- same message a second time: it sets up a `*mail*' buffer with the same
- text and header fields as before.  If you type `C-c C-c' right away,
- you send the message again exactly the same as the first time.
- Alternatively, you can edit the text or headers and then send it.  The
- variable `rmail-retry-ignored-headers', in the same format as
- `rmail-ignored-headers' (*note Rmail Display::.), controls which
- headers are stripped from the failed message when retrying it; it
- defaults to nil.
- 
-    Another frequent reason to send mail in Rmail is to "forward" the
- current message to other users.  `f' (`rmail-forward') makes this easy
- by preinitializing the `*mail*' buffer with the current message as the
- text, and a subject designating a forwarded message.  All you have to
- do is fill in the recipients and send.  When you forward a message,
- recipients get a message which is "from" you, and which has the
- original message in its contents.
- 
-    "Resending" is an alternative similar to forwarding; the difference
- is that resending sends a message that is "from" the original sender,
- just as it reached you--with a few added header fields `Resent-from'
- and `Resent-to' to indicate that it came via you.  To resend a message
- in Rmail, use `C-u f'.  (`f' runs `rmail-forward', which is programmed
- to invoke `rmail-resend' if you provide a numeric argument.)
- 
-    The `m' (`rmail-mail') command is used to start editing an outgoing
- message that is not a reply.  It leaves the header fields empty.  Its
- only difference from `C-x 4 m' is that it makes the Rmail buffer
- accessible for `C-c C-y', just as `r' does.  Thus, `m' can be used to
- reply to or forward a message; it can do anything `r' or `f' can do.
- 
-    The `c' (`rmail-continue') command resumes editing the `*mail*'
- buffer, to finish editing an outgoing message you were already
- composing, or to alter a message you have sent.
- 
-    If you set the variable `rmail-mail-new-frame' to a non-`nil' value,
- then all the Rmail commands to start sending a message create a new
- frame to edit it in.  This frame is deleted when you send the message,
- or when you use the `Don't Send' item in the `Mail' menu.
- 
- 
- File: emacs,  Node: Rmail Summary,  Next: Rmail Sorting,  Prev: Rmail Reply,  Up: Rmail
- 
- Summaries
- =========
- 
-    A "summary" is a buffer containing one line per message to give you
- an overview of the mail in an Rmail file.  Each line shows the message
- number, the sender, the labels, and the subject.  Almost all Rmail
- commands are valid in the summary buffer also; these apply to the
- message described by the current line of the summary.  Moving point in
- the summary buffer selects messages as you move to their summary lines.
- 
-    A summary buffer applies to a single Rmail file only; if you are
- editing multiple Rmail files, each one can have its own summary buffer.
- The summary buffer name is made by appending `-summary' to the Rmail
- buffer's name.  Normally only one summary buffer is displayed at a time.
- 
- * Menu:
- 
- * Rmail Make Summary::	     Making various sorts of summaries.
- * Rmail Summary Edit::	     Manipulating messages from the summary.
- 
- 
- File: emacs,  Node: Rmail Make Summary,  Next: Rmail Summary Edit,  Up: Rmail Summary
- 
- Making Summaries
- ----------------
- 
-    Here are the commands to create a summary for the current Rmail file.
- Once the Rmail file has a summary buffer, changes in the Rmail file
- (such as deleting or expunging messages, and getting new mail)
- automatically update the summary.
- 
- `h'
- `C-M-h'
-      Summarize all messages (`rmail-summary').
- 
- `l LABELS RET'
- `C-M-l LABELS RET'
-      Summarize message that have one or more of the specified labels
-      (`rmail-summary-by-labels').
- 
- `C-M-r RCPTS RET'
-      Summarize messages that have one or more of the specified
-      recipients (`rmail-summary-by-recipients').
- 
- `C-M-t TOPIC RET'
-      Summarize messages that have a match for the specified regexp
-      TOPIC in their subjects (`rmail-summary-by-topic').
- 
-    The `h' or `C-M-h' (`rmail-summary') command fills the summary buffer
- for the current Rmail file with a summary of all the messages in the
- file.  It then displays and selects the summary buffer in another
- window.
- 
-    `C-M-l LABELS RET' (`rmail-summary-by-labels') makes a partial
- summary mentioning only the messages that have one or more of the
- labels LABELS.  LABELS should contain label names separated by commas.
- 
-    `C-M-r RCPTS RET' (`rmail-summary-by-recipients') makes a partial
- summary mentioning only the messages that have one or more of the
- recipients RCPTS.  RCPTS should contain mailing addresses separated by
- commas.
- 
-    `C-M-t TOPIC RET' (`rmail-summary-by-topic') makes a partial summary
- mentioning only the messages whose subjects have a match for the
- regular expression TOPIC.
- 
-    Note that there is only one summary buffer for any Rmail file;
- making one kind of summary discards any previously made summary.
- 
-    The variable `rmail-summary-window-size' says how many lines to use
- for the summary window.
- 
- 
- File: emacs,  Node: Rmail Summary Edit,  Prev: Rmail Make Summary,  Up: Rmail Summary
- 
- Editing in Summaries
- --------------------
- 
-    You can use the Rmail summary buffer to do almost anything you can do
- in the Rmail buffer itself.  In fact, once you have a summary buffer,
- there's no need to switch back to the Rmail buffer.
- 
-    You can select and display various messages in the Rmail buffer, from
- the summary buffer, just by moving point in the summary buffer to
- different lines.  It doesn't matter what Emacs command you use to move
- point; whichever line point is on at the end of the command, that
- message is selected in the Rmail buffer.
- 
-    Almost all Rmail commands work in the summary buffer as well as in
- the Rmail buffer.  Thus, `d' in the summary buffer deletes the current
- message, `u' undeletes, and `x' expunges.  `o' and `C-o' output the
- current message to a file; `r' starts a reply to it.  You can scroll
- the current message while remaining in the summary buffer using SPC and
- DEL.
- 
-    The Rmail commands to move between messages also work in the summary
- buffer, but with a twist: they move through the set of messages included
- in the summary.  They also ensure the Rmail buffer appears on the screen
- (unlike cursor motion commands, which update the contents of the Rmail
- buffer but don't display it in a window unless it already appears).
- Here is a list of these commands:
- 
- `n'
-      Move to next line, skipping lines saying `deleted', and select its
-      message.
- 
- `p'
-      Move to previous line, skipping lines saying `deleted', and select
-      its message.
- 
- `M-n'
-      Move to next line and select its message.
- 
- `M-p'
-      Move to previous line and select its message.
- 
- `>'
-      Move to the last line, and select its message.
- 
- `<'
-      Move to the first line, and select its message.
- 
- `M-s PATTERN RET'
-      Search through messages for PATTERN starting with the current
-      message; select the message found, and move point in the summary
-      buffer to that message's line.
- 
-    Deletion, undeletion, and getting new mail, and even selection of a
- different message all update the summary buffer when you do them in the
- Rmail buffer.  If the variable `rmail-redisplay-summary' is non-`nil',
- these actions also bring the summary buffer back onto the screen.
- 
-    When you are finished using the summary, type `w'
- (`rmail-summary-wipe') to delete the summary buffer's window.  You can
- also exit Rmail while in the summary: `q' (`rmail-summary-quit')
- deletes the summary window, then exits from Rmail by saving the Rmail
- file and switching to another buffer.
- 
--- 0 ----
Index: emacs/info/emacs-15
diff -c emacs/info/emacs-15:1.1.1.2 emacs/info/emacs-15:removed
*** emacs/info/emacs-15:1.1.1.2	Mon Jul 22 01:52:03 1996
--- emacs/info/emacs-15	Fri Aug  2 20:06:21 1996
***************
*** 1,1233 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Rmail Sorting,  Next: Rmail Display,  Prev: Rmail Summary,  Up: Rmail
- 
- Sorting the Rmail File
- ======================
- 
- `M-x rmail-sort-by-date'
-      Sort messages of current Rmail file by date.
- 
- `M-x rmail-sort-by-subject'
-      Sort messages of current Rmail file by subject.
- 
- `M-x rmail-sort-by-author'
-      Sort messages of current Rmail file by author's name.
- 
- `M-x rmail-sort-by-recipient'
-      Sort messages of current Rmail file by recipient's names.
- 
- `M-x rmail-sort-by-correspondent'
-      Sort messages of current Rmail file by the name of the other
-      correspondent.
- 
- `M-x rmail-sort-by-lines'
-      Sort messages of current Rmail file by size (number of lines).
- 
- `M-x rmail-sort-by-keywords RET LABELS RET'
-      Sort messages of current Rmail file by labels.  The argument
-      LABELS should be a comma-separated list of labels.  The order of
-      these labels specifies the order of messages; messages with the
-      first label come first, messages with the second label come
-      second, and so on.  Messages which have none of these labels come
-      last.
- 
-    The Rmail sort commands perform a *stable sort*: if there is no
- reason to prefer either one of two messages, their order remains
- unchanged.  You can use this to sort by more than one criterion.  For
- example, if you use `rmail-sort-by-date' and then
- `rmail-sort-by-author', messages from the same author appear in order
- by date.
- 
-    With a numeric argument, all these commands reverse the order of
- comparison.  This means they sort messages from newest to oldest, from
- biggest to smallest, or in reverse alphabetical order.
- 
- 
- File: emacs,  Node: Rmail Display,  Next: Rmail Editing,  Prev: Rmail Sorting,  Up: Rmail
- 
- Display of Messages
- ===================
- 
-    Rmail reformats the header of each message before displaying it for
- the first time.  Reformatting hides uninteresting header fields to
- reduce clutter.  You can use the `t' command to show the entire header
- or to repeat the header reformatting operation.
- 
- `t'
-      Toggle display of complete header (`rmail-toggle-headers').
- 
-    Reformatting the header involves deleting most header fields, on the
- grounds that they are not interesting.  The variable
- `rmail-ignored-headers' holds a regular expression that specifies which
- header fields to hide in this way--if it matches the beginning of a
- header field, that whole field is hidden.
- 
-    Rmail saves the complete original header before reformatting; to see
- it, use the `t' command (`rmail-toggle-headers').  This discards the
- reformatted headers of the current message and displays it with the
- original header.  Repeating `t' reformats the message again.  Selecting
- the message again also reformats.
- 
-    One consequence of this is that if you edit the reformatted header
- (using `e'; *note Rmail Editing::.), subsequent use of `t' will discard
- your edits.  On the other hand, if you use `e' after `t', to edit the
- original (unreformatted) header, those changes are permanent.
- 
-    When used with a window system that supports multiple fonts, Rmail
- highlights certain header fields that are especially interesting--by
- default, the `From' and `Subject' fields.  The variable
- `rmail-highlighted-headers' holds a regular expression that specifies
- the header fields to highlight; if it matches the beginning of a header
- field, that whole field is highlighted.
- 
-    If you specify unusual colors for your text foreground and
- background, the colors used for highlighting may not go well with them.
- If so, specify different colors for the `highlight' face.  That is
- worth doing because the `highlight' face is used for other kinds of
- highlighting as well.  *Note Faces::, for how to do this.
- 
-    To turn off highlighting entirely in Rmail, set
- `rmail-highlighted-headers' to `nil'.
- 
- 
- File: emacs,  Node: Rmail Editing,  Next: Rmail Digest,  Prev: Rmail Display,  Up: Rmail
- 
- Editing Within a Message
- ========================
- 
-    Most of the usual Emacs commands are available in Rmail mode, though
- a few, such as `C-M-n' and `C-M-h', are redefined by Rmail for other
- purposes.  However, the Rmail buffer is normally read only, and most of
- the letters are redefined as Rmail commands.  If you want to edit the
- text of a message, you must use the Rmail command `e'.
- 
- `e'
-      Edit the current message as ordinary text.
- 
-    The `e' command (`rmail-edit-current-message') switches from Rmail
- mode into Rmail Edit mode, another major mode which is nearly the same
- as Text mode.  The mode line indicates this change.
- 
-    In Rmail Edit mode, letters insert themselves as usual and the Rmail
- commands are not available.  When you are finished editing the message
- and are ready to go back to Rmail, type `C-c C-c', which switches back
- to Rmail mode.  Alternatively, you can return to Rmail mode but cancel
- all the editing that you have done, by typing `C-c C-]'.
- 
-    Entering Rmail Edit mode runs the hook `text-mode-hook'; then it
- runs the hook `rmail-edit-mode-hook' (*note Hooks::.).  It adds the
- attribute `edited' to the message.
- 
- 
- File: emacs,  Node: Rmail Digest,  Next: Out of Rmail,  Prev: Rmail Editing,  Up: Rmail
- 
- Digest Messages
- ===============
- 
-    A "digest message" is a message which exists to contain and carry
- several other messages.  Digests are used on some moderated mailing
- lists; all the messages that arrive for the list during a period of time
- such as one day are put inside a single digest which is then sent to the
- subscribers.  Transmitting the single digest uses much less computer
- time than transmitting the individual messages even though the total
- size is the same, because the per-message overhead in network mail
- transmission is considerable.
- 
-    When you receive a digest message, the most convenient way to read
- it is to "undigestify" it: to turn it back into many individual
- messages.  Then you can read and delete the individual messages as it
- suits you.
- 
-    To do this, select the digest message and type the command `M-x
- undigestify-rmail-message'.  This extracts the submessages as separate
- Rmail messages, and inserts them following the digest.  The digest
- message itself is flagged as deleted.
- 
- 
- File: emacs,  Node: Out of Rmail,  Next: Rmail Rot13,  Prev: Rmail Digest,  Up: Rmail
- 
- Converting an Rmail File to Inbox Format
- ========================================
- 
-    The command `M-x unrmail' converts a file in Rmail format to inbox
- format (also known as the system mailbox format), so that you can use it
- with other mail-editing tools.  You must specify two arguments, the name
- of the Rmail file and the name to use for the converted file.  `M-x
- unrmail' does not alter the Rmail file itself.
- 
- 
- File: emacs,  Node: Rmail Rot13,  Prev: Out of Rmail,  Up: Rmail
- 
- Reading Rot13 Messages
- ======================
- 
-    Mailing list messages that might offend some readers are sometimes
- encoded in a simple code called "rot13"--so named because it rotates
- the alphabet by 13 letters.  This code is not for secrecy, as it
- provides none; rather, it enables those who might be offended to avoid
- ever seeing the real text of the message.
- 
-    To view a buffer using the rot13 code, use the command `M-x
- rot13-other-window'.  This displays the current buffer in another window
- which applies the code when displaying the text.
- 
- 
- File: emacs,  Node: Dired,  Next: Calendar/Diary,  Prev: Rmail,  Up: Top
- 
- Dired, the Directory Editor
- ***************************
- 
-    Dired makes an Emacs buffer containing a listing of a directory, and
- optionally some of its subdirectories as well.  You can use the normal
- Emacs commands to move around in this buffer, and special Dired commands
- to operate on the files listed.
- 
- * Menu:
- 
- * Enter: Dired Enter.         How to invoke Dired.
- * Commands: Dired Commands.   Commands in the Dired buffer.
- * Deletion: Dired Deletion.   Deleting files with Dired.
- * Flagging Many Files::       Flagging files based on their names.
- * Visit: Dired Visiting.      Other file operations through Dired.
- * Marks vs Flags::	      Flagging for deletion vs marking.
- * Operating on Files::	      How to copy, rename, print, compress, etc.
- 			        either one file or several files.
- * Shell Commands in Dired::   Running a shell command on the marked files.
- * Transforming File Names::   Using patterns to rename multiple files.
- * Comparison in Dired::	      Running `diff' by way of Dired.
- * Subdirectories in Dired::   Adding subdirectories to the Dired buffer.
- * Subdirectory Motion::	      Moving across subdirectories, and up and down.
- * Hiding Subdirectories::     Making subdirectories visible or invisible.
- * Updating: Dired Updating.   Discarding lines for files of no interest.
- * Find: Dired and Find.	      Using `find' to choose the files for Dired.
- 
- 
- File: emacs,  Node: Dired Enter,  Next: Dired Commands,  Up: Dired
- 
- Entering Dired
- ==============
- 
-    To invoke Dired, do `C-x d' or `M-x dired'.  The command reads a
- directory name or wildcard file name pattern as a minibuffer argument
- to specify which files to list.  Where `dired' differs from
- `list-directory' is in putting the buffer into Dired mode so that the
- special commands of Dired are available.
- 
-    The variable `dired-listing-switches' specifies the options to give
- to `ls' for listing directory; this string *must* contain `-l'.  If you
- use a numeric prefix argument with the `dired' command, you can specify
- the `ls' switches with the minibuffer after you finish entering the
- directory specification.
- 
-    To display the Dired buffer in another window rather than in the
- selected window, use `C-x 4 d' (`dired-other-window)' instead of `C-x
- d'.  `C-x 5 d' (`dired-other-frame') uses a separate frame to display
- the Dired buffer.
- 
- 
- File: emacs,  Node: Dired Commands,  Next: Dired Deletion,  Prev: Dired Enter,  Up: Dired
- 
- Commands in the Dired Buffer
- ============================
- 
-    The Dired buffer is "read-only", and inserting text in it is not
- useful, so ordinary printing characters such as `d' and `x' are used
- for special Dired commands.  Some Dired commands "mark" or "flag" the
- "current file" (that is, the file on the current line); other commands
- operate on the marked files or on the flagged files.
- 
-    All the usual Emacs cursor motion commands are available in Dired
- buffers.  Some special purpose cursor motion commands are also
- provided.  The keys `C-n' and `C-p' are redefined to put the cursor at
- the beginning of the file name on the line, rather than at the
- beginning of the line.
- 
-    For extra convenience, SPC and `n' in Dired are equivalent to `C-n'.
- `p' is equivalent to `C-p'.  (Moving by lines is so common in Dired
- that it deserves to be easy to type.)  DEL (move up and unflag) is
- often useful simply for moving up.
- 
- 
- File: emacs,  Node: Dired Deletion,  Next: Flagging Many Files,  Prev: Dired Commands,  Up: Dired
- 
- Deleting Files with Dired
- =========================
- 
-    The primary use of Dired is to "flag" files for deletion and then
- delete the files previously flagged.
- 
- `d'
-      Flag this file for deletion.
- 
- `u'
-      Remove deletion flag on this line.
- 
- `DEL'
-      Move point to previous line and remove the deletion flag on that
-      line.
- 
- `x'
-      Delete the files that are flagged for deletion.
- 
-    You can flag a file for deletion by moving to the line describing the
- file and typing `d'.  The deletion flag is visible as a `D' at the
- beginning of the line.  This command moves point to the next line, so
- that repeated `d' commands flag successive files.  A numeric argument
- serves as a repeat count.
- 
-    The files are flagged for deletion rather than deleted immediately to
- reduce the danger of deleting a file accidentally.  Until you direct
- Dired to expunge the flagged files, you can remove deletion flags using
- the commands `u' and DEL.  `u' works just like `d', but removes flags
- rather than making flags.  DEL moves upward, removing flags; it is like
- `u' with numeric argument automatically negated.
- 
-    To delete the flagged files, type `x' (`dired-expunge').  This
- command first displays a list of all the file names flagged for
- deletion, and requests confirmation with `yes'.  If you confirm, Dired
- deletes the flagged files, then deletes their lines from the text of
- the Dired buffer.  The shortened Dired buffer remains selected.
- 
-    If you answer `no' or quit with `C-g' when asked to confirm, you
- return immediately to Dired, with the deletion flags still present in
- the buffer, and no files actually deleted.
- 
- 
- File: emacs,  Node: Flagging Many Files,  Next: Dired Visiting,  Prev: Dired Deletion,  Up: Dired
- 
- Flagging Many Files
- ===================
- 
- `#'
-      Flag all auto-save files (files whose names start and end with `#')
-      for deletion (*note Auto Save::.).
- 
- `~'
-      Flag all backup files (files whose names end with `~') for deletion
-      (*note Backup::.).
- 
- `. (Period)'
-      Flag excess numeric backup files for deletion.  The oldest and
-      newest few backup files of any one file are exempt; the middle
-      ones are flagged.
- 
- `% d REGEXP RET'
-      Flag for deletion all files whose names match the regular
-      expression REGEXP (`dired-flag-files-regexp').
- 
-    The `#', `~' and `.' commands flag many files for deletion, based on
- their file names.  These commands are useful precisely because they do
- not actually delete any files; you can remove the deletion flags from
- any flagged files that you really wish to keep.
- 
-    `#' flags for deletion all files whose names look like auto-save
- files (*note Auto Save::.)--that is, files whose names begin and end
- with `#'.  `~' flags for deletion all files whose names say they are
- backup files (*note Backup::.)--that is, whose names end in `~'.
- 
-    `.' (Period) flags just some of the backup files for deletion: all
- but the oldest few and newest few backups of any one file.  Normally
- `dired-kept-versions' (*not* `kept-new-versions'; that applies only
- when saving) specifies the number of newest versions of each file to
- keep, and `kept-old-versions' specifies the number of oldest versions
- to keep.
- 
-    Period with a positive numeric argument, as in `C-u 3 .', specifies
- the number of newest versions to keep, overriding
- `dired-kept-versions'.  A negative numeric argument overrides
- `kept-old-versions', using minus the value of the argument to specify
- the number of oldest versions of each file to keep.
- 
-    The `% d' command flags all files whose names match a specified
- regular expression (`dired-flag-files-regexp').  Only the non-directory
- part of the file name is used in matching.  You can use `^' and `$' to
- anchor matches.  You can exclude subdirectories by hiding them (*note
- Hiding Subdirectories::.).
- 
- 
- File: emacs,  Node: Dired Visiting,  Next: Marks vs Flags,  Prev: Flagging Many Files,  Up: Dired
- 
- Visiting Files in Dired
- =======================
- 
-    There are several Dired commands for visiting or examining the files
- listed in the Dired buffer.  All of them apply to the current line's
- file; if that file is really a directory, these commands invoke Dired on
- that subdirectory (making a separate Dired buffer).
- 
- `f'
-      Visit the file described on the current line, like typing `C-x C-f'
-      and supplying that file name (`dired-find-file').  *Note
-      Visiting::.
- 
- `RET'
-      Equivalent to `f'.
- 
- `o'
-      Like `f', but uses another window to display the file's buffer
-      (`dired-find-file-other-window').  The Dired buffer remains visible
-      in the first window.  This is like using `C-x 4 C-f' to visit the
-      file.  *Note Windows::.
- 
- `C-o'
-      Visit the file described on the current line, and display the
-      buffer in another window, but do not select that window
-      (`dired-display-file').
- 
- `Mouse-2'
-      Visit the file named by the line you click on
-      (`dired-mouse-find-file-other-window').  This uses another window
-      to display the file, like the `o' command.
- 
- `v'
-      View the file described on the current line, using `M-x view-file'
-      (`dired-view-file').
- 
-      Viewing a file is like visiting it, but is slanted toward moving
-      around in the file conveniently and does not allow changing the
-      file.  *Note View File: Misc File Ops.
- 
- 
- File: emacs,  Node: Marks vs Flags,  Next: Operating on Files,  Prev: Dired Visiting,  Up: Dired
- 
- Dired Marks vs. Flags
- =====================
- 
-    Instead of flagging a file with `D', you can "mark" the file with
- some other character (usually `*').  Most Dired commands to operate on
- files, aside from "expunge" (`x'), look for files marked with `*'.
- 
-    Here are some commands for marking with `*' (and also for
- unmarking).  (*Note Dired Deletion::, for commands to flag and unflag
- files.)
- 
- `m'
-      Mark the current file with `*' (`dired-mark').  With a numeric
-      argument N, mark the next N files starting with the current file.
-      (If N is negative, mark the previous -N files.)
- 
- `*'
-      Mark all executable files with `*' (`dired-mark-executables').
-      With a numeric argument, unmark all those files.
- 
- `@'
-      Mark all symbolic links with `*' (`dired-mark-symlinks').  With a
-      numeric argument, unmark all those files.
- 
- `/'
-      Mark with `*' all files which are actually directories, except for
-      `.' and `..' (`dired-mark-directories').  With a numeric argument,
-      unmark all those files.
- 
- `M-DEL MARKCHAR'
-      Remove all marks that use the character MARKCHAR
-      (`dired-unmark-all-files').  If you specify RET as MARKCHAR, this
-      command removes all marks, no matter what the marker character is.
- 
-      With a numeric argument, this command queries about each marked
-      file, asking whether to remove its mark.  You can answer `y'
-      meaning yes, `n' meaning no, `!' to remove the marks from the
-      remaining files without asking about them.
- 
- `c OLD NEW'
-      Replace all marks that use the character OLD with marks that use
-      the character NEW (`dired-change-marks').  This command is the
-      primary way to create or use marks other than `*' or `D'.  The
-      arguments are single characters--do not use RET to terminate them.
- 
-      You can use almost any character as a mark character by means of
-      this command, to distinguish various classes of files.  If OLD is a
-      space (` '), then the command operates on all unmarked files; if
-      NEW is a space, then the command unmarks the files it acts on.
- 
-      To illustrate the power of this command, here is how to put `*'
-      marks on all the files that are unmarked, while unmarking all
-      those that have `*' marks:
- 
-           c * t  c SPC *  c t SPC
- 
- `% m REGEXP RET'
-      Mark (with `*') all files whose names match the regular expression
-      REGEXP (`dired-mark-files-regexp').  `% m' is like `% d', except
-      that it marks files with `*' instead of flagging with `D'.  *Note
-      Flagging Many Files::.
- 
-      Only the non-directory part of the file name is used in matching.
-      Use `^' and `$' to anchor matches.  Exclude subdirectories by
-      hiding them (*note Hiding Subdirectories::.).
- 
- 
- File: emacs,  Node: Operating on Files,  Next: Shell Commands in Dired,  Prev: Marks vs Flags,  Up: Dired
- 
- Operating on Files
- ==================
- 
-    This section describes the basic Dired commands to operate on one
- file or several files.  All of these commands are capital letters; all
- of them use the minibuffer, either to read an argument or to ask for
- confirmation, before they act.  All use the following convention to
- decide which files to manipulate:
- 
-    * If you give the command a numeric prefix argument N, it operates
-      on the next N files, starting with the current file.  (If N is
-      negative, the command operates on the -N files preceding the
-      current line.)
- 
-    * Otherwise, if some files are marked with `*', the command operates
-      on all those files.
- 
-    * Otherwise, the command operates on the current file only.
- 
-    Here are the file-manipulating commands that operate on files in this
- way.  (Some other Dired commands, such as `!' and the `%' commands,
- also use these conventions to decide which files to work on.)
- 
- `C NEW RET'
-      Copy the specified files (`dired-do-copy').  The argument NEW is
-      the directory to copy into, or (if copying a single file) the new
-      name.
- 
-      If `dired-copy-preserve-time' is non-`nil', then copying with this
-      command sets the modification time of the new file to be the same
-      as that of the old file.
- 
- `R NEW RET'
-      Rename the specified files (`dired-do-rename').  The argument NEW
-      is the directory to rename into, or (if renaming a single file)
-      the new name.
- 
-      Dired automatically changes the visited file name of buffers
-      associated with renamed files so that they refer to the new names.
- 
- `H NEW RET'
-      Make hard links to the specified files (`dired-do-hardlink').  The
-      argument NEW is the directory to make the links in, or (if making
-      just one link) the name to give the link.
- 
- `S NEW RET'
-      Make symbolic links to the specified files (`dired-do-symlink').
-      The argument NEW is the directory to make the links in, or (if
-      making just one link) the name to give the link.
- 
- `M MODESPEC RET'
-      Change the mode (also called "permission bits") of the specified
-      files (`dired-do-chmod').  This uses the `chmod' program, so
-      MODESPEC can be any argument that `chmod' can handle.
- 
- `G NEWGROUP RET'
-      Change the group of the specified files to NEWGROUP
-      (`dired-do-chgrp').
- 
- `O NEWOWNER RET'
-      Change the owner of the specified files to NEWOWNER
-      (`dired-do-chown').  (On most systems, only the superuser can do
-      this.)
- 
-      The variable `dired-chown-program' specifies the name of the
-      program to use to do the work (different systems put `chown' in
-      different places).
- 
- `P COMMAND RET'
-      Print the specified files (`dired-do-print').  You must specify the
-      command to print them with, but the minibuffer starts out with a
-      suitable guess made using the variables `lpr-command' and
-      `lpr-switches' (the same variables that `lpr-file' uses; *note
-      Hardcopy::.).
- 
- `Z'
-      Compress or uncompress the specified files (`dired-do-compress').
-      If the file appears to be a compressed file, it is uncompressed;
-      otherwise, it is compressed.
- 
- `L'
-      Load the specified Emacs Lisp files (`dired-do-load').  *Note Lisp
-      Libraries::.
- 
- `B'
-      Byte compile the specified Emacs Lisp files
-      (`dired-do-byte-compile').  *Note Byte Compilation: (elisp)Byte
-      Compilation.
- 
- `A REGEXP RET'
-      Search all the specified files for the regular expression REGEXP
-      (`dired-do-search').
- 
-      This command is a variant of `tags-search'.  The search stops at
-      the first match it finds; use `M-,' to resume the search and find
-      the next match.  *Note Tags Search::.
- 
- `Q FROM RET TO RET'
-      Perform `query-replace-regexp' on each of the specified files,
-      replacing matches for FROM (a regular expression) with the string
-      TO (`dired-do-query-replace').
- 
-      This command is a variant of `tags-query-replace'.  If you exit the
-      query replace loop, you can use `M-,' to resume the scan and
-      replace more matches.  *Note Tags Search::.
- 
-    One special file-operation command is `+'
- (`dired-create-directory').  This command reads a directory name and
- creates the directory if it does not already exist.
- 
- 
- File: emacs,  Node: Shell Commands in Dired,  Next: Transforming File Names,  Prev: Operating on Files,  Up: Dired
- 
- Shell Commands in Dired
- =======================
- 
-    The dired command `!' (`dired-do-shell-command') reads a shell
- command string in the minibuffer and runs that shell command on all the
- specified files.  There are two ways of applying a shell command to
- multiple files:
- 
-    * If you use `*' in the shell command, then it runs just once, with
-      the list of file names substituted for the `*'.  The order of file
-      names is the order of appearance in the Dired buffer.
- 
-      Thus, `! tar cf foo.tar * RET' runs `tar' on the entire list of
-      file names, putting them into one tar file `foo.tar'.
- 
-    * If the command string doesn't contain `*', then it runs once *for
-      each file*, with the file name added at the end.
- 
-      For example, `! uudecode RET' runs `uudecode' on each file.
- 
-    What if you want to run the shell command once for each file but with
- the file name inserted in the middle?  Or if you want to use the file
- names in a more complicated fashion?  Use a shell loop.  For example,
- this shell command would run `uuencode' on each of the specified files,
- writing the output into a corresponding `.uu' file:
- 
-      for file in *; uuencode $file $file >$file.uu; done
- 
-    The working directory for the shell command is the top level
- directory of the Dired buffer.
- 
-    The `!' command does not attempt to update the Dired buffer to show
- new or modified files, because it doesn't really understand shell
- commands, and does not know what files the shell command changed.  Use
- the `g' command to update the Dired buffer (*note Dired Updating::.).
- 
- 
- File: emacs,  Node: Transforming File Names,  Next: Comparison in Dired,  Prev: Shell Commands in Dired,  Up: Dired
- 
- Transforming File Names in Dired
- ================================
- 
-    Here are commands that alter file names in a systematic way:
- 
- `% u'
-      Rename each of the selected files to an upper case name
-      (`dired-upcase').  If the old file names are `Foo' and `bar', the
-      new names are `FOO' and `BAR'.
- 
- `% l'
-      Rename each of the selected files to a lower case name
-      (`dired-downcase').  If the old file names are `Foo' and `bar',
-      the new names are `foo' and `bar'.
- 
- `% R FROM RET TO RET'
- `% C FROM RET TO RET'
- `% H FROM RET TO RET'
- `% S FROM RET TO RET'
-      These four commands rename, copy, make hard links and make soft
-      links, in each case computing the new name by regular expression
-      substitution from the name of the old file.
- 
-    The four regular expression substitution commands effectively perform
- a search-and-replace on the selected file names in the Dired buffer.
- They read two arguments: a regular expression FROM, and a substitution
- pattern TO.
- 
-    The commands match each "old" file name against the regular
- expression FROM, and then replace the matching part with TO.  You can
- use `\&' and `\DIGIT' in TO to refer to all or part of what the pattern
- matched in the old file name, as in `query-replace-regexp' (*note Query
- Replace::.).  If the regular expression matches more than once in a
- file name, only the first match is replaced.
- 
-    For example, `% R ^.*$ RET x-\& RET' renames each selected file by
- prepending `x-' to its name.  The inverse of this, removing `x-' from
- the front of each file name, is also possible: one method is `% R
- ^x-\(.*\)$ RET \1 RET'; another is `% R ^x- RET RET'.  (Use `^' and `$'
- to anchor matches that should span the whole filename.)
- 
-    Normally, the replacement process does not consider the files'
- directory names; it operates on the file name within the directory.  If
- you specify a numeric argument of zero, then replacement affects the
- entire absolute file name including directory name.
- 
-    Often you will want to apply the command to all files matching the
- same REGEXP that you use in the command.  To do this, mark those files
- with `% m REGEXP RET', then use the same regular expression in the
- command to operate on the files.  To make this easier, the `%' commands
- to operate on files use the last regular expression specified in any
- `%' command as a default.
- 
- 
- File: emacs,  Node: Comparison in Dired,  Next: Subdirectories in Dired,  Prev: Transforming File Names,  Up: Dired
- 
- File Comparison with Dired
- ==========================
- 
-    Here are two Dired commands that compare specified files using
- `diff'.
- 
- `='
-      Compare the current file (the file at point) with another file
-      (the file at the mark) using the `diff' program (`dired-diff').
-      The file at the mark is the first argument of `diff', and the file
-      at point is the second argument.
- 
- `M-='
-      Compare the current file with its latest backup file
-      (`dired-backup-diff').  If the current file is itself a backup,
-      compare it with the file it is a backup of; this way, you can
-      compare a file with any backup version of your choice.
- 
-      The backup file is the first file given to `diff'.
- 
- 
- File: emacs,  Node: Subdirectories in Dired,  Next: Subdirectory Motion,  Prev: Comparison in Dired,  Up: Dired
- 
- Subdirectories in Dired
- =======================
- 
-    A Dired buffer displays just one directory in the normal case; but
- you can optionally include its subdirectories as well.
- 
-    The simplest way to include multiple directories in one Dired buffer
- is to specify the options `-lR' for running `ls'.  (If you give a
- numeric argument when you run Dired, then you can specify these options
- in the minibuffer.)  That produces a recursive directory listing showing
- all subdirectories at all levels.
- 
-    But usually all the subdirectories are too many; usually you will
- prefer to include specific subdirectories only.  You can do this with
- the `i' command:
- 
- `i'
-      Insert the contents of a subdirectory later in the buffer.
- 
-    Use the `i' (`dired-maybe-insert-subdir') command on a line that
- describes a file which is a directory.  It inserts the contents of that
- directory into the same Dired buffer, and moves there.  Inserted
- subdirectory contents follow the top-level directory of the Dired
- buffer, just as they do in `ls -lR' output.
- 
-    If the subdirectory's contents are already present in the buffer, the
- `i' command just moves to it.
- 
-    In either case, `i' sets the Emacs mark before moving, so `C-u
- C-SPC' takes you back to the old position in the buffer (the line
- describing that subdirectory).
- 
-    Use the `l' command (`dired-do-redisplay') to update the
- subdirectory's contents.  Use `k' to delete the subdirectory.  *Note
- Dired Updating::.
- 
- 
- File: emacs,  Node: Subdirectory Motion,  Next: Hiding Subdirectories,  Prev: Subdirectories in Dired,  Up: Dired
- 
- Moving Over Subdirectories
- ==========================
- 
-    When a Dired buffer lists subdirectories, you can use the page motion
- commands `C-x [' and `C-x ]' to move by entire directories.
- 
-    The following commands move across, up and down in the tree of
- directories within one Dired buffer.  They move to "directory header
- lines", which are the lines that give a directory's name, at the
- beginning of the directory's contents.
- 
- `C-M-n'
-      Go to next subdirectory header line, regardless of level
-      (`dired-next-subdir').
- 
- `C-M-p'
-      Go to previous subdirectory header line, regardless of level
-      (`dired-prev-subdir').
- 
- `C-M-u'
-      Go up to the parent directory's header line (`dired-tree-up').
- 
- `C-M-d'
-      Go down in the directory tree, to the first subdirectory's header
-      line (`dired-tree-down').
- 
- 
- File: emacs,  Node: Hiding Subdirectories,  Next: Dired Updating,  Prev: Subdirectory Motion,  Up: Dired
- 
- Hiding Subdirectories
- =====================
- 
-    "Hiding" a subdirectory means to make it invisible, except for its
- header line, via selective display (*note Selective Display::.).
- 
- `$'
-      Hide or reveal the subdirectory that point is in, and move point
-      to the next subdirectory (`dired-hide-subdir').  A numeric
-      argument serves as a repeat count.
- 
- `M-$'
-      Hide all subdirectories in this Dired buffer, leaving only their
-      header lines (`dired-hide-all').  Or, if any subdirectory is
-      currently hidden, make all subdirectories visible again.  You can
-      use this command to get an overview in very deep directory trees
-      or to move quickly to subdirectories far away.
- 
-    Ordinary Dired commands never consider files inside a hidden
- subdirectory.  For example, the commands to operate on marked files
- ignore files in hidden directories even if they are marked.  Thus you
- can use hiding to temporarily exclude subdirectories from operations
- without having to remove the markers.
- 
-    The subdirectory hiding commands toggle; that is, they hide what was
- visible, and show what was hidden.
- 
- 
- File: emacs,  Node: Dired Updating,  Next: Dired and Find,  Prev: Hiding Subdirectories,  Up: Dired
- 
- Updating the Dired Buffer
- =========================
- 
-    This section describes commands to update the Dired buffer to reflect
- outside (non-Dired) changes in the directories and files, and to delete
- part of the Dired buffer.
- 
- `g'
-      Update the entire contents of the Dired buffer (`revert-buffer').
- 
- `l'
-      Update the specified files (`dired-do-redisplay').
- 
- `k'
-      Delete the specified *file lines*--not the files, just the lines
-      (`dired-do-kill-lines').
- 
- `s'
-      Toggle between sorting by file name and sorting by date/time
-      (`dired-sort-toggle-or-edit').
- 
- `C-u s SWITCHES RET'
-      Refresh the Dired buffer using SWITCHES as
-      `dired-listing-switches'.
- 
-    Type `g' (`revert-buffer') to update the contents of the Dired
- buffer, based on changes in the files and directories listed.  This
- preserves all marks except for those on files that have vanished.
- Hidden subdirectories are updated but remain hidden.
- 
-    To update only some of the files, type `l' (`dired-do-redisplay').
- This command applies to the next N files, or to the marked files if
- any, or to the current file.  Updating them means reading their current
- status from the file system and changing the buffer to reflect it
- properly.
- 
-    If you use `l' on a subdirectory header line, it updates the
- contents of the corresponding subdirectory.
- 
-    To delete the specified *file lines*--not the files, just the
- lines--type `k' (`dired-do-kill-lines').  This command applies to the
- next N files, or to the marked files if any, or to the current file.
- 
-    If you kill the line for a file that is a directory, the directory's
- contents are also deleted from the buffer.  Typing `C-u k' on the
- header line for a subdirectory is another way to delete a subdirectory
- from the Dired buffer.
- 
-    The `g' command brings back any individual lines that you have
- killed in this way, but not subdirectories--you must use `i' to
- reinsert each subdirectory.
- 
-    The files in a Dired buffers are normally in listed alphabetical
- order by file names.  Alternatively Dired can sort them by date/time.
- The Dired command `s' (`dired-sort-toggle-or-edit') switches between
- these two sorting modes.  The mode line in a Dired buffer indicates
- which way it is currently sorted--by name, or by date.
- 
-    `C-u s SWITCHES RET' lets you specify a new value for
- `dired-listing-switches'.
- 
- 
- File: emacs,  Node: Dired and Find,  Prev: Dired Updating,  Up: Dired
- 
- Dired and `find'
- ================
- 
-    You can select a set of files for display in a Dired buffer more
- flexibly by using the `find' utility to choose the files.
- 
-    To search for files with names matching a wildcard pattern use `M-x
- find-name-dired'.  It reads arguments DIRECTORY and PATTERN, and
- chooses all the files in DIRECTORY or its subdirectories whose
- individual names match PATTERN.
- 
-    The files thus chosen are displayed in a Dired buffer in which the
- ordinary Dired commands are available.
- 
-    If you want to test the contents of files, rather than their names,
- use `M-x find-grep-dired'.  This command reads two minibuffer
- arguments, DIRECTORY and REGEXP; it chooses all the files in DIRECTORY
- or its subdirectories that contain a match for REGEXP.  It works by
- running the programs `find' and `grep'.
- 
-    The most general command in this series is `M-x find-dired', which
- lets you specify any condition that `find' can test.  It takes two
- minibuffer arguments, DIRECTORY and FIND-ARGS; it runs `find' in
- DIRECTORY, passing FIND-ARGS to tell `find' what condition to test.  To
- use this command, you need to know how to use `find'.
- 
-    The format of listing produced by these commands is controlled by the
- variable `find-ls-option', whose default value specifies using options
- `-ldi' for `ls'.  If your listings are corrupted, you may need to
- change the value of this variable.
- 
- 
- File: emacs,  Node: Calendar/Diary,  Next: GNUS,  Prev: Dired,  Up: Top
- 
- The Calendar and the Diary
- **************************
- 
-    Emacs provides the functions of a desk calendar, with a diary of
- planned or past events.  To enter the calendar, type `M-x calendar';
- this displays a three-month calendar centered on the current month, with
- point on the current date.  With a numeric argument, as in `C-u M-x
- calendar', it prompts you for the month and year to be the center of the
- three-month calendar.  The calendar uses its own buffer, whose major
- mode is Calendar mode.
- 
-    `Mouse-2' in the calendar brings up a menu of operations on a
- particular date; `C-Mouse-3' brings up a menu of commonly used calendar
- features that are independent of any particular date.  To exit the
- calendar, type `q'.  *Note Customizing the Calendar and Diary:
- (elisp)Calendar, for customization information about the calendar and
- diary.
- 
- * Menu:
- 
- * Calendar Motion::       Moving through the calendar; selecting a date.
- * Scroll Calendar::       Bringing earlier or later months onto the screen.
- * Counting Days::         How many days are there between two dates?
- * General Calendar::      Exiting or recomputing the calendar.
- * Holidays::              Displaying dates of holidays.
- * Sunrise/Sunset::        Displaying local times of sunrise and sunset.
- * Lunar Phases::          Displaying phases of the moon.
- * Other Calendars::       Converting dates to other calendar systems.
- * Diary::                 Displaying events from your diary.
- * Appointments::	  Reminders when it's time to do something.
- * Daylight Savings::      How to specify when daylight savings time is active.
- 
- 
- File: emacs,  Node: Calendar Motion,  Next: Scroll Calendar,  Up: Calendar/Diary
- 
- Movement in the Calendar
- ========================
- 
-    Calendar mode lets you move through the calendar in logical units of
- time such as days, weeks, months, and years.  If you move outside the
- three months originally displayed, the calendar display "scrolls"
- automatically through time to make the selected date visible.  Moving to
- a date lets you view its holidays or diary entries, convert it to other
- calendars; moving longer time periods is also useful simply to scroll
- the calendar.
- 
- * Menu:
- 
- * Calendar Unit Motion::      Moving by days, weeks, months, and years.
- * Move to Beginning or End::  Moving to start/end of weeks, months, and years.
- * Specified Dates::           Moving to the current date or another
-                                 specific date.
- 
- 
- File: emacs,  Node: Calendar Unit Motion,  Next: Move to Beginning or End,  Up: Calendar Motion
- 
- Motion by Standard Lengths of Time
- ----------------------------------
- 
-    The commands for movement in the calendar buffer parallel the
- commands for movement in text.  You can move forward and backward by
- days, weeks, months, and years.
- 
- `C-f'
-      Move point one day forward (`calendar-forward-day').
- 
- `C-b'
-      Move point one day backward (`calendar-backward-day').
- 
- `C-n'
-      Move point one week forward (`calendar-forward-week').
- 
- `C-p'
-      Move point one week backward (`calendar-backward-week').
- 
- `M-}'
-      Move point one month forward (`calendar-forward-month').
- 
- `M-{'
-      Move point one month backward (`calendar-backward-month').
- 
- `C-x ]'
-      Move point one year forward (`calendar-forward-year').
- 
- `C-x ['
-      Move point one year backward (`calendar-forward-year').
- 
-    The day and week commands are natural analogues of the usual Emacs
- commands for moving by characters and by lines.  Just as `C-n' usually
- moves to the same column in the following line, in Calendar mode it
- moves to the same day in the following week.  And `C-p' moves to the
- same day in the previous week.
- 
-    The arrow keys are equivalent to `C-f', `C-b', `C-n' and `C-p', just
- as they normally are in other modes.
- 
-    The commands for motion by months and years work like those for
- weeks, but move a larger distance.  The month commands `M-}' and `M-{'
- move forward or backward by an entire month's time.  The year commands
- `C-x ]' and `C-x [' move forward or backward a whole year.
- 
-    The easiest way to remember these commands is to consider months and
- years analogous to paragraphs and pages of text, respectively.  But the
- commands themselves are not quite analogous.  The ordinary Emacs
- paragraph commands move to the beginning or end of a paragraph, whereas
- these month and year commands move by an entire month or an entire
- year, which usually involves skipping across the end of a month or year.
- 
-    All these commands accept a numeric argument as a repeat count.  For
- convenience, the digit keys and the minus sign specify numeric
- arguments in Calendar mode even without the Meta modifier.  For example,
- `100 C-f' moves point 100 days forward from its present location.
- 
- 
- File: emacs,  Node: Move to Beginning or End,  Next: Specified Dates,  Prev: Calendar Unit Motion,  Up: Calendar Motion
- 
- Beginning or End of Week, Month or Year
- ---------------------------------------
- 
-    A week (or month, or year) is not just a quantity of days; we think
- of weeks (months, years) as starting on particular dates.  So Calendar
- mode provides commands to move to the beginning or end of a week, month
- or year:
- 
- `C-a'
-      Move point to start of week (`calendar-beginning-of-week').
- 
- `C-e'
-      Move point to end of week (`calendar-end-of-week').
- 
- `M-a'
-      Move point to start of month (`calendar-beginning-of-month').
- 
- `M-e'
-      Move point to end of month (`calendar-end-of-month').
- 
- `M-<'
-      Move point to start of year (`calendar-beginning-of-year').
- 
- `M->'
-      Move point to end of year (`calendar-end-of-year').
- 
-    These commands also take numeric arguments as repeat counts, with the
- repeat count indicating how many weeks, months, or years to move
- backward or forward.
- 
-    By default, weeks begin on Sunday.  To make them begin on Monday
- instead, set the variable `calendar-week-start-day' to 1.
- 
- 
- File: emacs,  Node: Specified Dates,  Prev: Move to Beginning or End,  Up: Calendar Motion
- 
- Specified Dates
- ---------------
- 
-    Calendar mode provides commands for moving to a particular date
- specified in various ways.
- 
- `g d'
-      Move point to specified date (`calendar-goto-date').
- 
- `o'
-      Center calendar around specified month (`calendar-other-month').
- 
- `.'
-      Move point to today's date (`calendar-goto-today').
- 
-    `g d' (`calendar-goto-date') prompts for a year, a month, and a day
- of the month, and then moves to that date.  Because the calendar
- includes all dates from the beginning of the current era, you must type
- the year in its entirety; that is, type `1990', not `90'.
- 
-    `o' (`calendar-other-month') prompts for a month and year, then
- centers the three-month calendar around that month.
- 
-    You can return to today's date with `.' (`calendar-goto-today').
- 
- 
- File: emacs,  Node: Scroll Calendar,  Next: Counting Days,  Prev: Calendar Motion,  Up: Calendar/Diary
- 
- Scrolling in the Calendar
- =========================
- 
-    The calendar display scrolls automatically through time when you
- move out of the visible portion.  You can also scroll it manually.
- Imagine that the calendar window contains a long strip of paper with
- the months on it.  Scrolling it means moving the strip so that new
- months become visible in the window.
- 
- `C-x <'
-      Scroll calendar one month forward (`scroll-calendar-left').
- 
- `C-x >'
-      Scroll calendar one month backward (`scroll-calendar-right').
- 
- `C-v'
- `NEXT'
-      Scroll calendar three months forward
-      (`scroll-calendar-left-three-months').
- 
- `M-v'
- `PRIOR'
-      Scroll calendar three months backward
-      (`scroll-calendar-right-three-months').
- 
-    The most basic calendar scroll commands scroll by one month at a
- time.  This means that there are two months of overlap between the
- display before the command and the display after.  `C-x <' scrolls the
- calendar contents one month to the left; that is, it moves the display
- forward in time.  `C-x >' scrolls the contents to the right, which
- moves backwards in time.
- 
-    The commands `C-v' and `M-v' scroll the calendar by an entire
- "screenful"--three months--in analogy with the usual meaning of these
- commands.  `C-v' makes later dates visible and `M-v' makes earlier
- dates visible.  These commands take a numeric argument as a repeat
- count; in particular, since `C-u' multiplies the next command by four,
- typing `C-u C-v' scrolls the calendar forward by a year and typing `C-u
- M-v' scrolls the calendar backward by a year.
- 
-    The function keys NEXT and PRIOR are equivalent to `C-v' and `M-v',
- just as they are in other modes.
- 
- 
- File: emacs,  Node: Counting Days,  Next: General Calendar,  Prev: Scroll Calendar,  Up: Calendar/Diary
- 
- Counting Days
- =============
- 
- `M-='
-      Display the number of days in the current region
-      (`calendar-count-days-region').
- 
-    To determine the number of days in the region, type `M-='
- (`calendar-count-days-region').  The numbers of days printed is
- *inclusive*; that is, it includes the days specified by mark and point.
- 
- 
- File: emacs,  Node: General Calendar,  Next: Holidays,  Prev: Counting Days,  Up: Calendar/Diary
- 
- Miscellaneous Calendar Commands
- ===============================
- 
- `p d'
-      Display day-in-year (`calendar-print-day-of-year').
- 
- `C-c C-l'
-      Regenerate the calendar window (`redraw-calendar').
- 
- `SPC'
-      Scroll the next window (`scroll-other-window').
- 
- `q'
-      Exit from calendar (`exit-calendar').
- 
-    To print the number of days elapsed since the start of the year, or
- the number of days remaining in the year, type the `p d' command
- (`calendar-print-day-of-year').  This displays both of those numbers in
- the echo area.  The number of days elapsed includes the selected date.
- The number of days remaining does not include that date.
- 
-    If the calendar window text gets corrupted, type `C-c C-l'
- (`redraw-calendar') to redraw it.  (This can only happen if you use
- non-Calendar-mode editing commands.)
- 
-    In Calendar mode, you can use `SPC' (`scroll-other-window') to
- scroll the other window.  This is handy when you display a list of
- holidays or diary entries in another window.
- 
-    To exit from the calendar, type `q' (`exit-calendar').  This buries
- all buffers related to the calendar, selecting other buffers.  (If a
- frame contains a dedicated calendar window, exiting from the calendar
- iconifies that frame.)
- 
- 
- File: emacs,  Node: Holidays,  Next: Sunrise/Sunset,  Prev: General Calendar,  Up: Calendar/Diary
- 
- Holidays
- ========
- 
-    The Emacs calendar knows about all major and many minor holidays,
- and can display them.
- 
- `h'
-      Display holidays for the selected date
-      (`calendar-cursor-holidays').
- 
- `Mouse-2 Holidays'
-      Display any diary entries for the date you click on.
- 
- `x'
-      Mark holidays in the calendar window (`mark-calendar-holidays').
- 
- `u'
-      Unmark calendar window (`calendar-unmark').
- 
- `a'
-      List all holidays for the displayed three months in another window
-      (`list-calendar-holidays').
- 
- `M-x holidays'
-      List all holidays for three months around today's date in another
-      window.
- 
-    To see if any holidays fall on a given date, position point on that
- date in the calendar window and use the `h' command.  Alternatively,
- click on that date with `Mouse-2' and then choose `Holidays' from the
- menu that appears.  Either way, this displays the holidays for that
- date, in the echo area if they fit there, otherwise in a separate
- window.
- 
-    To view the distribution of holidays for all the dates shown in the
- calendar, use the `x' command.  This displays the dates that are
- holidays in a different face (or places a `*' after these dates, if
- display with multiple faces is not available).  The command applies both
- to the currently visible months and to other months that subsequently
- become visible by scrolling.  To turn marking off and erase the current
- marks, type `u', which also erases any diary marks (*note Diary::.).
- 
-    To get even more detailed information, use the `a' command, which
- displays a separate buffer containing a list of all holidays in the
- current three-month range.  You can use SPC in the calendar window to
- scroll that list.
- 
-    The command `M-x holidays' displays the list of holidays for the
- current month and the preceding and succeeding months; this works even
- if you don't have a calendar window.  If you want the list of holidays
- centered around a different month, use `C-u M-x holidays', which
- prompts for the month and year.
- 
-    The holidays known to Emacs include American holidays and the major
- Christian, Jewish, and Islamic holidays; also the solstices and
- equinoxes.
- 
-    The dates used by Emacs for holidays are based on *current
- practice*, not historical fact.  Historically, for instance, the start
- of daylight savings time and even its existence have varied from year to
- year, but present American law mandates that daylight savings time
- begins on the first Sunday in April.  In an American locale, Emacs
- always uses this definition, even though it is wrong for some prior
- years.
- 
--- 0 ----
Index: emacs/info/emacs-16
diff -c emacs/info/emacs-16:1.1.1.2 emacs/info/emacs-16:removed
*** emacs/info/emacs-16:1.1.1.2	Mon Jul 22 01:52:05 1996
--- emacs/info/emacs-16	Fri Aug  2 20:06:59 1996
***************
*** 1,1159 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Sunrise/Sunset,  Next: Lunar Phases,  Prev: Holidays,  Up: Calendar/Diary
- 
- Times of Sunrise and Sunset
- ===========================
- 
-    Special calendar commands can tell you, to within a minute or two,
- the times of sunrise and sunset for any date.
- 
- `S'
-      Display times of sunrise and sunset for the selected date
-      (`calendar-sunrise-sunset').
- 
- `Mouse-2 Sunrise/Sunset'
-      Display times of sunrise and sunset for the date you click on.
- 
- `M-x sunrise-sunset'
-      Display times of sunrise and sunset for today's date.
- 
- `C-u M-x sunrise-sunset'
-      Display times of sunrise and sunset for a specified date.
- 
-    Within the calendar, to display the *local times* of sunrise and
- sunset in the echo area, move point to the date you want, and type `S'.
- Alternatively, click `Mouse-2' on the date, then choose
- `Sunrise/Sunset' from the menu that appears.  The command `M-x
- sunrise-sunset' is available outside the calendar to display this
- information for today's date or a specified date.  To specify a date
- other than today, use `C-u M-x sunrise-sunset', which prompts for the
- year, month, and day.
- 
-    You can display the times of sunrise and sunset for any location and
- any date with `C-u C-u M-x sunrise-sunset'.  This asks you for a
- longitude, latitude, number of minutes difference from Coordinated
- Universal Time, and date, and then tells you the times of sunrise and
- sunset for that location on that date.
- 
-    Because the times of sunrise and sunset depend on the location on
- earth, you need to tell Emacs your latitude, longitude, and location
- name before using these commands.  Here is an example of what to set:
- 
-      (setq calendar-latitude 40.1)
-      (setq calendar-longitude -88.2)
-      (setq calendar-location-name "Urbana, IL")
- 
- Use one decimal place in the values of `calendar-latitude' and
- `calendar-longitude'.
- 
-    Your time zone also affects the local time of sunrise and sunset.
- Emacs usually gets time zone information from the operating system, but
- if these values are not what you want (or if the operating system does
- not supply them), you must set them yourself.  Here is an example:
- 
-      (setq calendar-time-zone -360)
-      (setq calendar-standard-time-zone-name "CST")
-      (setq calendar-daylight-time-zone-name "CDT")
- 
- The value of `calendar-time-zone' is the number of minutes difference
- between your local standard time and Coordinated Universal Time
- (Greenwich time).  The values of `calendar-standard-time-zone-name' and
- `calendar-daylight-time-zone-name' are the abbreviations used in your
- time zone.  Emacs displays the times of sunrise and sunset *corrected
- for daylight savings time*.  *Note Daylight Savings::, for how daylight
- savings time is determined.
- 
-    As a user, you might find it convenient to set the calendar location
- variables for your usual physical location in your `.emacs' file.  And
- when you install Emacs on a machine, you can create a `default.el' file
- which sets them properly for the typical location of most users of that
- machine.  *Note Init File::.
- 
- 
- File: emacs,  Node: Lunar Phases,  Next: Other Calendars,  Prev: Sunrise/Sunset,  Up: Calendar/Diary
- 
- Phases of the Moon
- ==================
- 
-    These calendar commands display the dates and times of the phases of
- the moon (new moon, first quarter, full moon, last quarter).  This
- feature is useful for debugging problems that "depend on the phase of
- the moon."
- 
- `M'
-      Display the dates and times for all the quarters of the moon for
-      the three-month period shown (`calendar-phases-of-moon').
- 
- `M-x phases-of-moon'
-      Display dates and times of the quarters of the moon for three
-      months around today's date.
- 
-    Within the calendar, use the `M' command to display a separate
- buffer of the phases of the moon for the current three-month range.  The
- dates and times listed are accurate to within a few minutes.
- 
-    Outside the calendar, use the command `M-x phases-of-moon' to
- display the list of the phases of the moon for the current month and the
- preceding and succeeding months.  For information about a different
- month, use `C-u M-x phases-of-moon', which prompts for the month and
- year.
- 
-    The dates and times given for the phases of the moon are given in
- local time (corrected for daylight savings, when appropriate); but if
- the variable `calendar-time-zone' is void, Coordinated Universal Time
- (the Greenwich time zone) is used.  *Note Daylight Savings::.
- 
- 
- File: emacs,  Node: Other Calendars,  Next: Diary,  Prev: Lunar Phases,  Up: Calendar/Diary
- 
- Conversion To and From Other Calendars
- ======================================
- 
-    The Emacs calendar displayed is *always* the Gregorian calendar,
- sometimes called the "new style" calendar, which is used in most of the
- world today.  However, this calendar did not exist before the sixteenth
- century and was not widely used before the eighteenth century; it did
- not fully displace the Julian calendar and gain universal acceptance
- until the early twentieth century.  The Emacs calendar can display any
- month since January, year 1 of the current era, but the calendar
- displayed is the Gregorian, even for a date at which the Gregorian
- calendar did not exist.
- 
-    While Emacs cannot display other calendars, it can convert dates to
- and from several other calendars.
- 
- * Menu:
- 
- * Calendar Systems::	   The calendars Emacs understands
- 			     (aside from Gregorian).
- * To Other Calendar::	   Converting the selected date to various calendars.
- * From Other Calendar::	   Moving to a date specified in another calendar.
- * Mayan Calendar::	   Moving to a date specified in a Mayan calendar.
- 
- 
- File: emacs,  Node: Calendar Systems,  Next: To Other Calendar,  Up: Other Calendars
- 
- Supported Calendar Systems
- --------------------------
- 
-    The ISO commercial calendar is used largely in Europe.
- 
-    The Julian calendar, named after Julius Caesar, was the one used in
- Europe throughout medieval times, and in many countries up until the
- nineteenth century.
- 
-    Astronomers use a simple counting of days elapsed since noon, Monday,
- January 1, 4713 B.C. on the Julian calendar.  The number of days elapsed
- is called the *Julian day number* or the *Astronomical day number*.
- 
-    The Hebrew calendar is used by tradition in the Jewish religion.  The
- Emacs calendar program uses the Hebrew calendar to determine the dates
- of Jewish holidays.  Hebrew calendar dates begin and end at sunset.
- 
-    The Islamic calendar is used in many predominantly Islamic countries.
- Emacs uses it to determine the dates of Islamic holidays.  There is no
- universal agreement in the Islamic world about the calendar; Emacs uses
- a widely accepted version, but the precise dates of Islamic holidays
- often depend on proclamation by religious authorities, not on
- calculations.  As a consequence, the actual dates of observance can vary
- slightly from the dates computed by Emacs.  Islamic calendar dates begin
- and end at sunset.
- 
-    The French Revolutionary calendar was created by the Jacobins after
- the 1789 revolution, to represent a more secular and nature-based view
- of the annual cycle, and to install a 10-day week in a rationalization
- measure similar to the metric system.  The French government officially
- abandoned this calendar at the end of 1805.
- 
-    The Maya of Central America used three separate, overlapping calendar
- systems, the *long count*, the *tzolkin*, and the *haab*.  Emacs knows
- about all three of these calendars.  Experts dispute the exact
- correlation between the Mayan calendar and our calendar; Emacs uses the
- Goodman-Martinez-Thompson correlation in its calculations.
- 
- 
- File: emacs,  Node: To Other Calendar,  Next: From Other Calendar,  Prev: Calendar Systems,  Up: Other Calendars
- 
- Converting To Other Calendars
- -----------------------------
- 
-    The following commands describe the selected date (the date at point)
- in various other calendar systems:
- 
- `Mouse-2  Other Calendars'
-      Display the date that you click on, expressed in various other
-      calendars.
- 
- `p c'
-      Display ISO commercial calendar equivalent for selected day
-      (`calendar-print-iso-date').
- 
- `p j'
-      Display Julian date for selected day
-      (`calendar-print-julian-date').
- 
- `p a'
-      Display astronomical (Julian) day number for selected day
-      (`calendar-print-astro-day-number').
- 
- `p h'
-      Display Hebrew date for selected day
-      (`calendar-print-hebrew-date').
- 
- `p i'
-      Display Islamic date for selected day
-      (`calendar-print-islamic-date').
- 
- `p f'
-      Display French Revolutionary date for selected day
-      (`calendar-print-french-date').
- 
- `p m'
-      Display Mayan date for selected day (`calendar-print-mayan-date').
- 
-    If you are using X windows, the easiest way to translate a date into
- other calendars is to click on it with `Mouse-2', then choose `Other
- Calendars' from the menu that appears.  This displays the equivalent
- forms of the date in all the calendars Emacs understands, in the form
- of a menu.  (Choosing an alternative from this menu doesn't actually do
- anything--the menu is used only for display.)
- 
-    Put point on the desired date of the Gregorian calendar, then type
- the appropriate keys.  The `p' is a mnemonic for "print" since Emacs
- "prints" the equivalent date in the echo area.
- 
- 
- File: emacs,  Node: From Other Calendar,  Next: Mayan Calendar,  Prev: To Other Calendar,  Up: Other Calendars
- 
- Converting From Other Calendars
- -------------------------------
- 
-    You can use the other supported calendars to specify a date to move
- to.  This section describes the commands for doing this using calendars
- other than Mayan; for the Mayan calendar, see the following section.
- 
- `g c'
-      Move to a date specified in the ISO commercial calendar
-      (`calendar-goto-iso-date').
- 
- `g j'
-      Move to a date specified in the Julian calendar
-      (`calendar-goto-julian-date').
- 
- `g a'
-      Move to a date specified in astronomical (Julian) day number
-      (`calendar-goto-astro-day-number').
- 
- `g h'
-      Move to a date specified in the Hebrew calendar
-      (`calendar-goto-hebrew-date').
- 
- `g i'
-      Move to a date specified in the Islamic calendar
-      (`calendar-goto-islamic-date').
- 
- `g f'
-      Move to a date specified in the French Revolutionary calendar
-      (`calendar-goto-french-date').
- 
-    These commands ask you for a date on the other calendar, move point
- to the Gregorian calendar date equivalent to that date, and display the
- other calendar's date in the echo area.  Emacs uses strict completion
- (*note Completion::.) whenever it asks you to type a month name, so you
- don't have to worry about the spelling of Hebrew, Islamic, or French
- names.
- 
-    One common question concerning the Hebrew calendar is the computation
- of the anniversary of a date of death, called a "yahrzeit."  The Emacs
- calendar includes a facility for such calculations.  If you are in the
- calendar, the command `M-x list-yahrzeit-dates' asks you for a range of
- years and then displays a list of the yahrzeit dates for those years
- for the date given by point.  If you are not in the calendar, this
- command first asks you for the date of death and the range of years,
- and then displays the list of yahrzeit dates.
- 
- 
- File: emacs,  Node: Mayan Calendar,  Prev: From Other Calendar,  Up: Other Calendars
- 
- Converting from the Mayan Calendar
- ----------------------------------
- 
-    Here are the commands to select dates based on the Mayan calendar:
- 
- `g m l'
-      Move to a date specified by the long count calendar
-      (`calendar-goto-mayan-long-count-date').
- 
- `g m n t'
-      Move to the next occurrence of a place in the tzolkin calendar
-      (`calendar-next-tzolkin-date').
- 
- `g m p t'
-      Move to the previous occurrence of a place in the tzolkin calendar
-      (`calendar-previous-tzolkin-date').
- 
- `g m n h'
-      Move to the next occurrence of a place in the haab calendar
-      (`calendar-next-haab-date').
- 
- `g m p h'
-      Move to the previous occurrence of a place in the haab calendar
-      (`calendar-previous-haab-date').
- 
- `g m n c'
-      Move to the next occurrence of a place in the calendar round
-      (`calendar-next-calendar-round-date').
- 
- `g m p c'
-      Move to the previous occurrence of a place in the calendar round
-      (`calendar-previous-calendar-round-date').
- 
-    To understand these commands, you need to understand the Mayan
- calendars.  The "long count" is a counting of days with these units:
- 
-      1 kin = 1 day   1 uinal = 20 kin   1 tun = 18 uinal
-      1 katun = 20 tun   1 baktun = 20 katun
- 
- Thus, the long count date 12.16.11.16.6 means 12 baktun, 16 katun, 11
- tun, 16 uinal, and 6 kin.  The Emacs calendar can handle Mayan long
- count dates as early as 7.17.18.13.1, but no earlier.  When you use the
- `g m l' command, type the Mayan long count date with the baktun, katun,
- tun, uinal, and kin separated by periods.
- 
-    The Mayan tzolkin calendar is a cycle of 260 days formed by a pair of
- independent cycles of 13 and 20 days.  Since this cycle repeats
- endlessly, Emacs provides commands to move backward and forward to the
- previous or next point in the cycle.  Type `g m p t' to go to the
- previous tzolkin date; Emacs asks you for a tzolkin date and moves point
- to the previous occurrence of that date.  Similarly, type `g m n t' to
- go to the next occurrence of a tzolkin date.
- 
-    The Mayan haab calendar is a cycle of 365 days arranged as 18 months
- of 20 days each, followed a 5-day monthless period.  Like the tzolkin
- cycle, this cycle repeats endlessly, and there are commands to move
- backward and forward to the previous or next point in the cycle.  Type
- `g m p h' to go to the previous haab date; Emacs asks you for a haab
- date and moves point to the previous occurrence of that date.
- Similarly, type `g m n h' to go to the next occurrence of a haab date.
- 
-    The Maya also used the combination of the tzolkin date and the haab
- date.  This combination is a cycle of about 52 years called a *calendar
- round*.  If you type `g m p c', Emacs asks you for both a haab and a
- tzolkin date and then moves point to the previous occurrence of that
- combination.  Use `g m p c' to move point to the next occurrence of a
- combination.  These commands signal an error if the haab/tzolkin date
- combination you have typed is impossible.
- 
-    Emacs uses strict completion (*note Strict Completion::.) whenever it
- asks you to type a Mayan name, so you don't have to worry about
- spelling.
- 
- 
- File: emacs,  Node: Diary,  Next: Appointments,  Prev: Other Calendars,  Up: Calendar/Diary
- 
- The Diary
- =========
- 
-    The Emacs diary keeps track of appointments or other events on a
- daily basis, in conjunction with the calendar.  To use the diary
- feature, you must first create a "diary file" containing a list of
- events and their dates.  Then Emacs can automatically pick out and
- display the events for today, for the immediate future, or for any
- specified date.
- 
-    By default, Emacs uses `~/diary' as the diary file.  This is the
- same file that the `calendar' utility uses.  A sample `~/diary' file is:
- 
-      12/22/1988  Twentieth wedding anniversary!!
-      &1/1.       Happy New Year!
-      10/22       Ruth's birthday.
-      * 21, *:    Payday
-      Tuesday--weekly meeting with grad students at 10am
-               Supowit, Shen, Bitner, and Kapoor to attend.
-      1/13/89     Friday the thirteenth!!
-      &thu 4pm    squash game with Lloyd.
-      mar 16      Dad's birthday
-      April 15, 1989 Income tax due.
-      &* 15       time cards due.
- 
- This example uses extra spaces to align the event descriptions of most
- of the entries.  Such formatting is purely a matter of taste.
- 
-    Although you probably will start by creating a diary manually, Emacs
- provides a number of commands to let you view, add, and change diary
- entries.
- 
- * Menu:
- 
- * Diary Commands::         Viewing diary entries and associated calendar dates.
- * Format of Diary File::   Entering events in your diary.
- * Date Formats::	   Various ways you can specify dates.
- * Adding to Diary::	   Commands to create diary entries.
- * Special Diary Entries::  Anniversaries, blocks of dates, cyclic entries, etc.
- 
- 
- File: emacs,  Node: Diary Commands,  Next: Format of Diary File,  Up: Diary
- 
- Commands Displaying Diary Entries
- ---------------------------------
- 
-    Once you have created a `~/diary' file, you can use the calendar to
- view it.  You can also view today's events outside of Calendar mode.
- 
- `d'
-      Display all diary entries for the selected date
-      (`view-diary-entries').
- 
- `Mouse-2 Diary'
-      Display all diary entries for the date you click on.
- 
- `s'
-      Display the entire diary file (`show-all-diary-entries').
- 
- `m'
-      Mark all visible dates that have diary entries
-      (`mark-diary-entries').
- 
- `u'
-      Unmark the calendar window (`calendar-unmark').
- 
- `M-x print-diary-entries'
-      Print hard copy of the diary display as it appears.
- 
- `M-x diary'
-      Display all diary entries for today's date.
- 
-    Displaying the diary entries with `d' shows in a separate window the
- diary entries for the selected date in the calendar.  The mode line of
- the new window shows the date of the diary entries and any holidays
- that fall on that date.  If you specify a numeric argument with `d', it
- shows all the diary entries for that many successive days.  Thus, `2 d'
- displays all the entries for the selected date and for the following
- day.
- 
-    Another way to display the diary entries for a date is to click
- `Mouse-2' on the date, and then choose `Diary' from the menu that
- appears.
- 
-    To get a broader view of which days are mentioned in the diary, use
- the `m' command.  This displays the dates that have diary entries fall
- in a different face (or places a `+' after these dates, if display with
- multiple faces is not available).  The command applies both to the
- currently visible months and to other months that subsequently become
- visible by scrolling.  To turn marking off and erase the current marks,
- type `u', which also turns off holiday marks (*note Holidays::.).
- 
-    To see the full diary file, rather than just some of the entries, use
- the `s' command.
- 
-    Display of selected diary entries uses the selective display feature
- to hide entries that don't apply.  This is the same feature that Outline
- mode uses to show part of an outline (*note Outline Mode::.).
- 
-    The diary buffer as you see it is an illusion, so simply printing the
- buffer does not print what you see on your screen.  There is a special
- command to print hard copy of the diary buffer *as it appears*; this
- command is `M-x print-diary-entries'.  It sends the data directly to
- the printer.  You can customize it like `lpr-region' (*note
- Hardcopy::.).
- 
-    The command `M-x diary' displays the diary entries for the current
- date, independently of the calendar display, and optionally for the next
- few days as well; the variable `number-of-diary-entries' specifies how
- many days to include.  *Note Calendar/Diary Options:
- (elisp)Calendar/Diary Options.
- 
-    If you put `(diary)' in your `.emacs' file, this automatically
- displays a window with the day's diary entries, when you enter Emacs.
- The mode line of the displayed window shows the date and any holidays
- that fall on that date.
- 
- 
- File: emacs,  Node: Format of Diary File,  Next: Date Formats,  Prev: Diary Commands,  Up: Diary
- 
- The Diary File
- --------------
- 
-    Your "diary file" is a file that records events associated with
- particular dates.  The name of the diary file is specified by the
- variable `diary-file'; `~/diary' is the default.  The `calendar'
- utility program supports a subset of the format allowed by the Emacs
- diary facilities, so you can use that utility to view the diary file,
- with reasonable results aside from the entries it cannot understand.
- 
-    Each entry in the diary file describes one event and consists of one
- or more lines.  An entry always begins with a date specification at the
- left margin.  The rest of the entry is simply text to describe the
- event.  If the entry has more than one line, then the lines after the
- first must begin with whitespace to indicate they continue a previous
- entry.  Lines that do not begin with valid dates and do not continue a
- preceding entry are ignored.
- 
-    You can inhibit the marking of certain diary entries in the calendar
- window; to do this, insert an ampersand (`&') at the beginning of the
- entry, before the date.  This has no effect on display of the entry in
- the diary window; it affects only marks on dates in the calendar
- window.  Nonmarking entries are especially useful for generic entries
- that would otherwise mark many different dates.
- 
-    If the first line of a diary entry consists only of the date or day
- name with no following blanks or punctuation, then the diary window
- display doesn't include that line; only the continuation lines appear.
- For example, this entry:
- 
-      02/11/1989
-            Bill B. visits Princeton today
-            2pm Cognitive Studies Committee meeting
-            2:30-5:30 Liz at Lawrenceville
-            4:00pm Dentist appt
-            7:30pm Dinner at George's
-            8:00-10:00pm concert
- 
- appears in the diary window without the date line at the beginning.
- This style of entry looks neater when you display just a single day's
- entries, but can cause confusion if you ask for more than one day's
- entries.
- 
-    You can edit the diary entries as they appear in the window, but it
- is important to remember that the buffer displayed contains the *entire*
- diary file, with portions of it concealed from view.  This means, for
- instance, that the `C-f' (`forward-char') command can put point at what
- appears to be the end of the line, but what is in reality the middle of
- some concealed line.
- 
-    *Be careful when editing the diary entries!*  Inserting additional
- lines or adding/deleting characters in the middle of a visible line
- cannot cause problems, but editing at the end of a line may not do what
- you expect.  Deleting a line may delete other invisible entries that
- follow it.  Before editing the diary, it is best to display the entire
- file with `s' (`show-all-diary-entries').
- 
- 
- File: emacs,  Node: Date Formats,  Next: Adding to Diary,  Prev: Format of Diary File,  Up: Diary
- 
- Date Formats
- ------------
- 
-    Here are some sample diary entries, illustrating different ways of
- formatting a date.  The examples all show dates in American order
- (month, day, year), but Calendar mode supports European order (day,
- month, year) as an option.
- 
-      4/20/93  Switch-over to new tabulation system
-      apr. 25  Start tabulating annual results
-      4/30  Results for April are due
-      */25  Monthly cycle finishes
-      Friday  Don't leave without backing up files
- 
-    The first entry appears only once, on April 20, 1993.  The second and
- third appear every year on the specified dates, and the fourth uses a
- wildcard (asterisk) for the month, so it appears on the 25th of every
- month.  The final entry appears every week on Friday.
- 
-    You can use just numbers to express a date, as in `MONTH/DAY' or
- `MONTH/DAY/YEAR'.  This must be followed by a nondigit.  In the date
- itself, MONTH and DAY are numbers of one or two digits.  The optional
- YEAR is also a number, and may be abbreviated to the last two digits;
- that is, you can use `11/12/1989' or `11/12/89'.
- 
-    Dates can also have the form `MONTHNAME DAY' or `MONTHNAME DAY,
- YEAR', where the month's name can be spelled in full or abbreviated to
- three characters (with or without a period).  Case is not significant.
- 
-    A date may be "generic"; that is, partially unspecified.  Then the
- entry applies to all dates that match the specification.  If the date
- does not contain a year, it is generic and applies to any year.
- Alternatively, MONTH, DAY, or YEAR can be a `*'; this matches any
- month, day, or year, respectively.  Thus, a diary entry `3/*/*' matches
- any day in March of any year; so does `march *'.
- 
-    If you prefer the European style of writing dates--in which the day
- comes before the month--type `M-x european-calendar' while in the
- calendar, or set the variable `european-calendar-style' to `t' *before*
- using any calendar or diary command.  This mode interprets all dates in
- the diary in the European manner, and also uses European style for
- displaying diary dates.  (Note that there is no comma after the
- MONTHNAME in the European style.)  To go back to the (default) American
- style of writing dates, type `M-x american-calendar'.
- 
-    You can use the name of a day of the week as a generic date which
- applies to any date falling on that day of the week.  You can abbreviate
- the day of the week to three letters (with or without a period) or spell
- it in full; case is not significant.
- 
- 
- File: emacs,  Node: Adding to Diary,  Next: Special Diary Entries,  Prev: Date Formats,  Up: Diary
- 
- Commands to Add to the Diary
- ----------------------------
- 
-    While in the calendar, there are several commands to create diary
- entries:
- 
- `i d'
-      Add a diary entry for the selected date (`insert-diary-entry').
- 
- `i w'
-      Add a diary entry for the selected day of the week
-      (`insert-weekly-diary-entry').
- 
- `i m'
-      Add a diary entry for the selected day of the month
-      (`insert-monthly-diary-entry').
- 
- `i y'
-      Add a diary entry for the selected day of the year
-      (`insert-yearly-diary-entry').
- 
-    You can make a diary entry for a specific date by selecting that date
- in the calendar window and typing the `i d' command.  This command
- displays the end of your diary file in another window and inserts the
- date; you can then type the rest of the diary entry.
- 
-    If you want to make a diary entry that applies to a specific day of
- the week, select that day of the week (any occurrence will do) and type
- `i w'.  This inserts the day-of-week as a generic date; you can then
- type the rest of the diary entry.  You can make a monthly diary entry in
- the same fashion.  Select the day of the month, use the `i m' command,
- and type rest of the entry.  Similarly, you can insert a yearly diary
- entry with the `i y' command.
- 
-    All of the above commands make marking diary entries by default.  To
- make a nonmarking diary entry, give a numeric argument to the command.
- For example, `C-u i w' makes a nonmarking weekly diary entry.
- 
-    When you modify the diary file, be sure to save the file before
- exiting Emacs.
- 
- 
- File: emacs,  Node: Special Diary Entries,  Prev: Adding to Diary,  Up: Diary
- 
- Special Diary Entries
- ---------------------
- 
-    In addition to entries based on calendar dates, the diary file can
- contain "special entries" for regular events such as anniversaries.
- These entries are based on Lisp expressions (sexps) that Emacs evaluates
- as it scans the diary file.  Instead of a date, a special entry contains
- `%%' followed by a Lisp expression which must begin and end with
- parentheses.  The Lisp expression determines which dates the entry
- applies to.
- 
-    Calendar mode provides commands to insert certain commonly used
- special entries:
- 
- `i a'
-      Add an anniversary diary entry for the selected date
-      (`insert-anniversary-diary-entry').
- 
- `i b'
-      Add a block diary entry for the current region
-      (`insert-block-diary-entry').
- 
- `i c'
-      Add a cyclic diary entry starting at the date
-      (`insert-cyclic-diary-entry').
- 
-    If you want to make a diary entry that applies to the anniversary of
- a specific date, move point to that date and use the `i a' command.
- This displays the end of your diary file in another window and inserts
- the anniversary description; you can then type the rest of the diary
- entry.  The entry looks like this:
- 
-      %%(diary-anniversary 10 31 1948) Arthur's birthday
- 
- This entry applies to October 31 in any year after 1948; `10 31 1948'
- specifies the date.  (If you are using the European calendar style, the
- month and day are interchanged.)  The reason this expression requires a
- beginning year is that advanced diary functions can use it to calculate
- the number of elapsed years.
- 
-    A "block" diary entry applies to a specified range of consecutive
- dates.  Here is a block diary entry that applies to all dates from June
- 24, 1990 through July 10, 1990:
- 
-      %%(diary-block 6 24 1990 7 10 1990) Vacation
- 
- The `6 24 1990' indicates the starting date and the `7 10 1990'
- indicates the stopping date.  (Again, if you are using the European
- calendar style, the month and day are interchanged.)
- 
-    To insert a block entry, place point and the mark on the two dates
- that begin and end the range, and type `i b'.  This command displays
- the end of your diary file in another window and inserts the block
- description; you can then type the diary entry.
- 
-    "Cyclic" diary entries repeat after a fixed interval of days.  To
- create one, select the starting date and use the `i c' command.  The
- command prompts for the length of interval, then inserts the entry,
- which looks like this:
- 
-      %%(diary-cyclic 50 3 1 1990) Renew medication
- 
- This entry applies to March 1, 1990 and every 50th day following; `3 1
- 1990' specifies the starting date.  (If you are using the European
- calendar style, the month and day are interchanged.)
- 
-    All three of these commands make marking diary entries.  To insert a
- nonmarking entry, give a numeric argument to the command.  For example,
- `C-u i a' makes a nonmarking anniversary diary entry.
- 
-    Marking sexp diary entries in the calendar is *extremely*
- time-consuming, since every date visible in the calendar window must be
- individually checked.  So it's a good idea to make sexp diary entries
- nonmarking (with `&') when possible.
- 
-    Another sophisticated kind of sexp entry, a "floating" diary entry,
- specifies a regularly-occurring event by offsets specified in days,
- weeks, and months.  It is comparable to a crontab entry interpreted by
- the `cron' utility.  Here is a nonmarking, floating diary entry that
- applies to the last Thursday in November:
- 
-      &%%(diary-float 11 4 -1) American Thanksgiving
- 
- The 11 specifies November (the eleventh month), the 4 specifies Thursday
- (the fourth day of the week, where Sunday is numbered zero), and the -1
- specifies "last" (1 would mean "first", 2 would mean "second", -2 would
- mean "second-to-last", and so on).  The month can be a single month or
- a list of months.  Thus you could change the 11 above to `'(1 2 3)' and
- have the entry apply to the last Thursday of January, February, and
- March.  If the month is `t', the entry applies to all months of the
- year.
- 
-    Most generally, special diary entries can perform arbitrary
- computations to determine when they apply.  *Note Sexp Diary Entries:
- (elisp)Sexp Diary Entries.
- 
- 
- File: emacs,  Node: Appointments,  Next: Daylight Savings,  Prev: Diary,  Up: Calendar/Diary
- 
- Appointments
- ============
- 
-    If you have a diary entry for an appointment, and that diary entry
- begins with a recognizable time of day, Emacs can warn you, several
- minutes beforehand, that that appointment is pending.  Emacs alerts you
- to the appointment by displaying a message in the mode line.
- 
-    To enable appointment notification, you must enable the time display
- feature of Emacs, `M-x display-time' (*note Mode Line::.).  You must
- also add the function `appt-make-list' to the `diary-hook', like this:
- 
-      (add-hook 'diary-hook 'appt-make-list)
- 
-    With these preparations done, when you display the diary (either with
- the `d' command in the calendar window or with the `M-x diary'
- command), it sets up an appointment list of all the diary entries found
- with recognizable times of day, and reminds you just before each of
- them.
- 
-    For example, suppose the diary file contains these lines:
- 
-      Monday
-        9:30am Coffee break
-       12:00pm Lunch
- 
- Then on Mondays, after you have displayed the diary, you will be
- reminded at 9:20am about your coffee break and at 11:50am about lunch.
- 
-    You can write times in conventional American am/pm style, or 24-hour
- European/military style.  You need not be consistent; your diary file
- can have a mixture of the two styles.
- 
-    Emacs updates the appointments list automatically just after
- midnight.  This also displays the next day's diary entries in the diary
- buffer, unless you set `appt-display-diary' to `nil'.
- 
-    You can also use the appointment notification facility like an alarm
- clock.  The command `M-x appt-add' adds entries to the appointment list
- without affecting your diary file.  You delete entries from the
- appointment list with `M-x appt-delete'.
- 
-    You can turn off the appointment notification feature at any time by
- setting `appt-issue-message' to `nil'.
- 
- 
- File: emacs,  Node: Daylight Savings,  Prev: Appointments,  Up: Calendar/Diary
- 
- Daylight Savings Time
- =====================
- 
-    Emacs understands the difference between standard time and daylight
- savings time--the times given for sunrise, sunset, solstices,
- equinoxes, and the phases of the moon take that into account.  The rules
- for daylight savings time vary from place to place and have also varied
- historically from year to year.  To do the job properly, Emacs needs to
- know which rules to use.
- 
-    Some operating systems keep track of the rules that apply to the
- place where you are; on these systems, Emacs gets the information it
- needs from the system automatically.  If some or all of this
- information is missing, Emacs fills in the gaps with the rules
- currently used in Cambridge, Massachusetts.  If the resulting rules are
- not what you want, you can tell Emacs the rules to use by setting
- certain variables.
- 
-    These values should be Lisp expressions that refer to the variable
- `year', and evaluate to the Gregorian date on which daylight savings
- time starts or (respectively) ends, in the form of a list `(MONTH DAY
- YEAR)'.  The values should be `nil' if your area does not use daylight
- savings time.
- 
-    Emacs uses these expressions to determine the starting date of
- daylight savings time for the holiday list and for correcting times of
- day in the solar and lunar calculations.
- 
-    The values for Cambridge, Massachusetts are as follows:
- 
-      (calendar-nth-named-day 1 0 4 year)
-      (calendar-nth-named-day -1 0 10 year)
- 
- That is, the first 0th day (Sunday) of the fourth month (April) in the
- year specified by `year', and the last Sunday of the tenth month
- (October) of that year.  If daylight savings time were changed to start
- on October 1, you would set `calendar-daylight-savings-starts' to this:
- 
-      (list 10 1 year)
- 
-    If there is no daylight savings time at your location, or if you want
- all times in standard time, set `calendar-daylight-savings-starts' and
- `calendar-daylight-savings-ends' to `nil'.
- 
-    The variable `calendar-daylight-time-offset' specifies the
- difference between daylight savings time and standard time, measured in
- minutes.  The value for Cambridge, Massachusetts is 60.
- 
-    The two variables `calendar-daylight-savings-starts-time' and
- `calendar-daylight-savings-ends-time' specify the number of minutes
- after midnight local time when the transition to and from daylight
- savings time should occur.  For Cambridge, both variables' values are
- 120.
- 
- 
- File: emacs,  Node: GNUS,  Next: Shell,  Prev: Calendar/Diary,  Up: Top
- 
- GNUS
- ====
- 
-    GNUS is an Emacs subsystem for reading and responding to netnews.
- You can use GNUS to browse through news groups, look at summaries of
- articles in specific group, and read articles of interest.  You can
- respond to authors or write replies to all the readers of a news group.
- 
-    This section introduces GNUS and describes several basic features.
- *Note GNUS: (gnus)Top.
- 
-    To start GNUS, type `M-x gnus RET'.
- 
- * Menu:
- 
- * Buffers of GNUS::	   The Newsgroups, Summary and Article buffers.
- * GNUS Startup::	   What you should know about starting GNUS.
- * Summary of GNUS::	   A short description of the basic GNUS commands.
- 
- 
- File: emacs,  Node: Buffers of GNUS,  Next: GNUS Startup,  Up: GNUS
- 
- GNUS's Three Buffers
- --------------------
- 
-    GNUS creates and uses three Emacs buffers, each with its own
- particular purpose and its own major mode.
- 
-    The "Newsgroup buffer" contains a list of newsgroups.  This is the
- first buffer that GNUS displays when it starts up.  Normally the list
- contains only the newsgroups to which you subscribe (which are listed in
- your `.newsrc' file) and which contain unread articles.  Use this
- buffer to select a specific newsgroup.
- 
-    The "Summary buffer" lists the articles in a single newsgroup,
- including their subjects, their numbers, and who posted them.  GNUS
- creates a Summary buffer for a newsgroup when you select the group in
- the Newsgroup buffer.  Use this buffer to select an article.
- 
-    The "Article buffer" displays the text of an article.  You rarely
- need to select this buffer because you can scroll through it while
- remaining in the Summary buffer.
- 
- 
- File: emacs,  Node: GNUS Startup,  Next: Summary of GNUS,  Prev: Buffers of GNUS,  Up: GNUS
- 
- When GNUS Starts Up
- -------------------
- 
-    At startup, GNUS reads your `.newsrc' news initialization file and
- attempts to communicate with the local news server, which is a
- repository of news articles.  The news server need not be the same
- computer you are logged in on.
- 
-    If you start GNUS and connect to the server, but do not see any
- newsgroups listed in the Newsgroup buffer, type `L' to get a listing of
- all the newsgroups.  Then type `u' to unsubscribe from the newsgroups
- you don't want to read.  (You can move point to a particular group
- using `n' and `p' or the usual Emacs commands.)
- 
-    The first time you start GNUS, it subscribes automatically to every
- newsgroup that exists.  Subsequently, GNUS subscribes automatically to
- all newly created newsgroups.  You can unsubscribe groups with `u'.
- You can inhibit automatic subscription by adding the following line to
- your `~/.newsrc' file:
- 
-      options -n !all !all.all
- 
-    When you quit GNUS with `q', it automatically records in your
- `.newsrc' initialization file the subscribed or unsubscribed status of
- all newsgroups, except for groups you have "killed".  (You do not need
- to edit this file yourself, but you may.)  When new newsgroups come
- into existence, GNUS subscribes to them automatically; if you don't
- want to read them, use `u' to unsubscribe from them.
- 
- 
- File: emacs,  Node: Summary of GNUS,  Prev: GNUS Startup,  Up: GNUS
- 
- Summary of GNUS Commands
- ------------------------
- 
-    Reading news is a two step process:
- 
-   1. Choose a newsgroup in the Newsgroup buffer.
- 
-   2. Select articles from the Summary buffer.  Each article selected is
-      displayed in the Article buffer in a large window, below the
-      Summary buffer in its small window.
- 
-    Each GNUS buffer has its own special commands, but commands that do
- the similar things have similar key bindings.  Here are commands for the
- Newsgroup and Summary buffers:
- 
- `z'
-      In the Newsgroup buffer, suspend GNUS.  You can return to GNUS
-      later by selecting the Newsgroup buffer and typing `g' to get
-      newly arrived articles.
- 
- `q'
-      In the Newsgroup buffer, update your `.newsrc' initialization file
-      and quit GNUS.
- 
-      In the Summary buffer, exit the current newsgroup and return to the
-      Newsgroup buffer.  Thus, typing `q' twice quits GNUS.
- 
- `L'
-      In the Newsgroup buffer, list all the newsgroups available on your
-      news server (except those you have killed).  This may be a long
-      list!
- 
- `l'
-      In the Newsgroup buffer, list only the newsgroups to which you
-      subscribe and which contain unread articles.
- 
- `u'
-      In the Newsgroup buffer, unsubscribe from (or subscribe to) the
-      newsgroup listed in the line that point is on.  When you quit GNUS
-      by typing `q', GNUS lists in your `.newsrc' file which groups you
-      have subscribed to.  The next time you start GNUS, you won't see
-      this group initially, because GNUS normally displays only
-      subscribed-to groups.
- 
- `C-k'
-      In the Newsgroup buffer, "kill" the current line's newsgroup--don't
-      even list it in `.newsrc' from now on.  This affects future GNUS
-      sessions as well as the present session.
- 
-      When you quit GNUS by typing `q', GNUS writes information in the
-      file `.newsrc' describing all newsgroups except those you have
-      "killed."
- 
- `SPC'
-      In the Newsgroup buffer, select the group on the line under the
-      cursor and display the first unread article in that group.
- 
-      In the Summary buffer,
- 
-         * Select the article on the line under the cursor if none is
-           selected.
- 
-         * Scroll the text of the selected article (if there is one).
- 
-         * Select the next unread article if at the end of the current
-           article.
- 
-      Thus, you can move through all the articles by repeatedly typing
-      SPC.
- 
- `DEL'
-      In the Newsgroup Buffer, move point to the previous newsgroup
-      containing unread articles.
- 
-      In the Summary buffer, scroll the text of the article backwards.
- 
- `n'
-      Move point to the next unread newsgroup, or select the next unread
-      article.
- 
- `p'
-      Move point to the previous unread newsgroup, or select the previous
-      unread article.
- 
- `C-n'
- `C-p'
-      Move point to the next or previous item, even if it is marked as
-      read.  This does not select the article or newsgroup on that line.
- 
- `s'
-      In the Summary buffer, do an incremental search of the current
-      text in the Article buffer, just as if you switched to the Article
-      buffer and typed `C-s'.
- 
- `M-s REGEXP RET'
-      In the Summary buffer, search forward for articles containing a
-      match for REGEXP.
- 
- `C-c C-s C-n'
- `C-c C-s C-s'
- `C-c C-s C-d'
- `C-c C-s C-a'
-      In the Summary buffer, sort the list of articles by number,
-      subject, date, or author.
- 
- `C-M-n'
- `C-M-p'
-      In the Summary buffer, read the next or previous article with the
-      same subject as the current article.
- 
- 
- File: emacs,  Node: Shell,  Next: Emacs Server,  Prev: GNUS,  Up: Top
- 
- Running Shell Commands from Emacs
- =================================
- 
-    Emacs has commands for passing single command lines to inferior shell
- processes; it can also run a shell interactively with input and output
- to an Emacs buffer named `*shell*'.
- 
- `M-! CMD RET'
-      Run the shell command line CMD and display the output
-      (`shell-command').
- 
- `M-| CMD RET'
-      Run the shell command line CMD with region contents as input;
-      optionally replace the region with the output
-      (`shell-command-on-region').
- 
- `M-x shell'
-      Run a subshell with input and output through an Emacs buffer.  You
-      can then give commands interactively.
- 
- * Menu:
- 
- * Single Shell::           How to run one shell command and return.
- * Interactive Shell::      Permanent shell taking input via Emacs.
- * Shell Mode::             Special Emacs commands used with permanent shell.
- * History: Shell History.  Repeating previous commands in a shell buffer.
- * Options: Shell Options.  Options for customizing Shell mode.
- * Remote Host::            Connecting to another computer.
- 
- 
- File: emacs,  Node: Single Shell,  Next: Interactive Shell,  Up: Shell
- 
- Single Shell Commands
- ---------------------
- 
-    `M-!' (`shell-command') reads a line of text using the minibuffer
- executes it as a shell command in a subshell made just for this
- command.  Standard input for the command comes from the null device.
- If the shell command produces any output, the output goes into an Emacs
- buffer named `*Shell Command Output*', which is displayed in another
- window but not selected.  A numeric argument, as in `M-1 M-!', directs
- this command to insert any output into the current buffer.  In that
- case, point is left before the output and the mark is set after the
- output.
- 
-    If the shell command line ends in `&', it runs asynchronously.
- 
-    `M-|' (`shell-command-on-region') is like `M-!' but passes the
- contents of the region as the standard input to the shell command,
- instead of no input.  If a numeric argument is used, meaning insert the
- output in the current buffer, then the old region is deleted first and
- the output replaces it as the contents of the region.
- 
-    Both `M-!' and `M-|' use `shell-file-name' to specify the shell to
- use.  This variable is initialized based on your `SHELL' environment
- variable when Emacs is started.  If the file name does not specify a
- directory, the directories in the list `exec-path' are searched; this
- list is initialized based on the environment variable `PATH' when Emacs
- is started.  Your `.emacs' file can override either or both of these
- default initializations.
- 
-    Both `M-!' and `M-|' wait for the shell command to complete.  To
- stop waiting, type `C-g' to quit; that terminates the shell command
- with the signal `SIGINT'--the same signal that `C-c' normally generates
- in the shell.  Emacs waits until the command actually terminates.  If
- the shell command doesn't stop (because it ignores the `SIGINT'
- signal), type `C-g' again; this sends the command a `SIGKILL' signal
- which is impossible to ignore.
- 
- 
- File: emacs,  Node: Interactive Shell,  Next: Shell Mode,  Prev: Single Shell,  Up: Shell
- 
- Interactive Inferior Shell
- --------------------------
- 
-    To run a subshell interactively, putting its typescript in an Emacs
- buffer, use `M-x shell'.  This creates (or reuses) a buffer named
- `*shell*' and runs a subshell with input coming from and output going
- to that buffer.  That is to say, any "terminal output" from the subshell
- goes into the buffer, advancing point, and any "terminal input" for the
- subshell comes from text in the buffer.  To give input to the subshell,
- go to the end of the buffer and type the input, terminated by RET.
- 
-    Emacs does not wait for the subshell to do anything.  You can switch
- windows or buffers and edit them while the shell is waiting, or while
- it is running a command.  Output from the subshell waits until Emacs
- has time to process it; this happens whenever Emacs is waiting for
- keyboard input or for time to elapse.
- 
-    To make multiple subshells, rename the buffer `*shell*' to something
- different using `M-x rename-uniquely'.  Then type `M-x shell' again to
- create a new buffer `*shell*' with its own subshell.  If you rename
- this buffer as well, you can create a third one, and so on.  All the
- subshells run independently and in parallel.
- 
-    The file name used to load the subshell is the value of the variable
- `explicit-shell-file-name', if that is non-`nil'.  Otherwise, the
- environment variable `ESHELL' is used, or the environment variable
- `SHELL' if there is no `ESHELL'.  If the file name specified is
- relative, the directories in the list `exec-path' are searched; this
- list is initialized based on the environment variable `PATH' when Emacs
- is started.  Your `.emacs' file can override either or both of these
- default initializations.
- 
-    As soon as the subshell is started, it is sent as input the contents
- of the file `~/.emacs_SHELLNAME', if that file exists, where SHELLNAME
- is the name of the file that the shell was loaded from.  For example,
- if you use bash, the file sent to it is `~/.emacs_bash'.
- 
-    `cd', `pushd' and `popd' commands given to the inferior shell are
- watched by Emacs so it can keep the `*shell*' buffer's default
- directory the same as the shell's working directory.  These commands
- are recognized syntactically by examining lines of input that are sent.
- If you use aliases for these commands, you can tell Emacs to recognize
- them also.  For example, if the value of the variable
- `shell-pushd-regexp' matches the beginning of a shell command line,
- that line is regarded as a `pushd' command.  Change this variable when
- you add aliases for `pushd'.  Likewise, `shell-popd-regexp' and
- `shell-cd-regexp' are used to recognize commands with the meaning of
- `popd' and `cd'.  These commands are recognized only at the beginning
- of a shell command line.
- 
-    If Emacs gets an error while trying to handle what it believes is a
- `cd', `pushd' or `popd' command, it runs the hook
- `shell-set-directory-error-hook' (*note Hooks::.).
- 
-    If Emacs does not properly track changes in the current directory of
- the subshell, use the command `M-x dirs' to ask the shell what its
- current directory is.  This command works for shells that support the
- most common command syntax; it may not work for unusual shells.
- 
--- 0 ----
Index: emacs/info/emacs-17
diff -c emacs/info/emacs-17:1.1.1.2 emacs/info/emacs-17:removed
*** emacs/info/emacs-17:1.1.1.2	Mon Jul 22 01:52:07 1996
--- emacs/info/emacs-17	Fri Aug  2 20:07:38 1996
***************
*** 1,1111 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Shell Mode,  Next: Shell History,  Prev: Interactive Shell,  Up: Shell
- 
- Shell Mode
- ----------
- 
-    Shell buffer use Shell mode, which defines several special keys
- attached to the `C-c' prefix.  They are chosen to resemble the usual
- editing and job control characters present in shells that are not under
- Emacs, except that you must type `C-c' first.  Here is a complete list
- of the special key bindings of Shell mode:
- 
- `RET'
-      At end of buffer send line as input; otherwise, copy current line
-      to end of buffer and send it (`comint-send-input').  When a line is
-      copied, any text at the beginning of the line that matches the
-      variable `shell-prompt-pattern' is left out; this variable's value
-      should be a regexp string that matches the prompts that your shell
-      uses.
- 
- `TAB'
-      Complete the command name or file name before point in the shell
-      buffer (`comint-dynamic-complete').  TAB also completes history
-      references (*note History References::.) and environment variable
-      names.
- 
-      The variable `shell-completion-fignore' specifies a list of file
-      name extensions to ignore in Shell mode completion.  The default
-      setting ignores file names ending in `~', `#' or `%'.  Other
-      related Comint modes use the variable `comint-completion-fignore'
-      instead.
- 
- `M-?'
-      Display temporarily a list of the possible completions of the file
-      name before point in the shell buffer
-      (`comint-dynamic-list-filename-completions').
- 
- `C-d'
-      Either delete a character or send EOF
-      (`comint-delchar-or-maybe-eof').  Typed at the end of the shell
-      buffer, `C-d' sends EOF to the subshell.  Typed at any other
-      position in the buffer, `C-d' deletes a character as usual.
- 
- `C-c C-a'
-      Move to the beginning of the line, but after the prompt if any
-      (`comint-bol').
- 
- `C-c C-u'
-      Kill all text pending at end of buffer to be sent as input
-      (`comint-kill-input').
- 
- `C-c C-w'
-      Kill a word before point (`backward-kill-word').
- 
- `C-c C-c'
-      Interrupt the shell or its current subjob if any
-      (`comint-interrupt-subjob').
- 
- `C-c C-z'
-      Stop the shell or its current subjob if any (`comint-stop-subjob').
- 
- `C-c C-\'
-      Send quit signal to the shell or its current subjob if any
-      (`comint-quit-subjob').
- 
- `C-c C-o'
-      Kill the last batch of output from a shell command
-      (`comint-kill-output').  This is useful if a shell command spews
-      out lots of output that just gets in the way.
- 
- `C-c C-r'
- `C-M-l'
-      Scroll to display the beginning of the last batch of output at the
-      top of the window; also move the cursor there
-      (`comint-show-output').
- 
- `C-c C-e'
-      Scroll to put the end of the buffer at the bottom of the window
-      (`comint-show-maximum-output').
- 
- `C-c C-f'
-      Move forward across one shell command, but not beyond the current
-      line (`shell-forward-command').  The variable
-      `shell-command-regexp' specifies how to recognize the end of a
-      command.
- 
- `C-c C-b'
-      Move backward across one shell command, but not beyond the current
-      line (`shell-backward-command').
- 
- `C-c C-l'
-      Display the buffer's history of shell commands in another window
-      (`comint-dynamic-list-input-ring').
- 
- `M-x dirs'
-      Ask the shell what its current directory is, so that Emacs can
-      agree with the shell.
- 
- `M-x send-invisible RET TEXT RET'
-      Send TEXT as input to the shell, after reading it without echoing.
-      This is useful when a shell command runs a program that asks for
-      a password.
- 
-      Alternatively, you can arrange for Emacs to notice password prompts
-      and turn off echoing for them, as follows:
- 
-           (add-hook `comint-output-filter-functions
-                     `comint-watch-for-password-prompt)
- 
- `M-x comint-continue-subjob'
-      Continue the shell process.  This is useful if you accidentally
-      suspend the shell process.(1)
- 
- `M-x comint-strip-ctrl-m'
-      Discard all control-m characters from the shell output.  The most
-      convenient way to use this command is to make it run automatically
-      when you get output from the subshell.  To do that, evaluate this
-      Lisp expression:
- 
-           (add-hook 'comint-output-filter-functions
-                     'comint-strip-ctrl-m)
- 
- `M-x comint-truncate-buffer'
-      This command truncates the shell buffer to a certain maximum
-      number of lines, specified by the variable
-      `comint-buffer-maximum-size'.  Here's how to do this automatically
-      each time you get output from the subshell:
- 
-           (add-hook 'comint-output-filter-functions
-                     'comint-truncate-buffer)
- 
-    Shell mode also customizes the paragraph commands so that only shell
- prompts start new paragraphs.  Thus, a paragraph consists of an input
- command plus the output that follows it in the buffer.
- 
-    Shell mode is a derivative of Comint mode, a general purpose mode for
- communicating with interactive subprocesses.  Most of the features of
- Shell mode actually come from Comint mode, as you can see from the
- command names listed above.  The specialization of Shell mode in
- particular include the choice of regular expression for detecting
- prompts, the directory tracking feature, and a few user commands.
- 
-    Other Emacs features that use variants of Comint mode include GUD
- (*note Debuggers::.) and `M-x run-lisp' (*note External Lisp::.).
- 
-    You can use `M-x comint-run' to execute any program of your choice
- in a subprocess using unmodified Comint mode--without the
- specializations of Shell mode.
- 
-    ---------- Footnotes ----------
- 
-    (1)  You should not suspend the shell process.  Suspending a subjob
- of the shell is a completely different matter--that is normal practice,
- but you must use the shell to continue the subjob; this command won't
- do it.
- 
- 
- File: emacs,  Node: Shell History,  Next: Shell Options,  Prev: Shell Mode,  Up: Shell
- 
- Shell Command History
- ---------------------
- 
-    Shell buffers support three ways of repeating earlier commands.  You
- can use the same keys used in the minibuffer; these work much as they do
- in the minibuffer, inserting text from prior commands while point
- remains always at the end of the buffer.  You can move through the
- buffer to previous inputs in their original place, then resubmit them or
- copy them to the end.  Or you can use a `!'-style history reference.
- 
- * Menu:
- 
- * Ring: Shell Ring.             Fetching commands from the history list.
- * Copy: Shell History Copying.  Moving to a command and then copying it.
- * History References::          Expanding `!'-style history references.
- 
- 
- File: emacs,  Node: Shell Ring,  Next: Shell History Copying,  Up: Shell History
- 
- Shell History Ring
- ..................
- 
- `M-p'
-      Fetch the next earlier old shell command.
- 
- `M-n'
-      Fetch the next later old shell command.
- 
- `M-r REGEXP RET'
- `M-s REGEXP RET'
-      Search backwards or forwards for old shell commands that match
-      REGEXP.
- 
-    Shell buffers provide a history of previously entered shell
- commands.  To reuse shell commands from the history, use the editing
- commands `M-p', `M-n', `M-r' and `M-s'.  These work just like the
- minibuffer history commands except that they operate on the text at the
- end of the shell buffer, where you would normally insert text to send
- to the shell.
- 
-    `M-p' fetches an earlier shell command to the end of the shell
- buffer.  Successive use of `M-p' fetches successively earlier shell
- commands, each replacing any text that was already present as potential
- shell input.  `M-n' does likewise except that it finds successively
- more recent shell commands from the buffer.
- 
-    The history search commands `M-r' and `M-s' read a regular
- expression and search through the history for a matching command.  Aside
- from the choice of which command to fetch, they work just like `M-p'
- and `M-r'.  If you enter an empty regexp, these commands reuse the same
- regexp used last time.
- 
-    When you find the previous input you want, you can resubmit it by
- typing RET, or you can edit it first and then resubmit it if you wish.
- 
-    These commands get the text of previous shell commands from a special
- history list, not from the shell buffer itself.  Thus, editing the shell
- buffer, or even killing large parts of it, does not affect the history
- that these commands access.
- 
-    Some shells store their command histories in files so that you can
- refer to previous commands from previous shell sessions.  Emacs reads
- the command history file for your chosen shell, to initialize its own
- command history.  The file name is `~/.bash_history' for bash,
- `~/.sh_history' for ksh, and `~/.history' for other shells.
- 
- 
- File: emacs,  Node: Shell History Copying,  Next: History References,  Prev: Shell Ring,  Up: Shell History
- 
- Shell History Copying
- .....................
- 
- `C-c C-p'
-      Move point to the previous prompt (`comint-previous-prompt').
- 
- `C-c C-n'
-      Move point to the following prompt (`comint-next-prompt').
- 
- `C-c RET'
-      Copy the input command which point is in, inserting the copy at
-      the end of the buffer (`comint-copy-old-input').  This is useful
-      if you move point back to a previous command.  After you copy the
-      command, you can submit the copy as input with RET.  If you wish,
-      you can edit the copy before resubmitting it.
- 
-    Moving to a previous input and then copying it with `C-c RET'
- produces the same results--the same buffer contents--that you would get
- by using `M-p' enough times to fetch that previous input from the
- history list.  However, `C-c RET' copies the text from the buffer,
- which can be different from what is in the history list if you edit the
- input text in the buffer after it has been sent.
- 
- 
- File: emacs,  Node: History References,  Prev: Shell History Copying,  Up: Shell History
- 
- Shell History References
- ........................
- 
-    Various shells including csh and bash support "history references"
- that begin with `!' and `^'.  Shell mode can understands these
- constructs and perform the history substitution for you.  If you insert
- a history reference and type TAB, this searches the input history for a
- matching command, performs substitution if necessary, and places the
- result in the buffer in place of the history reference.  For example,
- you can fetch the most recent command beginning with `mv' with `! m v
- TAB'.  You can edit the command if you wish, and then resubmit the
- command to the shell by typing RET.
- 
-    History references take effect only following a shell prompt.  The
- variable `shell-prompt-pattern' specifies how to recognize a shell
- prompt.  Comint modes in general use the variable
- `comint-prompt-regexp' to specify how to find a prompt; Shell mode uses
- `shell-prompt-pattern' to set up the local value of
- `comint-prompt-regexp'.
- 
-    Shell mode can optionally expand history references in the buffer
- when you send them to the shell.  To request this, set the variable
- `comint-input-autoexpand' to `input'.
- 
-    You can make SPC perform history expansion by binding SPC to the
- command `comint-magic-space'.
- 
- 
- File: emacs,  Node: Shell Options,  Next: Remote Host,  Prev: Shell History,  Up: Shell
- 
- Shell Mode Options
- ------------------
- 
-    If the variable `comint-scroll-to-bottom-on-input' is non-`nil',
- insertion and yank commands scroll the selected window to the bottom
- before inserting.
- 
-    If `comint-scroll-show-maximum-output' is non-`nil' (which is the
- default), then scrolling due to arrival of output tries to place the
- last line of text at the bottom line of the window, so as to show as
- much useful text as possible.  (This mimics the scrolling behavior of
- many terminals.)
- 
-    By setting `comint-scroll-to-bottom-on-output', you can opt for
- having point jump to the end of the buffer whenever output arrives--no
- matter where in the buffer point was before.  If the value is `this',
- point jumps in the selected window.  If the value is `all', point jumps
- in each window that shows the comint buffer.  If the value is `other',
- point jumps in all nonselected windows that show the current buffer.
- The default value is `nil', which means point does not jump to the end.
- 
-    The variable `comint-input-ignoredups' controls whether successive
- identical inputs are stored in the input history.  A non-`nil' value
- means to omit an input that is the same as the previous input.  The
- default is `nil', which means to store each input even if it is equal
- to the previous input.
- 
-    Three variables customize file name completion.  The variable
- `comint-completion-addsuffix' controls whether completion inserts a
- space or a slash to indicate a fully completed file or directory name
- (non-`nil' means do insert a space or slash).
- `comint-completion-recexact', if non-`nil', directs TAB to choose the
- shortest possible completion if the usual Emacs completion algorithm
- cannot add even a single character.  `comint-completion-autolist', if
- non-`nil', says to list all the possible completions whenever
- completion is not exact.
- 
-    The command `comint-dynamic-complete-variable' does variable name
- completion using the environment variables as set within Emacs.  The
- variables controlling file name completion apply to variable name
- completion too.  This command is normally available through the menu
- bar.
- 
-    Command completion normally considers only executable files.  If you
- set `shell-command-execonly' to `nil', it considers nonexecutable files
- as well.
- 
-    You can configure the behavior of `pushd'.  Variables control
- whether `pushd' behaves like `cd' if no argument is given
- (`shell-pushd-tohome'), pop rather than rotate with a numeric argument
- (`shell-pushd-dextract'), and only add directories to the directory
- stack if they are not already on it (`shell-pushd-dunique').  The
- values you choose should match the underlying shell, of course.
- 
- 
- File: emacs,  Node: Remote Host,  Prev: Shell Options,  Up: Shell
- 
- Remote Host Shell
- -----------------
- 
-    Emacs provides two commands for logging in to another computer and
- communicating with it through an Emacs buffer.
- 
- `M-x telnet RET HOSTNAME RET'
-      Set up a Telnet connection to the computer named HOSTNAME.
- 
- `M-x rlogin RET HOSTNAME RET'
-      Set up an Rlogin connection to the computer named HOSTNAME.
- 
-    Use `M-x telnet' to set up a Telnet connection to another computer.
- (Telnet is the standard Internet protocol for remote login.) It reads
- the host name of the other computer as an argument with the minibuffer.
- Once the connection is established, talking to the other computer
- works like talking to a subshell: you can edit input with the usual
- Emacs commands, and send it a line at a time by typing RET.  The output
- is inserted in the Telnet buffer interspersed with the input.
- 
-    Use `M-x rlogin' to set up an Rlogin connection.  Rlogin is another
- remote login communication protocol, essentially much like the Telnet
- protocol but incompatible with it, and supported only by certain
- systems.  Rlogin's advantages are that you can arrange not to have to
- give your user name and password when communicating between two machines
- you frequently use, and that you can make an 8-bit-clean connection.
- (To do that in Emacs, set `rlogin-explicit-args' to `("-8")' before you
- run Rlogin.)
- 
-    `M-x rlogin' sets up the default file directory of the Emacs buffer
- to access the remote host via FTP (*note File Names::.), and it tracks
- the shell commands that change the current directory just like Shell
- mode.
- 
- 
- File: emacs,  Node: Emacs Server,  Next: Hardcopy,  Prev: Shell,  Up: Top
- 
- Using Emacs as a Server
- =======================
- 
-    Various programs such as `mail' can invoke your choice of editor to
- edit a particular piece of text, such as a message that you are
- sending.  By convention, most of these programs use the environment
- variable `EDITOR' to specify which editor to run.  If you set `EDITOR'
- to `emacs', they invoke Emacs--but in an inconvenient fashion, by
- starting a new, separate Emacs process.  This is inconvenient because
- it takes time and because the new Emacs process doesn't share the
- buffers in the existing Emacs process.
- 
-    You can arrange to use your existing Emacs process as the editor for
- programs like `mail' by using the Emacs client and Emacs server
- programs.  Here is how.
- 
-    First, the preparation.  Within Emacs, call the function
- `server-start'.  (Your `.emacs' file can do this automatically if you
- add the expression `(server-start)' to it.)  Then, outside Emacs, set
- the `EDITOR' environment variable to `emacsclient'.  (Note that some
- programs use a different environment variable; for example, to make TeX
- use `emacsclient', you should set the `TEXEDIT' environment variable to
- `emacsclient +%d %s'.)
- 
-    Then, whenever any program invokes your specified `EDITOR' program,
- the effect is to send a message to your principal Emacs telling it to
- visit a file.  (That's what the program `emacsclient' does.) Emacs
- displays the buffer immediately and you can immediately begin editing
- it.
- 
-    When you've finished editing that buffer, type `C-x #'
- (`server-edit').  This saves the file and sends a message back to the
- `emacsclient' program telling it to exit.  The programs that use
- `EDITOR' wait for the "editor" (actually, `emacsclient') to exit.  `C-x
- #' also checks for other pending external requests to edit various
- files, and selects the next such file.
- 
-    You can switch to a server buffer manually if you wish; you don't
- have to arrive at it with `C-x #'.  But `C-x #' is the only way to say
- that you are "finished" with one.
- 
-    If you set the variable `server-window' to a window or a frame, `C-x
- #' displays the server buffer in that window or in that frame.
- 
-    While `mail' or another application is waiting for `emacsclient' to
- finish, `emacsclient' does not read terminal input.  So the terminal
- that `mail' was using is effectively blocked for the duration.  In
- order to edit with your principal Emacs, you need to be able to use it
- without using that terminal.  There are two ways to do this:
- 
-    * Using a window system, run `mail' and the principal Emacs in two
-      separate windows.  While `mail' is waiting for `emacsclient', the
-      window where it was running is blocked, but you can use Emacs by
-      switching windows.
- 
-    * Use Shell mode in Emacs to run the other program such as `mail';
-      then, `emacsclient' blocks only the subshell under Emacs, and you
-      can still use Emacs to edit the file.
- 
-    Some programs write temporary files for you to edit.  After you edit
- the temporary file, the program reads it back and deletes it.  If the
- Emacs server is later asked to edit the same file name, it should assume
- this has nothing to do with the previous occasion for that file name.
- The server accomplishes this by killing the temporary file's buffer when
- you finish with the file.  Use the variable `server-temp-file-regexp'
- to specify which files are temporary in this sense; its value should be
- a regular expression that matches file names that are temporary.
- 
- 
- File: emacs,  Node: Hardcopy,  Next: Postscript,  Prev: Emacs Server,  Up: Top
- 
- Hardcopy Output
- ===============
- 
-    The Emacs commands for making hardcopy let you print either an entire
- buffer or just part of one, either with or without page headers.  See
- also the hardcopy commands of Dired (*note Misc File Ops::.) and the
- diary (*note Diary Commands::.).
- 
- `M-x print-buffer'
-      Print hardcopy of current buffer with page headings containing the
-      file name and page number.
- 
- `M-x lpr-buffer'
-      Print hardcopy of current buffer without page headings.  makes no
-      page headings.
- 
- `M-x print-region'
-      Like `print-buffer' but print only the current region.
- 
- `M-x lpr-region'
-      Like `lpr-buffer' but print only the current region.
- 
-    The hardcopy commands (aside from the Postscript commands) pass extra
- switches to the `lpr' program based on the value of the variable
- `lpr-switches'.  Its value should be a list of strings, each string an
- option starting with `-'.  For example, to use a printer named
- `nearme', set `lpr-switches' like this:
- 
-      (setq lpr-switches '("-Pnearme"))
- 
-    The variable `lpr-header-switches' similarly specifies the extra
- switches to use to make page headers.
- 
- 
- File: emacs,  Node: Postscript,  Next: Sorting,  Prev: Hardcopy,  Up: Top
- 
- Postscript Hardcopy
- ===================
- 
-    These commands convert buffer contents to Postscript, either
- printing it or leaving it in another Emacs buffer.
- 
- `M-x ps-print-buffer'
-      Print hardcopy of the current buffer in Postscript form.
- 
- `M-x ps-print-region'
-      Print hardcopy of the current region in Postscript form.
- 
- `M-x ps-print-buffer-with-faces'
-      Print hardcopy of the current buffer in Postscript form, showing
-      the faces used in the text by means of Postscript features.
- 
- `M-x ps-print-region-with-faces'
-      Print hardcopy of the current region in Postscript form, showing
-      the faces used in the text.
- 
- `M-x ps-spool-buffer'
-      Generate Postscript for the current buffer text.
- 
- `M-x ps-spool-region'
-      Generate Postscript for the current region.
- 
- `M-x ps-spool-buffer-with-faces'
-      Generate Postscript for the current buffer, showing the faces used.
- 
- `M-x ps-spool-region-with-faces'
-      Generate Postscript for the current region, showing the faces used.
- 
-    The Postscript commands, `ps-print-buffer' and `ps-print-region',
- print buffer contents in Postscript form.  One command prints the
- entire buffer; the other, just the region.  The corresponding
- `-with-faces' commands, `ps-print-buffer-with-faces' and
- `ps-print-region-with-faces', use Postscript features to show the faces
- (fonts and colors) in the text properties of the text being printed.
- 
-    All four of the commands above use the variables `ps-lpr-command'
- and `ps-lpr-switches' to specify how to print the output.
- `ps-lpr-command' specifies the command name to run, and
- `ps-lpr-switches' specifies command line options to use.  If you don't
- set these variables yourself, they take their initial values from
- `lpr-command' and `lpr-switches'.
- 
-    The variable `ps-print-header' controls whether these commands add
- header lines to each page--set it to `nil' to turn headers off.  You
- can turn off color processing by setting `ps-print-color-p' to `nil'.
- Many other customization variables for these commands are defined and
- described in the Lisp file `ps-print.el'.
- 
-    The commands whose names have `spool' instead of `print' generate
- the Postscript output in an Emacs buffer instead of sending it to the
- printer.
- 
- 
- File: emacs,  Node: Sorting,  Next: Narrowing,  Prev: Postscript,  Up: Top
- 
- Sorting Text
- ============
- 
-    Emacs provides several commands for sorting text in the buffer.  All
- operate on the contents of the region (the text between point and the
- mark).  They divide the text of the region into many "sort records",
- identify a "sort key" for each record, and then reorder the records
- into the order determined by the sort keys.  The records are ordered so
- that their keys are in alphabetical order, or, for numeric sorting, in
- numeric order.  In alphabetic sorting, all upper case letters `A'
- through `Z' come before lower case `a', in accord with the ASCII
- character sequence.
- 
-    The various sort commands differ in how they divide the text into
- sort records and in which part of each record is used as the sort key.
- Most of the commands make each line a separate sort record, but some
- commands use paragraphs or pages as sort records.  Most of the sort
- commands use each entire sort record as its own sort key, but some use
- only a portion of the record as the sort key.
- 
- `M-x sort-lines'
-      Divide the region into lines, and sort by comparing the entire
-      text of a line.  A numeric argument means sort into descending
-      order.
- 
- `M-x sort-paragraphs'
-      Divide the region into paragraphs, and sort by comparing the entire
-      text of a paragraph (except for leading blank lines).  A numeric
-      argument means sort into descending order.
- 
- `M-x sort-pages'
-      Divide the region into pages, and sort by comparing the entire
-      text of a page (except for leading blank lines).  A numeric
-      argument means sort into descending order.
- 
- `M-x sort-fields'
-      Divide the region into lines, and sort by comparing the contents of
-      one field in each line.  Fields are defined as separated by
-      whitespace, so the first run of consecutive non-whitespace
-      characters in a line constitutes field 1, the second such run
-      constitutes field 2, etc.
- 
-      Specify which field to sort by with a numeric argument: 1 to sort
-      by field 1, etc.  A negative argument means count fields from the
-      right instead of from the left; thus, minus 1 means sort by the
-      last field.  If several lines have identical contents in the field
-      being sorted, they keep same relative order that they had in the
-      original buffer.
- 
-      A negative argument means count fields from the right (from the
-      end of the line).
- 
- `M-x sort-numeric-fields'
-      Like `M-x sort-fields' except the specified field is converted to
-      an integer for each line, and the numbers are compared.  `10'
-      comes before `2' when considered as text, but after it when
-      considered as a number.
- 
- `M-x sort-columns'
-      Like `M-x sort-fields' except that the text within each line used
-      for comparison comes from a fixed range of columns.  See below for
-      an explanation.
- 
- `M-x reverse-region'
-      Reverse the order of the lines in the region.  This is useful for
-      sorting into descending order by fields or columns, since those
-      sort commands do not have a feature for doing that.
- 
-    For example, if the buffer contains this:
- 
-      On systems where clash detection (locking of files being edited) is
-      implemented, Emacs also checks the first time you modify a buffer
-      whether the file has changed on disk since it was last visited or
-      saved.  If it has, you are asked to confirm that you want to change
-      the buffer.
- 
- applying `M-x sort-lines' to the entire buffer produces this:
- 
-      On systems where clash detection (locking of files being edited) is
-      implemented, Emacs also checks the first time you modify a buffer
-      saved.  If it has, you are asked to confirm that you want to change
-      the buffer.
-      whether the file has changed on disk since it was last visited or
- 
- where the upper case `O' sorts before all lower case letters.  If you
- use `C-u 2 M-x sort-fields' instead, you get this:
- 
-      implemented, Emacs also checks the first time you modify a buffer
-      saved.  If it has, you are asked to confirm that you want to change
-      the buffer.
-      On systems where clash detection (locking of files being edited) is
-      whether the file has changed on disk since it was last visited or
- 
- where the sort keys were `Emacs', `If', `buffer', `systems' and `the'.
- 
-    `M-x sort-columns' requires more explanation.  You specify the
- columns by putting point at one of the columns and the mark at the other
- column.  Because this means you cannot put point or the mark at the
- beginning of the first line to sort, this command uses an unusual
- definition of `region': all of the line point is in is considered part
- of the region, and so is all of the line the mark is in, as well as all
- the lines in between.
- 
-    For example, to sort a table by information found in columns 10 to
- 15, you could put the mark on column 10 in the first line of the table,
- and point on column 15 in the last line of the table, and then run
- `sort-columns'.  Equivalently, you could run it with the mark on column
- 15 in the first line and point on column 10 in the last line.
- 
-    This can be thought of as sorting the rectangle specified by point
- and the mark, except that the text on each line to the left or right of
- the rectangle moves along with the text inside the rectangle.  *Note
- Rectangles::.
- 
-    Many of the sort commands ignore case differences when comparing, if
- `sort-fold-case' is non-`nil'.
- 
- 
- File: emacs,  Node: Narrowing,  Next: Two-Column,  Prev: Sorting,  Up: Top
- 
- Narrowing
- =========
- 
-    "Narrowing" means focusing in on some portion of the buffer, making
- the rest temporarily inaccessible.  The portion which you can still get
- to is called the "accessible portion".  Canceling the narrowing, which
- makes the entire buffer once again accessible, is called "widening".
- The amount of narrowing in effect in a buffer at any time is called the
- buffer's "restriction".
- 
-    Narrowing can make it easier to concentrate on a single subroutine or
- paragraph by eliminating clutter.  It can also be used to restrict the
- range of operation of a replace command or repeating keyboard macro.
- 
- `C-x n n'
-      Narrow down to between point and mark (`narrow-to-region').
- 
- `C-x n w'
-      Widen to make the entire buffer accessible again (`widen').
- 
- `C-x n p'
-      Narrow down to the current page (`narrow-to-page').
- 
-    When you have narrowed down to a part of the buffer, that part
- appears to be all there is.  You can't see the rest, you can't move
- into it (motion commands won't go outside the accessible part), you
- can't change it in any way.  However, it is not gone, and if you save
- the file all the inaccessible text will be saved.  The word `Narrow'
- appears in the mode line whenever narrowing is in effect.
- 
-    The primary narrowing command is `C-x n n' (`narrow-to-region').  It
- sets the current buffer's restrictions so that the text in the current
- region remains accessible but all text before the region or after the
- region is inaccessible.  Point and mark do not change.
- 
-    Alternatively, use `C-x n p' (`narrow-to-page') to narrow down to
- the current page.  *Note Pages::, for the definition of a page.
- 
-    The way to cancel narrowing is to widen with `C-x n w' (`widen').
- This makes all text in the buffer accessible again.
- 
-    You can get information on what part of the buffer you are narrowed
- down to using the `C-x =' command.  *Note Position Info::.
- 
-    Because narrowing can easily confuse users who do not understand it,
- `narrow-to-region' is normally a disabled command.  Attempting to use
- this command asks for confirmation and gives you the option of enabling
- it; if you enable the command, confirmation will no longer be required
- for it.  *Note Disabling::.
- 
- 
- File: emacs,  Node: Two-Column,  Next: Editing Binary Files,  Prev: Narrowing,  Up: Top
- 
- Two-Column Editing
- ==================
- 
-    Two-column mode lets you conveniently edit two side-by-side columns
- of text.  It uses two side-by-side windows, each showing its own buffer.
- 
-    There are three ways to enter two-column mode:
- 
- `C-x 6 2'
-      Enter two-column mode with the current buffer on the left, and on
-      the right, a buffer whose name is based on the current buffer's
-      name (`tc-two-columns').  If the right-hand buffer doesn't already
-      exist, it starts out empty; the current buffer's contents are not
-      changed.
- 
-      This command is appropriate when the current buffer contains just
-      one column and you want to add another column.
- 
- `C-x 6 s'
-      Split the current buffer, which contains two-column text, into two
-      buffers, and display them side by side (`tc-split').  The current
-      buffer becomes the left-hand buffer, but the text in the right-hand
-      column is moved into the right-hand buffer.  The current column
-      specifies the split point.  Splitting starts with the current line
-      and continues to the end of the buffer.
- 
-      This command is appropriate when you have a buffer that already
-      contains two-column text, and you wish to separate the columns
-      temporarily.
- 
- `C-x 6 b BUFFER RET'
-      Enter two-column mode using the current buffer as the left-hand
-      buffer, and using buffer BUFFER as the right-hand buffer
-      (`tc-associate-buffer').
- 
-    `C-x 6 s' looks for a column separator which is a string that
- appears on each line between the two columns.  You can specify the width
- of the separator with a numeric argument to `C-x 6 s'; that many
- characters, before point, constitute the separator string.  By default,
- the width is 1, so the column separator is the character before point.
- 
-    When a line has the separator at the proper place, `C-x 6 s' puts
- the text after the separator into the right-hand buffer, and deletes the
- separator.  Lines that don't have the column separator at the proper
- place remain unsplit; they stay in the left-hand buffer, and the
- right-hand buffer gets an empty line to correspond.  (This is the way
- to write a line that spans both columns while in two-column mode: write
- it in the left-hand buffer, and put an empty line in the right-hand
- buffer.)
- 
-    It's not a good idea to use ordinary scrolling commands during
- two-column editing, because that separates the two parts of each split
- line.  Instead, use these special scroll commands:
- 
- `C-x 6 SPC'
-      Scroll both buffers up, in lock step (`tc-scroll-up').
- 
- `C-x 6 DEL'
-      Scroll both buffers down, in lock step (`tc-scroll-down').
- 
- `C-x 6 C-l'
-      Recenter both buffers, in lock step (`tc-recenter').
- 
-    When you have edited both buffers as you wish, merge them with `C-x
- 6 1' (`tc-merge').  This copies the text from the right-hand buffer as
- a second column in the other buffer.  To go back to two-column editing,
- use `C-x 6 s'.
- 
-    Use `C-x 6 d' to disassociate the two buffers, leaving each as it
- stands (`tc-dissociate').  If the other buffer, the one not current
- when you type `C-x 6 d', is empty, `C-x 6 d' kills it.
- 
- 
- File: emacs,  Node: Editing Binary Files,  Next: Saving Emacs Sessions,  Prev: Two-Column,  Up: Top
- 
- Editing Binary Files
- ====================
- 
-    There is a special major mode for editing binary files: Hexl mode.
- To use it, use `M-x hexl-find-file' instead of `C-x C-f' to visit the
- file.  This command converts the file's contents to hexadecimal and
- lets you edit the translation.  When you save the file, it is converted
- automatically back to binary.
- 
-    You can also use `M-x hexl-mode' to translate an existing buffer
- into hex.  This is useful if you visit a file normally and then discover
- it is a binary file.
- 
-    Ordinary text characters overwrite in Hexl mode.  This is to reduce
- the risk of accidentally spoiling the alignment of data in the file.
- There are special commands for insertion.  Here is a list of the
- commands of Hexl mode:
- 
- `C-M-d'
-      Insert a byte with a code typed in decimal.
- 
- `C-M-o'
-      Insert a byte with a code typed in octal.
- 
- `C-M-x'
-      Insert a byte with a code typed in hex.
- 
- `C-x ['
-      Move to the beginning of a 1k-byte "page".
- 
- `C-x ]'
-      Move to the end of a 1k-byte "page".
- 
- `M-g'
-      Move to an address specified in hex.
- 
- `M-j'
-      Move to an address specified in decimal.
- 
- `C-c C-c'
-      Leave Hexl mode, going back to the major mode this buffer had
-      before you invoked `hexl-mode'.
- 
- 
- File: emacs,  Node: Saving Emacs Sessions,  Next: Recursive Edit,  Prev: Editing Binary Files,  Up: Top
- 
- Saving Emacs Sessions
- =====================
- 
-    You can use the Desktop library to save the state of Emacs from one
- session to another.  Saving the state means that Emacs starts up with
- the same set of buffers, major modes, buffer positions, and so on that
- the previous Emacs session had.
- 
-    To use Desktop, you should first add these lines to your `.emacs'
- file, preferably at or near the end:
- 
-      (load "desktop")
-      (desktop-load-default)
-      (desktop-read)
- 
- Then, to enable state saving in a particular Emacs session, use the
- command `M-x desktop-save'.  Once you have done this, the state of this
- Emacs session will be saved when you exit Emacs.
- 
-    In order for Emacs to recover the state from a previous session, you
- must start it with the same current directory as you used when you
- started the previous session.
- 
-    The variable `desktop-files-not-to-save' controls which files are
- excluded from state saving.  Its value is a regular expression that
- matches the files to exclude.  By default, remote (ftp-accessed) files
- are excluded; this is because visiting them again in the subsequent
- session would be slow.  If you want to include these files in state
- saving, set `desktop-files-not-to-save' to `"^$"'.
- 
- 
- File: emacs,  Node: Recursive Edit,  Next: Emulation,  Prev: Saving Emacs Sessions,  Up: Top
- 
- Recursive Editing Levels
- ========================
- 
-    A "recursive edit" is a situation in which you are using Emacs
- commands to perform arbitrary editing while in the middle of another
- Emacs command.  For example, when you type `C-r' inside of a
- `query-replace', you enter a recursive edit in which you can change the
- current buffer.  On exiting from the recursive edit, you go back to the
- `query-replace'.
- 
-    "Exiting" the recursive edit means returning to the unfinished
- command, which continues execution.  The command to exit is `C-M-c'
- (`exit-recursive-edit').
- 
-    You can also "abort" the recursive edit.  This is like exiting, but
- also quits the unfinished command immediately.  Use the command `C-]'
- (`abort-recursive-edit') to do this.  *Note Quitting::.
- 
-    The mode line shows you when you are in a recursive edit by
- displaying square brackets around the parentheses that always surround
- the major and minor mode names.  Every window's mode line shows this,
- in the same way, since being in a recursive edit is true of Emacs as a
- whole rather than any particular window or buffer.
- 
-    It is possible to be in recursive edits within recursive edits.  For
- example, after typing `C-r' in a `query-replace', you may type a
- command that enters the debugger.  This begins a recursive editing level
- for the debugger, within the recursive editing level for `C-r'.  Mode
- lines display a pair of square brackets for each recursive editing
- level currently in progress.
- 
-    Exiting the inner recursive edit (such as, with the debugger `c'
- command) resumes the command running in the next level up.  When that
- command finishes, you can then use `C-M-c' to exit another recursive
- editing level, and so on.  Exiting applies to the innermost level only.
- Aborting also gets out of only one level of recursive edit; it returns
- immediately to the command level of the previous recursive edit.  If you
- wish, you can then abort the next recursive editing level.
- 
-    Alternatively, the command `M-x top-level' aborts all levels of
- recursive edits, returning immediately to the top level command reader.
- 
-    The text being edited inside the recursive edit need not be the same
- text that you were editing at top level.  It depends on what the
- recursive edit is for.  If the command that invokes the recursive edit
- selects a different buffer first, that is the buffer you will edit
- recursively.  In any case, you can switch buffers within the recursive
- edit in the normal manner (as long as the buffer-switching keys have
- not been rebound).  You could probably do all the rest of your editing
- inside the recursive edit, visiting files and all.  But this could have
- surprising effects (such as stack overflow) from time to time.  So
- remember to exit or abort the recursive edit when you no longer need it.
- 
-    In general, we try to minimize the use of recursive editing levels in
- GNU Emacs.  This is because they constrain you to "go back" in a
- particular order-from the innermost level toward the top level.  When
- possible, we present different activities in separate buffers so that
- you can switch between them as you please.  Some commands switch to a
- new major mode which provides a command to switch back.  These
- approaches give you more flexibility to go back to unfinished tasks in
- the order you choose.
- 
- 
- File: emacs,  Node: Emulation,  Next: Dissociated Press,  Prev: Recursive Edit,  Up: Top
- 
- Emulation
- =========
- 
-    GNU Emacs can be programmed to emulate (more or less) most other
- editors.  Standard facilities can emulate these:
- 
- EDT (DEC VMS editor)
-      Turn on EDT emulation with `M-x edt-emulation-on'.  `M-x
-      edt-emulation-off' restores normal Emacs command bindings.
- 
-      Most of the EDT emulation commands are keypad keys, and most
-      standard Emacs key bindings are still available.  The EDT
-      emulation rebindings are done in the global keymap, so there is no
-      problem switching buffers or major modes while in EDT emulation.
- 
- vi (Berkeley editor)
-      Viper is the newest emulator for vi.  It implements several levels
-      of emulation; level 1 is closest to vi itself, while level 5
-      departs somewhat from strict emulation to take advantage of the
-      capabilities of Emacs.  To invoke Viper, type `M-x viper-mode'; it
-      will guide you the rest of the way and ask for the emulation level.
- 
- vi (another emulator)
-      `M-x vi-mode' enters a major mode that replaces the previously
-      established major mode.  All of the vi commands that, in real vi,
-      enter "input" mode are programmed instead to return to the
-      previous major mode.  Thus, ordinary Emacs serves as vi's "input"
-      mode.
- 
-      Because vi emulation works through major modes, it does not work
-      to switch buffers during emulation.  Return to normal Emacs first.
- 
-      If you plan to use vi emulation much, you probably want to bind a
-      key to the `vi-mode' command.
- 
- vi (alternate emulator)
-      `M-x vip-mode' invokes another vi emulator, said to resemble real
-      vi more thoroughly than `M-x vi-mode'.  "Input" mode in this
-      emulator is changed from ordinary Emacs so you can use ESC to go
-      back to emulated vi command mode.  To get from emulated vi command
-      mode back to ordinary Emacs, type `C-z'.
- 
-      This emulation does not work through major modes, and it is
-      possible to switch buffers in various ways within the emulator.
-      It is not so necessary to assign a key to the command `vip-mode' as
-      it is with `vi-mode' because terminating insert mode does not use
-      it.
- 
-      For full information, see the long comment at the beginning of the
-      source file, which is `lisp/vip.el' in the Emacs distribution.
- 
- 
- File: emacs,  Node: Dissociated Press,  Next: Amusements,  Prev: Emulation,  Up: Top
- 
- Dissociated Press
- =================
- 
-    `M-x dissociated-press' is a command for scrambling a file of text
- either word by word or character by character.  Starting from a buffer
- of straight English, it produces extremely amusing output.  The input
- comes from the current Emacs buffer.  Dissociated Press writes its
- output in a buffer named `*Dissociation*', and redisplays that buffer
- after every couple of lines (approximately) so you can read the output
- as it comes out.
- 
-    Dissociated Press asks every so often whether to continue generating
- output.  Answer `n' to stop it.  You can also stop at any time by
- typing `C-g'.  The dissociation output remains in the `*Dissociation*'
- buffer for you to copy elsewhere if you wish.
- 
-    Dissociated Press operates by jumping at random from one point in the
- buffer to another.  In order to produce plausible output rather than
- gibberish, it insists on a certain amount of overlap between the end of
- one run of consecutive words or characters and the start of the next.
- That is, if it has just printed out `president' and then decides to jump
- to a different point in the file, it might spot the `ent' in `pentagon'
- and continue from there, producing `presidentagon'.(1)  Long sample
- texts produce the best results.
- 
-    A positive argument to `M-x dissociated-press' tells it to operate
- character by character, and specifies the number of overlap characters.
- A negative argument tells it to operate word by word and specifies the
- number of overlap words.  In this mode, whole words are treated as the
- elements to be permuted, rather than characters.  No argument is
- equivalent to an argument of two.  For your againformation, the output
- goes only into the buffer `*Dissociation*'.  The buffer you start with
- is not changed.
- 
-    Dissociated Press produces nearly the same results as a Markov chain
- based on a frequency table constructed from the sample text.  It is,
- however, an independent, ignoriginal invention.  Dissociated Press
- techniquitously copies several consecutive characters from the sample
- between random choices, whereas a Markov chain would choose randomly for
- each word or character.  This makes for more plausible sounding results,
- and runs faster.
- 
-    It is a mustatement that too much use of Dissociated Press can be a
- developediment to your real work.  Sometimes to the point of outragedy.
- And keep dissociwords out of your documentation, if you want it to be
- well userenced and properbose.  Have fun.  Your buggestions are welcome.
- 
-    ---------- Footnotes ----------
- 
-    (1)  This dissociword actually appeared during the Vietnam War, when
- it was very appropriate.
- 
- 
- File: emacs,  Node: Amusements,  Next: Customization,  Prev: Dissociated Press,  Up: Top
- 
- Other Amusements
- ================
- 
-    If you are a little bit bored, you can try `M-x hanoi'.  If you are
- considerably bored, give it a numeric argument.  If you are very very
- bored, try an argument of 9.  Sit back and watch.
- 
-    If you want a little more personal involvement, try `M-x gomoku',
- which plays the game Go Moku with you.
- 
-    `M-x blackbox' and `M-x mpuz' are two kinds of puzzles.  `blackbox'
- challenges you to determine the location of objects inside a box by
- tomography.  `mpuz' displays a multiplication puzzle with letters
- standing for digits in a code that you must guess--to guess a value,
- type a letter and then the digit you think it stands for.
- 
-    `M-x dunnet' runs an adventure-style exploration game, which is a
- bigger sort of puzzle.
- 
-    When you are frustrated, try the famous Eliza program.  Just do `M-x
- doctor'.  End each input by typing `RET' twice.
- 
-    When you are feeling strange, type `M-x yow'.
- 
- 
- File: emacs,  Node: Customization,  Next: Quitting,  Prev: Amusements,  Up: Top
- 
- Customization
- *************
- 
-    This chapter talks about various topics relevant to adapting the
- behavior of Emacs in minor ways.  See `The Emacs Lisp Reference Manual'
- for how to make more far-reaching changes.
- 
-    All kinds of customization affect only the particular Emacs session
- that you do them in.  They are completely lost when you kill the Emacs
- session, and have no effect on other Emacs sessions you may run at the
- same time or later.  The only way an Emacs session can affect anything
- outside of it is by writing a file; in particular, the only way to make
- a customization `permanent' is to put something in your `.emacs' file
- or other appropriate file to do the customization in each session.
- *Note Init File::.
- 
- * Menu:
- 
- * Minor Modes::		   Each minor mode is one feature you can turn on
- 			     independently of any others.
- * Variables::		   Many Emacs commands examine Emacs variables
- 			     to decide what to do; by setting variables,
- 			     you can control their functioning.
- * Keyboard Macros::	   A keyboard macro records a sequence of
- 			     keystrokes to be replayed with a single
- 			     command.
- * Key Bindings::	   The keymaps say what command each key runs.
- 			     By changing them, you can "redefine keys".
- * Keyboard Translations::  If your keyboard passes an undesired code
- 			     for a key, you can tell Emacs to
- 			     substitute another code.
- * Syntax::		   The syntax table controls how words and
- 			      expressions are parsed.
- * Init File::		   How to write common customizations in the
-                              `.emacs' file.
- 
--- 0 ----
Index: emacs/info/emacs-18
diff -c emacs/info/emacs-18:1.1.1.2 emacs/info/emacs-18:removed
*** emacs/info/emacs-18:1.1.1.2	Mon Jul 22 01:52:10 1996
--- emacs/info/emacs-18	Fri Aug  2 20:08:19 1996
***************
*** 1,1144 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Minor Modes,  Next: Variables,  Up: Customization
- 
- Minor Modes
- ===========
- 
-    Minor modes are optional features which you can turn on or off.  For
- example, Auto Fill mode is a minor mode in which SPC breaks lines
- between words as you type.  All the minor modes are independent of each
- other and of the selected major mode.  Most minor modes say in the mode
- line when they are on; for example, `Fill' in the mode line means that
- Auto Fill mode is on.
- 
-    Append `-mode' to the name of a minor mode to get the name of a
- command function that turns the mode on or off.  Thus, the command to
- enable or disable Auto Fill mode is called `M-x auto-fill-mode'.  These
- commands are usually invoked with `M-x', but you can bind keys to them
- if you wish.  With no argument, the function turns the mode on if it was
- off and off if it was on.  This is known as "toggling".  A positive
- argument always turns the mode on, and an explicit zero argument or a
- negative argument always turns it off.
- 
-    Enabling or disabling some minor modes applies only to the current
- buffer; each buffer is independent of the other buffers.  Therefore, you
- can enable the mode in particular buffers and disable it in others.  The
- per-buffer minor modes include Auto Fill mode, Auto Save mode, Font-Lock
- mode, ISO Accents mode, Outline minor mode, Overwrite mode, and Binary
- Overwrite mode.
- 
-    Auto Fill mode allows you to enter filled text without breaking lines
- explicitly.  Emacs inserts newlines as necessary to prevent lines from
- becoming too long.  *Note Filling::.
- 
-    Auto Save mode causes the contents of a buffer to be saved
- periodically to reduce the amount of work you can lose in case of a
- system crash.  *Note Auto Save::.
- 
-    Enriched mode enables editing and saving of formatted text.  *Note
- Formatted Text::.
- 
-    Font-Lock mode automatically highlights certain textual units found
- in programs, such as comments, strings, and function names being
- defined.  This requires a window system that can display multiple fonts.
- *Note Faces::.
- 
-    ISO Accents mode makes the characters ``', `'', `"', `^', `/' and
- `~' combine with the following letter, to produce an accented letter in
- the ISO Latin-1 character set.  *Note European Display::.
- 
-    Outline minor mode provides the same facilities as the major mode
- called Outline mode; but since it is a minor mode instead, you can
- combine it with any major mode.  *Note Outline Mode::.
- 
-    Overwrite mode causes ordinary printing characters to replace
- existing text instead of shoving it to the right.  For example, if
- point is in front of the `B' in `FOOBAR', then in Overwrite mode typing
- a `G' changes it to `FOOGAR', instead of producing it `FOOGBAR' as
- usual.  Binary Overwrite mode is a variant of Overwrite mode for
- editing binary files; it treats newlines and tabs like other
- characters, so that they overwrite other characters and can be
- overwritten by them.
- 
-    The following minor modes normally apply to all buffers at once.
- Since each is enabled or disabled by the value of a variable, you *can*
- set them differently for particular buffers, by explicitly making the
- corresponding variables local in those buffers.  *Note Locals::.
- 
-    Abbrev mode allows you to define abbreviations that automatically
- expand as you type them.  For example, `amd' might expand to `abbrev
- mode'.  *Note Abbrevs::, for full information.
- 
-    Icomplete mode displays an indication of available completions when
- you are in the minibuffer and completion is active.  *Note Completion
- Options::.
- 
-    Line Number mode enables continuous display in the mode line of the
- line number of point.  *Note Mode Line::.
- 
-    Resize-Minibuffer mode makes the minibuffer expand as necessary to
- hold the text that you put in it.  *Note Minibuffer Edit::.
- 
-    Scroll Bar mode gives each window a scroll bar (*note Scroll
- Bars::.).  Menu Bar mode gives each frame a menu bar (*note Menu
- Bars::.).  Both of these modes are enabled by default when you use the
- X Window System.
- 
-    In Transient Mark mode, every change in the buffer contents
- "deactivates" the mark, so that commands that operate on the region
- will get an error.  This means you must either set the mark, or
- explicitly "reactivate" it, before each command that uses the region.
- The advantage of Transient Mark mode is that Emacs can display the
- region highlighted (currently only when using X).  *Note Setting Mark::.
- 
-    For most minor modes, the command name is also the name of a variable
- which directly controls the mode.  The mode is enabled whenever this
- variable's value is non-`nil', and the minor mode command works by
- setting the variable.  For example, the command `outline-minor-mode'
- works by setting the value of `outline-minor-mode' as a variable; it is
- this variable that directly turns Outline minor mode on and off.  To
- check whether a given minor mode works this way, use `C-h v' to ask for
- documentation on the variable name.
- 
-    These minor mode variables provide a good way for Lisp programs to
- turn minor modes on and off; they are also useful in a file's local
- variables list.  But please think twice before setting minor modes with
- a local variables list, because most minor modes are matter of user
- preference--other users editing the same file might not want the same
- minor modes you prefer.
- 
- 
- File: emacs,  Node: Variables,  Next: Keyboard Macros,  Prev: Minor Modes,  Up: Customization
- 
- Variables
- =========
- 
-    A "variable" is a Lisp symbol which has a value.  The symbol's name
- is also called the name of the variable.  A variable name can contain
- any characters that can appear in a file, but conventionally variable
- names consist of words separated by hyphens.  A variable can have a
- documentation string which describes what kind of value it should have
- and how the value will be used.
- 
-    Lisp allows any variable to have any kind of value, but most
- variables that Emacs uses require a value of a certain type.  Often the
- value should always be a string, or should always be a number.
- Sometimes we say that a certain feature is turned on if a variable is
- "non-`nil'," meaning that if the variable's value is `nil', the feature
- is off, but the feature is on for *any* other value.  The conventional
- value to use to turn on the feature--since you have to pick one
- particular value when you set the variable--is `t'.
- 
-    Emacs uses many Lisp variables for internal record keeping, as any
- Lisp program must, but the most interesting variables for you are the
- ones that exist for the sake of customization.  Emacs does not
- (usually) change the values of these variables; instead, you set the
- values, and thereby alter and control the behavior of certain Emacs
- commands.  These variables are called "options".  Most options are
- documented in this manual, and appear in the Variable Index (*note
- Variable Index::.).
- 
-    One example of a variable which is an option is `fill-column', which
- specifies the position of the right margin (as a number of characters
- from the left margin) to be used by the fill commands (*note
- Filling::.).
- 
- * Menu:
- 
- * Examining::	     Examining or setting one variable's value.
- * Edit Options::     Examining or editing list of all variables' values.
- * Hooks::	     Hook variables let you specify programs for parts
- 		       of Emacs to run on particular occasions.
- * Locals::	     Per-buffer values of variables.
- * File Variables::   How files can specify variable values.
- 
- 
- File: emacs,  Node: Examining,  Next: Edit Options,  Up: Variables
- 
- Examining and Setting Variables
- -------------------------------
- 
- `C-h v VAR RET'
-      Display the value and documentation of variable VAR
-      (`describe-variable').
- 
- `M-x set-variable RET VAR RET VALUE RET'
-      Change the value of variable VAR to VALUE.
- 
-    To examine the value of a single variable, use `C-h v'
- (`describe-variable'), which reads a variable name using the
- minibuffer, with completion.  It displays both the value and the
- documentation of the variable.  For example,
- 
-      C-h v fill-column RET
- 
- displays something like this:
- 
-      fill-column's value is 75
-      
-      Documentation:
-      *Column beyond which automatic line-wrapping should happen.
-      Automatically becomes buffer-local when set in any fashion.
- 
- The star at the beginning of the documentation indicates that this
- variable is an option.  `C-h v' is not restricted to options; it allows
- any variable name.
- 
-    The most convenient way to set a specific option is with `M-x
- set-variable'.  This reads the variable name with the minibuffer (with
- completion), and then reads a Lisp expression for the new value using
- the minibuffer a second time.  For example,
- 
-      M-x set-variable RET fill-column RET 75 RET
- 
- sets `fill-column' to 75.
- 
-    You can set any variable with a Lisp expression using the function
- `setq'.  Here's how to use it to set `fill-column':
- 
-      (setq fill-column 75)
- 
-    Setting variables, like all means of customizing Emacs except where
- otherwise stated, affects only the current Emacs session.
- 
- 
- File: emacs,  Node: Edit Options,  Next: Hooks,  Prev: Examining,  Up: Variables
- 
- Editing Variable Values
- -----------------------
- 
-    These two functions make it easy to display all the Emacs option
- variables, and to change some of them if you wish.
- 
- `M-x list-options'
-      Display a buffer listing names, values and documentation of all
-      options.
- 
- `M-x edit-options'
-      Change option values by editing a list of options.
- 
-    `M-x list-options' displays a list of all Emacs option variables, in
- an Emacs buffer named `*List Options*'.  Each option is shown with its
- documentation and its current value.  Here is what a portion of it might
- look like:
- 
-      ;; exec-path:
-      ("." "/usr/local/bin" "/usr/ucb" "/bin" "/usr/bin" "/u2/emacs/etc")
-      *List of directories to search programs to run in subprocesses.
-      Each element is a string (directory name)
-      or nil (try the default directory).
-      ;;
-      ;; fill-column:
-      75
-      *Column beyond which automatic line-wrapping should happen.
-      Automatically becomes buffer-local when set in any fashion.
-      ;;
- 
-    `M-x edit-options' goes one step further and immediately selects the
- `*List Options*' buffer; this buffer uses the major mode Options mode,
- which provides commands that allow you to point at an option and change
- its value:
- 
- `s'
-      Set the variable point is in or near to a new value read using the
-      minibuffer.
- 
- `x'
-      Toggle the variable point is in or near: if the value was `nil',
-      it becomes `t'; otherwise it becomes `nil'.
- 
- `1'
-      Set the variable point is in or near to `t'.
- 
- `0'
-      Set the variable point is in or near to `nil'.
- 
- `n'
- `p'
-      Move to the next or previous variable.
- 
-    Any changes take effect immediately, and last until you exit from
- Emacs.
- 
- 
- File: emacs,  Node: Hooks,  Next: Locals,  Prev: Edit Options,  Up: Variables
- 
- Hooks
- -----
- 
-    A "hook" is a variable where you can store a function or functions
- to be called on a particular occasion by an existing program.  Emacs
- provides a number of hooks for the sake of customization.
- 
-    Most of the hooks in Emacs are "normal hooks".  These variables
- contain lists of functions to be called with no arguments.  The reason
- most hooks are normal hooks is so that you can use them in a uniform
- way.  Every variable in Emacs whose name ends in `-hook' is a normal
- hook.
- 
-    Most major modes run hooks as the last step of initialization.  This
- makes it easy for a user to customize the behavior of the mode, by
- overriding the local variable assignments already made by the mode.  But
- hooks may also be used in other contexts.  For example, the hook
- `suspend-hook' runs just before Emacs suspends itself (*note
- Exiting::.).
- 
-    The recommended way to add a hook function to a normal hook is by
- calling `add-hook'.  You can use any valid Lisp function as the hook
- function.  For example, here's how to set up a hook to turn on Auto
- Fill mode when entering Text mode and other modes based on Text mode:
- 
-      (add-hook 'text-mode-hook 'turn-on-auto-fill)
- 
-    The next example shows how to use a hook to customize the indentation
- of C code.  (People often have strong personal preferences for one
- format compared to another.)  Here the hook function is an anonymous
- lambda expression.
- 
-      (add-hook 'c-mode-hook
-        (function (lambda ()
-                    (setq c-indent-level 4
-                          c-argdecl-indent 0
-                          c-label-offset -4
-                          c-continued-statement-indent 0
-                          c-brace-offset 0
-                          comment-column 40))))
-      
-      (setq c++-mode-hook c-mode-hook)
- 
-    It is best to design your hook functions so that the order in which
- they are executed does not matter.  Any dependence on the order is
- "asking for trouble."  However, the order is predictable: the most
- recently added hook functions are executed first.
- 
- 
- File: emacs,  Node: Locals,  Next: File Variables,  Prev: Hooks,  Up: Variables
- 
- Local Variables
- ---------------
- 
- `M-x make-local-variable RET VAR RET'
-      Make variable VAR have a local value in the current buffer.
- 
- `M-x kill-local-variable RET VAR RET'
-      Make variable VAR use its global value in the current buffer.
- 
- `M-x make-variable-buffer-local RET VAR RET'
-      Mark variable VAR so that setting it will make it local to the
-      buffer that is current at that time.
- 
-    Almost any variable can be made "local" to a specific Emacs buffer.
- This means that its value in that buffer is independent of its value in
- other buffers.  A few variables are always local in every buffer.
- Every other Emacs variable has a "global" value which is in effect in
- all buffers that have not made the variable local.
- 
-    `M-x make-local-variable' reads the name of a variable and makes it
- local to the current buffer.  Further changes in this buffer will not
- affect others, and further changes in the global value will not affect
- this buffer.
- 
-    `M-x make-variable-buffer-local' reads the name of a variable and
- changes the future behavior of the variable so that it will become local
- automatically when it is set.  More precisely, once a variable has been
- marked in this way, the usual ways of setting the variable automatically
- do `make-local-variable' first.  We call such variables "per-buffer"
- variables.
- 
-    Major modes (*note Major Modes::.) always make variables local to the
- buffer before setting the variables.  This is why changing major modes
- in one buffer has no effect on other buffers.  Minor modes also work by
- setting variables--normally, each minor mode has one controlling
- variable which is non-`nil' when the mode is enabled (*note Minor
- Modes::.).  For most minor modes, the controlling variable is per
- buffer.
- 
-    Emacs contains a number of variables that are always per-buffer.
- These include `abbrev-mode', `auto-fill-function', `case-fold-search',
- `comment-column', `ctl-arrow', `fill-column', `fill-prefix',
- `indent-tabs-mode', `left-margin', `mode-line-format', `overwrite-mode',
- `selective-display-ellipses', `selective-display', `tab-width', and
- `truncate-lines'.  Some other variables are always local in every
- buffer, but they are used for internal purposes.
- 
-    A few variables cannot be local to a buffer because they are always
- local to each display instead (*Note Multiple Displays::).  If you try
- to make one of these variables buffer-local, you'll get an error
- message.
- 
-    `M-x kill-local-variable' reads the name of a variable and makes it
- cease to be local to the current buffer.  The global value of the
- variable henceforth is in effect in this buffer.  Setting the major mode
- kills all the local variables of the buffer except for a few variables
- specially marked as "permanent locals".
- 
-    To set the global value of a variable, regardless of whether the
- variable has a local value in the current buffer, you can use the Lisp
- construct `setq-default'.  This construct is used just like `setq', but
- it sets variables' global values instead of their local values (if
- any).  When the current buffer does have a local value, the new global
- value may not be visible until you switch to another buffer.  Here is
- an example:
- 
-      (setq-default fill-column 75)
- 
- `setq-default' is the only way to set the global value of a variable
- that has been marked with `make-variable-buffer-local'.
- 
-    Lisp programs can use `default-value' to look at a variable's
- default value.  This function takes a symbol as argument and returns its
- default value.  The argument is evaluated; usually you must quote it
- explicitly.  For example, here's how to obtain the default value of
- `fill-column':
- 
-      (default-value 'fill-column)
- 
- 
- File: emacs,  Node: File Variables,  Prev: Locals,  Up: Variables
- 
- Local Variables in Files
- ------------------------
- 
-    A file can specify local variable values for use when you edit the
- file with Emacs.  Visiting the file checks for local variables
- specifications; it automatically makes these variables local to the
- buffer, and sets them to the values specified in the file.
- 
-    There are two ways to specify local variable values: in the first
- line, or with a local variables list.  Here's how to specify them in the
- first line:
- 
-      -*- mode: MODENAME; VAR: VALUE; ... -*-
- 
- You can specify any number of variables/value pairs in this way, each
- pair with a colon and semicolon as shown above.  `mode: MODENAME;'
- specifies the major mode; this should come first in the line.  The
- VALUEs are not evaluated; they are used literally.  Here is an example
- that specifies Lisp mode and sets two variables with numeric values:
- 
-      ;; -*-mode: Lisp; fill-column: 75; comment-column: 50; -*-
- 
-    A "local variables list" goes near the end of the file, in the last
- page.  (It is often best to put it on a page by itself.)  The local
- variables list starts with a line containing the string `Local
- Variables:', and ends with a line containing the string `End:'.  In
- between come the variable names and values, one set per line, as
- `VARIABLE: VALUE'.  The VALUEs are not evaluated; they are used
- literally.  If a file has both a local variables list and a `-*-' line,
- Emacs processes *everything* in the `-*-' line first, and *everything*
- in the local variables list afterward.
- 
-    Here is an example of a local variables list:
- 
-      ;;; Local Variables: ***
-      ;;; mode:lisp ***
-      ;;; comment-column:0 ***
-      ;;; comment-start: ";;; "  ***
-      ;;; comment-end:"***" ***
-      ;;; End: ***
- 
-    As you see, each line starts with the prefix `;;; ' and each line
- ends with the suffix ` ***'.  Emacs recognizes these as the prefix and
- suffix based on the first line of the list, by finding them surrounding
- the magic string `Local Variables:'; then it automatically discards
- them from the other lines of the list.
- 
-    The usual reason for using a prefix and/or suffix is to embed the
- local variables list in a comment, so it won't confuse other programs
- that the file is intended as input for.  The example above is for a
- language where comment lines start with `;;; ' and end with `***'; the
- local values for `comment-start' and `comment-end' customize the rest
- of Emacs for this unusual syntax.  Don't use a prefix (or a suffix) if
- you don't need one.
- 
-    Two "variable names" have special meanings in a local variables
- list: a value for the variable `mode' really sets the major mode, and a
- value for the variable `eval' is simply evaluated as an expression and
- the value is ignored.  `mode' and `eval' are not real variables;
- setting variables named `mode' and `eval' in any other context has no
- special meaning.  If `mode' is used to set a major mode, it should be
- the first "variable" in the list.
- 
-    You can use the `mode' "variable" to set minor modes as well as
- major modes; in fact, you can use it more than once, first to set the
- major mode and then to set minor modes which are specific to particular
- buffers.  But most minor modes should not be specified in the file in
- any fashion, because they represent user preferences.  For example, you
- should not try to specify Auto Fill mode with file local variables,
- because whether to use Auto Fill mode for editing a particular kind of
- text is a matter of personal taste, not an aspect of the format of the
- text.
- 
-    The start of the local variables list must be no more than 3000
- characters from the end of the file, and must be in the last page if the
- file is divided into pages.  Otherwise, Emacs will not notice it is
- there.  The purpose of this rule is so that a stray `Local Variables:'
- not in the last page does not confuse Emacs, and so that visiting a
- long file that is all one page and has no local variables list need not
- take the time to search the whole file.
- 
-    You may be tempted to try to turn on Auto Fill mode with a local
- variable list.  That is a mistake.  The choice of Auto Fill mode or not
- is a matter of individual taste, not a matter of the contents of
- particular files.  If you want to use Auto Fill, set up major mode
- hooks with your `.emacs' file to turn it on (when appropriate) for you
- alone (*note Init File::.).  Don't try to use a local variable list
- that would impose your taste on everyone.
- 
-    The variable `enable-local-variables' controls whether to process
- local variables lists, and thus gives you a chance to override them.
- Its default value is `t', which means do process local variables lists.
- If you set the value to `nil', Emacs simply ignores local variables
- lists.  Any other value says to query you about each local variables
- list, showing you the local variables list to consider.
- 
-    The `eval' "variable", and certain actual variables, create a
- special risk; when you visit someone else's file, local variable
- specifications for these could affect your Emacs in arbitrary ways.
- Therefore, the option `enable-local-eval' controls whether Emacs
- processes `eval' variables, as well variables with names that end in
- `-hook', `-hooks', `-function' or `-functions', and certain other
- variables.  The three possibilities for the option's value are `t',
- `nil', and anything else, just as for `enable-local-variables'.  The
- default is `maybe', which is neither `t' nor `nil', so normally Emacs
- does ask for confirmation about file settings for these variables.
- 
-    Use the command `normal-mode' to reset the local variables and major
- mode of a buffer according to the file name and contents, including the
- local variables list if any.  *Note Choosing Modes::.
- 
- 
- File: emacs,  Node: Keyboard Macros,  Next: Key Bindings,  Prev: Variables,  Up: Customization
- 
- Keyboard Macros
- ===============
- 
-    A "keyboard macro" is a command defined by the user to stand for
- another sequence of keys.  For example, if you discover that you are
- about to type `C-n C-d' forty times, you can speed your work by
- defining a keyboard macro to do `C-n C-d' and calling it with a repeat
- count of forty.
- 
- `C-x ('
-      Start defining a keyboard macro (`start-kbd-macro').
- 
- `C-x )'
-      End the definition of a keyboard macro (`end-kbd-macro').
- 
- `C-x e'
-      Execute the most recent keyboard macro (`call-last-kbd-macro').
- 
- `C-u C-x ('
-      Re-execute last keyboard macro, then add more keys to its
-      definition.
- 
- `C-x q'
-      When this point is reached during macro execution, ask for
-      confirmation (`kbd-macro-query').
- 
- `M-x name-last-kbd-macro'
-      Give a command name (for the duration of the session) to the most
-      recently defined keyboard macro.
- 
- `M-x insert-kbd-macro'
-      Insert in the buffer a keyboard macro's definition, as Lisp code.
- 
- `C-x C-k'
-      Edit a previously defined keyboard macro (`edit-kbd-macro').
- 
-    Keyboard macros differ from ordinary Emacs commands in that they are
- written in the Emacs command language rather than in Lisp.  This makes
- it easier for the novice to write them, and makes them more convenient
- as temporary hacks.  However, the Emacs command language is not powerful
- enough as a programming language to be useful for writing anything
- intelligent or general.  For such things, Lisp must be used.
- 
-    You define a keyboard macro while executing the commands which are
- the definition.  Put differently, as you define a keyboard macro, the
- definition is being executed for the first time.  This way, you can see
- what the effects of your commands are, so that you don't have to figure
- them out in your head.  When you are finished, the keyboard macro is
- defined and also has been, in effect, executed once.  You can then do
- the whole thing over again by invoking the macro.
- 
- * Menu:
- 
- * Basic Kbd Macro::  Defining and running keyboard macros.
- * Save Kbd Macro::   Giving keyboard macros names; saving them in files.
- * Kbd Macro Query::  Keyboard macros that do different things each use.
- 
- 
- File: emacs,  Node: Basic Kbd Macro,  Next: Save Kbd Macro,  Up: Keyboard Macros
- 
- Basic Use
- ---------
- 
-    To start defining a keyboard macro, type the `C-x (' command
- (`start-kbd-macro').  From then on, your keys continue to be executed,
- but also become part of the definition of the macro.  `Def' appears in
- the mode line to remind you of what is going on.  When you are
- finished, the `C-x )' command (`end-kbd-macro') terminates the
- definition (without becoming part of it!).  For example,
- 
-      C-x ( M-f foo C-x )
- 
- defines a macro to move forward a word and then insert `foo'.
- 
-    The macro thus defined can be invoked again with the `C-x e' command
- (`call-last-kbd-macro'), which may be given a repeat count as a numeric
- argument to execute the macro many times.  `C-x )' can also be given a
- repeat count as an argument, in which case it repeats the macro that
- many times right after defining it, but defining the macro counts as
- the first repetition (since it is executed as you define it).
- Therefore, giving `C-x )' an argument of 4 executes the macro
- immediately 3 additional times.  An argument of zero to `C-x e' or `C-x
- )' means repeat the macro indefinitely (until it gets an error or you
- type `C-g').
- 
-    If you wish to repeat an operation at regularly spaced places in the
- text, define a macro and include as part of the macro the commands to
- move to the next place you want to use it.  For example, if you want to
- change each line, you should position point at the start of a line, and
- define a macro to change that line and leave point at the start of the
- next line.  Then repeating the macro will operate on successive lines.
- 
-    After you have terminated the definition of a keyboard macro, you
- can add to the end of its definition by typing `C-u C-x ('.  This is
- equivalent to plain `C-x (' followed by retyping the whole definition
- so far.  As a consequence it re-executes the macro as previously
- defined.
- 
-    You can use function keys in a keyboard macro, just like keyboard
- keys.  You can even use mouse events, but be careful about that: when
- the macro replays the mouse event, it uses the original mouse position
- of that event, the position that the mouse had while you were defining
- the macro.  The effect of this may be hard to predict.  (Using the
- current mouse position would be even less predictable.)
- 
-    One thing that doesn't always work well in a keyboard macro is the
- command `C-M-c' (`exit-recursive-edit').  When this command exits a
- recursive edit that started within the macro, it works as you'd expect.
- But if it exits a recursive edit that started before you invoked the
- keyboard macro, it also necessarily exits the keyboard macro as part of
- the process.
- 
-    You can edit a keyboard macro already defined by typing `C-x C-k'
- (`edit-kbd-macro').  Follow that with the keyboard input that you would
- use to invoke the macro--`C-x e' or `M-x NAME' or some other key
- sequence.  This formats the macro definition in a buffer and enters a
- specialized major mode for editing it.  Type `C-h m' once in that
- buffer to display details of how to edit the macro.  When you are
- finished editing, type `C-c C-c'.
- 
- 
- File: emacs,  Node: Save Kbd Macro,  Next: Kbd Macro Query,  Prev: Basic Kbd Macro,  Up: Keyboard Macros
- 
- Naming and Saving Keyboard Macros
- ---------------------------------
- 
-    If you wish to save a keyboard macro for longer than until you
- define the next one, you must give it a name using `M-x
- name-last-kbd-macro'.  This reads a name as an argument using the
- minibuffer and defines that name to execute the macro.  The macro name
- is a Lisp symbol, and defining it in this way makes it a valid command
- name for calling with `M-x' or for binding a key to with
- `global-set-key' (*note Keymaps::.).  If you specify a name that has a
- prior definition other than another keyboard macro, an error message is
- printed and nothing is changed.
- 
-    Once a macro has a command name, you can save its definition in a
- file.  Then it can be used in another editing session.  First, visit
- the file you want to save the definition in.  Then use this command:
- 
-      M-x insert-kbd-macro RET MACRONAME RET
- 
- This inserts some Lisp code that, when executed later, will define the
- same macro with the same definition it has now.  (You need not
- understand Lisp code to do this, because `insert-kbd-macro' writes the
- Lisp code for you.)  Then save the file.  You can load the file later
- with `load-file' (*note Lisp Libraries::.).  If the file you save in is
- your init file `~/.emacs' (*note Init File::.) then the macro will be
- defined each time you run Emacs.
- 
-    If you give `insert-kbd-macro' a numeric argument, it makes
- additional Lisp code to record the keys (if any) that you have bound to
- the keyboard macro, so that the macro will be reassigned the same keys
- when you load the file.
- 
- 
- File: emacs,  Node: Kbd Macro Query,  Prev: Save Kbd Macro,  Up: Keyboard Macros
- 
- Executing Macros with Variations
- --------------------------------
- 
-    Using `C-x q' (`kbd-macro-query'), you can get an effect similar to
- that of `query-replace', where the macro asks you each time around
- whether to make a change.  While defining the macro, type `C-x q' at
- the point where you want the query to occur.  During macro definition,
- the `C-x q' does nothing, but when you run the macro later, `C-x q'
- asks you interactively whether to continue.
- 
-    The valid responses when `C-x q' asks are SPC (or `y'), DEL (or
- `n'), ESC (or `q'), `C-l' and `C-r'.  The answers are the same as in
- `query-replace', though not all of the `query-replace' options are
- meaningful.
- 
-    These responses include SPC to continue, and DEL to skip the
- remainder of this repetition of the macro and start right away with the
- next repetition.  ESC means to skip the remainder of this repetition
- and cancel further repetitions.  `C-l' redraws the screen and asks you
- again for a character to say what to do.
- 
-    `C-r' enters a recursive editing level, in which you can perform
- editing which is not part of the macro.  When you exit the recursive
- edit using `C-M-c', you are asked again how to continue with the
- keyboard macro.  If you type a SPC at this time, the rest of the macro
- definition is executed.  It is up to you to leave point and the text in
- a state such that the rest of the macro will do what you want.
- 
-    `C-u C-x q', which is `C-x q' with a numeric argument, performs a
- completely different function.  It enters a recursive edit reading
- input from the keyboard, both when you type it during the definition of
- the macro, and when it is executed from the macro.  During definition,
- the editing you do inside the recursive edit does not become part of
- the macro.  During macro execution, the recursive edit gives you a
- chance to do some particularized editing on each repetition.  *Note
- Recursive Edit::.
- 
- 
- File: emacs,  Node: Key Bindings,  Next: Keyboard Translations,  Prev: Keyboard Macros,  Up: Customization
- 
- Customizing Key Bindings
- ========================
- 
-    This section describes "key bindings" which map keys to commands,
- and the "keymaps" which record key bindings.  It also explains how to
- customize key bindings.
- 
-    Recall that a command is a Lisp function whose definition provides
- for interactive use.  Like every Lisp function, a command has a function
- name which usually consists of lower case letters and hyphens.
- 
- * Menu:
- 
- * Keymaps::          Generalities.  The global keymap.
- * Prefix Keymaps::   Keymaps for prefix keys.
- * Local Keymaps::    Major and minor modes have their own keymaps.
- * Minibuffer Maps::  The minibuffer uses its own local keymaps.
- * Rebinding::        How to redefine one key's meaning conveniently.
- * Init Rebinding::   Rebinding keys with your init file, `.emacs'.
- * Function Keys::    Rebinding terminal function keys.
- * Named ASCII Chars::Distinguishing TAB from `C-i', and so on.
- * Mouse Buttons::    Rebinding mouse buttons in Emacs.
- * Disabling::        Disabling a command means confirmation is required
-                        before it can be executed.  This is done to protect
-                        beginners from surprises.
- 
- 
- File: emacs,  Node: Keymaps,  Next: Prefix Keymaps,  Up: Key Bindings
- 
- Keymaps
- -------
- 
-    The bindings between key sequences and command functions are recorded
- in data structures called "keymaps".  Emacs has many of these, each
- used on particular occasions.
- 
-    Recall that a "key sequence" ("key", for short) is a sequence of
- "input events" that have a meaning as a unit.  Input events include
- characters, function keys and mouse buttons--all the inputs that you
- can send to the computer with your terminal.  A key sequence gets its
- meaning from its "binding", which says what command it runs.  The
- function of keymaps is to record these bindings.
- 
-    The "global" keymap is the most important keymap because it is
- always in effect.  The global keymap defines keys for Fundamental mode;
- most of these definitions are common to most or all major modes.  Each
- major or minor mode can have its own keymap which overrides the global
- definitions of some keys.
- 
-    For example, a self-inserting character such as `g' is
- self-inserting because the global keymap binds it to the command
- `self-insert-command'.  The standard Emacs editing characters such as
- `C-a' also get their standard meanings from the global keymap.
- Commands to rebind keys, such as `M-x global-set-key', actually work by
- storing the new binding in the proper place in the global map.  *Note
- Rebinding::.
- 
-    Meta characters work differently; Emacs translates each Meta
- character into a pair of characters starting with ESC.  When you type
- the character `M-a' in a key sequence, Emacs replaces it with `ESC a'.
- A meta key comes in as a single input event, but becomes two events for
- purposes of key bindings.  The reason for this is historical, and we
- might change it someday.
- 
-    Most modern keyboards have function keys as well as character keys.
- Function keys send input events just as character keys do, and keymaps
- can have bindings for them.
- 
-    On many terminals, typing a function key actually sends the computer
- a sequence of characters; the precise details of the sequence depends on
- which function key and on the model of terminal you are using.  (Often
- the sequence starts with `ESC ['.)  If Emacs understands your terminal
- type properly, it recognizes the character sequences forming function
- keys wherever they occur in a key sequence (not just at the beginning).
- Thus, for most purposes, you can pretend the function keys reach Emacs
- directly and ignore their encoding as character sequences.
- 
-    Mouse buttons also produce input events.  These events come with
- other data--the window and position where you pressed or released the
- button, and a time stamp.  But only the choice of button matters for key
- bindings; the other data matters only if a command looks at it.
- (Commands designed for mouse invocation usually do look at the other
- data.)
- 
-    A keymap records definitions for single events.  Interpreting a key
- sequence of multiple events involves a chain of keymaps.  The first
- keymap gives a definition for the first event; this definition is
- another keymap, which is used to look up the second event in the
- sequence, and so on.
- 
-    Key sequences can mix function keys and characters.  For example,
- `C-x SELECT' makes sense.  If you make SELECT a prefix key, then
- `SELECT C-n' makes sense.  You can even mix mouse events with keyboard
- events, but we recommend against it, because such sequences are
- inconvenient to type in.
- 
- 
- File: emacs,  Node: Prefix Keymaps,  Next: Local Keymaps,  Prev: Keymaps,  Up: Key Bindings
- 
- Prefix Keymaps
- --------------
- 
-    A prefix key such as `C-x' or ESC has its own keymap, which holds
- the definition for the event that immediately follows that prefix.
- 
-    The definition of a prefix key is usually the keymap to use for
- looking up the following event.  The definition can also be a Lisp
- symbol whose function definition is the following keymap; the effect is
- the same, but it provides a command name for the prefix key that can be
- used as a description of what the prefix key is for.  Thus, the binding
- of `C-x' is the symbol `Ctl-X-Prefix', whose function definition is the
- keymap for `C-x' commands.  The definitions of `C-c', `C-x', `C-h' and
- ESC as prefix keys appear in the global map, so these prefix keys are
- always available.
- 
-    Some prefix keymaps are stored in variables with names:
- 
-    * `ctl-x-map' is the variable name for the map used for characters
-      that follow `C-x'.
- 
-    * `help-map' is for characters that follow `C-h'.
- 
-    * `esc-map' is for characters that follow ESC.  Thus, all Meta
-      characters are actually defined by this map.
- 
-    * `ctl-x-4-map' is for characters that follow `C-x 4'.
- 
-    * `mode-specific-map' is for characters that follow `C-c'.
- 
- 
- File: emacs,  Node: Local Keymaps,  Next: Minibuffer Maps,  Prev: Prefix Keymaps,  Up: Key Bindings
- 
- Local Keymaps
- -------------
- 
-    So far we have explained the ins and outs of the global map.  Major
- modes customize Emacs by providing their own key bindings in "local
- keymaps".  For example, C mode overrides TAB to make it indent the
- current line for C code.  Portions of text in the buffer can specify
- their own keymaps to substitute for the keymap of the buffer's major
- mode.
- 
-    Minor modes can also have local keymaps.  Whenever a minor mode is
- in effect, the definitions in its keymap override both the major mode's
- local keymap and the global keymap.
- 
-    The local keymaps for Lisp mode, C mode, and several other major
- modes always exist even when not in use.  These are kept in variables
- named `lisp-mode-map', `c-mode-map', and so on.  For major modes less
- often used, the local keymap is normally constructed only when the mode
- is used for the first time in a session.  This is to save space.  If
- you wish to change one of these keymaps, you must use the major mode's
- "mode hook"--see below.
- 
-    All minor mode keymaps are created in advance.  There is no way to
- defer their creation until the first time the minor mode is enabled.
- 
-    A local keymap can locally redefine a key as a prefix key by defining
- it as a prefix keymap.  If the key is also defined globally as a prefix,
- then its local and global definitions (both keymaps) effectively
- combine: both of them are used to look up the event that follows the
- prefix key.  Thus, if the mode's local keymap defines `C-c' as another
- keymap, and that keymap defines `C-z' as a command, this provides a
- local meaning for `C-c C-z'.  This does not affect other sequences that
- start with `C-c'; if those sequences don't have their own local
- bindings, their global bindings remain in effect.
- 
-    Another way to think of this is that Emacs handles a multi-event key
- sequence by looking in several keymaps, one by one, for a binding of the
- whole key sequence.  First it checks the minor mode keymaps for minor
- modes that are enabled, then it checks the major mode's keymap, and then
- it checks the global keymap.  This is not precisely how key lookup
- works, but it's good enough for understanding ordinary circumstances.
- 
-    To change the local bindings of a major mode, you must change the
- mode's local keymap.  Normally you must wait until the first time the
- mode is used, because most major modes don't create their keymaps until
- then.  If you want to specify something in your `~/.emacs' file to
- change a major mode's bindings, you must use the mode's mode hook to
- delay the change until the mode is first used.
- 
-    For example, the command `texinfo-mode' to select Texinfo mode runs
- the hook `texinfo-mode-hook'.  Here's how you can use the hook to add
- local bindings (not very useful, we admit) for `C-c n' and `C-c p' in
- Texinfo mode:
- 
-      (add-hook 'texinfo-mode-hook
-                '(lambda ()
-                   (define-key texinfo-mode-map
-                               "\C-cp"
-                               'backward-paragraph)
-                   (define-key texinfo-mode-map
-                               "\C-cn"
-                               'forward-paragraph)
-                   ))
- 
-    *Note Hooks::.
- 
- 
- File: emacs,  Node: Minibuffer Maps,  Next: Rebinding,  Prev: Local Keymaps,  Up: Key Bindings
- 
- Minibuffer Keymaps
- ------------------
- 
-    The minibuffer has its own set of local keymaps; they contain various
- completion and exit commands.
- 
-    * `minibuffer-local-map' is used for ordinary input (no completion).
- 
-    * `minibuffer-local-ns-map' is similar, except that SPC exits just
-      like RET.  This is used mainly for Mocklisp compatibility.
- 
-    * `minibuffer-local-completion-map' is for permissive completion.
- 
-    * `minibuffer-local-must-match-map' is for strict completion and for
-      cautious completion.
- 
- 
- File: emacs,  Node: Rebinding,  Next: Init Rebinding,  Prev: Minibuffer Maps,  Up: Key Bindings
- 
- Changing Key Bindings Interactively
- -----------------------------------
- 
-    The way to redefine an Emacs key is to change its entry in a keymap.
- You can change the global keymap, in which case the change is effective
- in all major modes (except those that have their own overriding local
- definitions for the same key).  Or you can change the current buffer's
- local map, which affects all buffers using the same major mode.
- 
- `M-x global-set-key RET KEY CMD RET'
-      Define KEY globally to run CMD.
- 
- `M-x local-set-key RET KEY CMD RET'
-      Define KEY locally (in the major mode now in effect) to run CMD.
- 
- `M-x global-unset-key RET KEY'
-      Make KEY undefined in the global map.
- 
- `M-x local-unset-key RET KEY'
-      Make KEY undefined locally (in the major mode now in effect).
- 
-    For example, suppose you like to execute commands in a subshell
- within an Emacs buffer, instead of suspending Emacs and executing
- commands in your login shell.  Normally, `C-z' is bound to the function
- `suspend-emacs' (when not using the X Window System), but you can
- change `C-z' to invoke an interactive subshell within Emacs, by binding
- it to `shell' as follows:
- 
-      M-x global-set-key RET C-z shell RET
- 
- `global-set-key' reads the command name after the key.   After you
- press the key, a message like this appears so that you can confirm that
- you are binding the key you want:
- 
-      Set key C-z to command:
- 
-    You can redefine function keys and mouse events in the same way; just
- type the function key or click the mouse when it's time to specify the
- key to rebind.
- 
-    You can rebind a key that contains more than one event in the same
- way.  Emacs keeps reading the key to rebind until it is a complete key
- (that is, not a prefix key).  Thus, if you type `C-f' for KEY, that's
- the end; the minibuffer is entered immediately to read CMD.  But if you
- type `C-x', another character is read; if that is `4', another
- character is read, and so on.  For example,
- 
-      M-x global-set-key RET C-x 4 $ spell-other-window RET
- 
- redefines `C-x 4 $' to run the (fictitious) command
- `spell-other-window'.
- 
-    The two-character keys consisting of `C-c' followed by a letter are
- reserved for user customizations.  Lisp programs are not supposed to
- define these keys, so the bindings you make for them will be available
- in all major modes and will never get in the way of anything.
- 
-    You can remove the global definition of a key with
- `global-unset-key'.  This makes the key "undefined"; if you type it,
- Emacs will just beep.  Similarly, `local-unset-key' makes a key
- undefined in the current major mode keymap, which makes the global
- definition (or lack of one) come back into effect in that major mode.
- 
-    If you have redefined (or undefined) a key and you subsequently wish
- to retract the change, undefining the key will not do the job--you need
- to redefine the key with its standard definition.  To find the name of
- the standard definition of a key, go to a Fundamental mode buffer and
- use `C-h c'.  The documentation of keys in this manual also lists their
- command names.
- 
-    If you want to prevent yourself from invoking a command by mistake,
- it is better to disable the command than to undefine the key.  A
- disabled command is less work to invoke when you really want to.  *Note
- Disabling::.
- 
- 
- File: emacs,  Node: Init Rebinding,  Next: Function Keys,  Prev: Rebinding,  Up: Key Bindings
- 
- Rebinding Keys in Your Init File
- --------------------------------
- 
-    If you have a set of key bindings that you like to use all the time,
- you can specify them in your `.emacs' file by using their Lisp syntax.
- 
-    The simplest method for doing this works for ASCII characters and
- Meta-modified ASCII characters only.  This method uses a string to
- represent the key sequence you want to rebind.  For example, here's how
- to bind `C-z' to `shell':
- 
-      (global-set-key "\C-z" 'shell)
- 
- This example uses a string constant containing one character, `C-z'.
- The single-quote before the command name, `shell', marks it as a
- constant symbol rather than a variable.  If you omit the quote, Emacs
- would try to evaluate `shell' immediately as a variable.  This probably
- causes an error; it certainly isn't what you want.
- 
-    Here is another example that binds a key sequence two characters
- long:
- 
-      (global-set-key "\C-xl" 'make-symbolic-link)
- 
-    When the key sequence includes function keys or mouse button events,
- or non-ASCII characters such as `C-=' or `H-a', you must use the more
- general method of rebinding, which uses a vector to specify the key
- sequence.
- 
-    The way to write a vector in Emacs Lisp is with square brackets
- around the vector elements.  Use spaces to separate the elements.  If an
- element is a symbol, simply write the symbol's name--no other
- delimiters or punctuation are needed.  If a vector element is a
- character, write it as a Lisp character constant: `?' followed by the
- character as it would appear in a string.
- 
-    Here are examples of using vectors to rebind `C-=' (a control
- character outside of ASCII), `H-a' (a Hyper character; ASCII doesn't
- have Hyper at all); f7 (a function key), and `C-Mouse-1' (a
- keyboard-modified mouse button):
- 
-      (global-set-key [?\C-=] 'make-symbolic-link)
-      (global-set-key [?\H-a] 'make-symbolic-link)
-      (global-set-key [f7] 'make-symbolic-link)
-      (global-set-key [C-mouse-1] 'make-symbolic-link)
- 
-    You can use a vector for the simple cases too.  Here's how to rewrite
- the first two examples, above, to use vectors:
- 
-      (global-set-key [?\C-z] 'shell)
-      
-      (global-set-key [?\C-x ?l] 'make-symbolic-link)
- 
- 
- File: emacs,  Node: Function Keys,  Next: Named ASCII Chars,  Prev: Init Rebinding,  Up: Key Bindings
- 
- Rebinding Function Keys
- -----------------------
- 
-    Key sequences can contain function keys as well as ordinary
- characters.  Just as Lisp characters (actually integers) represent
- keyboard characters, Lisp symbols represent function keys.  If the
- function key has a word as its label, then that word is also the name of
- the corresponding Lisp symbol.  Here are the conventional Lisp names for
- common function keys:
- 
- `left', `up', `right', `down'
-      Cursor arrow keys.
- 
- `begin', `end', `home', `next', `prior'
-      Other cursor repositioning keys.
- 
- `select', `print', `execute', `backtab'
- `insert', `undo', `redo', `clearline'
- `insertline', `deleteline', `insertchar', `deletechar',
-      Miscellaneous function keys.
- 
- `f1', `f2', ... `f35'
-      Numbered function keys (across the top of the keyboard).
- 
- `kp-add', `kp-subtract', `kp-multiply', `kp-divide'
- `kp-backtab', `kp-space', `kp-tab', `kp-enter'
- `kp-separator', `kp-decimal', `kp-equal'
-      Keypad keys (to the right of the regular keyboard), with names or
-      punctuation.
- 
- `kp-0', `kp-1', ... `kp-9'
-      Keypad keys with digits.
- 
- `kp-f1', `kp-f2', `kp-f3', `kp-f4'
-      Keypad PF keys.
- 
-    These names are conventional, but some systems (especially when using
- X windows) may use different names.  To make certain what symbol is used
- for a given function key on your terminal, type `C-h c' followed by
- that key.
- 
-    A key sequence which contains function key symbols (or anything but
- ASCII characters) must be a vector rather than a string.  The vector
- syntax uses spaces between the elements, and square brackets around the
- whole vector.  Thus, to bind function key `f1' to the command `rmail',
- write the following:
- 
-      (global-set-key [f1] 'rmail)
- 
- To bind the right-arrow key to the command `forward-char', you can use
- this expression:
- 
-      (global-set-key [right] 'forward-char)
- 
- This uses the Lisp syntax for a vector containing the symbol `right'.
- (This binding is present in Emacs by default.)
- 
-    *Note Init Rebinding::, for more information about using vectors for
- rebinding.
- 
-    You can mix function keys and characters in a key sequence.  This
- example binds `C-x NEXT' to the command `forward-page'.
- 
-      (global-set-key [?\C-x next] 'forward-page)
- 
- where `?\C-x' is the Lisp character constant for the character `C-x'.
- The vector element `next' is a symbol and therefore does not take a
- question mark.
- 
-    You can use the modifier keys CTRL, META, HYPER, SUPER, ALT and
- SHIFT with function keys.  To represent these modifiers, add the
- strings `C-', `M-', `H-', `s-', `A-' and `S-' at the front of the
- symbol name.  Thus, here is how to make `Hyper-Meta-RIGHT' move forward
- a word:
- 
-      (global-set-key [H-M-right] 'forward-word)
- 
--- 0 ----
Index: emacs/info/emacs-19
diff -c emacs/info/emacs-19:1.1.1.2 emacs/info/emacs-19:removed
*** emacs/info/emacs-19:1.1.1.2	Mon Jul 22 01:52:12 1996
--- emacs/info/emacs-19	Fri Aug  2 20:08:59 1996
***************
*** 1,938 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Named ASCII Chars,  Next: Mouse Buttons,  Prev: Function Keys,  Up: Key Bindings
- 
- Named ASCII Control Characters
- ------------------------------
- 
-    TAB, RET, BS, LFD, ESC and DEL started out as names for certain
- ASCII control characters, used so often that they have special keys of
- their own.  Later, users found it convenient to distinguish in Emacs
- between these keys and the "same" control characters typed with the
- CTRL key.
- 
-    Emacs 19 distinguishes these two kinds of input, when used with the X
- Window System.  It treats the "special" keys as function keys named
- `tab', `return', `backspace', `linefeed', `escape', and `delete'.
- These function keys translate automatically into the corresponding
- ASCII characters *if* they have no bindings of their own.  As a result,
- neither users nor Lisp programs need to pay attention to the
- distinction unless they care to.
- 
-    If you do not want to distinguish between (for example) TAB and
- `C-i', make just one binding, for the ASCII character TAB (octal code
- 011).  If you do want to distinguish, make one binding for this ASCII
- character, and another for the "function key" `tab'.
- 
-    With an ordinary ASCII terminal, there is no way to distinguish
- between TAB and `C-i' (and likewise for other such pairs), because the
- terminal sends the same character in both cases.
- 
- 
- File: emacs,  Node: Mouse Buttons,  Next: Disabling,  Prev: Named ASCII Chars,  Up: Key Bindings
- 
- Rebinding Mouse Buttons
- -----------------------
- 
-    Emacs uses Lisp symbols to designate mouse buttons, too.  The
- ordinary mouse events in Emacs are "click" events; these happen when you
- press a button and release it without moving the mouse.  You can also
- get "drag" events, when you move the mouse while holding the button
- down.  Drag events happen when you finally let go of the button.
- 
-    The symbols for basic click events are `mouse-1' for the leftmost
- button, `mouse-2' for the next, and so on.  Here is how you can
- redefine the second mouse button to split the current window:
- 
-      (global-set-key [mouse-2] 'split-window-vertically)
- 
-    The symbols for drag events are similar, but have the prefix `drag-'
- before the word `mouse'.  For example, dragging the first button
- generates a `drag-mouse-1' event.
- 
-    You can also define bindings for events that occur when a mouse
- button is pressed down.  These events start with `down-' instead of
- `drag-'.  Such events are generated only if they have key bindings.
- When you get a button-down event, a corresponding click or drag event
- will always follow.
- 
-    If you wish, you can distinguish single, double, and triple clicks.
- A double click means clicking a mouse button twice in approximately the
- same place.  The first click generates an ordinary click event.  The
- second click, if it comes soon enough, generates a double-click event
- instead.  The event type for a double click event starts with
- `double-': for example, `double-mouse-3'.
- 
-    This means that you can give a special meaning to the second click at
- the same place, but it must act on the assumption that the ordinary
- single click definition has run when the first click was received.
- 
-    This constrains what you can do with double clicks, but user
- interface designers say that this constraint ought to be followed in
- any case.  A double click should do something similar to the single
- click, only "more so".  The command for the double-click event should
- perform the extra work for the double click.
- 
-    If a double-click event has no binding, it changes to the
- corresponding single-click event.  Thus, if you don't define a
- particular double click specially, it executes the single-click command
- twice.
- 
-    Emacs also supports triple-click events whose names start with
- `triple-'.  Emacs does not distinguish quadruple clicks as event types;
- clicks beyond the third generate additional triple-click events.
- However, the full number of clicks is recorded in the event list, so you
- can distinguish if you really want to.  We don't recommend distinct
- meanings for more than three clicks, but sometimes it is useful for
- subsequent clicks to cycle through the same set of three meanings, so
- that four clicks are equivalent to one click, five are equivalent to
- two, and six are equivalent to three.
- 
-    Emacs also records multiple presses in drag and button-down events.
- For example, when you press a button twice, then move the mouse while
- holding the button, Emacs gets a `double-drag-' event.  And at the
- moment when you press it down for the second time, Emacs gets a
- `double-down-' event (which is ignored, like all button-down events, if
- it has no binding).
- 
-    The variable `double-click-time' specifies how long may elapse
- between clicks that are recognized as a pair.  Its value is measured in
- milliseconds.  If the value is `nil', double clicks are not detected at
- all.  If the value is `t', then there is no time limit.
- 
-    The symbols for mouse events also indicate the status of the modifier
- keys, with the usual prefixes `C-', `M-', `H-', `s-', `A-' and `S-'.
- These always precede `double-' or `triple-', which always precede
- `drag-' or `down-'.
- 
-    A frame includes areas that don't show text from the buffer, such as
- the mode line and the scroll bar.  You can tell whether a mouse button
- comes from a special area of the screen by means of dummy "prefix
- keys."  For example, if you click the mouse in the mode line, you get
- the prefix key `mode-line' before the ordinary mouse-button symbol.
- Thus, here is how to define the command for clicking the first button in
- a mode line to run `scroll-up':
- 
-      (global-set-key [mode-line mouse-1] 'scroll-up)
- 
-    Here is the complete list of these dummy prefix keys and their
- meanings:
- 
- `mode-line'
-      The mouse was in the mode line of a window.
- 
- `vertical-line'
-      The mouse was in the vertical line separating side-by-side
-      windows.  (If you use scroll bars, they appear in place of these
-      vertical lines.)
- 
- `vertical-scroll-bar'
-      The mouse was in a vertical scroll bar.  (This is the only kind of
-      scroll bar Emacs currently supports.)
- 
-    You can put more than one mouse button in a key sequence, but it
- isn't usual to do so.
- 
- 
- File: emacs,  Node: Disabling,  Prev: Mouse Buttons,  Up: Key Bindings
- 
- Disabling Commands
- ------------------
- 
-    Disabling a command marks the command as requiring confirmation
- before it can be executed.  The purpose of disabling a command is to
- prevent beginning users from executing it by accident and being
- confused.
- 
-    An attempt to invoke a disabled command interactively in Emacs
- displays a window containing the command's name, its documentation, and
- some instructions on what to do immediately; then Emacs asks for input
- saying whether to execute the command as requested, enable it and
- execute it, or cancel.  If you decide to enable the command, you are
- asked whether to do this permanently or just for the current session.
- Enabling permanently works by automatically editing your `.emacs' file.
- 
-    The direct mechanism for disabling a command is to put a non-`nil'
- `disabled' property on the Lisp symbol for the command.  Here is the
- Lisp program to do this:
- 
-      (put 'delete-region 'disabled t)
- 
-    If the value of the `disabled' property is a string, that string is
- included in the message printed when the command is used:
- 
-      (put 'delete-region 'disabled
-           "It's better to use `kill-region' instead.\n")
- 
-    You can make a command disabled either by editing the `.emacs' file
- directly or with the command `M-x disable-command', which edits the
- `.emacs' file for you.  Likewise, `M-x enable-command' edits `.emacs'
- to enable a command permanently.  *Note Init File::.
- 
-    Whether a command is disabled is independent of what key is used to
- invoke it; disabling also applies if the command is invoked using
- `M-x'.  Disabling a command has no effect on calling it as a function
- from Lisp programs.
- 
- 
- File: emacs,  Node: Keyboard Translations,  Next: Syntax,  Prev: Key Bindings,  Up: Customization
- 
- Keyboard Translations
- =====================
- 
-    Some keyboards do not make it convenient to send all the special
- characters that Emacs uses.  The most common problem case is the DEL
- character.  Some keyboards provide no convenient way to type this very
- important character--usually because they were designed to expect the
- character `C-h' to be used for deletion.  On these keyboard, if you
- press the key normally used for deletion, Emacs handles the `C-h' as a
- prefix character and offers you a list of help options, which is not
- what you want.
- 
-    You can work around this problem within Emacs by setting up keyboard
- translations to turn `C-h' into DEL and DEL into `C-h', as follows:
- 
-      ;; Translate `C-h' to DEL.
-      (keyboard-translate ?\C-h ?\C-?)
-      
-      ;; Translate DEL to `C-h'.
-      (keyboard-translate ?\C-? ?\C-h)
- 
-    Keyboard translations are not the same as key bindings in keymaps
- (*note Keymaps::.).  Emacs contains numerous keymaps that apply in
- different situations, but there is only one set of keyboard
- translations, and it applies to every character that Emacs reads from
- the terminal.  Keyboard translations take place at the lowest level of
- input processing; the keys that are looked up in keymaps contain the
- characters that result from keyboard translation.
- 
-    Under X, the keyboard key named DELETE is a function key and is
- distinct from the ASCII character named DEL.  *Note Named ASCII
- Chars::.  Keyboard translations affect only ASCII character input, not
- function keys; thus, the above example used under X does not affect the
- DELETE key.  However, the translation above isn't necessary under X,
- because Emacs can also distinguish between the BACKSPACE key and `C-h';
- and it normally treats BACKSPACE as DEL.
- 
-    For full information about how to use keyboard translations, see
- *Note Translating Input: (elisp)Translating Input.
- 
- 
- File: emacs,  Node: Syntax,  Next: Init File,  Prev: Keyboard Translations,  Up: Customization
- 
- The Syntax Table
- ================
- 
-    All the Emacs commands which parse words or balance parentheses are
- controlled by the "syntax table".  The syntax table says which
- characters are opening delimiters, which are parts of words, which are
- string quotes, and so on.  Each major mode has its own syntax table
- (though sometimes related major modes use the same one) which it
- installs in each buffer that uses that major mode.  The syntax table
- installed in the current buffer is the one that all commands use, so we
- call it "the" syntax table.  A syntax table is a Lisp object, a vector
- of length 256 whose elements are numbers.
- 
-    To display a description of the contents of the current syntax table,
- type `C-h s' (`describe-syntax').  The description of each character
- includes both the string you would have to give to
- `modify-syntax-entry' to set up that character's current syntax, and
- some English to explain that string if necessary.
- 
-    For full information on the syntax table, see *Note Syntax Tables:
- (elisp)Syntax Tables.
- 
- 
- File: emacs,  Node: Init File,  Prev: Syntax,  Up: Customization
- 
- The Init File, `~/.emacs'
- =========================
- 
-    When Emacs is started, it normally loads a Lisp program from the file
- `.emacs' in your home directory.  We call this file your "init file"
- because it specifies how to initialize Emacs for you.  You can use the
- command line switches `-q' and `-u' to tell Emacs whether to load an
- init file, and which one (*note Entering Emacs::.).
- 
-    There can also be a "default init file", which is the library named
- `default.el', found via the standard search path for libraries.  The
- Emacs distribution contains no such library; your site may create one
- for local customizations.  If this library exists, it is loaded
- whenever you start Emacs (except when you specify `-q').  But your init
- file, if any, is loaded first; if it sets `inhibit-default-init'
- non-`nil', then `default' is not loaded.
- 
-    Your site may also have a "site startup file"; this is named
- `site-start.el', if it exists.  Emacs loads this library before it
- loads your init file.  To inhibit loading of this library, use the
- option `-no-site-file'.
- 
-    If you have a large amount of code in your `.emacs' file, you should
- move it into another file such as `~/SOMETHING.el', byte-compile it,
- and make your `.emacs' file load it with `(load "~/SOMETHING")'.  *Note
- Byte Compilation: (elisp)Byte Compilation, for more information about
- compiling Emacs Lisp programs.
- 
- * Menu:
- 
- * Init Syntax::	     Syntax of constants in Emacs Lisp.
- * Init Examples::    How to do some things with an init file.
- * Terminal Init::    Each terminal type can have an init file.
- * Find Init::	     How Emacs finds the init file.
- 
- 
- File: emacs,  Node: Init Syntax,  Next: Init Examples,  Up: Init File
- 
- Init File Syntax
- ----------------
- 
-    The `.emacs' file contains one or more Lisp function call
- expressions.  Each of these consists of a function name followed by
- arguments, all surrounded by parentheses.  For example, `(setq
- fill-column 60)' calls the function `setq' to set the variable
- `fill-column' (*note Filling::.) to 60.
- 
-    The second argument to `setq' is an expression for the new value of
- the variable.  This can be a constant, a variable, or a function call
- expression.  In `.emacs', constants are used most of the time.  They
- can be:
- 
- Numbers:
-      Numbers are written in decimal, with an optional initial minus
-      sign.
- 
- Strings:
-      Lisp string syntax is the same as C string syntax with a few extra
-      features.  Use a double-quote character to begin and end a string
-      constant.
- 
-      In a string, you can include newlines and special characters
-      literally.  But often it is cleaner to use backslash sequences for
-      them: `\n' for newline, `\b' for backspace, `\r' for carriage
-      return, `\t' for tab, `\f' for formfeed (control-L), `\e' for
-      escape, `\\' for a backslash, `\"' for a double-quote, or `\OOO'
-      for the character whose octal code is OOO.  Backslash and
-      double-quote are the only characters for which backslash sequences
-      are mandatory.
- 
-      `\C-' can be used as a prefix for a control character, as in
-      `\C-s' for ASCII control-S, and `\M-' can be used as a prefix for
-      a Meta character, as in `\M-a' for `Meta-A' or `\M-\C-a' for
-      `Control-Meta-A'.
- 
- Characters:
-      Lisp character constant syntax consists of a `?' followed by
-      either a character or an escape sequence starting with `\'.
-      Examples: `?x', `?\n', `?\"', `?\)'.  Note that strings and
-      characters are not interchangeable in Lisp; some contexts require
-      one and some contexts require the other.
- 
- True:
-      `t' stands for `true'.
- 
- False:
-      `nil' stands for `false'.
- 
- Other Lisp objects:
-      Write a single-quote (') followed by the Lisp object you want.
- 
- 
- File: emacs,  Node: Init Examples,  Next: Terminal Init,  Prev: Init Syntax,  Up: Init File
- 
- Init File Examples
- ------------------
- 
-    Here are some examples of doing certain commonly desired things with
- Lisp expressions:
- 
-    * Make TAB in C mode just insert a tab if point is in the middle of a
-      line.
- 
-           (setq c-tab-always-indent nil)
- 
-      Here we have a variable whose value is normally `t' for `true' and
-      the alternative is `nil' for `false'.
- 
-    * Make searches case sensitive by default (in all buffers that do not
-      override this).
- 
-           (setq-default case-fold-search nil)
- 
-      This sets the default value, which is effective in all buffers
-      that do not have local values for the variable.  Setting
-      `case-fold-search' with `setq' affects only the current buffer's
-      local value, which is not what you probably want to do in an init
-      file.
- 
-    * Specify your own email address, if Emacs can't figure it out
-      correctly.
- 
-           (setq user-mail-address "coon@yoyodyne.com")
- 
-      Various Emacs packages that need your own email address use the
-      value of `user-mail-address'.
- 
-    * Make Text mode the default mode for new buffers.
- 
-           (setq default-major-mode 'text-mode)
- 
-      Note that `text-mode' is used because it is the command for
-      entering Text mode.  The single-quote before it makes the symbol a
-      constant; otherwise, `text-mode' would be treated as a variable
-      name.
- 
-    * Turn on Auto Fill mode automatically in Text mode and related
-      modes.
- 
-           (add-hook 'text-mode-hook
-             '(lambda () (auto-fill-mode 1)))
- 
-      This shows how to add a hook function to a normal hook variable
-      (*note Hooks::.).  The function we supply is a list starting with
-      `lambda', with a single-quote in front of it to make it a list
-      constant rather than an expression.
- 
-      It's beyond the scope of this manual to explain Lisp functions,
-      but for this example it is enough to know that the effect is to
-      execute `(auto-fill-mode 1)' when Text mode is entered.  You can
-      replace that with any other expression that you like, or with
-      several expressions in a row.
- 
-      Emacs comes with a function named `turn-on-auto-fill' whose
-      definition is `(lambda () (auto-fill-mode 1))'.  Thus, a simpler
-      way to write the above example is as follows:
- 
-           (add-hook 'text-mode-hook 'turn-on-auto-fill)
- 
-    * Load the installed Lisp library named `foo' (actually a file
-      `foo.elc' or `foo.el' in a standard Emacs directory).
- 
-           (load "foo")
- 
-      When the argument to `load' is a relative file name, not starting
-      with `/' or `~', `load' searches the directories in `load-path'
-      (*note Lisp Libraries::.).
- 
-    * Load the compiled Lisp file `foo.elc' from your home directory.
- 
-           (load "~/foo.elc")
- 
-      Here an absolute file name is used, so no searching is done.
- 
-    * Rebind the key `C-x l' to run the function `make-symbolic-link'.
- 
-           (global-set-key "\C-xl" 'make-symbolic-link)
- 
-      or
- 
-           (define-key global-map "\C-xl" 'make-symbolic-link)
- 
-      Note once again the single-quote used to refer to the symbol
-      `make-symbolic-link' instead of its value as a variable.
- 
-    * Do the same thing for C mode only.
- 
-           (define-key c-mode-map "\C-xl" 'make-symbolic-link)
- 
-    * Redefine all keys which now run `next-line' in Fundamental mode so
-      that they run `forward-line' instead.
- 
-           (substitute-key-definition 'next-line 'forward-line
-                                      global-map)
- 
-    * Make `C-x C-v' undefined.
- 
-           (global-unset-key "\C-x\C-v")
- 
-      One reason to undefine a key is so that you can make it a prefix.
-      Simply defining `C-x C-v ANYTHING' will make `C-x C-v' a prefix,
-      but `C-x C-v' must first be freed of its usual non-prefix
-      definition.
- 
-    * Make `$' have the syntax of punctuation in Text mode.  Note the
-      use of a character constant for `$'.
- 
-           (modify-syntax-entry ?\$ "." text-mode-syntax-table)
- 
-    * Enable the use of the command `eval-expression' without
-      confirmation.
- 
-           (put 'eval-expression 'disabled nil)
- 
- 
- File: emacs,  Node: Terminal Init,  Next: Find Init,  Prev: Init Examples,  Up: Init File
- 
- Terminal-specific Initialization
- --------------------------------
- 
-    Each terminal type can have a Lisp library to be loaded into Emacs
- when it is run on that type of terminal.  For a terminal type named
- TERMTYPE, the library is called `term/TERMTYPE' and it is found by
- searching the directories `load-path' as usual and trying the suffixes
- `.elc' and `.el'.  Normally it appears in the subdirectory `term' of
- the directory where most Emacs libraries are kept.
- 
-    The usual purpose of the terminal-specific library is to map the
- escape sequences used by the terminal's function keys onto more
- meaningful names, using `function-key-map'.  See the file
- `term/lk201.el' for an example of how this is done.  Many function keys
- are mapped automatically according to the information in the Termcap
- data base; the terminal-specific library needs to map only the function
- keys that Termcap does not specify.
- 
-    When the terminal type contains a hyphen, only the part of the name
- before the first hyphen is significant in choosing the library name.
- Thus, terminal types `aaa-48' and `aaa-30-rv' both use the library
- `term/aaa'.  The code in the library can use `(getenv "TERM")' to find
- the full terminal type name.
- 
-    The library's name is constructed by concatenating the value of the
- variable `term-file-prefix' and the terminal type.  Your `.emacs' file
- can prevent the loading of the terminal-specific library by setting
- `term-file-prefix' to `nil'.
- 
-    Emacs runs the hook `term-setup-hook' at the end of initialization,
- after both your `.emacs' file and any terminal-specific library have
- been read in.  Add hook functions to this hook if you wish to override
- part of any of the terminal-specific libraries and to define
- initializations for terminals that do not have a library.  *Note
- Hooks::.
- 
- 
- File: emacs,  Node: Find Init,  Prev: Terminal Init,  Up: Init File
- 
- How Emacs Finds Your Init File
- ------------------------------
- 
-    Normally Emacs uses the environment variable `HOME' to find
- `.emacs'; that's what `~' means in a file name.  But if you have done
- `su', Emacs tries to find your own `.emacs', not that of the user you
- are currently pretending to be.  The idea is that you should get your
- own editor customizations even if you are running as the super user.
- 
-    More precisely, Emacs first determines which user's init file to use.
- It gets the user name from the environment variables `LOGNAME' and
- `USER'; if neither of those exists, it uses effective user-ID.  If that
- user name matches the real user-ID, then Emacs uses `HOME'; otherwise,
- it looks up the home directory corresponding to that user name in the
- system's data base of users.
- 
- 
- File: emacs,  Node: Quitting,  Next: Lossage,  Prev: Customization,  Up: Top
- 
- Quitting and Aborting
- =====================
- 
- `C-g'
-      Quit.  Cancel running or partially typed command.
- 
- `C-]'
-      Abort innermost recursive editing level and cancel the command
-      which invoked it (`abort-recursive-edit').
- 
- `ESC ESC ESC'
-      Either quit or abort, whichever makes sense
-      (`keyboard-escape-quit').
- 
- `M-x top-level'
-      Abort all recursive editing levels that are currently executing.
- 
- `C-x u'
-      Cancel a previously made change in the buffer contents (`undo').
- 
-    There are two ways of canceling commands which are not finished
- executing: "quitting" with `C-g', and "aborting" with `C-]' or `M-x
- top-level'.  Quitting cancels a partially typed command or one which is
- already running.  Aborting exits a recursive editing level and cancels
- the command that invoked the recursive edit.  (*Note Recursive Edit::.)
- 
-    Quitting with `C-g' is used for getting rid of a partially typed
- command, or a numeric argument that you don't want.  It also stops a
- running command in the middle in a relatively safe way, so you can use
- it if you accidentally give a command which takes a long time.  In
- particular, it is safe to quit out of killing; either your text will
- *all* still be in the buffer, or it will *all* be in the kill ring (or
- maybe both).  Quitting an incremental search does special things
- documented under searching; in general, it may take two successive
- `C-g' characters to get out of a search (*note Incremental Search::.).
- 
-    `C-g' works by setting the variable `quit-flag' to `t' the instant
- `C-g' is typed; Emacs Lisp checks this variable frequently and quits if
- it is non-`nil'.  `C-g' is only actually executed as a command if you
- type it while Emacs is waiting for input.
- 
-    If you quit with `C-g' a second time before the first `C-g' is
- recognized, you activate the "emergency escape" feature and return to
- the shell.  *Note Emergency Escape::.
- 
-    There may be times when you cannot quit.  When Emacs is waiting for
- the operating system to do something, quitting is impossible unless
- special pains are taken for the particular system call within Emacs
- where the waiting occurs.  We have done this for the system calls that
- users are likely to want to quit from, but it's possible you will find
- another.  In one very common case--waiting for file input or output
- using NFS--Emacs itself knows how to quit, but most NFS implementations
- simply do not allow user programs to stop waiting for NFS when the NFS
- server is hung.
- 
-    Aborting with `C-]' (`abort-recursive-edit') is used to get out of a
- recursive editing level and cancel the command which invoked it.
- Quitting with `C-g' does not do this, and could not do this, because it
- is used to cancel a partially typed command *within* the recursive
- editing level.  Both operations are useful.  For example, if you are in
- a recursive edit and type `C-u 8' to enter a numeric argument, you can
- cancel that argument with `C-g' and remain in the recursive edit.
- 
-    The command `ESC ESC ESC' (`keyboard-escape-quit') can either quit
- or abort.  This key was defined because ESC is used to "get out" in
- many PC programs.  It can cancel a prefix argument, clear a selected
- region, or get out of a Query Replace, like `C-g'.  It can get out of
- the minibuffer or a recursive edit, like `C-]'.  It can also get out of
- splitting the frame into multiple windows, like `C-x 1'.  One thing it
- cannot do, however, is stop a command that is running.  That's because
- it executes as an ordinary command, and Emacs doesn't notice it until
- it is ready for a command.
- 
-    The command `M-x top-level' is equivalent to "enough" `C-]' commands
- to get you out of all the levels of recursive edits that you are in.
- `C-]' gets you out one level at a time, but `M-x top-level' goes out
- all levels at once.  Both `C-]' and `M-x top-level' are like all other
- commands, and unlike `C-g', in that they take effect only when Emacs is
- ready for a command.  `C-]' is an ordinary key and has its meaning only
- because of its binding in the keymap.  *Note Recursive Edit::.
- 
-    `C-x u' (`undo') is not strictly speaking a way of canceling a
- command, but you can think of it as canceling a command that already
- finished executing.  *Note Undo::.
- 
- 
- File: emacs,  Node: Lossage,  Next: Bugs,  Prev: Quitting,  Up: Top
- 
- Dealing with Emacs Trouble
- ==========================
- 
-    This section describes various conditions in which Emacs fails to
- work normally, and how to recognize them and correct them.
- 
- * Menu:
- 
- * DEL Gets Help::       What to do if DEL doesn't delete.
- * Stuck Recursive::     `[...]' in mode line around the parentheses.
- * Screen Garbled::      Garbage on the screen.
- * Text Garbled::        Garbage in the text.
- * Unasked-for Search::  Spontaneous entry to incremental search.
- * Memory Full::         How to cope when you run out of memory.
- * Emergency Escape::    Emergency escape--
-                           What to do if Emacs stops responding.
- * Total Frustration::   When you are at your wits' end.
- 
- 
- File: emacs,  Node: DEL Gets Help,  Next: Stuck Recursive,  Up: Lossage
- 
- If DEL Fails to Delete
- ----------------------
- 
-    If you find that DEL enters Help like `Control-h' instead of
- deleting a character, your terminal is sending the wrong code for DEL.
- You can work around this problem by changing the keyboard translation
- table (*note Keyboard Translations::.).
- 
- 
- File: emacs,  Node: Stuck Recursive,  Next: Screen Garbled,  Prev: DEL Gets Help,  Up: Lossage
- 
- Recursive Editing Levels
- ------------------------
- 
-    Recursive editing levels are important and useful features of Emacs,
- but they can seem like malfunctions to the user who does not understand
- them.
- 
-    If the mode line has square brackets `[...]' around the parentheses
- that contain the names of the major and minor modes, you have entered a
- recursive editing level.  If you did not do this on purpose, or if you
- don't understand what that means, you should just get out of the
- recursive editing level.  To do so, type `M-x top-level'.  This is
- called getting back to top level.  *Note Recursive Edit::.
- 
- 
- File: emacs,  Node: Screen Garbled,  Next: Text Garbled,  Prev: Stuck Recursive,  Up: Lossage
- 
- Garbage on the Screen
- ---------------------
- 
-    If the data on the screen looks wrong, the first thing to do is see
- whether the text is really wrong.  Type `C-l', to redisplay the entire
- screen.  If the screen appears correct after this, the problem was
- entirely in the previous screen update.  (Otherwise, see *Note Text
- Garbled::.)
- 
-    Display updating problems often result from an incorrect termcap
- entry for the terminal you are using.  The file `etc/TERMS' in the Emacs
- distribution gives the fixes for known problems of this sort.
- `INSTALL' contains general advice for these problems in one of its
- sections.  Very likely there is simply insufficient padding for certain
- display operations.  To investigate the possibility that you have this
- sort of problem, try Emacs on another terminal made by a different
- manufacturer.  If problems happen frequently on one kind of terminal
- but not another kind, it is likely to be a bad termcap entry, though it
- could also be due to a bug in Emacs that appears for terminals that
- have or that lack specific features.
- 
- 
- File: emacs,  Node: Text Garbled,  Next: Unasked-for Search,  Prev: Screen Garbled,  Up: Lossage
- 
- Garbage in the Text
- -------------------
- 
-    If `C-l' shows that the text is wrong, try undoing the changes to it
- using `C-x u' until it gets back to a state you consider correct.  Also
- try `C-h l' to find out what command you typed to produce the observed
- results.
- 
-    If a large portion of text appears to be missing at the beginning or
- end of the buffer, check for the word `Narrow' in the mode line.  If it
- appears, the text you don't see is probably still present, but
- temporarily off-limits.  To make it accessible again, type `C-x n w'.
- *Note Narrowing::.
- 
- 
- File: emacs,  Node: Unasked-for Search,  Next: Memory Full,  Prev: Text Garbled,  Up: Lossage
- 
- Spontaneous Entry to Incremental Search
- ---------------------------------------
- 
-    If Emacs spontaneously displays `I-search:' at the bottom of the
- screen, it means that the terminal is sending `C-s' and `C-q' according
- to the poorly designed xon/xoff "flow control" protocol.
- 
-    If this happens to you, your best recourse is to put the terminal in
- a mode where it will not use flow control, or give it so much padding
- that it will never send a `C-s'.  (One way to increase the amount of
- padding is to set the variable `baud-rate' to a larger value.  Its
- value is the terminal output speed, measured in the conventional units
- of baud.)
- 
-    If you don't succeed in turning off flow control, the next best thing
- is to tell Emacs to cope with it.  To do this, call the function
- `enable-flow-control'.
- 
-    Typically there are particular terminal types with which you must use
- flow control.  You can conveniently ask for flow control on those
- terminal types only, using `enable-flow-control-on'.  For example, if
- you find you must use flow control on VT-100 and H19 terminals, put the
- following in your `.emacs' file:
- 
-      (enable-flow-control-on "vt100" "h19")
- 
-    When flow control is enabled, you must type `C-\' to get the effect
- of a `C-s', and type `C-^' to get the effect of a `C-q'.  (These
- aliases work by means of keyboard translations; see *Note Keyboard
- Translations::.)
- 
- 
- File: emacs,  Node: Memory Full,  Next: Emergency Escape,  Prev: Unasked-for Search,  Up: Lossage
- 
- Running out of Memory
- ---------------------
- 
-    If you get the error message `Virtual memory exceeded', save your
- modified buffers with `C-x s'.  This method of saving them has the
- smallest need for additional memory.  Emacs keeps a reserve of memory
- which it makes available when this error happens; that should be enough
- to enable `C-x s' to complete its work.
- 
-    Once you have saved your modified buffers, you can exit this Emacs
- job and start another, or you can use `M-x kill-some-buffers' to free
- space in the current Emacs job.  If you kill buffers containing a
- substantial amount of text, you can safely go on editing.  Emacs refills
- its memory reserve automatically when it sees sufficient free space
- available, in case you run out of memory another time.
- 
-    Do not use `M-x buffer-menu' to save or kill buffers when you run
- out of memory, because the buffer menu needs a fair amount memory
- itself, and the reserve supply may not be enough.
- 
- 
- File: emacs,  Node: Emergency Escape,  Next: Total Frustration,  Prev: Memory Full,  Up: Lossage
- 
- Emergency Escape
- ----------------
- 
-    Because at times there have been bugs causing Emacs to loop without
- checking `quit-flag', a special feature causes Emacs to be suspended
- immediately if you type a second `C-g' while the flag is already set,
- so you can always get out of GNU Emacs.  Normally Emacs recognizes and
- clears `quit-flag' (and quits!) quickly enough to prevent this from
- happening.
- 
-    When you resume Emacs after a suspension caused by multiple `C-g', it
- asks two questions before going back to what it had been doing:
- 
-      Auto-save? (y or n)
-      Abort (and dump core)? (y or n)
- 
- Answer each one with `y' or `n' followed by RET.
- 
-    Saying `y' to `Auto-save?' causes immediate auto-saving of all
- modified buffers in which auto-saving is enabled.
- 
-    Saying `y' to `Abort (and dump core)?' causes an illegal instruction
- to be executed, dumping core.  This is to enable a wizard to figure out
- why Emacs was failing to quit in the first place.  Execution does not
- continue after a core dump.  If you answer `n', execution does
- continue.  With luck, GNU Emacs will ultimately check `quit-flag' and
- quit normally.  If not, and you type another `C-g', it is suspended
- again.
- 
-    If Emacs is not really hung, just slow, you may invoke the double
- `C-g' feature without really meaning to.  Then just resume and answer
- `n' to both questions, and you will arrive at your former state.
- Presumably the quit you requested will happen soon.
- 
-    The double-`C-g' feature is turned off when Emacs is running under
- the X Window System, since you can use the window manager to kill Emacs
- or to create another window and run another program.
- 
- 
- File: emacs,  Node: Total Frustration,  Prev: Emergency Escape,  Up: Lossage
- 
- Help for Total Frustration
- --------------------------
- 
-    If using Emacs (or something else) becomes terribly frustrating and
- none of the techniques described above solve the problem, Emacs can
- still help you.
- 
-    First, if the Emacs you are using is not responding to commands, type
- `C-g C-g' to get out of it and then start a new one.
- 
-    Second, type `M-x doctor RET'.
- 
-    The doctor will help you feel better.  Each time you say something to
- the doctor, you must end it by typing RET RET.  This lets the doctor
- know you are finished.
- 
- 
- File: emacs,  Node: Bugs,  Next: Service,  Prev: Lossage,  Up: Top
- 
- Reporting Bugs
- ==============
- 
-    Sometimes you will encounter a bug in Emacs.  Although we cannot
- promise we can or will fix the bug, and we might not even agree that it
- is a bug, we want to hear about problems you encounter.  Often we agree
- they are bugs and want to fix them.
- 
-    To make it possible for us to fix a bug, you must report it.  In
- order to do so effectively, you must know when and how to do it.
- 
- * Menu:
- 
- * Criteria:  Bug Criteria.	 Have you really found a bug?
- * Understanding Bug Reporting::	 How to report a bug effectively.
- * Checklist::			 Steps to follow for a good bug report.
- * Sending Patches::		 How to send a patch for GNU Emacs.
- 
- 
- File: emacs,  Node: Bug Criteria,  Next: Understanding Bug Reporting,  Up: Bugs
- 
- When Is There a Bug
- -------------------
- 
-    If Emacs executes an illegal instruction, or dies with an operating
- system error message that indicates a problem in the program (as
- opposed to something like "disk full"), then it is certainly a bug.
- 
-    If Emacs updates the display in a way that does not correspond to
- what is in the buffer, then it is certainly a bug.  If a command seems
- to do the wrong thing but the problem corrects itself if you type
- `C-l', it is a case of incorrect display updating.
- 
-    Taking forever to complete a command can be a bug, but you must make
- certain that it was really Emacs's fault.  Some commands simply take a
- long time.  Type `C-g' and then `C-h l' to see whether the input Emacs
- received was what you intended to type; if the input was such that you
- *know* it should have been processed quickly, report a bug.  If you
- don't know whether the command should take a long time, find out by
- looking in the manual or by asking for assistance.
- 
-    If a command you are familiar with causes an Emacs error message in a
- case where its usual definition ought to be reasonable, it is probably a
- bug.
- 
-    If a command does the wrong thing, that is a bug.  But be sure you
- know for certain what it ought to have done.  If you aren't familiar
- with the command, or don't know for certain how the command is supposed
- to work, then it might actually be working right.  Rather than jumping
- to conclusions, show the problem to someone who knows for certain.
- 
-    Finally, a command's intended definition may not be best for editing
- with.  This is a very important sort of problem, but it is also a
- matter of judgment.  Also, it is easy to come to such a conclusion out
- of ignorance of some of the existing features.  It is probably best not
- to complain about such a problem until you have checked the
- documentation in the usual ways, feel confident that you understand it,
- and know for certain that what you want is not available.  If you are
- not sure what the command is supposed to do after a careful reading of
- the manual, check the index and glossary for any terms that may be
- unclear.
- 
-    If after careful rereading of the manual you still do not understand
- what the command should do, that indicates a bug in the manual, which
- you should report.  The manual's job is to make everything clear to
- people who are not Emacs experts--including you.  It is just as
- important to report documentation bugs as program bugs.
- 
-    If the on-line documentation string of a function or variable
- disagrees with the manual, one of them must be wrong; that is a bug.
- 
- 
- File: emacs,  Node: Understanding Bug Reporting,  Next: Checklist,  Prev: Bug Criteria,  Up: Bugs
- 
- Understanding Bug Reporting
- ---------------------------
- 
-    When you decide that there is a bug, it is important to report it
- and to report it in a way which is useful.  What is most useful is an
- exact description of what commands you type, starting with the shell
- command to run Emacs, until the problem happens.
- 
-    The most important principle in reporting a bug is to report *facts*,
- not hypotheses or categorizations.  It is always easier to report the
- facts, but people seem to prefer to strain to posit explanations and
- report them instead.  If the explanations are based on guesses about
- how Emacs is implemented, they will be useless; we will have to try to
- figure out what the facts must have been to lead to such speculations.
- Sometimes this is impossible.  But in any case, it is unnecessary work
- for us.
- 
-    For example, suppose that you type `C-x C-f /glorp/baz.ugh RET',
- visiting a file which (you know) happens to be rather large, and Emacs
- prints out `I feel pretty today'.  The best way to report the bug is
- with a sentence like the preceding one, because it gives all the facts
- and nothing but the facts.
- 
-    Do not assume that the problem is due to the size of the file and
- say, "When I visit a large file, Emacs prints out `I feel pretty
- today'." This is what we mean by "guessing explanations".  The problem
- is just as likely to be due to the fact that there is a `z' in the file
- name.  If this is so, then when we got your report, we would try out
- the problem with some "large file", probably with no `z' in its name,
- and not find anything wrong.  There is no way in the world that we
- could guess that we should try visiting a file with a `z' in its name.
- 
-    Alternatively, the problem might be due to the fact that the file
- starts with exactly 25 spaces.  For this reason, you should make sure
- that you inform us of the exact contents of any file that is needed to
- reproduce the bug.  What if the problem only occurs when you have typed
- the `C-x C-a' command previously?  This is why we ask you to give the
- exact sequence of characters you typed since starting the Emacs session.
- 
-    You should not even say "visit a file" instead of `C-x C-f' unless
- you *know* that it makes no difference which visiting command is used.
- Similarly, rather than saying "if I have three characters on the line,"
- say "after I type `RET A B C RET C-p'," if that is the way you entered
- the text.
- 
--- 0 ----
Index: emacs/info/emacs-2
diff -c emacs/info/emacs-2:1.1.1.2 emacs/info/emacs-2:removed
*** emacs/info/emacs-2:1.1.1.2	Mon Jul 22 01:52:14 1996
--- emacs/info/emacs-2	Fri Aug  2 20:09:27 1996
***************
*** 1,1040 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Intro,  Next: Glossary,  Prev: Copying,  Up: Top
- 
- Introduction
- ************
- 
-    You are reading about GNU Emacs, the GNU incarnation of the advanced,
- self-documenting, customizable, extensible real-time display editor
- Emacs.  (The `G' in `GNU' is not silent.)
- 
-    We say that Emacs is a "display" editor because normally the text
- being edited is visible on the screen and is updated automatically as
- you type your commands.  *Note Display: Screen.
- 
-    We call it a "real-time" editor because the display is updated very
- frequently, usually after each character or pair of characters you
- type.  This minimizes the amount of information you must keep in your
- head as you edit.  *Note Real-time: Basic.
- 
-    We call Emacs advanced because it provides facilities that go beyond
- simple insertion and deletion: controlling subprocesses; automatic
- indentation of programs; viewing two or more files at once; editing
- formatted text; and dealing in terms of characters, words, lines,
- sentences, paragraphs, and pages, as well as expressions and comments in
- several different programming languages.
- 
-    "Self-documenting" means that at any time you can type a special
- character, `Control-h', to find out what your options are.  You can
- also use it to find out what any command does, or to find all the
- commands that pertain to a topic.  *Note Help::.
- 
-    "Customizable" means that you can change the definitions of Emacs
- commands in little ways.  For example, if you use a programming
- language in which comments start with `<**' and end with `**>', you can
- tell the Emacs comment manipulation commands to use those strings
- (*note Comments::.).  Another sort of customization is rearrangement of
- the command set.  For example, if you prefer the four basic cursor
- motion commands (up, down, left and right) on keys in a diamond pattern
- on the keyboard, you can rebind the keys that way.  *Note
- Customization::.
- 
-    "Extensible" means that you can go beyond simple customization and
- write entirely new commands, programs in the Lisp language to be run by
- Emacs's own Lisp interpreter.  Emacs is an "on-line extensible" system,
- which means that it is divided into many functions that call each
- other, any of which can be redefined in the middle of an editing
- session.  Almost any part of Emacs can be replaced without making a
- separate copy of all of Emacs.  Most of the editing commands of Emacs
- are written in Lisp already; the few exceptions could have been written
- in Lisp but are written in C for efficiency.  Although only a programmer
- can write an extension, anybody can use it afterward.
- 
-    When run under the X Window System, Emacs provides its own menus and
- convenient bindings to mouse buttons.  But Emacs can provide many of the
- benefits of a window system on a text-only terminal.  For instance, you
- can look at or edit several files at once, move text between them, and
- edit files at the same time as you run shell commands.
- 
- 
- File: emacs,  Node: Screen,  Next: User Input,  Prev: Acknowledgments,  Up: Top
- 
- The Organization of the Screen
- ******************************
- 
-    On a text-only terminal, the Emacs display occupies the whole screen.
- On the X Window System, Emacs creates its own X windows to use.  We use
- the term "frame" to mean an entire text-only screen or an entire X
- window used by Emacs.  Emacs uses both kinds of frames in the same way
- to display your editing.  Emacs normally starts out with just one frame,
- but you can create additional frames if you wish.  *Note Frames::.
- 
-    When you start Emacs, the entire frame except for the last line is
- devoted to the text you are editing.  This area is called "window".
- The last line is a special "echo area" or "minibuffer window" where
- prompts appear and where you can enter responses.  You can subdivide
- the large text window horizontally or vertically into multiple text
- windows, each of which can be used for a different file (*note
- Windows::.).  In this manual, the word "window" always refers to the
- subdivisions of a frame within Emacs.
- 
-    The window that the cursor is in is the "selected window", in which
- editing takes place.  Most Emacs commands implicitly apply to the text
- in the selected window (though mouse commands generally operate on
- whatever window you click them in, whether selected or not).  The other
- windows display text for reference only, unless/until you select them.
- If you use multiple frames under the X Window System, then giving the
- input focus to a particular frame selects a window in that frame.
- 
-    Each window's last line is a "mode line" which describes what is
- going on in that window.  It appears in inverse video if the terminal
- supports that, and contains text that starts like `-----Emacs:
- SOMETHING'.  Its purpose is to indicate what buffer is being displayed
- above it in the window; what major and minor modes are in use; and
- whether the buffer contains unsaved changes.
- 
- * Menu:
- 
- * Point::	The place in the text where editing commands operate.
- * Echo Area::   Short messages appear at the bottom of the screen.
- * Mode Line::	Interpreting the mode line.
- 
- 
- File: emacs,  Node: Point,  Next: Echo Area,  Up: Screen
- 
- Point
- =====
- 
-    Within Emacs, the terminal's cursor shows the location at which
- editing commands will take effect.  This location is called "point".
- Many Emacs commands move point through the text, so that you can edit at
- different places in it.  You can also place point by clicking mouse
- button 1.
- 
-    While the cursor appears to point AT a character, you should think
- of point as BETWEEN two characters; it points BEFORE the character that
- appears under the cursor.  For example, if your text looks like `frob'
- with the cursor over the `b', then point is between the `o' and the
- `b'.  If you insert the character `!' at that position, the result is
- `fro!b', with point between the `!' and the `b'.  Thus, the cursor
- remains over the `b', as before.
- 
-    Sometimes people speak of "the cursor" when they mean "point", or
- speak of commands that move point as "cursor motion" commands.
- 
-    Terminals have only one cursor, and when output is in progress it
- must appear where the typing is being done.  This does not mean that
- point is moving.  It is only that Emacs has no way to show you the
- location of point except when the terminal is idle.
- 
-    If you are editing several files in Emacs, each in its own buffer,
- each buffer has its own point location.  A buffer that is not currently
- displayed remembers where point is in case you display it again later.
- 
-    When there are multiple windows in a frame, each window has its own
- point location.  The cursor shows the location of point in the selected
- window.  This also is how you can tell which window is selected.  If the
- same buffer appears in more than one window, each window has its own
- position for point in that buffer.
- 
-    When there are multiple frames, each frame can display one cursor.
- The cursor in the selected frame is solid; the cursor in other frames is
- a hollow box, and appears in the window that would be selected if you
- give the input focus to that frame.
- 
-    The term `point' comes from the character `.', which was the command
- in TECO (the language in which the original Emacs was written) for
- accessing the value now called `point'.
- 
- 
- File: emacs,  Node: Echo Area,  Next: Mode Line,  Prev: Point,  Up: Screen
- 
- The Echo Area
- =============
- 
-    The line at the bottom of the frame (below the mode line) is the
- "echo area".  It is used to display small amounts of text for several
- purposes.
- 
-    "Echoing" means displaying the characters that you type.  Outside
- Emacs, the operating system normally echoes all your input.  Emacs
- handles echoing differently.
- 
-    Single-character commands do not echo in Emacs, and multi-character
- commands echo only if you pause while typing them.  As soon as you pause
- for more than a second in the middle of a command, Emacs echoes all the
- characters of the command so far.  This is to "prompt" you for the rest
- of the command.  Once echoing has started, the rest of the command
- echoes immediately as you type it.  This behavior is designed to give
- confident users fast response, while giving hesitant users maximum
- feedback.  You can change this behavior by setting a variable (*note
- Display Vars::.).
- 
-    If a command cannot be executed, it may print an "error message" in
- the echo area.  Error messages are accompanied by a beep or by flashing
- the screen.  Also, any input you have typed ahead is thrown away when
- an error happens.
- 
-    Some commands print informative messages in the echo area.  These
- messages look much like error messages, but they are not announced with
- a beep and do not throw away input.  Sometimes the message tells you
- what the command has done, when this is not obvious from looking at the
- text being edited.  Sometimes the sole purpose of a command is to print
- a message giving you specific information--for example, `C-x =' prints
- a message describing the character position of point in the text and
- its current column in the window.  Commands that take a long time often
- display messages ending in `...' while they are working, and add `done'
- at the end when they are finished.
- 
-    Echo area informative messages appear also in a buffer named
- `*Messages*'.  If you miss a message that appears briefly on the
- screen, you can switch to the `*Messages*' buffer to see it again.
- Garbage collection messages are omitted from `*Messages*', and
- successive progress messages are often collapsed into one.
- 
-    The size of `*Messages*' is limited to a certain number of lines.
- The variable `message-log-max' specifies how many lines.  Once the
- buffer has that many lines, each line added at the end deletes one line
- from the beginning.  *Note Variables::, for how to set variables such as
- `message-log-max'.
- 
-    The echo area is also used to display the "minibuffer", a window that
- is used for reading arguments to commands, such as the name of a file
- to be edited.  When the minibuffer is in use, the echo area begins with
- a prompt string that usually ends with a colon; also, the cursor
- appears in that line because it is the selected window.  You can always
- get out of the minibuffer by typing `C-g'.  *Note Minibuffer::.
- 
- 
- File: emacs,  Node: Mode Line,  Prev: Echo Area,  Up: Screen
- 
- The Mode Line
- =============
- 
-    Each text window's last line is a "mode line" which describes what
- is going on in that window.  When there is only one text window, the
- mode line appears right above the echo area.  The mode line is in
- inverse video if the terminal supports that, it starts and ends with
- dashes, and it contains text like `Emacs: SOMETHING'.
- 
-    A few special editing modes, such as Dired and Rmail, display
- something else in place of `Emacs: SOMETHING'.  The rest of the mode
- line still has the usual meaning.
- 
-    Normally, the mode line looks like this:
- 
-      --CH-Emacs: BUF      (MAJOR MINOR)----POS------
- 
- This gives information about the buffer being displayed in the window:
- the buffer's name, what major and minor modes are in use, whether the
- buffer's text has been changed, and how far down the buffer you are
- currently looking.
- 
-    CH contains two stars `**' if the text in the buffer has been edited
- (the buffer is "modified"), or `--' if the buffer has not been edited.
- For a read-only buffer, it is `%*' if the buffer is modified, and `%%'
- otherwise.
- 
-    BUF is the name of the window's "buffer".  In most cases this is the
- same as the name of a file you are editing.  *Note Buffers::.
- 
-    The buffer displayed in the selected window (the window that the
- cursor is in) is also Emacs's selected buffer, the one that editing
- takes place in.  When we speak of what some command does to "the
- buffer", we are talking about the currently selected buffer.
- 
-    POS tells you whether there is additional text above the top of the
- window, or below the bottom.  If your buffer is small and it is all
- visible in the window, POS is `All'.  Otherwise, it is `Top' if you are
- looking at the beginning of the buffer, `Bot' if you are looking at the
- end of the buffer, or `NN%', where NN is the percentage of the buffer
- above the top of the window.
- 
-    MAJOR is the name of the "major mode" in effect in the buffer.  At
- any time, each buffer is in one and only one of the possible major
- modes.  The major modes available include Fundamental mode (the least
- specialized), Text mode, Lisp mode, C mode, Texinfo mode, and many
- others.  *Note Major Modes::, for details of how the modes differ and
- how to select one.
- 
-    Some major modes display additional information after the major mode
- name.  For example, Rmail buffers display the current message number and
- the total number of messages.  Compilation buffers and Shell buffers
- display the status of the subprocess.
- 
-    MINOR is a list of some of the "minor modes" that are turned on at
- the moment in the window's chosen buffer.  For example, `Fill' means
- that Auto Fill mode is on.  `Abbrev' means that Word Abbrev mode is on.
- `Ovwrt' means that Overwrite mode is on.  *Note Minor Modes::, for
- more information.  `Narrow' means that the buffer being displayed has
- editing restricted to only a portion of its text.  This is not really a
- minor mode, but is like one.  *Note Narrowing::.  `Def' means that a
- keyboard macro is being defined.  *Note Keyboard Macros::.
- 
-    In addition, if Emacs is currently inside a recursive editing level,
- square brackets (`[...]') appear around the parentheses that surround
- the modes.  If Emacs is in one recursive editing level within another,
- double square brackets appear, and so on.  Since recursive editing
- levels affect Emacs globally, not just one buffer, the square brackets
- appear in every window's mode line or not in any of them.  *Note
- Recursive Edit::.
- 
-    *Note Optional Mode Line::, for features that add other handy
- information to the mode line, such as the current line number of point,
- the current time, and whether new mail for you has arrived.
- 
- 
- File: emacs,  Node: User Input,  Next: Keys,  Prev: Screen,  Up: Top
- 
- Kinds of User Input
- ===================
- 
-    GNU Emacs uses an extension of the ASCII character set for keyboard
- input; it also accepts non-character input events including function
- keys and mouse button actions.
- 
-    ASCII consists of 128 character codes.  Some of these codes are
- assigned graphic symbols such as `a' and `='; the rest are control
- characters, such as `Control-a' (usually written `C-a' for short).
- `C-a' gets its name from the fact that you type it by holding down the
- CTRL key while pressing `a'.
- 
-    Some control characters have special names, and special keys you can
- type them with: for example, RET, TAB, LFD, DEL and ESC.  The space
- character is usually referred to below as SPC, even though strictly
- speaking it is a graphic character whose graphic happens to be blank.
- 
-    On ASCII terminals, there are only 32 possible control characters.
- These are the control variants of letters and `@[]\^_'.  In addition,
- the shift key is meaningless with control characters: `C-a' and `C-A'
- are the same character, and Emacs cannot distinguish them.
- 
-    But the Emacs character set has room for control variants of all
- characters, and for distinguishing between `C-a' and `C-A'.  X Windows
- makes it possible to enter all these characters.  For example, `C--'
- (that's Control-Minus) and `C-5' are meaningful Emacs commands under X.
- 
-    Another Emacs character set extension is that characters have
- additional modifier bits.  Only one modifier bit is commonly used; it is
- called Meta.  Every character has a Meta variant; examples include
- `Meta-a' (normally written `M-a', for short), `M-A' (not the same
- character as `M-a', but those two characters normally have the same
- meaning in Emacs), `M-RET', and `M-C-a'.  For reasons of tradition, we
- usually write `C-M-a' rather than `M-C-a'; logically speaking, the
- order in which the modifier keys CTRL and META are mentioned does not
- matter.
- 
-    Some terminals have a META key, and allow you to type Meta
- characters by holding this key down.  Thus, `Meta-a' is typed by
- holding down META and pressing `a'.  The META key works much like the
- SHIFT key.  Such a key is not always labeled META, however, as this
- function is often a special option for a key with some other primary
- purpose.
- 
-    If there is no META key, you can still type Meta characters using
- two-character sequences starting with ESC.  Thus, to enter `M-a', you
- could type `ESC a'.  To enter `C-M-a', you would type `ESC C-a'.  ESC
- is allowed on terminals with META keys, too, in case you have formed a
- habit of using it.
- 
-    X Windows provides several other modifier keys that can be applied to
- any input character.  These are called SUPER, HYPER and ALT.  We write
- `s-', `H-' and `A-' to say that a character uses these modifiers.
- Thus, `s-H-C-x' is short for `Super-Hyper-Control-x'.  Not all X
- terminals actually provide keys for these modifier flags--in fact, many
- terminals have a key labeled ALT which is really a META key.  The
- standard key bindings of Emacs do not include any characters with these
- modifiers.  But you can assign them meanings of your own by customizing
- Emacs.
- 
-    Keyboard input includes keyboard keys that are not characters at all:
- for example function keys and arrow keys.  Mouse buttons are also
- outside the gamut of characters.  You can modify these events with the
- modifier keys CONTROL, META, SUPER, HYPER and ALT like keyboard
- characters.
- 
-    Input characters and non-character inputs are collectively called
- "input events".  *Note Input Events: (elisp)Input Events, for more
- information.  If you are not doing Lisp programming, but simply want to
- redefine the meaning of some characters or non-character events, see
- *Note Customization::.
- 
-    ASCII terminals cannot really send anything to the computer except
- ASCII characters.  These terminals use a sequence of characters to
- represent each function key.  But that is invisible to the Emacs user,
- because the keyboard input routines recognize these special sequences
- and convert them to function key events before any other part of Emacs
- gets to see them.
- 
- 
- File: emacs,  Node: Keys,  Next: Commands,  Prev: User Input,  Up: Top
- 
- Keys
- ====
- 
-    A "key sequence" ("key", for short) is a sequence of input events
- that are meaningful as a unit--as "a single command." Some Emacs
- command sequences are just one character or one event; for example,
- just `C-f' is enough to move forward one character.  But Emacs also has
- commands that take two or more events to invoke.
- 
-    If a sequence of events is enough to invoke a command, it is a
- "complete key".  Examples of complete keys include `C-a', `X', RET,
- NEXT (a function key), DOWN (an arrow key), `C-x C-f' and `C-x 4 C-f'.
- If it isn't long enough to be complete, we call it a "prefix key".  The
- above examples show that `C-x' and `C-x 4' are prefix keys.  Every key
- sequence is either a complete key or a prefix key.
- 
-    Most single characters constitute complete keys in the standard Emacs
- command bindings.  A few of them are prefix keys.  A prefix key combines
- with the following input event to make a longer key sequence, which may
- itself be complete or a prefix.  For example, `C-x' is a prefix key, so
- `C-x' and the next input event combine to make a two-character key
- sequence.  Most of these key sequences are complete keys, including
- `C-x C-f' and `C-x b'.  A few, such as `C-x 4' and `C-x r', are
- themselves prefix keys that lead to three-character key sequences.
- There's no limit to the length of a key sequence, but in practice
- people rarely use sequences longer than four events.
- 
-    By contrast, you can't add more events onto a complete key.  For
- example, the two-character sequence `C-f C-k' is not a key, because the
- `C-f' is a complete key in itself.  It's impossible to give `C-f C-k'
- an independent meaning as a command.  `C-f C-k' is two key sequences,
- not one.
- 
-    All told, the prefix keys in Emacs are `C-c', `C-h', `C-x', `C-x
- C-a', `C-x n', `C-x r', `C-x v', `C-x 4', `C-x 5', `C-x 6', and ESC.
- But this is not cast in concrete; it is just a matter of Emacs's
- standard key bindings.  If you customize Emacs, you can make new prefix
- keys, or eliminate these.  *Note Key Bindings::.
- 
-    If you do make or eliminate prefix keys, that changes the set of
- possible key sequences.  For example, if you redefine `C-f' as a
- prefix, `C-f C-k' automatically becomes a key (complete, unless you
- define it too as a prefix).  Conversely, if you remove the prefix
- definition of `C-x 4', then `C-x 4 f' (or `C-x 4 ANYTHING') is no
- longer a key.
- 
-    Typing the help character (`C-h' or F1) after a prefix character
- displays a list of the commands starting with that prefix.  There are a
- few prefix characters for which `C-h' does not work--for historical
- reasons, they have other meanings for `C-h' which are not easy to
- change.  But F1 should work for all prefix characters.
- 
- 
- File: emacs,  Node: Commands,  Next: Text Characters,  Prev: Keys,  Up: Top
- 
- Keys and Commands
- =================
- 
-    This manual is full of passages that tell you what particular keys
- do.  But Emacs does not assign meanings to keys directly.  Instead,
- Emacs assigns meanings to named "commands", and then gives keys their
- meanings by "binding" them to commands.
- 
-    Every command has a name chosen by a programmer.  The name is usually
- made of a few English words separated by dashes; for example,
- `next-line' or `forward-word'.  A command also has a "function
- definition" which is a Lisp program; this is what makes the command do
- what it does.  In Emacs Lisp, a command is actually a special kind of
- Lisp function; one which specifies how to read arguments for it and
- call it interactively.  For more information on commands and functions,
- see *Note What Is a Function: (elisp)What Is a Function.  (The
- definition we use in this manual is simplified slightly.)
- 
-    The bindings between keys and commands are recorded in various tables
- called "keymaps".  *Note Keymaps::.
- 
-    When we say that "`C-n' moves down vertically one line" we are
- glossing over a distinction that is irrelevant in ordinary use but is
- vital in understanding how to customize Emacs.  It is the command
- `next-line' that is programmed to move down vertically.  `C-n' has this
- effect *because* it is bound to that command.  If you rebind `C-n' to
- the command `forward-word' then `C-n' will move forward by words
- instead.  Rebinding keys is a common method of customization.
- 
-    In the rest of this manual, we usually ignore this subtlety to keep
- things simple.  To give the information needed for customization, we
- state the name of the command which really does the work in parentheses
- after mentioning the key that runs it.  For example, we will say that
- "The command `C-n' (`next-line') moves point vertically down," meaning
- that `next-line' is a command that moves vertically down and `C-n' is a
- key that is standardly bound to it.
- 
-    While we are on the subject of information for customization only,
- it's a good time to tell you about "variables".  Often the description
- of a command will say, "To change this, set the variable `mumble-foo'."
- A variable is a name used to remember a value.  Most of the variables
- documented in this manual exist just to facilitate customization: some
- command or other part of Emacs examines the variable and behaves
- differently according to the value that you set.  Until you are
- interested in customizing, you can ignore the information about
- variables.  When you are ready to be interested, read the basic
- information on variables, and then the information on individual
- variables will make sense.  *Note Variables::.
- 
- 
- File: emacs,  Node: Text Characters,  Next: Entering Emacs,  Prev: Commands,  Up: Top
- 
- Character Set for Text
- ======================
- 
-    Emacs buffers use an 8-bit character set, because bytes have 8 bits.
- ASCII graphic characters in Emacs buffers are displayed with their
- graphics.  The newline character (which has the same character code as
- LFD) is displayed by starting a new line.  The tab character is
- displayed by moving to the next tab stop column (normally every 8
- columns).  Other control characters are displayed as a caret (`^')
- followed by the non-control version of the character; thus, `C-a' is
- displayed as `^A'.  Non-ASCII characters 128 and up are displayed with
- octal escape sequences; thus, character code 243 (octal) is displayed
- as `\243'.
- 
-    You can customize the display of these character codes (or ASCII
- characters) by creating a "display table".  *Note Display Tables:
- (elisp)Display Tables.  This is useful for editing files that use 8-bit
- European character sets.  *Note European Display::.
- 
- 
- File: emacs,  Node: Entering Emacs,  Next: Exiting,  Prev: Text Characters,  Up: Top
- 
- Entering and Exiting Emacs
- **************************
- 
-    The usual way to invoke Emacs is with the shell command `emacs'.
- Emacs clears the screen and then displays an initial help message and
- copyright notice.  Some operating systems discard all type-ahead when
- Emacs starts up; they give Emacs no way to prevent this.  Therefore, it
- is advisable to wait until Emacs clears the screen before typing your
- first editing command.
- 
-    If you run Emacs from a shell window under the X Window System, run
- it in the background with `emacs&'.  This way, Emacs does not tie up
- the shell window, so you can use that to run other shell commands while
- Emacs operates its own X windows.  You can begin typing Emacs commands
- as soon as you direct your keyboard input to the Emacs frame.
- 
-    When Emacs starts up, it makes a buffer named `*scratch*'.  That's
- the buffer you start out in.  The `*scratch*' buffer uses Lisp
- Interaction mode; you can use it to type Lisp expressions and evaluate
- them, or you can ignore that capability and simply doodle.  (You can
- specify a different major mode for this buffer by setting the variable
- `initial-major-mode' in your init file.  *Note Init File::.)
- 
-    It is possible to specify files to be visited, Lisp files to be
- loaded, and functions to be called, by giving Emacs arguments in the
- shell command line.  *Note Command Arguments::.  But we don't recommend
- doing this.  The feature exists mainly for compatibility with other
- editors.
- 
-    Many other editors are designed to be started afresh each time you
- want to edit.  You edit one file and then exit the editor.  The next
- time you want to edit either another file or the same one, you must run
- the editor again.  With these editors, it makes sense to use a command
- line argument to say which file to edit.
- 
-    But starting a new Emacs each time you want to edit a different file
- does not make sense.  For one thing, this would be annoyingly slow.  For
- another, this would fail to take advantage of Emacs's ability to visit
- more than one file in a single editing session.  And it would lose the
- other accumulated context, such as registers, undo history, and the mark
- ring.
- 
-    The recommended way to use GNU Emacs is to start it only once, just
- after you log in, and do all your editing in the same Emacs session.
- Each time you want to edit a different file, you visit it with the
- existing Emacs, which eventually comes to have many files in it ready
- for editing.  Usually you do not kill the Emacs until you are about to
- log out.  *Note Files::, for more information on visiting more than one
- file.
- 
- 
- File: emacs,  Node: Exiting,  Next: Basic,  Prev: Entering Emacs,  Up: Top
- 
- Exiting Emacs
- =============
- 
-    There are two commands for exiting Emacs because there are two kinds
- of exiting: "suspending" Emacs and "killing" Emacs.
- 
-    "Suspending" means stopping Emacs temporarily and returning control
- to its parent process (usually a shell), allowing you to resume editing
- later in the same Emacs job, with the same buffers, same kill ring,
- same undo history, and so on.  This is the usual way to exit.
- 
-    "Killing" Emacs means destroying the Emacs job.  You can run Emacs
- again later, but you will get a fresh Emacs; there is no way to resume
- the same editing session after it has been killed.
- 
- `C-z'
-      Suspend Emacs (`suspend-emacs') or iconify a frame
-      (`iconify-or-deiconify-frame').
- 
- `C-x C-c'
-      Kill Emacs (`save-buffers-kill-emacs').
- 
-    To suspend Emacs, type `C-z' (`suspend-emacs').  This takes you back
- to the shell from which you invoked Emacs.  You can resume Emacs with
- the shell command `%emacs' in most common shells.
- 
-    On systems that do not support suspending programs, `C-z' starts an
- inferior shell that communicates directly with the terminal.  Emacs
- waits until you exit the subshell.  (The way to do that is probably
- with `C-d' or `exit', but it depends on which shell you use.)  The only
- way on these systems to get back to the shell from which Emacs was run
- (to log out, for example) is to kill Emacs.
- 
-    Suspending also fails if you run Emacs under a shell that doesn't
- support suspending programs, even if the system itself does support it.
- In such a case, you can set the variable `cannot-suspend' to a
- non-`nil' value to force `C-z' to start an inferior shell.  (One might
- also describe Emacs's parent shell as "inferior" for failing to support
- job control properly, but that is a matter of taste.)
- 
-    When Emacs communicates directly with an X server and creates its own
- dedicated X windows, `C-z' has a different meaning.  Suspending an
- applications that uses its own X windows is not meaningful or useful.
- Instead, `C-z' runs the command `iconify-or-deiconify-frame', which
- temporarily closes up the selected Emacs frame (*note Frames::.).  The
- way to get back to a shell window is with the window manager.
- 
-    To kill Emacs, type `C-x C-c' (`save-buffers-kill-emacs').  A
- two-character key is used for this to make it harder to type.  This
- command first offers to save any modified file-visiting buffers.  If you
- do not save them all, it asks for reconfirmation with `yes' before
- killing Emacs, since any changes not saved will be lost forever.  Also,
- if any subprocesses are still running, `C-x C-c' asks for confirmation
- about them, since killing Emacs will kill the subprocesses immediately.
- 
-    There is no way to restart an Emacs session once you have killed it.
- You can, however, arrange for Emacs to record certain session
- information, such as which files are visited, when you kill it, so that
- the next time you restart Emacs it will try to visit the same files and
- so on.  *Note Saving Emacs Sessions::.
- 
-    The operating system usually listens for certain special characters
- whose meaning is to kill or suspend the program you are running.  This
- operating system feature is turned off while you are in Emacs.  The
- meanings of `C-z' and `C-x C-c' as keys in Emacs were inspired by the
- use of `C-z' and `C-c' on several operating systems as the characters
- for stopping or killing a program, but that is their only relationship
- with the operating system.  You can customize these keys to run any
- commands of your choice (*note Keymaps::.).
- 
- 
- File: emacs,  Node: Basic,  Next: Minibuffer,  Prev: Exiting,  Up: Top
- 
- Basic Editing Commands
- **********************
- 
-    We now give the basics of how to enter text, make corrections, and
- save the text in a file.  If this material is new to you, you might
- learn it more easily by running the Emacs learn-by-doing tutorial.  To
- use the tutorial, run Emacs and type `Control-h t'
- (`help-with-tutorial').
- 
-    To clear the screen and redisplay, type `C-l' (`recenter').
- 
- * Menu:
- 
- * Inserting Text::     Inserting text by simply typing it.
- * Moving Point::       How to move the cursor to the place where you want to
- 		         change something.
- * Erasing::	       Deleting and killing text.
- * Undo::               Undoing previous changes.
- * Files: Basic Files.  Visiting, creating, and saving files.
- * Help: Basic Help.    Asking what a character does.
- * Blank Lines::        Commands to make or delete blank lines.
- * Continuation Lines:: Lines too wide for the screen.
- * Position Info::      What page, line, row, or column is point on?
- * Arguments::	       Numeric arguments for repeating a command.
- 
- 
- File: emacs,  Node: Inserting Text,  Next: Moving Point,  Up: Basic
- 
- Inserting Text
- ==============
- 
-    To insert printing characters into the text you are editing, just
- type them.  This inserts the characters you type into the buffer at the
- cursor (that is, at "point"; *note Point::.).  The cursor moves
- forward, and any text after the cursor moves forward too.  If the text
- in the buffer is `FOOBAR', with the cursor before the `B', then if you
- type `XX', you get `FOOXXBAR', with the cursor still before the `B'.
- 
-    To "delete" text you have just inserted, use DEL.  DEL deletes the
- character *before* the cursor (not the one that the cursor is on top of
- or under; that is the character AFTER the cursor).  The cursor and all
- characters after it move backwards.  Therefore, if you type a printing
- character and then type DEL, they cancel out.
- 
-    To end a line and start typing a new one, type RET.  This inserts a
- newline character in the buffer.  If point is in the middle of a line,
- RET splits the line.  Typing DEL when the cursor is at the beginning of
- a line deletes the preceding newline, thus joining the line with the
- preceding line.
- 
-    Emacs can split lines automatically when they become too long, if you
- turn on a special minor mode called "Auto Fill" mode.  *Note Filling::,
- for how to use Auto Fill mode.
- 
-    If you prefer to have text characters replace (overwrite) existing
- text rather than shove it to the right, you can enable Overwrite mode,
- a minor mode.  *Note Minor Modes::.
- 
-    Direct insertion works for printing characters and SPC, but other
- characters act as editing commands and do not insert themselves.  If you
- need to insert a control character or a character whose code is above
- 200 octal, you must "quote" it by typing the character `Control-q'
- (`quoted-insert') first.  (This character's name is normally written
- `C-q' for short.)  There are two ways to use `C-q':
- 
-    * `C-q' followed by any non-graphic character (even `C-g') inserts
-      that character.
- 
-    * `C-q' followed by three octal digits inserts the character with
-      the specified character code.
- 
- A numeric argument to `C-q' specifies how many copies of the quoted
- character should be inserted (*note Arguments::.).
- 
-    Customization information: DEL in most modes runs the command
- `delete-backward-char'; RET runs the command `newline', and
- self-inserting printing characters run the command `self-insert', which
- inserts whatever character was typed to invoke it.  Some major modes
- rebind DEL to other commands.
- 
- 
- File: emacs,  Node: Moving Point,  Next: Erasing,  Prev: Inserting Text,  Up: Basic
- 
- Changing the Location of Point
- ==============================
- 
-    To do more than insert characters, you have to know how to move point
- (*note Point::.).  The simplest way to do this is with arrow keys, or by
- clicking the left mouse button where you want to move to.
- 
-    There are also control and meta characters for cursor motion.  Some
- are equivalent to the arrow keys (these date back to the days before
- terminals had arrow keys, and are usable on terminals which don't have
- them).  Others do more sophisticated things.
- 
- `C-a'
-      Move to the beginning of the line (`beginning-of-line').
- 
- `C-e'
-      Move to the end of the line (`end-of-line').
- 
- `C-f'
-      Move forward one character (`forward-char').
- 
- `C-b'
-      Move backward one character (`backward-char').
- 
- `M-f'
-      Move forward one word (`forward-word').
- 
- `M-b'
-      Move backward one word (`backward-word').
- 
- `C-n'
-      Move down one line, vertically (`next-line').  This command
-      attempts to keep the horizontal position unchanged, so if you
-      start in the middle of one line, you end in the middle of the
-      next.  When on the last line of text, `C-n' creates a new line and
-      moves onto it.
- 
- `C-p'
-      Move up one line, vertically (`previous-line').
- 
- `M-r'
-      Move point to left margin, vertically centered in the window
-      (`move-to-window-line').  Text does not move on the screen.
- 
-      A numeric argument says which screen line to place point on.  It
-      counts screen lines down from the top of the window (zero for the
-      top line).  A negative argument counts lines from the bottom (-1
-      for the bottom line).
- 
- `M-<'
-      Move to the top of the buffer (`beginning-of-buffer').  With
-      numeric argument N, move to N/10 of the way from the top.  *Note
-      Arguments::, for more information on numeric arguments.
- 
- `M->'
-      Move to the end of the buffer (`end-of-buffer').
- 
- `M-x goto-char'
-      Read a number N and move point to character number N.  Position 1
-      is the beginning of the buffer.
- 
- `M-x goto-line'
-      Read a number N and move point to line number N.  Line 1 is the
-      beginning of the buffer.
- 
- `C-x C-n'
-      Use the current column of point as the "semipermanent goal column"
-      for `C-n' and `C-p' (`set-goal-column').  Henceforth, those
-      commands always move to this column in each line moved into, or as
-      close as possible given the contents of the line.  This goal
-      column remains in effect until canceled.
- 
- `C-u C-x C-n'
-      Cancel the goal column.  Henceforth, `C-n' and `C-p' once again
-      try to stick to a fixed horizontal position, as usual.
- 
-    If you set the variable `track-eol' to a non-`nil' value, then `C-n'
- and `C-p' when at the end of the starting line move to the end of
- another line.  Normally, `track-eol' is `nil'.  *Note Variables::, for
- how to set variables such as `track-eol'.
- 
-    Normally, `C-n' on the last line of a buffer appends a newline to
- it.  If the variable `next-line-add-newlines' is `nil', then `C-n' gets
- an error instead (like `C-p' on the first line).
- 
- 
- File: emacs,  Node: Erasing,  Next: Undo,  Prev: Moving Point,  Up: Basic
- 
- Erasing Text
- ============
- 
- `DEL'
-      Delete the character before point (`delete-backward-char').
- 
- `C-d'
-      Delete the character after point (`delete-char').
- 
- `C-k'
-      Kill to the end of the line (`kill-line').
- 
- `M-d'
-      Kill forward to the end of the next word (`kill-word').
- 
- `M-DEL'
-      Kill back to the beginning of the previous word
-      (`backward-kill-word').
- 
-    You already know about the DEL key which deletes the character
- before point (that is, before the cursor).  Another key, `Control-d'
- (`C-d' for short), deletes the character after point (that is, the
- character that the cursor is on).  This shifts the rest of the text on
- the line to the left.  If you type `C-d' at the end of a line, it joins
- together that line and the next line.
- 
-    To erase a larger amount of text, use the `C-k' key, which kills a
- line at a time.  If you type `C-k' at the beginning or middle of a
- line, it kills all the text up to the end of the line.  If you type
- `C-k' at the end of a line, it joins that line and the next line.
- 
-    *Note Killing::, for more flexible ways of killing text.
- 
- 
- File: emacs,  Node: Undo,  Next: Basic Files,  Prev: Erasing,  Up: Basic
- 
- Undoing Changes
- ===============
- 
-    You can undo all the recent changes in the buffer text, up to a
- certain point.  Each buffer records changes individually, and the undo
- command always applies to the current buffer.  Usually each editing
- command makes a separate entry in the undo records, but some commands
- such as `query-replace' make many entries, and very simple commands
- such as self-inserting characters are often grouped to make undoing less
- tedious.
- 
- `C-x u'
-      Undo one batch of changes--usually, one command worth (`undo').
- 
- `C-_'
-      The same.
- 
-    The command `C-x u' or `C-_' is how you undo.  The first time you
- give this command, it undoes the last change.  Point moves back to
- where it was before the command that made the change.
- 
-    Consecutive repetitions of `C-_' or `C-x u' undo earlier and earlier
- changes, back to the limit of the undo information available.  If all
- recorded changes have already been undone, the undo command prints an
- error message and does nothing.
- 
-    Any command other than an undo command breaks the sequence of undo
- commands.  Starting from that moment, the previous undo commands become
- ordinary changes that you can undo.  Thus, to redo changes you have
- undone, type `C-f' or any other command that will harmlessly break the
- sequence of undoing, then type more undo commands.
- 
-    If you notice that a buffer has been modified accidentally, the
- easiest way to recover is to type `C-_' repeatedly until the stars
- disappear from the front of the mode line.  At this time, all the
- modifications you made have been canceled.  Whenever an undo command
- makes the stars disappear from the mode line, it means that the buffer
- contents are the same as they were when the file was last read in or
- saved.
- 
-    If you do not remember whether you changed the buffer deliberately,
- type `C-_' once.  When you see the last change you made undone, you
- will see whether it was an intentional change.  If it was an accident,
- leave it undone.  If it was deliberate, redo the change as described
- above.
- 
-    Not all buffers record undo information.  Buffers whose names start
- with spaces don't; these buffers are used internally by Emacs and its
- extensions to hold text that users don't normally look at or edit.
- 
-    You cannot undo mere cursor motion; only changes in the buffer
- contents save undo information.  However, some cursor motion commands
- set the mark, so if you use these commands from time to time, you can
- move back to the neighborhoods you have moved through by popping the
- mark ring (*note Mark Ring::.).
- 
-    When the undo information for a buffer becomes too large, Emacs
- discards the oldest undo information from time to time (during garbage
- collection).  You can specify how much undo information to keep by
- setting two variables: `undo-limit' and `undo-strong-limit'.  Their
- values are expressed in units of bytes of space.
- 
-    The variable `undo-limit' sets a soft limit: Emacs keeps undo data
- for enough commands to reach this size, and perhaps exceed it, but does
- not keep data for any earlier commands beyond that.  Its default value
- is 20000.  The variable `undo-strong-limit' sets a stricter limit: the
- command which pushes the size past this amount is itself forgotten.
- Its default value is 30000.
- 
-    Regardless of the values of those variables, the most recent change
- is never discarded, so there is no danger that garbage collection
- occurring right after an unintentional large change might prevent you
- from undoing it.
- 
-    The reason the `undo' command has two keys, `C-x u' and `C-_', set
- up to run it is that it is worthy of a single-character key, but on
- some keyboards it is not obvious how to type `C-_'.  `C-x u' is an
- alternative you can type straightforwardly on any terminal.
- 
- 
- File: emacs,  Node: Basic Files,  Next: Basic Help,  Prev: Undo,  Up: Basic
- 
- Files
- =====
- 
-    The commands described above are sufficient for creating and altering
- text in an Emacs buffer; the more advanced Emacs commands just make
- things easier.  But to keep any text permanently you must put it in a
- "file".  Files are named units of text which are stored by the
- operating system for you to retrieve later by name.  To look at or use
- the contents of a file in any way, including editing the file with
- Emacs, you must specify the file name.
- 
-    Consider a file named `/usr/rms/foo.c'.  In Emacs, to begin editing
- this file, type
- 
-      C-x C-f /usr/rms/foo.c RET
- 
- Here the file name is given as an "argument" to the command `C-x C-f'
- (`find-file').  That command uses the "minibuffer" to read the
- argument, and you type RET to terminate the argument (*note
- Minibuffer::.).
- 
-    Emacs obeys the command by "visiting" the file: creating a buffer,
- copying the contents of the file into the buffer, and then displaying
- the buffer for you to edit.  If you alter the text, you can "save" the
- new text in the file by typing `C-x C-s' (`save-buffer').  This makes
- the changes permanent by copying the altered buffer contents back into
- the file `/usr/rms/foo.c'.  Until you save, the changes exist only
- inside Emacs, and the file `foo.c' is unaltered.
- 
-    To create a file, just visit the file with `C-x C-f' as if it
- already existed.  This creates an empty buffer in which you can insert
- the text you want to put in the file.  The file is actually created when
- you save this buffer with `C-x C-s'.
- 
-    Of course, there is a lot more to learn about using files.  *Note
- Files::.
- 
- 
- File: emacs,  Node: Basic Help,  Next: Blank Lines,  Prev: Basic Files,  Up: Basic
- 
- Help
- ====
- 
-    If you forget what a key does, you can find out with the Help
- character, which is `C-h' (or F1, which is an alias for `C-h').  Type
- `C-h k' followed by the key you want to know about; for example, `C-h k
- C-n' tells you all about what `C-n' does.  `C-h' is a prefix key; `C-h
- k' is just one of its subcommands (the command `describe-key').  The
- other subcommands of `C-h' provide different kinds of help.  Type `C-h'
- twice to get a description of all the help facilities.  *Note Help::.
- 
- 
- File: emacs,  Node: Blank Lines,  Next: Continuation Lines,  Prev: Basic Help,  Up: Basic
- 
- Blank Lines
- ===========
- 
-    Here are special commands and techniques for putting in and taking
- out blank lines.
- 
- `C-o'
-      Insert one or more blank lines after the cursor (`open-line').
- 
- `C-x C-o'
-      Delete all but one of many consecutive blank lines
-      (`delete-blank-lines').
- 
-    When you want to insert a new line of text before an existing line,
- you can do it by typing the new line of text, followed by RET.
- However, it may be easier to see what you are doing if you first make a
- blank line and then insert the desired text into it.  This is easy to do
- using the key `C-o' (`open-line'), which inserts a newline after point
- but leaves point in front of the newline.  After `C-o', type the text
- for the new line.  `C-o F O O' has the same effect as `F O O RET',
- except for the final location of point.
- 
-    You can make several blank lines by typing `C-o' several times, or
- by giving it a numeric argument to tell it how many blank lines to make.
- *Note Arguments::, for how.  If you have a fill prefix, then `C-o'
- command inserts the fill prefix on the new line, when you use it at the
- beginning of a line.  *Note Fill Prefix::.
- 
-    The easy way to get rid of extra blank lines is with the command
- `C-x C-o' (`delete-blank-lines').  `C-x C-o' in a run of several blank
- lines deletes all but one of them.  `C-x C-o' on a solitary blank line
- deletes that blank line.  When point is on a nonblank line, `C-x C-o'
- deletes any blank lines following that nonblank line.
- 
- 
- File: emacs,  Node: Continuation Lines,  Next: Position Info,  Prev: Blank Lines,  Up: Basic
- 
- Continuation Lines
- ==================
- 
-    If you add too many characters to one line without breaking it with
- RET, the line will grow to occupy two (or more) lines on the screen,
- with a `\' at the extreme right margin of all but the last of them.
- The `\' says that the following screen line is not really a distinct
- line in the text, but just the "continuation" of a line too long to fit
- the screen.  Continuation is also called "line wrapping".
- 
-    Sometimes it is nice to have Emacs insert newlines automatically when
- a line gets too long.  Continuation on the screen does not do that.  Use
- Auto Fill mode (*note Filling::.) if that's what you want.
- 
-    As an alternative to continuation, Emacs can display long lines by
- "truncation".  This means that all the characters that do not fit in
- the width of the screen or window do not appear at all.  They remain in
- the buffer, temporarily invisible.  `$' is used in the last column
- instead of `\' to inform you that truncation is in effect.
- 
-    Truncation instead of continuation happens whenever horizontal
- scrolling is in use, and optionally in all side-by-side windows (*note
- Windows::.).  You can enable truncation for a particular buffer by
- setting the variable `truncate-lines' to non-`nil' in that buffer.
- (*Note Variables::.)  Altering the value of `truncate-lines' makes it
- local to the current buffer; until that time, the default value is in
- effect.  The default is initially `nil'.  *Note Locals::.
- 
-    *Note Display Vars::, for additional variables that affect how text
- is displayed.
- 
--- 0 ----
Index: emacs/info/emacs-20
diff -c emacs/info/emacs-20:1.1.1.2 emacs/info/emacs-20:removed
*** emacs/info/emacs-20:1.1.1.2	Mon Jul 22 01:52:16 1996
--- emacs/info/emacs-20	Fri Aug  2 20:10:06 1996
***************
*** 1,1175 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Checklist,  Next: Sending Patches,  Prev: Understanding Bug Reporting,  Up: Bugs
- 
- Checklist for Bug Reports
- -------------------------
- 
-    The best way to send a bug report is to mail it electronically to the
- Emacs maintainers at `bug-gnu-emacs@prep.ai.mit.edu'.  (If you want to
- suggest a change as an improvement, use the same address.)
- 
-    If you'd like to read the bug reports, you can find them on the
- newsgroup `gnu.emacs.bug'; keep in mind, however, that as a spectator
- you should not criticize anything about what you see there.  The
- purpose of bug reports is to give information to the Emacs maintainers.
- Spectators are welcome only as long as they do not interfere with
- this.  In particular, some bug reports contain large amounts of data;
- spectators should not complain about this.
- 
-    Please do not post bug reports using netnews; mail is more reliable
- than netnews about reporting your correct address, which we may need in
- order to ask you for more information.
- 
-    If you can't send electronic mail, then mail the bug report on paper
- or machine-readable media to this address:
- 
- GNU Emacs Bugs
- Free Software Foundation
- 59 Temple Place, Suite 330
- Boston, MA 02111-1307 USA
- 
-    We do not promise to fix the bug; but if the bug is serious, or
- ugly, or easy to fix, chances are we will want to.
- 
-    To enable maintainers to investigate a bug, your report should
- include all these things:
- 
-    * The version number of Emacs.  Without this, we won't know whether
-      there is any point in looking for the bug in the current version
-      of GNU Emacs.
- 
-      You can get the version number by typing `M-x emacs-version RET'.
-      If that command does not work, you probably have something other
-      than GNU Emacs, so you will have to report the bug somewhere else.
- 
-    * The type of machine you are using, and the operating system name
-      and version number.  `M-x emacs-version RET' provides this
-      information too.  Copy its output from the `*Messages*' buffer, so
-      that you get it all and get it accurately.
- 
-    * The operands given to the `configure' command when Emacs was
-      installed.
- 
-    * A complete list of any modifications you have made to the Emacs
-      source.  (We may not have time to investigate the bug unless it
-      happens in an unmodified Emacs.  But if you've made modifications
-      and you don't tell us, you are sending us on a wild goose chase.)
- 
-      Be precise about these changes.  A description in English is not
-      enough--send a context diff for them.
- 
-      Adding files of your own, or porting to another machine, is a
-      modification of the source.
- 
-    * Details of any other deviations from the standard procedure for
-      installing GNU Emacs.
- 
-    * The complete text of any files needed to reproduce the bug.
- 
-      If you can tell us a way to cause the problem without visiting any
-      files, please do so.  This makes it much easier to debug.  If you
-      do need files, make sure you arrange for us to see their exact
-      contents.  For example, it can often matter whether there are
-      spaces at the ends of lines, or a newline after the last line in
-      the buffer (nothing ought to care whether the last line is
-      terminated, but try telling the bugs that).
- 
-    * The precise commands we need to type to reproduce the bug.
- 
-      The easy way to record the input to Emacs precisely is to to write
-      a dribble file.  To start the file, execute the Lisp expression
- 
-           (open-dribble-file "~/dribble")
- 
-      using `M-ESC' or from the `*scratch*' buffer just after starting
-      Emacs.  From then on, Emacs copies all your input to the specified
-      dribble file until the Emacs process is killed.
- 
-    * For possible display bugs, the terminal type (the value of
-      environment variable `TERM'), the complete termcap entry for the
-      terminal from `/etc/termcap' (since that file is not identical on
-      all machines), and the output that Emacs actually sent to the
-      terminal.
- 
-      The way to collect the terminal output is to execute the Lisp
-      expression
- 
-           (open-termscript "~/termscript")
- 
-      using `M-ESC' or from the `*scratch*' buffer just after starting
-      Emacs.  From then on, Emacs copies all terminal output to the
-      specified termscript file as well, until the Emacs process is
-      killed.  If the problem happens when Emacs starts up, put this
-      expression into your `.emacs' file so that the termscript file
-      will be open when Emacs displays the screen for the first time.
- 
-      Be warned: it is often difficult, and sometimes impossible, to fix
-      a terminal-dependent bug without access to a terminal of the type
-      that stimulates the bug.
- 
-    * A description of what behavior you observe that you believe is
-      incorrect.  For example, "The Emacs process gets a fatal signal,"
-      or, "The resulting text is as follows, which I think is wrong."
- 
-      Of course, if the bug is that Emacs gets a fatal signal, then one
-      can't miss it.  But if the bug is incorrect text, the maintainer
-      might fail to notice what is wrong.  Why leave it to chance?
- 
-      Even if the problem you experience is a fatal signal, you should
-      still say so explicitly.  Suppose something strange is going on,
-      such as, your copy of the source is out of sync, or you have
-      encountered a bug in the C library on your system.  (This has
-      happened!)  Your copy might crash and the copy here might not.  If
-      you *said* to expect a crash, then when Emacs here fails to crash,
-      we would know that the bug was not happening.  If you don't say to
-      expect a crash, then we would not know whether the bug was
-      happening--we would not be able to draw any conclusion from our
-      observations.
- 
-    * If the manifestation of the bug is an Emacs error message, it is
-      important to report the precise text of the error message, and a
-      backtrace showing how the Lisp program in Emacs arrived at the
-      error.
- 
-      To get the error message text accurately, copy it from the
-      `*Messages*' buffer into the bug report.  Copy all of it, not just
-      part.
- 
-      To make a backtrace for the error, evaluate the Lisp expression
-      `(setq debug-on-error t)' before the error happens (that is to
-      say, you must execute that expression and then make the bug
-      happen).  This causes the error to run the Lisp debugger, which
-      shows you a backtrace.  Copy the text of the debugger's backtrace
-      into the bug report.
- 
-      This use of the debugger is possible only if you know how to make
-      the bug happen again.  If you can't make it happen again, at least
-      copy the whole error message.
- 
-    * Check whether any programs you have loaded into the Lisp world,
-      including your `.emacs' file, set any variables that may affect the
-      functioning of Emacs.  Also, see whether the problem happens in a
-      freshly started Emacs without loading your `.emacs' file (start
-      Emacs with the `-q' switch to prevent loading the init file.)  If
-      the problem does *not* occur then, you must report the precise
-      contents of any programs that you must load into the Lisp world in
-      order to cause the problem to occur.
- 
-    * If the problem does depend on an init file or other Lisp programs
-      that are not part of the standard Emacs system, then you should
-      make sure it is not a bug in those programs by complaining to
-      their maintainers first.  After they verify that they are using
-      Emacs in a way that is supposed to work, they should report the
-      bug.
- 
-    * If you wish to mention something in the GNU Emacs source, show the
-      line of code with a few lines of context.  Don't just give a line
-      number.
- 
-      The line numbers in the development sources don't match those in
-      your sources.  It would take extra work for the maintainers to
-      determine what code is in your version at a given line number, and
-      we could not be certain.
- 
-    * Additional information from a C debugger such as GDB might enable
-      someone to find a problem on a machine which he does not have
-      available.  If you don't know how to use GDB, please read the GDB
-      manual--it is not very long, and using GDB is easy.  You can find
-      the GDB distribution, including the GDB manual in online form, in
-      most of the same places you can find the Emacs distribution.
- 
-      However, you need to think when you collect the additional
-      information if you want it to show what causes the bug.
- 
-      For example, many people send just a backtrace, but that is not
-      very useful by itself.  A simple backtrace with arguments often
-      conveys little about what is happening inside GNU Emacs, because
-      most of the arguments listed in the backtrace are pointers to Lisp
-      objects.  The numeric values of these pointers have no
-      significance whatever; all that matters is the contents of the
-      objects they point to (and most of the contents are themselves
-      pointers).
- 
-      To provide useful information, you need to show the values of Lisp
-      objects in Lisp notation.  Do this for each variable which is a
-      Lisp object, in several stack frames near the bottom of the stack.
-      Look at the source to see which variables are Lisp objects,
-      because the debugger thinks of them as integers.
- 
-      To show a variable's value in Lisp syntax, first print its value,
-      then use the user-defined GDB command `pr' to print the Lisp
-      object in Lisp syntax.  (If you must use another debugger, call
-      the function `debug_print' with the object as an argument.)  The
-      `pr' command is defined by the file `.gdbinit' in the `src'
-      subdirectory, and it works only if you are debugging a running
-      process (not with a core dump).
- 
-      To make Lisp errors stop Emacs and return to GDB, put a breakpoint
-      at `Fsignal'.
- 
-      To find out which Lisp functions are running, using GDB, move up
-      the stack, and each time you get to a frame for the function
-      `Ffuncall', type these GDB commands:
- 
-           p *args
-           pr
- 
-      To print the first argument that the function received, use these
-      commands:
- 
-           p args[1]
-           pr
- 
-      You can print the other arguments likewise.  The argument `nargs'
-      of `Ffuncall' says how many arguments `Ffuncall' received; these
-      include the Lisp function itself and the arguments for that
-      function.
- 
-    * If the symptom of the bug is that Emacs fails to respond, don't
-      assume Emacs is "hung"--it may instead be in an infinite loop.  To
-      find out which, make the problem happen under GDB and stop Emacs
-      once it is not responding.  (If Emacs is using X Windows directly,
-      you can stop Emacs by typing `C-c' at the GDB job.)  Then try
-      stepping with `step'.  If Emacs is hung, the `step' command won't
-      return.  If it is looping, `step' will return.
- 
-      If this shows Emacs is hung in a system call, stop it again and
-      examine the arguments of the call.  In your bug report, state
-      exactly where in the source the system call is, and what the
-      arguments are.
- 
-      If Emacs is in an infinite loop, please determine where the loop
-      starts and ends.  The easiest way to do this is to use the GDB
-      command `finish'.  Each time you use it, Emacs resumes execution
-      until it exits one stack frame.  Keep typing `finish' until it
-      doesn't return--that means the infinite loop is in the stack frame
-      which you just tried to finish.
- 
-      Stop Emacs again, and use `finish' repeatedly again until you get
-      *back to* that frame.  Then use `next' to step through that frame.
-      By stepping, you will see where the loop starts and ends.  Also
-      please examine the data being used in the loop and try to
-      determine why the loop does not exit when it should.  Include all
-      of this information in your bug report.
- 
-    Here are some things that are not necessary in a bug report:
- 
-    * A description of the envelope of the bug--this is not necessary
-      for a reproducible bug.
- 
-      Often people who encounter a bug spend a lot of time investigating
-      which changes to the input file will make the bug go away and which
-      changes will not affect it.
- 
-      This is often time consuming and not very useful, because the way
-      we will find the bug is by running a single example under the
-      debugger with breakpoints, not by pure deduction from a series of
-      examples.  You might as well save time by not searching for
-      additional examples.
- 
-      Of course, if you can find a simpler example to report *instead* of
-      the original one, that is a convenience.  Errors in the output
-      will be easier to spot, running under the debugger will take less
-      time, etc.
- 
-      However, simplification is not vital; if you can't do this or
-      don't have time to try, please report the bug with your original
-      test case.
- 
-    * A system call trace of Emacs execution.
- 
-      System call traces are very useful for certain special kinds of
-      debugging, but in most cases they give little useful information.
-      It is therefore strange that many people seem to think that *the*
-      way to report information about a crash is to send a system call
-      trace.
- 
-      In most programs, a backtrace is normally far, far more
-      informative than a system call trace.  Even in Emacs, a simple
-      backtrace is generally more informative, though to give full
-      information you should supplement the backtrace by displaying
-      variable values and printing them as Lisp objects with `pr' (see
-      above).
- 
-    * A patch for the bug.
- 
-      A patch for the bug is useful if it is a good one.  But don't omit
-      the other information that a bug report needs, such as the test
-      case, on the assumption that a patch is sufficient.  We might see
-      problems with your patch and decide to fix the problem another
-      way, or we might not understand it at all.  And if we can't
-      understand what bug you are trying to fix, or why your patch
-      should be an improvement, we mustn't install it.
- 
-      *Note Sending Patches::, for guidelines on how to make it easy for
-      us to understand and install your patches.
- 
-    * A guess about what the bug is or what it depends on.
- 
-      Such guesses are usually wrong.  Even experts can't guess right
-      about such things without first using the debugger to find the
-      facts.
- 
- 
- File: emacs,  Node: Sending Patches,  Prev: Checklist,  Up: Bugs
- 
- Sending Patches for GNU Emacs
- -----------------------------
- 
-    If you would like to write bug fixes or improvements for GNU Emacs,
- that is very helpful.  When you send your changes, please follow these
- guidelines to make it easy for the maintainers to use them.  If you
- don't follow these guidelines, your information might still be useful,
- but using it will take extra work.  Maintaining GNU Emacs is a lot of
- work in the best of circumstances, and we can't keep up unless you do
- your best to help.
- 
-    * Send an explanation with your changes of what problem they fix or
-      what improvement they bring about.  For a bug fix, just include a
-      copy of the bug report, and explain why the change fixes the bug.
- 
-      (Referring to a bug report is not as good as including it, because
-      then we will have to look it up, and we have probably already
-      deleted it if we've already fixed the bug.)
- 
-    * Always include a proper bug report for the problem you think you
-      have fixed.  We need to convince ourselves that the change is
-      right before installing it.  Even if it is correct, we might have
-      trouble understanding it if we don't have a way to reproduce the
-      problem.
- 
-    * Include all the comments that are appropriate to help people
-      reading the source in the future understand why this change was
-      needed.
- 
-    * Don't mix together changes made for different reasons.  Send them
-      *individually*.
- 
-      If you make two changes for separate reasons, then we might not
-      want to install them both.  We might want to install just one.  If
-      you send them all jumbled together in a single set of diffs, we
-      have to do extra work to disentangle them--to figure out which
-      parts of the change serve which purpose.  If we don't have time
-      for this, we might have to ignore your changes entirely.
- 
-      If you send each change as soon as you have written it, with its
-      own explanation, then two changes never get tangled up, and we can
-      consider each one properly without any extra work to disentangle
-      them.
- 
-    * Send each change as soon as that change is finished.  Sometimes
-      people think they are helping us by accumulating many changes to
-      send them all together.  As explained above, this is absolutely
-      the worst thing you could do.
- 
-      Since you should send each change separately, you might as well
-      send it right away.  That gives us the option of installing it
-      immediately if it is important.
- 
-    * Use `diff -c' to make your diffs.  Diffs without context are hard
-      to install reliably.  More than that, they are hard to study; we
-      must always study a patch to decide whether we want to install it.
-      Unidiff format is better than contextless diffs, but not as easy
-      to read as `-c' format.
- 
-      If you have GNU diff, use `diff -c -F'^[_a-zA-Z0-9$]+ *('' when
-      making diffs of C code.  This shows the name of the function that
-      each change occurs in.
- 
-    * Write the change log entries for your changes.  This is both to
-      save us the extra work of writing them, and to help explain your
-      changes so we can understand them.
- 
-      The purpose of the change log is to show people where to find what
-      was changed.  So you need to be specific about what functions you
-      changed; in large functions, it's often helpful to indicate where
-      within the function the change was.
- 
-      On the other hand, once you have shown people where to find the
-      change, you need not explain its purpose in the change log.  Thus,
-      if you add a new function, all you need to say about it is that it
-      is new.  If you feel that the purpose needs explaining, it
-      probably does--but put the explanation in comments in the code.
-      It will be more useful there.
- 
-      Please read the `ChangeLog' files in the `src' and `lisp'
-      directories to see what sorts of information to put in, and to
-      learn the style that we use.  If you would like your name to
-      appear in the header line, showing who made the change, send us
-      the header line.  *Note Change Log::.
- 
-    * When you write the fix, keep in mind that we can't install a
-      change that would break other systems.  Please think about what
-      effect your change will have if compiled on another type of system.
- 
-      Sometimes people send fixes that *might* be an improvement in
-      general--but it is hard to be sure of this.  It's hard to install
-      such changes because we have to study them very carefully.  Of
-      course, a good explanation of the reasoning by which you concluded
-      the change was correct can help convince us.
- 
-      The safest changes are changes to the configuration files for a
-      particular machine.  These are safe because they can't create new
-      bugs on other machines.
- 
-      Please help us keep up with the workload by designing the patch in
-      a form that is clearly safe to install.
- 
- 
- File: emacs,  Node: Service,  Next: Command Arguments,  Prev: Bugs,  Up: Top
- 
- How To Get Help with GNU Emacs
- ==============================
- 
-    If you need help installing, using or changing GNU Emacs, there are
- two ways to find it:
- 
-    * Send a message to the mailing list
-      `help-gnu-emacs@prep.ai.mit.edu', or post your request on
-      newsgroup `gnu.emacs.help'.  (This mailing list and newsgroup
-      interconnect, so it does not matter which one you use.)
- 
-    * Look in the service directory for someone who might help you for a
-      fee.  The service directory is found in the file named
-      `etc/SERVICE' in the Emacs distribution.
- 
- 
- File: emacs,  Node: Command Arguments,  Next: Antinews,  Prev: Service,  Up: Top
- 
- Command Line Arguments
- **********************
- 
-    GNU Emacs supports command line arguments to request various actions
- when invoking Emacs.  These are for compatibility with other editors and
- for sophisticated activities.  We don't recommend using them for
- ordinary editing.
- 
-    Arguments starting with `-' are "options".  Other arguments specify
- files to visit.  Emacs visits the specified files while it starts up.
- The last file name on your command line becomes the current buffer; the
- other files are also present in other buffers.
- 
-    You can use options to specify various other things, such as the size
- and position of the X window Emacs uses, its colors, and so on.  A few
- options support advanced usage, such as running Lisp functions on files
- in batch mode.  The sections of this chapter describe the available
- options, arranged according to their purpose.
- 
-    There are two ways of writing options: the short forms that start
- with a single `-', and the long forms that start with `--'.  For
- example, `-d' is a short form and `--display' is the corresponding long
- form.
- 
-    The long forms with `--' are easier to remember, but longer to type.
- However, you don't have to spell out the whole option name; any
- unambiguous abbreviation is enough.  When a long option takes an
- argument, you can use either a space or an equal sign to separate the
- option name and the argument.  Thus, you can write either `--display
- sugar-bombs:0.0' or `--display=sugar-bombs:0.0'.  We recommend an equal
- sign because it makes the relationship clearer, and the tables below
- always show an equal sign.
- 
-    Most options specify how to initialize Emacs, or set parameters for
- the Emacs session.  We call them "initial options".  A few options
- specify things to do: for example, load libraries, call functions, or
- exit Emacs.  These are called "action options".  These and file names
- together are called "action arguments".  Emacs processes all the action
- arguments in the order they are written.
- 
- * Menu:
- 
- * Action Arguments::	Arguments to visit files, load libraries,
- 			  and call functions.
- * Initial Options::     Arguments that take effect while starting Emacs.
- * Command Example::     Examples of using command line arguments.
- * Resume Arguments::	Specifying arguments when you resume a running Emacs.
- * Environment::         Environment variables that Emacs uses.
- 
- * Display X::           Changing the default display and using remote login.
- * Font X::	        Choosing a font for text, under X.
- * Colors X::	        Choosing colors, under X.
- * Window Size X::       Start-up window size, under X.
- * Borders X::	        Internal and external borders, under X.
- * Icons X::             Choosing what sort of icon to use, under X.
- * Resources X::         Advanced use of classes and resources, under X.
- * Lucid Resources::     X resources for Lucid menus.
- * Motif Resources::     X resources for Motif menus.
- 
- 
- File: emacs,  Node: Action Arguments,  Next: Initial Options,  Up: Command Arguments
- 
- Action Arguments
- ================
- 
-    Here is a table of the action arguments and options:
- 
- `FILE'
-      Visit FILE using `find-file'.  *Note Visiting::.
- 
- `+LINENUM FILE'
-      Visit FILE using `find-file', then go to line number LINENUM in it.
- 
- `-l FILE'
- `--load=FILE'
-      Load a file FILE of Lisp code with the function `load'.  *Note
-      Lisp Libraries::.
- 
- `-f FUNCTION'
- `--funcall=FUNCTION'
-      Call Lisp function FUNCTION with no arguments.
- 
- `--insert=FILE'
-      Insert the contents of FILE into the current buffer.  This is like
-      what `M-x insert-file' does.  *Note Misc File Ops::.
- 
- `--kill'
-      Exit from Emacs without asking for confirmation.
- 
-    The init file can access the values of the action arguments as the
- elements of a list in the variable `command-line-args'.  The init file
- can override the normal processing of the action arguments, or define
- new ones, by reading and setting this variable.
- 
- 
- File: emacs,  Node: Initial Options,  Next: Command Example,  Prev: Action Arguments,  Up: Command Arguments
- 
- Initial Options
- ===============
- 
-    The initial options specify parameter for the Emacs session.  This
- section describes the more general initial options; some other options
- specifically related to X Windows appear in the following sections.
- 
-    Some initial options affect the loading of init files.  The normal
- actions of Emacs are to first load `site-start.el' if it exists, then
- your own init file `~/.emacs' if it exists, and finally `default.el' if
- it exists; certain options prevent loading of some of these files or
- substitute other files for them.
- 
- `-t DEVICE'
- `--terminal=DEVICE'
-      Use DEVICE as the device for terminal input and output.
- 
- `-d DISPLAY'
- `--display=DISPLAY'
-      Use the X Window System and use the display named DISPLAY to open
-      the initial Emacs frame.
- 
- `-nw'
- `--no-windows'
-      Don't communicate directly with X, disregarding the `DISPLAY'
-      environment variable even if it is set.
- 
- `-batch'
- `--batch'
-      Run Emacs in "batch mode", which means that the text being edited
-      is not displayed and the standard terminal interrupt characters
-      such as `C-z' and `C-c' continue to have their normal effect.
-      Emacs in batch mode outputs to `stderr' only what would normally
-      be printed in the echo area under program control.
- 
-      Batch mode is used for running programs written in Emacs Lisp from
-      shell scripts, makefiles, and so on.  Normally the `-l' option or
-      `-f' option will be used as well, to invoke a Lisp program to do
-      the batch processing.
- 
-      `-batch' implies `-q' (do not load an init file).  It also causes
-      Emacs to kill itself after all command options have been
-      processed.  In addition, auto-saving is not done except in buffers
-      for which it has been explicitly requested.
- 
- `-q'
- `--no-init-file'
-      Do not load your Emacs init file `~/.emacs', or `default.el'
-      either.
- 
- `--no-site-file'
-      Do not load `site-start.el'.  The options `-q', `-u' and `-batch'
-      have no effect on the loading of this file--this is the only
-      option that blocks it.
- 
- `-u USER'
- `--user=USER'
-      Load USER's Emacs init file `~USER/.emacs' instead of your own.
- 
- `--debug-init'
-      Enable the Emacs Lisp debugger for errors in the init file.
- 
- 
- File: emacs,  Node: Command Example,  Next: Resume Arguments,  Prev: Initial Options,  Up: Command Arguments
- 
- Command Argument Example
- ========================
- 
-    Here is an example of using Emacs with arguments and options.  It
- assumes you have a Lisp program file called `hack-c.el' which, when
- loaded, performs some useful operation on current buffer, expected to be
- a C program.
- 
-      emacs -batch foo.c -l hack-c -f save-buffer >& log
- 
- This says to visit `foo.c', load `hack-c.el' (which makes changes in
- the visited file), save `foo.c' (note that `save-buffer' is the
- function that `C-x C-s' is bound to), and then exit back to the shell
- (because of `-batch').  `-batch' also guarantees there will be no
- problem redirecting output to `log', because Emacs will not assume that
- it has a display terminal to work with.
- 
- 
- File: emacs,  Node: Resume Arguments,  Next: Environment,  Prev: Command Example,  Up: Command Arguments
- 
- Resuming Emacs with Arguments
- =============================
- 
-    You can specify action arguments for Emacs when you resume it after
- a suspension.  To prepare for this, put the following code in your
- `.emacs' file (*note Hooks::.):
- 
-      (add-hook 'suspend-hook 'resume-suspend-hook)
- 
-    As further preparation, you must execute the shell script
- `emacs.csh' (if you use csh as your shell) or `emacs.bash' (if you use
- bash as your shell).  These scripts define an alias named `edit', which
- will resume Emacs giving it new command line arguments such as files to
- visit.
- 
-    Only action arguments work properly when you resume Emacs.  Initial
- arguments are not recognized--it's too late to execute them anyway.
- 
-    Note that resuming Emacs (with or without arguments) must be done
- from within the shell that is the parent of the Emacs job.  This is why
- `edit' is an alias rather than a program or a shell script.  It is not
- possible to implement a resumption command that could be run from other
- subjobs of the shell; no way to define a command that could be made the
- value of `EDITOR', for example.  Therefore, this feature does not take
- the place of the Emacs Server feature (*note Emacs Server::.).
- 
-    The aliases use the Emacs Server feature if you appear to have a
- server Emacs running.  However, they cannot determine this with complete
- accuracy.  They may think that a server is still running when in
- actuality you have killed that Emacs, because the file `/tmp/.esrv...'
- still exists.  If this happens, find that file and delete it.
- 
- 
- File: emacs,  Node: Environment,  Next: Display X,  Prev: Resume Arguments,  Up: Command Arguments
- 
- Environment Variables
- =====================
- 
-    This appendix describes how Emacs uses environment variables.  An
- environment variable is a string passed from the operating system to
- Emacs, and the collection of environment variables is known as the
- environment.  Environment variable names are case sensitive and it is
- conventional to use upper case letters only.
- 
-    Because environment variables come from the operating system there
- is no general way to set them; it depends on the operating system and
- especially the shell that you are using.  For example, here's how to set
- the environment variable `ORGANIZATION' to `not very much' using bash:
- 
-      export ORGANIZATION="not very much"
- 
- and here's how to do it in csh or tcsh:
- 
-      setenv ORGANIZATION "not very much"
- 
-    When Emacs is set-up to use the X windowing system, it inherits the
- use of a large number of environment variables from the X library.  See
- the X documentation for more information.
- 
- * Menu:
- 
- * General Variables::     Environment variables that all versions of Emacs use.
- * Misc Variables::        Certain system specific variables.
- 
- 
- File: emacs,  Node: General Variables,  Next: Misc Variables,  Up: Environment
- 
- General Variables
- -----------------
- 
- `AUTHORCOPY'
-      The name of a file used to archive news articles posted with the
-      GNUS package.
- 
- `CDPATH'
-      Used by the `cd' command.
- 
- `DOMAINNAME'
-      The name of the internet domain that the machine running Emacs is
-      located in.  Used by the GNUS package.
- 
- `EMACSDATA'
-      Used to initialize the variable `data-directory' used to locate the
-      architecture-independent files that come with Emacs.  Setting this
-      variable overrides the setting in `paths.h' when Emacs was built.
- 
- `EMACSLOADPATH'
-      A colon-separated list of directories from which to load Emacs Lisp
-      files.  Setting this variable overrides the setting in `paths.h'
-      when Emacs was built.
- 
- `EMACSLOCKDIR'
-      The directory that Emacs places lock files--files used to protect
-      users from editing the same files simultaneously.  Setting this
-      variable overrides the setting in `paths.h' when Emacs was built.
- 
- `EMACSPATH'
-      The location of Emacs-specific binaries.  Setting this variable
-      overrides the setting in `paths.h' when Emacs was built.
- 
- `ESHELL'
-      Used for shell-mode to override the `SHELL' environment variable.
- 
- `HISTFILE'
-      The name of the file that shell commands are saved in between
-      logins.  This variable defaults to `~/.history' if you use (t)csh
-      as shell, to `~/.bash_history' if you use bash, to `~/.sh_history'
-      if you use ksh, and to `~/.history' otherwise.
- 
- `HOME'
-      The location of the user's files in the directory tree; used for
-      expansion of file names starting with a tilde (`~').  On MS-DOS, it
-      defaults to the directory from which Emacs was started, with `/bin'
-      removed from the end if it was present.
- 
- `HOSTNAME'
-      The name of the machine that Emacs is running on.
- 
- `INCPATH'
-      A colon-separated list of directories.  Used by the `complete'
-      package to search for files.
- 
- `INFOPATH'
-      A colon separated list of directories holding info files.  Setting
-      this variable overrides the setting in `paths.el' when Emacs was
-      built.
- 
- `LOGNAME'
-      The user's login name.  See also `USER'.
- 
- `MAIL'
-      The name of the user's system mail box.
- 
- `MAILRC'
-      Name of file containing mail aliases.  This defaults to
-      `~/.mailrc'.
- 
- `MH'
-      Name of setup file for the mh system.  This defaults to
-      `~/.mh_profile'.
- 
- `NAME'
-      The real-world name of the user.
- 
- `NNTPSERVER'
-      The name of the news server.  Used by the mh and GNUS packages.
- 
- `ORGANIZATION'
-      The name of the organization to which you belong.  Used for
-      setting the `Organization:' header in your posts from the GNUS
-      package.
- 
- `PATH'
-      A colon-separated list of directories in which executables reside.
-      (On MS-DOS, it is semicolon-separated instead.)  This variable is
-      used to set the Emacs Lisp variable `exec-path' which you should
-      consider to use instead.
- 
- `PWD'
-      If set, this should be the default directory when Emacs was
-      started.
- 
- `REPLYTO'
-      If set, this specifies an initial value for the variable
-      `mail-default-reply-to'.  *Note Mail Headers::.
- 
- `SAVEDIR'
-      The name of a directory in which news articles are saved by
-      default.  Used by the GNUS package.
- 
- `SHELL'
-      The name of an interpreter used to parse and execute programs run
-      from inside Emacs.
- 
- `TERM'
-      The name of the terminal that Emacs is running on.  The variable
-      must be set unless Emacs is run in batch mode.  On MS-DOS, it
-      defaults to `internal', which specifies a built-in terminal
-      emulation that handles the machine's own display.
- 
- `TERMCAP'
-      The name of the termcap library file describing how to program the
-      terminal specified by the `TERM' variable.  This defaults to
-      `/etc/termcap'.
- 
- `TMPDIR'
-      Used by the Emerge package as a prefix for temporary files.
- 
- `TZ'
-      This specifies the current time zone and possibly also daylight
-      savings information.  On MS-DOS, the default is based on country
-      code; see the file `msdos.c' for details.
- 
- `USER'
-      The user's login name.  See also `LOGNAME'.  On MS-DOS, this
-      defaults to `root'.
- 
- `VERSION_CONTROL'
-      Used to initialize the `version-control' variable (*note Backup
-      Names::.).
- 
- 
- File: emacs,  Node: Misc Variables,  Prev: General Variables,  Up: Environment
- 
- Misc Variables
- --------------
- 
-    These variables are used only on particular configurations:
- 
- `COMSPEC'
-      On MS-DOS, the name of the command interpreter to use.  This is
-      used to make a default value for the `SHELL' environment variable.
- 
- `NAME'
-      On MS-DOS, this variable defaults to the value of the `USER'
-      variable.
- 
- `TEMP'
- `TMP'
-      On MS-DOS, these specify the name of the directory for storing
-      temporary files in.
- 
- `WINDOW_GFX'
-      Used when initializing the Sun windows system.
- 
- 
- File: emacs,  Node: Display X,  Next: Font X,  Prev: Environment,  Up: Command Arguments
- 
- Specifying the Display Name
- ===========================
- 
-    The environment variable `DISPLAY' tells all X clients, including
- Emacs, where to display their windows.  Its value is set up by default
- in ordinary circumstances, when you start an X server and run jobs
- locally.  Occasionally you may need to specify the display yourself; for
- example, if you do a remote login and want to run a client program
- remotely, displaying on your local screen.
- 
-    With Emacs, the main reason people change the default display is to
- let them log into another system, run Emacs on that system, but have the
- window displayed at their local terminal.  You might need to use login
- to another system because the files you want to edit are there, or
- because the Emacs executable file you want to run is there.
- 
-    The syntax of the `DISPLAY' environment variable is
- `HOST:DISPLAY.SCREEN', where HOST is the host name of the X Window
- System server machine, DISPLAY is an arbitrarily-assigned number that
- distinguishes your server (X terminal) from other servers on the same
- machine, and SCREEN is a rarely-used field that allows an X server to
- control multiple terminal screens.  The period and the SCREEN field are
- optional.  If included, SCREEN is usually zero.
- 
-    For example, if your host is named `glasperle' and your server is
- the first (or perhaps the only) server listed in the configuration, your
- `DISPLAY' is `glasperle:0.0'.
- 
-    You can specify the display name explicitly when you run Emacs,
- either by changing the `DISPLAY' variable, or with the option `-d
- DISPLAY' or `--display=DISPLAY'.  Here is an example:
- 
-      emacs --display=glasperle:0 &
- 
-    You can inhibit the direct use of X with the `-nw' option.  This is
- also an initial option.  It tells Emacs to display using ordinary ASCII
- on its controlling terminal.
- 
-    Sometimes, security arrangements prevent a program on a remote system
- from displaying on your local system.  In this case, trying to run Emacs
- produces messages like this:
- 
-      Xlib:  connection to "glasperle:0.0" refused by server
- 
- You might be able to overcome this problem by using the `xhost' command
- on the local system to give permission for access from your remote
- machine.
- 
- 
- File: emacs,  Node: Font X,  Next: Colors X,  Prev: Display X,  Up: Command Arguments
- 
- Font Specification Options
- ==========================
- 
-    By default, Emacs displays text in the font named `9x15', which
- makes each character nine pixels wide and fifteen pixels high.  You can
- specify a different font on your command line through the option `-fn
- NAME'.
- 
- `-fn NAME'
-      Use font NAME as the default font.
- 
- `--font=NAME'
-      `--font' is an alias for `-fn'.
- 
-    Under X, each font has a long name which consists of eleven words or
- numbers, separated by dashes.  Some fonts also have shorter
- nicknames--`9x15' is such a nickname.  You can use either kind of name.
- You can use wild card patterns for the font name; then Emacs lets X
- choose one of the fonts that match the pattern.  Here is an example,
- which happens to specify the font whose nickname is `6x13':
- 
-      emacs -fn "-misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1" &
- 
- You can also specify the font in your `.Xdefaults' file:
- 
-      emacs.font: -misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1
- 
-    A long font name has the following form:
- 
-      -MAKER-FAMILY-WEIGHT-SLANT-WIDTHTYPE-STYLE...
-      ...-PIXELS-HEIGHT-HORIZ-VERT-SPACING-WIDTH-CHARSET
- 
- FAMILY
-      This is the name of the font family-for example, `courier'.
- 
- WEIGHT
-      This is normally `bold', `medium' or `light'.  Other words may
-      appear here in some font names.
- 
- SLANT
-      This is `r' (roman), `i' (italic), `o' (oblique), `ri' (reverse
-      italic), or `ot' (other).
- 
- WIDTHTYPE
-      This is normally `condensed', `extended', `semicondensed' or
-      `normal'.  Other words may appear here in some font names.
- 
- STYLE
-      This is an optional additional style name.  Usually it is
-      empty--most long font names have two hyphens in a row at this
-      point.
- 
- PIXELS
-      This is the font height, in pixels.
- 
- HEIGHT
-      This is the font height on the screen, measured in printer's points
-      (approximately 1/72 of an inch), times ten.  For a given vertical
-      resolution, HEIGHT and PIXELS are proportional; therefore, it is
-      common to specify just one of them and use `*' for the other.
- 
- HORIZ
-      This is the horizontal resolution, in pixels per inch, of the
-      screen for which the font is intended.
- 
- VERT
-      This is the vertical resolution, in dots per inch, of the screen
-      for which the font is intended.  Normally the resolution of the
-      fonts on your system is the right value for your screen;
-      therefore, you normally specify `*' for this and HORIZ.
- 
- SPACING
-      This is `m' (monospace), `p' (proportional) or `c' (character
-      cell).  Emacs can use `m' and `c' fonts.
- 
- WIDTH
-      This is the average character width, in pixels, times ten.
- 
- CHARSET
-      This is the character set that the font depicts.  Normally you
-      should use `iso8859-1'.
- 
-    Use only fixed width fonts--that is, fonts in which all characters
- have the same width; Emacs cannot yet handle display properly for
- variable width fonts.  Any font with `m' or `c' in the SPACING field of
- the long name is a fixed width font.  Here's how to use the `xlsfonts'
- program to list all the fixed width fonts available on your system:
- 
-      xlsfonts -fn '*x*'
-      xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-m*'
-      xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-c*'
- 
- To see what a particular font looks like, use the `xfd' command.  For
- example:
- 
-      xfd -fn 6x13
- 
- displays the entire font `6x13'.
- 
-    While running Emacs, you can set the font of the current frame
- (*note Frame Parameters::.) or for a specific kind of text (*note
- Faces::.).
- 
- 
- File: emacs,  Node: Colors X,  Next: Window Size X,  Prev: Font X,  Up: Command Arguments
- 
- Window Color Options
- ====================
- 
-    On a color display, you can specify which color to use for various
- parts of the Emacs display.  To find out what colors are available on
- your system, look at the `/usr/lib/X11/rgb.txt' file.  If you do not
- specify colors, the default for the background is white and the default
- for all other colors is black.  On a monochrome display, the foreground
- is black, the background is white, and the border is gray if the
- display supports that.
- 
-    Here is a list of the options for specifying colors:
- 
- `-fg COLOR'
- `--foreground-color=COLOR'
-      Specify the foreground color.
- 
- `-bg COLOR'
- `--background-color=COLOR'
-      Specify the background color.
- 
- `-bd COLOR'
- `--border-color=COLOR'
-      Specify the color of the border of the X window.
- 
- `-cr COLOR'
- `--cursor-color=COLOR'
-      Specify the color of the Emacs cursor which indicates where point
-      is.
- 
- `-ms COLOR'
- `--mouse-color=COLOR'
-      Specify the color for the mouse cursor when the mouse is in the
-      Emacs window.
- 
- `-r'
- `--reverse-video'
-      Reverse video--swap the foreground and background colors.
- 
-    For example, to use a coral mouse cursor and a slate blue text
- cursor, enter:
- 
-      emacs -ms coral -cr 'slate blue' &
- 
-    You can reverse the foreground and background colors through the
- `-r' option or with the X resource `reverseVideo'.
- 
- 
- File: emacs,  Node: Window Size X,  Next: Borders X,  Prev: Colors X,  Up: Command Arguments
- 
- Options for Window Geometry
- ===========================
- 
-    The `-geometry' option controls the size and position of the initial
- Emacs frame.  Here is the format for specifying the window geometry:
- 
- `-g WIDTHxHEIGHT{+-}XOFFSET{+-}YOFFSET'
-      Specify window size WIDTH and HEIGHT (measured in character
-      columns and lines), and positions XOFFSET and YOFFSET (measured in
-      pixels).
- 
- `--geometry=WIDTHxHEIGHT{+-}XOFFSET{+-}YOFFSET'
-      This is another way of writing the same thing.
- 
- `{+-}' means either a plus sign or a minus sign.  A plus sign before
- XOFFSET means it is the distance from the left side of the screen; a
- minus sign means it counts from the right side.  A plus sign before
- YOFFSET means it is the distance from the top of the screen, and a
- minus sign there indicates the distance from the bottom.  The values
- XOFFSET and YOFFSET may themselves be positive or negative, but that
- doesn't change their meaning, only their direction.
- 
-    Emacs uses the same units as `xterm' does to interpret the geometry.
- The WIDTH and HEIGHT are measured in characters, so a large font
- creates a larger frame than a small font.  The XOFFSET and YOFFSET are
- measured in pixels.
- 
-    Since the mode line and the echo area occupy the last 2 lines of the
- frame, the height of the initial text window is 2 less than the height
- specified in your geometry.  In non-X-toolkit versions of Emacs, the
- menu bar also takes one line of the specified number.
- 
-    You do not have to specify all of the fields in the geometry
- specification.
- 
-    If you omit both XOFFSET and YOFFSET, the window manager decides
- where to put the Emacs frame, possibly by letting you place it with the
- mouse.  For example, `164x55' specifies a window 164 columns wide,
- enough for two ordinary width windows side by side, and 55 lines tall.
- 
-    The default width for Emacs is 80 characters and the default height
- is 40 lines.  You can omit either the width or the height or both.  If
- you start the geometry with an integer, Emacs interprets it as the
- width.  If you start with an `x' followed by an integer, Emacs
- interprets it as the height.  Thus, `81' specifies just the width;
- `x45' specifies just the height.
- 
-    If you start with `+' or `-', that introduces an offset, which means
- both sizes are omitted.  Thus, `-3' specifies the XOFFSET only.  (If
- you give just one offset, it is always XOFFSET.)  `+3-3' specifies both
- the XOFFSET and the YOFFSET, placing the frame near the bottom left of
- the screen.
- 
-    You can specify a default for any or all of the fields in
- `.Xdefaults' file, and then override selected fields with a
- `--geometry' option.
- 
- 
- File: emacs,  Node: Borders X,  Next: Icons X,  Prev: Window Size X,  Up: Command Arguments
- 
- Internal and External Borders
- =============================
- 
-    An Emacs frame has an internal border and an external border.  The
- internal border is an extra strip of the background color around all
- four edges of the frame.  Emacs itself adds the internal border.  The
- external border is added by the window manager outside the internal
- border; it may contain various boxes you can click on to move or iconify
- the window.
- 
- `-ib WIDTH'
- `--internal-border=WIDTH'
-      Specify WIDTH as the width of the internal border.
- 
- `-bw WIDTH'
- `--border-width=WIDTH'
-      Specify WIDTH as the width of the main border.
- 
-    When you specify the size of the frame, that does not count the
- borders.  The frame's position is measured from the outside edge of the
- external border.
- 
-    Use the `-ib N' option to specify an internal border N pixels wide.
- The default is 1.  Use `-bw N' to specify the width of the external
- border (though the window manager may not pay attention to what you
- specify).  The default width of the external border is 2.
- 
- 
- File: emacs,  Node: Icons X,  Next: Resources X,  Prev: Borders X,  Up: Command Arguments
- 
- Icons
- =====
- 
-    Most window managers allow the user to "iconify" a frame, removing
- it from sight, and leaving a small, distinctive "icon" window in its
- place.  Clicking on the icon window makes the frame itself appear again.
- If you have many clients running at once, you can avoid cluttering up
- the screen by iconifying most of the clients.
- 
- `-i'
- `--icon-type'
-      Use a picture of a gnu as the Emacs icon.
- 
- `-iconic'
- `--iconic'
-      Start Emacs in iconified state.
- 
-    The `-i' or `--icon-type' option tells Emacs to use an icon window
- containing a picture of the GNU gnu.  If omitted, Emacs lets the window
- manager choose what sort of icon to use--usually just a small rectangle
- containing the frame's title.
- 
-    The `-iconic' option tells Emacs to begin running as an icon, rather
- than opening a frame right away.  In this situation, the icon window
- provides only indication that Emacs has started; the usual text frame
- doesn't appear until you deiconify it.
- 
--- 0 ----
Index: emacs/info/emacs-21
diff -c emacs/info/emacs-21:1.1.1.2 emacs/info/emacs-21:removed
*** emacs/info/emacs-21:1.1.1.2	Mon Jul 22 01:52:18 1996
--- emacs/info/emacs-21	Fri Aug  2 20:10:42 1996
***************
*** 1,933 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Resources X,  Next: Lucid Resources,  Prev: Icons X,  Up: Command Arguments
- 
- X Resources
- ===========
- 
-    Programs running under the X Window System organize their user
- options under a hierarchy of classes and resources.  You can specify
- default values for these options in your X resources file, usually named
- `~/.Xdefaults'.
- 
-    Each line in the file specifies a value for one option or for a
- collection of related options, for one program or for several programs
- (optionally even for all programs).
- 
-    Programs define named resources with particular meanings.  They also
- define how to group resources into named classes.  For instance, in
- Emacs, the `internalBorder' resource controls the width of the internal
- border, and the `borderWidth' resource controls the width of the
- external border.  Both of these resources are part of the `BorderWidth'
- class.  Case distinctions are significant in these names.
- 
-    In `~/.Xdefaults', you can specify a value for a single resource on
- one line, like this:
- 
-      emacs.borderWidth: 2
- 
- Or you can use a class name to specify the same value for all resources
- in that class.  Here's an example:
- 
-      emacs.BorderWidth: 2
- 
-    If you specify a value for a class, it becomes the default for all
- resources in that class.  You can specify values for individual
- resources as well; these override the class value, for those particular
- resources.  Thus, this example specifies 2 as the default width for all
- borders, but overrides this value with 4 for the external border:
- 
-      emacs.Borderwidth: 2
-      emacs.borderwidth: 4
- 
-    The order in which the lines appear in the file does not matter.
- Also, command-line options always override the X resources file.
- 
-    The string `emacs' in the examples above is also a resource name.
- It actually represents the name of the executable file that you invoke
- to run Emacs.  If Emacs is installed under a different name, it looks
- for resources under that name instead of `emacs'.
- 
-    When Emacs creates a new frame, it may or may not have a specified
- title.  The frame title, if specified, appears in window decorations and
- icons as the name of the frame.  It is also used (instead of the Emacs
- executable's name) to look up all the resources for that frame.  The
- option `-name' specifies a frame title for the initial frame.
- Subsequent frames normally have no specified frame title, but Lisp
- programs can specify a title when they create frames.
- 
- `-name NAME'
- `--name=NAME'
-      Use NAME as the title of the initial frame.
- 
- `-xrm RESOURCE-VALUES'
- `--xrm=RESOURCE-VALUES'
-      Specify X resource values for this Emacs job (see below).
- 
-    For consistency, `-name' also specifies the name to use for other
- resource values that do not belong to any particular frame.
- 
-    The resources that name Emacs invocations also belong to a class; its
- name is `Emacs'.  If you write `Emacs' instead of `emacs', the resource
- applies to all frames in all Emacs jobs, regardless of frame titles and
- regardless of the name of the executable file.  Here is an example:
- 
-      Emacs.BorderWidth: 2
-      Emacs.borderWidth: 4
- 
-    You can specify a string of additional resource values for Emacs to
- use with the command line option `-xrm RESOURCES'.  The text RESOURCES
- should have the same format that you would use inside a file of X
- resources.  To include multiple resource specifications in DATA, put a
- newline between them, just as you would in a file.  You can also use
- `#include "FILENAME"' to include a file full of resource
- specifications.  Resource values specified with `-xrm' take precedence
- over all other resource specifications.
- 
-    The following table lists the resource names that designate options
- for Emacs, each with the class that it belongs to:
- 
- `background' (class `Background')
-      Background color name.
- 
- `bitmapIcon' (class `BitmapIcon')
-      Use a bitmap icon (a picture of a gnu) if `on', let the window
-      manager choose an icon if `off'.
- 
- `borderColor' (class `BorderColor')
-      Color name for the external border.
- 
- `borderWidth' (class `BorderWidth')
-      Width in pixels of the external border.
- 
- `cursorColor' (class `Foreground')
-      Color name for text cursor (point).
- 
- `font' (class `Font')
-      Font name for text.
- 
- `foreground' (class `Foreground')
-      Color name for text.
- 
- `geometry' (class `Geometry')
-      Window size and position.  Be careful not to specify this resource
-      as `emacs*geometry', because that may affect individual menus as
-      well as the Emacs frame itself.  If this resource specifies a
-      position, that affects only the initial Emacs frame; but the size
-      (if specified) applies to all frames.
- 
- `iconName' (class `Title')
-      Name to display in the icon.
- 
- `internalBorder' (class `BorderWidth')
-      Width in pixels of the internal border.
- 
- `menuBar' (class `MenuBar')
-      Give frames menu bars if `on'; don't have menu bars if `off'.
- 
- `paneFont' (class `Font')
-      Font name for menu pane titles, in non-toolkit versions of Emacs.
- 
- `pointerColor' (class `Foreground')
-      Color of the mouse cursor.
- 
- `reverseVideo' (class `ReverseVideo')
-      Switch foreground and background default colors if `on', use
-      colors as specified if `off'.
- 
- `verticalScrollBars' (class `ScrollBars')
-      Give frames scroll bars if `on'; don't have scroll bars if `off'.
- 
- `selectionFont' (class `Font')
-      Font name for pop-up menu items, in non-toolkit versions of Emacs.
-      (For toolkit versions, see *Note Lucid Resources::, also see
-      *Note Motif Resources::.)
- 
- `title' (class `Title')
-      Name to display in the title bar of the initial Emacs frame.
- 
-    Here are resources for controlling the appearance of particular faces
- (*note Faces::.):
- 
- `FACE.attributeFont'
-      Font for face FACE.
- 
- `FACE.attributeForeground'
-      Foreground color for face FACE.
- 
- `FACE.attributeBackground'
-      Background color for face FACE.
- 
- `FACE.attributeUnderline'
-      Underline flag for face FACE.
- 
- 
- File: emacs,  Node: Lucid Resources,  Next: Motif Resources,  Prev: Resources X,  Up: Command Arguments
- 
- Lucid Menu X Resources
- ======================
- 
-    If the Emacs installed at your site was built to use the X toolkit
- with the Lucid menu widgets, then the menu bar is a separate widget and
- has its own resources.  The resource names contain `pane.menubar'
- (following, as always, the name of the Emacs invocation or `Emacs'
- which stands for all Emacs invocations).  Specify them like this:
- 
-      Emacs.pane.menubar.RESOURCE:  VALUE
- 
- For example, to specify the font `8x16' for the menu bar items, write
- this:
- 
-      Emacs.pane.menubar.font:  8x16
- 
-    Resources for toolkit popup menus have `menu*', in like fashion.
- For example, to specify the font `8x16' for the popup menu items, write
- this:
- 
-      Emacs.menu*.font:	8x16
- 
-    Experience shows that on some systems you may need to add `shell.'
- before the `pane.menubar' or `menu*'.
- 
-    Here is a list of the specific resources for menu bars and popup
- menus:
- 
- `font'
-      Font for menu item text.
- 
- `foreground'
-      Color of the foreground.
- 
- `background'
-      Color of the background.
- 
- `buttonForeground'
-      In the menu bar, the color of the foreground for a selected item.
- 
- `horizontalSpacing'
-      Horizontal spacing in pixels between items.  Default is 3.
- 
- `verticalSpacing'
-      Vertical spacing in pixels between items.  Default is 1.
- 
- `arrowSpacing'
-      Horizontal spacing between the arrow (which indicates a submenu)
-      and the associated text.  Default is 10.
- 
- `shadowThickness'
-      Thickness of shadow line around the widget.
- 
- 
- File: emacs,  Node: Motif Resources,  Prev: Lucid Resources,  Up: Command Arguments
- 
- Motif Menu X Resources
- ======================
- 
-    If the Emacs installed at your site was built to use the X toolkit
- with the Motif widgets, then the menu bar is a separate widget and has
- its own resources.  The resource names contain `pane.menubar'
- (following, as always, the name of the Emacs invocation or `Emacs'
- which stands for all Emacs invocations).  Specify them like this:
- 
-      Emacs.pane.menubar.SUBWIDGET.RESOURCE:  VALUE
- 
-    Each individual string in the menu bar is a subwidget; the
- subwidget's name is the same as the menu item string.  For example, the
- word `Files' in the menu bar is part of a subwidget named
- `emacs.pane.menubar.Files'.  Most likely, you want to specify the same
- resources for the whole menu bar.  To do this, use `*' instead of a
- specific subwidget name.  For example, to specify the font `8x16' for
- the menu bar items, write this:
- 
-      Emacs.pane.menubar.*.fontList:  8x16
- 
- This also specifies the resource value for submenus.
- 
-    Each item in a submenu in the menu bar also has its own name for X
- resources; for example, the `Files' submenu has an item named `Save
- Buffer'.  A resource specification for a submenu item looks like this:
- 
-      Emacs.pane.menubar.popup_*.MENU.ITEM.RESOURCE: VALUE
- 
- For example, here's how to specify the font for the `Save Buffer' item:
- 
-      Emacs.pane.menubar.popup_*.Files.Save Buffer.fontList: 8x16
- 
-    For an item in a second-level submenu, such as `Check Message' under
- `Spell' under `Edit', the resource fits this template:
- 
-      Emacs.pane.menubar.popup_*.popup_*.MENU.RESOURCE: VALUE
- 
- For example,
- 
-      Emacs.pane.menubar.popup_*.popup_*.Spell.Check Message: VALUE
- 
-    It's impossible to specify a resource for all the menu bar items
- without also specifying it for the submenus as well.  So if you want the
- submenu items to look different from the menu bar itself, you must ask
- for that in two steps.  First, specify the resource for all of them;
- then, override the value for submenus alone.  Here is an example:
- 
-      Emacs.pane.menubar.*.fontList:  8x16
-      Emacs.pane.menubar.popup_*.fontList: 8x16
- 
-    For toolkit popup menus, use `menu*' instead of `pane.menubar'.  For
- example, to specify the font `8x16' for the popup menu items, write
- this:
- 
-      Emacs.menu*.fontList:  8x16
- 
-    Here is a list of the specific resources for menu bars and popup
- menus:
- 
- `armColor'
-      The color to show in an armed button.
- 
- `fontList'
-      The font to use.
- 
- `marginBottom'
- `marginHeight'
- `marginLeft'
- `marginRight'
- `marginTop'
- `marginWidth'
-      Amount of space to leave around the item, within the border.
- 
- `borderWidth'
-      The width of border around the menu item, on all sides.
- 
- `shadowThickness'
-      The width of the border shadow.
- 
- `bottomShadowColor'
-      The color for the border shadow, on the bottom and the right.
- 
- `topShadowColor'
-      The color for the border shadow, on the bottom and the right.
- 
- 
- File: emacs,  Node: Antinews,  Next: MS-DOS,  Prev: Command Arguments,  Up: Top
- 
- Emacs 19.28 Antinews
- ********************
- 
-    For those users who live backwards in time, here is information about
- downgrading to Emacs version 19.28.  We hope you will enjoy the greater
- simplicity that results from the absence of certain Emacs 19.29
- features.
- 
-    * This version doesn't support Windows NT, or the DEC Alpha.
- 
-    * There is no support for editing formatted text.  The text formatter
-      TeX does a much better job of formatting than any formatted text
-      editor; we recommend you learn to use it.
- 
-    * `C-Mouse-2' now runs the menu for setting the default font.
- 
-    * F1 is no longer an alias for the Help key; you must actually type
-      `C-h' if you want help.
- 
-    * Integers and buffer sizes are limited to 24 bits on most machines.
-      But as memory gets more expensive, you won't want to edit such
-      large files any more.
- 
-    * There are no indirect buffers, so you can only display one view of
-      an outline.  Meanwhile, the prefix key for Outline minor mode is
-      now `C-c C-o'.
- 
-    * When you are in Transient Mark mode, incremental search always
-      deactivates the mark.
- 
-    * Dynamic abbrev completion has been eliminated in 19.28, and some
-      of the other dynamic abbrev customization features are also gone.
- 
-    * In Dired, Occur mode, Compilation mode, and other such modes, you
-      must use `C-c C-c' to select the item point is on.  RET won't do
-      it.
- 
-    * `M-x buffer-menu' now displays the menu buffer in another window.
- 
-    * The VC (version control) package no longer supports CVS or
-      selecting branches other than the principal branch.
- 
-    * There is no `recover-session' command; if Emacs crashes, you simply
-      have to remember which files you were editing before the crash,
-      and use `recover-file' on the individual files.
- 
-    * In Emacs Lisp mode, `C-M-x' now lets `defvar' operate as it
-      usually does--setting the value of the variable only if it has no
-      value yet.  Use `ESC ESC' to evaluate a Lisp expression, instead
-      of `M-:'.
- 
-    * GNU-standard long option names are not supported.  (Real hackers
-      prefer the shorter single-dash names, to save typing.)  All the
-      initial options must come before all the action options, and
-      whatever initial options you use must appear in this order: `-t',
-      `-d', `-nw', `-batch', `-q' or `-no-init-file', `-no-site-file',
-      `-u' or `-user', `-debug-init'.
- 
- 
- File: emacs,  Node: MS-DOS,  Next: Manifesto,  Prev: Antinews,  Up: Top
- 
- MS-DOS Issues
- *************
- 
-    This section briefly describes the peculiarities of using Emacs under
- the MS-DOS "operating system" (also known as "MS-DOG").
- 
-    MS-DOS normally uses a backslash, `\', to separate name units within
- a file name, instead of the slash used on other systems.  Emacs on
- MS-DOS permits use of either slash or backslash.
- 
-    On MS-DOS, file names are case-insensitive and limited to eight
- characters, plus optionally a period and three more characters.  Emacs
- does not know about this limitation; it is up to you to specify valid
- file names.  Excess characters before or after the period are generally
- ignored.
- 
-    Display on MS-DOS does not support menus or multiple fonts.  Support
- for multiple faces that specify different colors may be added later.
- 
-    Emacs on MS-DOS does support a mouse (on the default terminal only).
- The mouse commands work as documented, aside from those that try to use
- menus.  *Note Mouse Commands::.
- 
-    Because MS-DOS is a single-process "operating system", asynchronous
- subprocesses are not available.  In particular, Shell mode and its
- derivatives do not work.  Compilation under Emacs with `M-x compile'
- does work, but the compiler runs synchronously; you cannot do any more
- editing until the compilation finishes.
- 
-    When you run a subprocess synchronously on MS-DOS, make sure the
- program terminates and does not try to read keyboard input.  If the
- program does not terminate on its own, you will be unable to terminate
- it, because MS-DOS provides no general way to terminate a process.
- 
- 
- File: emacs,  Node: Manifesto,  Prev: MS-DOS,  Up: Top
- 
- The GNU Manifesto
- *****************
- 
-      The GNU Manifesto which appears below was written by Richard
-      Stallman at the beginning of the GNU project, to ask for
-      participation and support.  For the first few years, it was
-      updated in minor ways to account for developments, but now it
-      seems best to leave it unchanged as most people have seen it.
- 
-      Since that time, we have learned about certain common
-      misunderstandings that different wording could help avoid.
-      Footnotes added in 1993 help clarify these points.
- 
-      For up-to-date information about the available GNU software,
-      please see the latest issue of the GNU's Bulletin.  The list is
-      much too long to include here.
- 
- What's GNU?  Gnu's Not Unix!
- ============================
- 
-    GNU, which stands for Gnu's Not Unix, is the name for the complete
- Unix-compatible software system which I am writing so that I can give it
- away free to everyone who can use it.(1) Several other volunteers are
- helping me.  Contributions of time, money, programs and equipment are
- greatly needed.
- 
-    So far we have an Emacs text editor with Lisp for writing editor
- commands, a source level debugger, a yacc-compatible parser generator,
- a linker, and around 35 utilities.  A shell (command interpreter) is
- nearly completed.  A new portable optimizing C compiler has compiled
- itself and may be released this year.  An initial kernel exists but
- many more features are needed to emulate Unix.  When the kernel and
- compiler are finished, it will be possible to distribute a GNU system
- suitable for program development.  We will use TeX as our text
- formatter, but an nroff is being worked on.  We will use the free,
- portable X window system as well.  After this we will add a portable
- Common Lisp, an Empire game, a spreadsheet, and hundreds of other
- things, plus on-line documentation.  We hope to supply, eventually,
- everything useful that normally comes with a Unix system, and more.
- 
-    GNU will be able to run Unix programs, but will not be identical to
- Unix.  We will make all improvements that are convenient, based on our
- experience with other operating systems.  In particular, we plan to
- have longer file names, file version numbers, a crashproof file system,
- file name completion perhaps, terminal-independent display support, and
- perhaps eventually a Lisp-based window system through which several
- Lisp programs and ordinary Unix programs can share a screen.  Both C
- and Lisp will be available as system programming languages.  We will
- try to support UUCP, MIT Chaosnet, and Internet protocols for
- communication.
- 
-    GNU is aimed initially at machines in the 68000/16000 class with
- virtual memory, because they are the easiest machines to make it run
- on.  The extra effort to make it run on smaller machines will be left
- to someone who wants to use it on them.
- 
-    To avoid horrible confusion, please pronounce the `G' in the word
- `GNU' when it is the name of this project.
- 
- Why I Must Write GNU
- ====================
- 
-    I consider that the golden rule requires that if I like a program I
- must share it with other people who like it.  Software sellers want to
- divide the users and conquer them, making each user agree not to share
- with others.  I refuse to break solidarity with other users in this
- way.  I cannot in good conscience sign a nondisclosure agreement or a
- software license agreement.  For years I worked within the Artificial
- Intelligence Lab to resist such tendencies and other inhospitalities,
- but eventually they had gone too far: I could not remain in an
- institution where such things are done for me against my will.
- 
-    So that I can continue to use computers without dishonor, I have
- decided to put together a sufficient body of free software so that I
- will be able to get along without any software that is not free.  I
- have resigned from the AI lab to deny MIT any legal excuse to prevent
- me from giving GNU away.
- 
- Why GNU Will Be Compatible with Unix
- ====================================
- 
-    Unix is not my ideal system, but it is not too bad.  The essential
- features of Unix seem to be good ones, and I think I can fill in what
- Unix lacks without spoiling them.  And a system compatible with Unix
- would be convenient for many other people to adopt.
- 
- How GNU Will Be Available
- =========================
- 
-    GNU is not in the public domain.  Everyone will be permitted to
- modify and redistribute GNU, but no distributor will be allowed to
- restrict its further redistribution.  That is to say, proprietary
- modifications will not be allowed.  I want to make sure that all
- versions of GNU remain free.
- 
- Why Many Other Programmers Want to Help
- =======================================
- 
-    I have found many other programmers who are excited about GNU and
- want to help.
- 
-    Many programmers are unhappy about the commercialization of system
- software.  It may enable them to make more money, but it requires them
- to feel in conflict with other programmers in general rather than feel
- as comrades.  The fundamental act of friendship among programmers is the
- sharing of programs; marketing arrangements now typically used
- essentially forbid programmers to treat others as friends.  The
- purchaser of software must choose between friendship and obeying the
- law.  Naturally, many decide that friendship is more important.  But
- those who believe in law often do not feel at ease with either choice.
- They become cynical and think that programming is just a way of making
- money.
- 
-    By working on and using GNU rather than proprietary programs, we can
- be hospitable to everyone and obey the law.  In addition, GNU serves as
- an example to inspire and a banner to rally others to join us in
- sharing.  This can give us a feeling of harmony which is impossible if
- we use software that is not free.  For about half the programmers I
- talk to, this is an important happiness that money cannot replace.
- 
- How You Can Contribute
- ======================
- 
-    I am asking computer manufacturers for donations of machines and
- money.  I'm asking individuals for donations of programs and work.
- 
-    One consequence you can expect if you donate machines is that GNU
- will run on them at an early date.  The machines should be complete,
- ready to use systems, approved for use in a residential area, and not
- in need of sophisticated cooling or power.
- 
-    I have found very many programmers eager to contribute part-time
- work for GNU.  For most projects, such part-time distributed work would
- be very hard to coordinate; the independently-written parts would not
- work together.  But for the particular task of replacing Unix, this
- problem is absent.  A complete Unix system contains hundreds of utility
- programs, each of which is documented separately.  Most interface
- specifications are fixed by Unix compatibility.  If each contributor
- can write a compatible replacement for a single Unix utility, and make
- it work properly in place of the original on a Unix system, then these
- utilities will work right when put together.  Even allowing for Murphy
- to create a few unexpected problems, assembling these components will
- be a feasible task.  (The kernel will require closer communication and
- will be worked on by a small, tight group.)
- 
-    If I get donations of money, I may be able to hire a few people full
- or part time.  The salary won't be high by programmers' standards, but
- I'm looking for people for whom building community spirit is as
- important as making money.  I view this as a way of enabling dedicated
- people to devote their full energies to working on GNU by sparing them
- the need to make a living in another way.
- 
- Why All Computer Users Will Benefit
- ===================================
- 
-    Once GNU is written, everyone will be able to obtain good system
- software free, just like air.(2)
- 
-    This means much more than just saving everyone the price of a Unix
- license.  It means that much wasteful duplication of system programming
- effort will be avoided.  This effort can go instead into advancing the
- state of the art.
- 
-    Complete system sources will be available to everyone.  As a result,
- a user who needs changes in the system will always be free to make them
- himself, or hire any available programmer or company to make them for
- him.  Users will no longer be at the mercy of one programmer or company
- which owns the sources and is in sole position to make changes.
- 
-    Schools will be able to provide a much more educational environment
- by encouraging all students to study and improve the system code.
- Harvard's computer lab used to have the policy that no program could be
- installed on the system if its sources were not on public display, and
- upheld it by actually refusing to install certain programs.  I was very
- much inspired by this.
- 
-    Finally, the overhead of considering who owns the system software
- and what one is or is not entitled to do with it will be lifted.
- 
-    Arrangements to make people pay for using a program, including
- licensing of copies, always incur a tremendous cost to society through
- the cumbersome mechanisms necessary to figure out how much (that is,
- which programs) a person must pay for.  And only a police state can
- force everyone to obey them.  Consider a space station where air must
- be manufactured at great cost: charging each breather per liter of air
- may be fair, but wearing the metered gas mask all day and all night is
- intolerable even if everyone can afford to pay the air bill.  And the
- TV cameras everywhere to see if you ever take the mask off are
- outrageous.  It's better to support the air plant with a head tax and
- chuck the masks.
- 
-    Copying all or parts of a program is as natural to a programmer as
- breathing, and as productive.  It ought to be as free.
- 
- Some Easily Rebutted Objections to GNU's Goals
- ==============================================
- 
-      "Nobody will use it if it is free, because that means they can't
-      rely on any support."
- 
-      "You have to charge for the program to pay for providing the
-      support."
- 
-    If people would rather pay for GNU plus service than get GNU free
- without service, a company to provide just service to people who have
- obtained GNU free ought to be profitable.(3)
- 
-    We must distinguish between support in the form of real programming
- work and mere handholding.  The former is something one cannot rely on
- from a software vendor.  If your problem is not shared by enough
- people, the vendor will tell you to get lost.
- 
-    If your business needs to be able to rely on support, the only way
- is to have all the necessary sources and tools.  Then you can hire any
- available person to fix your problem; you are not at the mercy of any
- individual.  With Unix, the price of sources puts this out of
- consideration for most businesses.  With GNU this will be easy.  It is
- still possible for there to be no available competent person, but this
- problem cannot be blamed on distribution arrangements.  GNU does not
- eliminate all the world's problems, only some of them.
- 
-    Meanwhile, the users who know nothing about computers need
- handholding: doing things for them which they could easily do
- themselves but don't know how.
- 
-    Such services could be provided by companies that sell just
- hand-holding and repair service.  If it is true that users would rather
- spend money and get a product with service, they will also be willing
- to buy the service having got the product free.  The service companies
- will compete in quality and price; users will not be tied to any
- particular one.  Meanwhile, those of us who don't need the service
- should be able to use the program without paying for the service.
- 
-      "You cannot reach many people without advertising, and you must
-      charge for the program to support that."
- 
-      "It's no use advertising a program people can get free."
- 
-    There are various forms of free or very cheap publicity that can be
- used to inform numbers of computer users about something like GNU.  But
- it may be true that one can reach more microcomputer users with
- advertising.  If this is really so, a business which advertises the
- service of copying and mailing GNU for a fee ought to be successful
- enough to pay for its advertising and more.  This way, only the users
- who benefit from the advertising pay for it.
- 
-    On the other hand, if many people get GNU from their friends, and
- such companies don't succeed, this will show that advertising was not
- really necessary to spread GNU.  Why is it that free market advocates
- don't want to let the free market decide this?(4)
- 
-      "My company needs a proprietary operating system to get a
-      competitive edge."
- 
-    GNU will remove operating system software from the realm of
- competition.  You will not be able to get an edge in this area, but
- neither will your competitors be able to get an edge over you.  You and
- they will compete in other areas, while benefiting mutually in this
- one.  If your business is selling an operating system, you will not
- like GNU, but that's tough on you.  If your business is something else,
- GNU can save you from being pushed into the expensive business of
- selling operating systems.
- 
-    I would like to see GNU development supported by gifts from many
- manufacturers and users, reducing the cost to each.(5)
- 
-      "Don't programmers deserve a reward for their creativity?"
- 
-    If anything deserves a reward, it is social contribution.
- Creativity can be a social contribution, but only in so far as society
- is free to use the results.  If programmers deserve to be rewarded for
- creating innovative programs, by the same token they deserve to be
- punished if they restrict the use of these programs.
- 
-      "Shouldn't a programmer be able to ask for a reward for his
-      creativity?"
- 
-    There is nothing wrong with wanting pay for work, or seeking to
- maximize one's income, as long as one does not use means that are
- destructive.  But the means customary in the field of software today
- are based on destruction.
- 
-    Extracting money from users of a program by restricting their use of
- it is destructive because the restrictions reduce the amount and the
- ways that the program can be used.  This reduces the amount of wealth
- that humanity derives from the program.  When there is a deliberate
- choice to restrict, the harmful consequences are deliberate destruction.
- 
-    The reason a good citizen does not use such destructive means to
- become wealthier is that, if everyone did so, we would all become
- poorer from the mutual destructiveness.  This is Kantian ethics; or,
- the Golden Rule.  Since I do not like the consequences that result if
- everyone hoards information, I am required to consider it wrong for one
- to do so.  Specifically, the desire to be rewarded for one's creativity
- does not justify depriving the world in general of all or part of that
- creativity.
- 
-      "Won't programmers starve?"
- 
-    I could answer that nobody is forced to be a programmer.  Most of us
- cannot manage to get any money for standing on the street and making
- faces.  But we are not, as a result, condemned to spend our lives
- standing on the street making faces, and starving.  We do something
- else.
- 
-    But that is the wrong answer because it accepts the questioner's
- implicit assumption: that without ownership of software, programmers
- cannot possibly be paid a cent.  Supposedly it is all or nothing.
- 
-    The real reason programmers will not starve is that it will still be
- possible for them to get paid for programming; just not paid as much as
- now.
- 
-    Restricting copying is not the only basis for business in software.
- It is the most common basis because it brings in the most money.  If it
- were prohibited, or rejected by the customer, software business would
- move to other bases of organization which are now used less often.
- There are always numerous ways to organize any kind of business.
- 
-    Probably programming will not be as lucrative on the new basis as it
- is now.  But that is not an argument against the change.  It is not
- considered an injustice that sales clerks make the salaries that they
- now do.  If programmers made the same, that would not be an injustice
- either.  (In practice they would still make considerably more than
- that.)
- 
-      "Don't people have a right to control how their creativity is
-      used?"
- 
-    "Control over the use of one's ideas" really constitutes control over
- other people's lives; and it is usually used to make their lives more
- difficult.
- 
-    People who have studied the issue of intellectual property rights
- carefully (such as lawyers) say that there is no intrinsic right to
- intellectual property.  The kinds of supposed intellectual property
- rights that the government recognizes were created by specific acts of
- legislation for specific purposes.
- 
-    For example, the patent system was established to encourage
- inventors to disclose the details of their inventions.  Its purpose was
- to help society rather than to help inventors.  At the time, the life
- span of 17 years for a patent was short compared with the rate of
- advance of the state of the art.  Since patents are an issue only among
- manufacturers, for whom the cost and effort of a license agreement are
- small compared with setting up production, the patents often do not do
- much harm.  They do not obstruct most individuals who use patented
- products.
- 
-    The idea of copyright did not exist in ancient times, when authors
- frequently copied other authors at length in works of non-fiction.  This
- practice was useful, and is the only way many authors' works have
- survived even in part.  The copyright system was created expressly for
- the purpose of encouraging authorship.  In the domain for which it was
- invented--books, which could be copied economically only on a printing
- press--it did little harm, and did not obstruct most of the individuals
- who read the books.
- 
-    All intellectual property rights are just licenses granted by society
- because it was thought, rightly or wrongly, that society as a whole
- would benefit by granting them.  But in any particular situation, we
- have to ask: are we really better off granting such license?  What kind
- of act are we licensing a person to do?
- 
-    The case of programs today is very different from that of books a
- hundred years ago.  The fact that the easiest way to copy a program is
- from one neighbor to another, the fact that a program has both source
- code and object code which are distinct, and the fact that a program is
- used rather than read and enjoyed, combine to create a situation in
- which a person who enforces a copyright is harming society as a whole
- both materially and spiritually; in which a person should not do so
- regardless of whether the law enables him to.
- 
-      "Competition makes things get done better."
- 
-    The paradigm of competition is a race: by rewarding the winner, we
- encourage everyone to run faster.  When capitalism really works this
- way, it does a good job; but its defenders are wrong in assuming it
- always works this way.  If the runners forget why the reward is offered
- and become intent on winning, no matter how, they may find other
- strategies--such as, attacking other runners.  If the runners get into
- a fist fight, they will all finish late.
- 
-    Proprietary and secret software is the moral equivalent of runners
- in a fist fight.  Sad to say, the only referee we've got does not seem
- to object to fights; he just regulates them ("For every ten yards you
- run, you can fire one shot").  He really ought to break them up, and
- penalize runners for even trying to fight.
- 
-      "Won't everyone stop programming without a monetary incentive?"
- 
-    Actually, many people will program with absolutely no monetary
- incentive.  Programming has an irresistible fascination for some
- people, usually the people who are best at it.  There is no shortage of
- professional musicians who keep at it even though they have no hope of
- making a living that way.
- 
-    But really this question, though commonly asked, is not appropriate
- to the situation.  Pay for programmers will not disappear, only become
- less.  So the right question is, will anyone program with a reduced
- monetary incentive?  My experience shows that they will.
- 
-    For more than ten years, many of the world's best programmers worked
- at the Artificial Intelligence Lab for far less money than they could
- have had anywhere else.  They got many kinds of non-monetary rewards:
- fame and appreciation, for example.  And creativity is also fun, a
- reward in itself.
- 
-    Then most of them left when offered a chance to do the same
- interesting work for a lot of money.
- 
-    What the facts show is that people will program for reasons other
- than riches; but if given a chance to make a lot of money as well, they
- will come to expect and demand it.  Low-paying organizations do poorly
- in competition with high-paying ones, but they do not have to do badly
- if the high-paying ones are banned.
- 
-      "We need the programmers desperately.  If they demand that we stop
-      helping our neighbors, we have to obey."
- 
-    You're never so desperate that you have to obey this sort of demand.
- Remember: millions for defense, but not a cent for tribute!
- 
-      "Programmers need to make a living somehow."
- 
-    In the short run, this is true.  However, there are plenty of ways
- that programmers could make a living without selling the right to use a
- program.  This way is customary now because it brings programmers and
- businessmen the most money, not because it is the only way to make a
- living.  It is easy to find other ways if you want to find them.  Here
- are a number of examples.
- 
-    A manufacturer introducing a new computer will pay for the porting of
- operating systems onto the new hardware.
- 
-    The sale of teaching, hand-holding and maintenance services could
- also employ programmers.
- 
-    People with new ideas could distribute programs as freeware, asking
- for donations from satisfied users, or selling hand-holding services.
- I have met people who are already working this way successfully.
- 
-    Users with related needs can form users' groups, and pay dues.  A
- group would contract with programming companies to write programs that
- the group's members would like to use.
- 
-    All sorts of development can be funded with a Software Tax:
- 
-      Suppose everyone who buys a computer has to pay x percent of the
-      price as a software tax.  The government gives this to an agency
-      like the NSF to spend on software development.
- 
-      But if the computer buyer makes a donation to software development
-      himself, he can take a credit against the tax.  He can donate to
-      the project of his own choosing--often, chosen because he hopes to
-      use the results when it is done.  He can take a credit for any
-      amount of donation up to the total tax he had to pay.
- 
-      The total tax rate could be decided by a vote of the payers of the
-      tax, weighted according to the amount they will be taxed on.
- 
-      The consequences:
- 
-         * The computer-using community supports software development.
- 
-         * This community decides what level of support is needed.
- 
-         * Users who care which projects their share is spent on can
-           choose this for themselves.
- 
-    In the long run, making programs free is a step toward the
- post-scarcity world, where nobody will have to work very hard just to
- make a living.  People will be free to devote themselves to activities
- that are fun, such as programming, after spending the necessary ten
- hours a week on required tasks such as legislation, family counseling,
- robot repair and asteroid prospecting.  There will be no need to be
- able to make a living from programming.
- 
-    We have already greatly reduced the amount of work that the whole
- society must do for its actual productivity, but only a little of this
- has translated itself into leisure for workers because much
- nonproductive activity is required to accompany productive activity.
- The main causes of this are bureaucracy and isometric struggles against
- competition.  Free software will greatly reduce these drains in the
- area of software production.  We must do this, in order for technical
- gains in productivity to translate into less work for us.
- 
-    ---------- Footnotes ----------
- 
-    (1)  The wording here was careless.  The intention was that nobody
- would have to pay for *permission* to use the GNU system.  But the
- words don't make this clear, and people often interpret them as saying
- that copies of GNU should always be distributed at little or no charge.
- That was never the intent; later on, the manifesto mentions the
- possibility of companies providing the service of distribution for a
- profit.  Subsequently I have learned to distinguish carefully between
- "free" in the sense of freedom and "free" in the sense of price.  Free
- software is software that users have the freedom to distribute and
- change.  Some users may obtain copies at no charge, while others pay to
- obtain copies--and if the funds help support improving the software, so
- much the better.  The important thing is that everyone who has a copy
- has the freedom to cooperate with others in using it.
- 
-    (2)  This is another place I failed to distinguish carefully between
- the two different meanings of "free".  The statement as it stands is
- not false--you can get copies of GNU software at no charge, from your
- friends or over the net.  But it does suggest the wrong idea.
- 
-    (3)  Several such companies now exist.
- 
-    (4)  The Free Software Foundation raises most of its funds from a
- distribution service, although it is a charity rather than a company.
- If *no one* chooses to obtain copies by ordering the from the FSF, it
- will be unable to do its work.  But this does not mean that proprietary
- restrictions are justified to force every user to pay.  If a small
- fraction of all the users order copies from the FSF, that is sufficient
- to keep the FSF afloat.  So we ask users to choose to support us in
- this way.  Have you done your part?
- 
-    (5)  A group of computer companies recently pooled funds to support
- maintenance of the GNU C Compiler.
- 
--- 0 ----
Index: emacs/info/emacs-22
diff -c emacs/info/emacs-22:1.1.1.2 emacs/info/emacs-22:removed
*** emacs/info/emacs-22:1.1.1.2	Mon Jul 22 01:52:20 1996
--- emacs/info/emacs-22	Fri Aug  2 20:11:13 1996
***************
*** 1,962 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Glossary,  Next: Key Index,  Prev: Intro,  Up: Top
- 
- Glossary
- ********
- 
- Abbrev
-      An abbrev is a text string which expands into a different text
-      string when present in the buffer.  For example, you might define
-      a few letters as an abbrev for a long phrase that you want to
-      insert frequently.  *Note Abbrevs::.
- 
- Aborting
-      Aborting means getting out of a recursive edit (q.v.).  The
-      commands `C-]' and `M-x top-level' are used for this.  *Note
-      Quitting::.
- 
- Alt
-      Alt is the name of a modifier bit which a keyboard input character
-      may have.  To make a character Alt, type it while holding down the
-      ALT key.  Such characters are given names that start with `Alt-'
-      (usually written `A-' for short).  (Note that many terminals have a
-      key labeled ALT which is really a META key.)  *Note Alt: User
-      Input.
- 
- Auto Fill Mode
-      Auto Fill mode is a minor mode in which text that you insert is
-      automatically broken into lines of fixed width.  *Note Filling::.
- 
- Auto Saving
-      Auto saving is the practice of saving the contents of an Emacs
-      buffer in a specially-named file, so that the information will not
-      be lost if the buffer is lost due to a system error or user error.
-      *Note Auto Save::.
- 
- Backup File
-      A backup file records the contents that a file had before the
-      current editing session.  Emacs makes backup files automatically
-      to help you track down or cancel changes you later regret making.
-      *Note Backup::.
- 
- Balance Parentheses
-      Emacs can balance parentheses manually or automatically.  Manual
-      balancing is done by the commands to move over balanced expressions
-      (*note Lists::.).  Automatic balancing is done by blinking or
-      highlighting the parenthesis that matches one just inserted (*note
-      Matching Parens: Matching.).
- 
- Bind
-      To bind a key sequence means to give it a binding (q.v.).  *Note
-      Rebinding::.
- 
- Binding
-      A key sequence gets its meaning in Emacs by having a binding,
-      which is a command (q.v.), a Lisp function that is run when the
-      user types that sequence.  *Note Binding: Commands.  Customization
-      often involves rebinding a character to a different command
-      function.  The bindings of all key sequences are recorded in the
-      keymaps (q.v.).  *Note Keymaps::.
- 
- Blank Lines
-      Blank lines are lines that contain only whitespace.  Emacs has
-      several commands for operating on the blank lines in the buffer.
- 
- Buffer
-      The buffer is the basic editing unit; one buffer corresponds to
-      one text being edited.  You can have several buffers, but at any
-      time you are editing only one, the `selected' buffer, though
-      several can be visible when you are using multiple windows (q.v.).
-      Most buffers are visiting (q.v.) some file.  *Note Buffers::.
- 
- Buffer Selection History
-      Emacs keeps a buffer selection history which records how recently
-      each Emacs buffer has been selected.  This is used for choosing a
-      buffer to select.  *Note Buffers::.
- 
- Button Down Event
-      A button down event is the kind of input event generated right
-      away when you press a mouse button.  *Note Mouse Buttons::.
- 
- `C-'
-      `C-' in the name of a character is an abbreviation for Control.
-      *Note C-: User Input.
- 
- `C-M-'
-      `C-M-' in the name of a character is an abbreviation for
-      Control-Meta.  *Note C-M-: User Input.
- 
- Case Conversion
-      Case conversion means changing text from upper case to lower case
-      or vice versa.  *Note Case::, for the commands for case conversion.
- 
- Character
-      Characters form the contents of an Emacs buffer; see *Note Text
-      Characters::.  Also, key sequences (q.v.) are usually made up of
-      characters (though they may include other input events as well).
-      *Note User Input::.
- 
- Click Event
-      A click event is the kind of input event generated when you press a
-      mouse button and release it without moving the mouse.  *Note Mouse
-      Buttons::.
- 
- Command
-      A command is a Lisp function specially defined to be able to serve
-      as a key binding in Emacs.  When you type a key sequence (q.v.),
-      its binding (q.v.) is looked up in the relevant keymaps (q.v.) to
-      find the command to run.  *Note Commands::.
- 
- Command Name
-      A command name is the name of a Lisp symbol which is a command
-      (*note Commands::.).  You can invoke any command by its name using
-      `M-x' (*note M-x::.).
- 
- Comment
-      A comment is text in a program which is intended only for humans
-      reading the program, and which is marked specially so that it will
-      be ignored when the program is loaded or compiled.  Emacs offers
-      special commands for creating, aligning and killing comments.
-      *Note Comments::.
- 
- Compilation
-      Compilation is the process of creating an executable program from
-      source code.  Emacs has commands for compiling files of Emacs Lisp
-      code (*note Byte Compilation: (elisp)Byte Compilation.) and
-      programs in C and other languages (*note Compilation::.).
- 
- Complete Key
-      A complete key is a key sequence which fully specifies one action
-      to be performed by Emacs.  For example, `X' and `C-f' and `C-x m'
-      are complete keys.  Complete keys derive their meanings from being
-      bound (q.v.) to commands (q.v.).  Thus, `X' is conventionally
-      bound to a command to insert `X' in the buffer; `C-x m' is
-      conventionally bound to a command to begin composing a mail
-      message.  *Note Keys::.
- 
- Completion
-      Completion is what Emacs does when it automatically fills out an
-      abbreviation for a name into the entire name.  Completion is done
-      for minibuffer (q.v.) arguments when the set of possible valid
-      inputs is known; for example, on command names, buffer names, and
-      file names.  Completion occurs when TAB, SPC or RET is typed.
-      *Note Completion::.
- 
- Continuation Line
-      When a line of text is longer than the width of the window, it
-      takes up more than one screen line when displayed.  We say that the
-      text line is continued, and all screen lines used for it after the
-      first are called continuation lines.  *Note Continuation: Basic.
- 
- Control Character
-      ASCII characters with octal codes 0 through 037, and also code
-      0177, do not have graphic images assigned to them.  These are the
-      Control characters.  To type a Control character, hold down the
-      CTRL key and type the corresponding non-Control character.  RET,
-      TAB, ESC, LFD and DEL are all control characters.  *Note User
-      Input::.
- 
-      When you are using the X Window System, every non-control
-      character has a corresponding control character variant.
- 
- Copyleft
-      A copyleft is a notice giving the public legal permission to
-      redistribute a program or other work of art.  Copylefts are used by
-      left-wing programmers to give people equal rights, just as
-      copyrights are used by right-wing programmers to gain power over
-      other people.
- 
-      The particular form of copyleft used by the GNU project is called
-      the GNU General Public License.  *Note Copying::.
- 
- Current Buffer
-      The current buffer in Emacs is the Emacs buffer on which most
-      editing commands operate.  You can select any Emacs buffer as the
-      current one.  *Note Buffers::.
- 
- Current Line
-      The line point is on (*note Point::.).
- 
- Current Paragraph
-      The paragraph that point is in.  If point is between paragraphs,
-      the current paragraph is the one that follows point.  *Note
-      Paragraphs::.
- 
- Current Defun
-      The defun (q.v.) that point is in.  If point is between defuns, the
-      current defun is the one that follows point.  *Note Defuns::.
- 
- Cursor
-      The cursor is the rectangle on the screen which indicates the
-      position called point (q.v.) at which insertion and deletion takes
-      place.  The cursor is on or under the character that follows
-      point.  Often people speak of `the cursor' when, strictly
-      speaking, they mean `point'.  *Note Cursor: Basic.
- 
- Customization
-      Customization is making minor changes in the way Emacs works.  It
-      is often done by setting variables (*note Variables::.) or by
-      rebinding key sequences (*note Keymaps::.).
- 
- Default Argument
-      The default for an argument is the value that will be assumed if
-      you do not specify one.  When the minibuffer is used to read an
-      argument, the default argument is used if you just type RET.
-      *Note Minibuffer::.
- 
- Default Directory
-      When you specify a file name that does not start with `/' or `~',
-      it is interpreted relative to the current buffer's default
-      directory.  *Note Default Directory: Minibuffer File.
- 
- Defun
-      A defun is a list at the top level of parenthesis or bracket
-      structure in a program.  It is so named because most such lists in
-      Lisp programs are calls to the Lisp function `defun'.  *Note
-      Defuns::.
- 
- DEL
-      DEL is a character that runs the command to delete one character of
-      text.  *Note DEL: Basic.
- 
- Deletion
-      Deletion means erasing text without copying it into the kill ring
-      (q.v.).  The alternative is killing (q.v.).  *Note Deletion:
-      Killing.
- 
- Deletion of Files
-      Deleting a file means erasing it from the file system.  *Note Misc
-      File Ops::.
- 
- Deletion of Messages
-      Deleting a message means flagging it to be eliminated from your
-      mail file.  Until you expunge (q.v.) the Rmail file, you can still
-      undelete the messages you have deleted.  *Note Rmail Deletion::.
- 
- Deletion of Windows
-      Deleting a window means eliminating it from the screen.  Other
-      windows expand to use up the space.  The deleted window can never
-      come back, but no actual text is thereby lost.  *Note Windows::.
- 
- Directory
-      File directories are named collections in the file system, within
-      which you can place individual files or subdirectories.  *Note
-      Directories::.
- 
- Dired
-      Dired is the Emacs facility that displays the contents of a file
-      directory and allows you to "edit the directory", performing
-      operations on the files in the directory.  *Note Dired::.
- 
- Disabled Command
-      A disabled command is one that you may not run without special
-      confirmation.  The usual reason for disabling a command is that it
-      is confusing for beginning users.  *Note Disabling::.
- 
- Down Event
-      Short for `button down event'.
- 
- Drag Event
-      A drag event is the kind of input event generated when you press a
-      mouse button, move the mouse, and then release the button.  *Note
-      Mouse Buttons::.
- 
- Dribble File
-      A file into which Emacs writes all the characters that the user
-      types on the keyboard.  Dribble files are used to make a record for
-      debugging Emacs bugs.  Emacs does not make a dribble file unless
-      you tell it to.  *Note Bugs::.
- 
- Echo Area
-      The echo area is the bottom line of the screen, used for echoing
-      the arguments to commands, for asking questions, and printing
-      brief messages (including error messages).  The messages are
-      stored in the buffer `*Messages*' so you can review them later.
-      *Note Echo Area::.
- 
- Echoing
-      Echoing is acknowledging the receipt of commands by displaying
-      them (in the echo area).  Emacs never echoes single-character key
-      sequences; longer key sequences echo only if you pause while
-      typing them.
- 
- Error
-      An error occurs when an Emacs command cannot execute in the current
-      circumstances.  When an error occurs, execution of the command
-      stops (unless the command has been programmed to do otherwise) and
-      Emacs reports the error by printing an error message (q.v.).
-      Type-ahead is discarded.  Then Emacs is ready to read another
-      editing command.
- 
- Error Message
-      An error message is a single line of output displayed by Emacs
-      when the user asks for something impossible to do (such as,
-      killing text forward when point is at the end of the buffer).
-      They appear in the echo area, accompanied by a beep.
- 
- ESC
-      ESC is a character used as a prefix for typing Meta characters on
-      keyboards lacking a META key.  Unlike the META key (which, like
-      the SHIFT key, is held down while another character is typed), the
-      ESC key is pressed once and applies to the next character typed.
- 
- Expunging
-      Expunging an Rmail file or Dired buffer means really discarding the
-      messages or files you have previously flagged for deletion.
- 
- File Name
-      A file name is a name that refers to a file.  File names may be
-      relative or absolute; the meaning of a relative file name depends
-      on the current directory, but an absolute file name refers to the
-      same file regardless of which directory is current.  On GNU and
-      Unix systems, an absolute file name starts with a slash (the root
-      directory) or with `~/' or `~USER/' (a home directory).
- 
-      Some people use the term "pathname" for file names, but we do not;
-      we use the word "path" only in the term "search path" (q.v.).
- 
- File Name Component
-      A file name component names a file directly within a particular
-      directory.  On GNU and Unix systems, a file name is a sequence of
-      file name components, separated by slashes.  For example,
-      `foo/bar' is a file name containing two components, `foo' and
-      `bar'; it refers to the file named `bar' in the directory named
-      `foo' in the current directory.
- 
- Fill Prefix
-      The fill prefix is a string that should be expected at the
-      beginning of each line when filling is done.  It is not regarded
-      as part of the text to be filled.  *Note Filling::.
- 
- Filling
-      Filling text means shifting text between consecutive lines so that
-      all the lines are approximately the same length.  *Note Filling::.
- 
- Formatted Text
-      Formatted text is text that displays with formatting information
-      while you edit.  Formatting information includes fonts, colors,
-      and specified margins.  *Note Formatted Text::.
- 
- Frame
-      A frame is a rectangular cluster of Emacs windows.  Emacs starts
-      out with one frame, but you can create more.  You can subdivide
-      each frame into Emacs windows (q.v.).  When you are using X
-      windows, all the frames can be visible at the same time.  *Note
-      Frames::.
- 
- Function Key
-      A function key is a key on the keyboard that sends input but does
-      not correspond to any character.  *Note Function Keys::.
- 
- Global
-      Global means `independent of the current environment; in effect
-      throughout Emacs'.  It is the opposite of local (q.v.).  Particular
-      examples of the use of `global' appear below.
- 
- Global Abbrev
-      A global definition of an abbrev (q.v.) is effective in all major
-      modes that do not have local (q.v.) definitions for the same
-      abbrev.  *Note Abbrevs::.
- 
- Global Keymap
-      The global keymap (q.v.) contains key bindings that are in effect
-      except when overridden by local key bindings in a major mode's
-      local keymap (q.v.).  *Note Keymaps::.
- 
- Global Mark Ring
-      The global mark ring records the series of buffers you have
-      recently set a mark in.  In many cases you can use this to
-      backtrack through buffers you have been editing in, or in which
-      you have found tags.  *Note Global Mark Ring::.
- 
- Global Substitution
-      Global substitution means replacing each occurrence of one string
-      by another string through a large amount of text.  *Note Replace::.
- 
- Global Variable
-      The global value of a variable (q.v.) takes effect in all buffers
-      that do not have their own local (q.v.) values for the variable.
-      *Note Variables::.
- 
- Graphic Character
-      Graphic characters are those assigned pictorial images rather than
-      just names.  All the non-Meta (q.v.) characters except for the
-      Control (q.v.) characters are graphic characters.  These include
-      letters, digits, punctuation, and spaces; they do not include RET
-      or ESC.  In Emacs, typing a graphic character inserts that
-      character (in ordinary editing modes).  *Note Basic Editing: Basic.
- 
- Highlighting
-      Highlighting text means displaying it with a different foreground
-      and/or background color to make it stand out from the rest of the
-      text in the buffer.
- 
- Hardcopy
-      Hardcopy means printed output.  Emacs has commands for making
-      printed listings of text in Emacs buffers.  *Note Hardcopy::.
- 
- HELP
-      You can type HELP at any time to ask what options you have, or to
-      ask what any command does.  The character HELP is really `C-h'.
-      *Note Help::.
- 
- Hyper
-      Hyper is the name of a modifier bit which a keyboard input
-      character may have.  To make a character Hyper, type it while
-      holding down the HYPER key.  Such characters are given names that
-      start with `Hyper-' (usually written `H-' for short).  *Note
-      Hyper: User Input.
- 
- Inbox
-      An inbox is a file in which mail is delivered by the operating
-      system.  Rmail transfers mail from inboxes to Rmail files (q.v.)
-      in which the mail is then stored permanently or until explicitly
-      deleted.  *Note Rmail Inbox::.
- 
- Indentation
-      Indentation means blank space at the beginning of a line.  Most
-      programming languages have conventions for using indentation to
-      illuminate the structure of the program, and Emacs has special
-      commands to adjust indentation.  *Note Indentation::.
- 
- Indirect Buffer
-      An indirect buffer is a buffer that shares the text of another
-      buffer, called its base buffer.  *Note Indirect Buffers::.
- 
- Input Event
-      An input event represents, within Emacs, one action taken by the
-      user on the terminal.  Input events include typing characters,
-      typing function keys, pressing or releasing mouse buttons, and
-      switching between Emacs frames.  *Note User Input::.
- 
- Insertion
-      Insertion means copying text into the buffer, either from the
-      keyboard or from some other place in Emacs.
- 
- Justification
-      Justification means adding extra spaces to lines of text to make
-      them come exactly to a specified width.  *Note Justification:
-      Filling.
- 
- Keyboard Macro
-      Keyboard macros are a way of defining new Emacs commands from
-      sequences of existing ones, with no need to write a Lisp program.
-      *Note Keyboard Macros::.
- 
- Key Sequence
-      A key sequence (key, for short) is a sequence of input events
-      (q.v.) that are meaningful as a single unit.  If the key sequence
-      is enough to specify one action, it is a complete key (q.v.); if
-      it is not enough, it is a prefix key (q.v.).  *Note Keys::.
- 
- Keymap
-      The keymap is the data structure that records the bindings (q.v.)
-      of key sequences to the commands that they run.  For example, the
-      global keymap binds the character `C-n' to the command function
-      `next-line'.  *Note Keymaps::.
- 
- Keyboard Translation Table
-      The keyboard translation table is an array that translates the
-      character codes that come from the terminal into the character
-      codes that make up key sequences.  *Note Keyboard Translations::.
- 
- Kill Ring
-      The kill ring is where all text you have killed recently is saved.
-      You can reinsert any of the killed text still in the ring; this is
-      called yanking (q.v.).  *Note Yanking::.
- 
- Killing
-      Killing means erasing text and saving it on the kill ring so it
-      can be yanked (q.v.) later.  Some other systems call this
-      "cutting".  Most Emacs commands to erase text do killing, as
-      opposed to deletion (q.v.).  *Note Killing::.
- 
- Killing Jobs
-      Killing a job (such as, an invocation of Emacs) means making it
-      cease to exist.  Any data within it, if not saved in a file, is
-      lost.  *Note Exiting::.
- 
- List
-      A list is, approximately, a text string beginning with an open
-      parenthesis and ending with the matching close parenthesis.  In C
-      mode and other non-Lisp modes, groupings surrounded by other kinds
-      of matched delimiters appropriate to the language, such as braces,
-      are also considered lists.  Emacs has special commands for many
-      operations on lists.  *Note Lists::.
- 
- Local
-      Local means `in effect only in a particular context'; the relevant
-      kind of context is a particular function execution, a particular
-      buffer, or a particular major mode.  It is the opposite of `global'
-      (q.v.).  Specific uses of `local' in Emacs terminology appear
-      below.
- 
- Local Abbrev
-      A local abbrev definition is effective only if a particular major
-      mode is selected.  In that major mode, it overrides any global
-      definition for the same abbrev.  *Note Abbrevs::.
- 
- Local Keymap
-      A local keymap is used in a particular major mode; the key bindings
-      (q.v.) in the current local keymap override global bindings of the
-      same key sequences.  *Note Keymaps::.
- 
- Local Variable
-      A local value of a variable (q.v.) applies to only one buffer.
-      *Note Locals::.
- 
- `M-'
-      `M-' in the name of a character is an abbreviation for META, one
-      of the modifier keys that can accompany any character.  *Note User
-      Input::.
- 
- `M-C-'
-      `M-C-' in the name of a character is an abbreviation for
-      Control-Meta; it means the same thing as `C-M-'.  If your terminal
-      lacks a real META key, you type a Control-Meta character by typing
-      ESC and then typing the corresponding Control character.  *Note
-      C-M-: User Input.
- 
- `M-x'
-      `M-x' is the key sequence which is used to call an Emacs command by
-      name.  This is how you run commands that are not bound to key
-      sequences.  *Note M-x::.
- 
- Mail
-      Mail means messages sent from one user to another through the
-      computer system, to be read at the recipient's convenience.  Emacs
-      has commands for composing and sending mail, and for reading and
-      editing the mail you have received.  *Note Sending Mail::.  *Note
-      Rmail::, for how to read mail.
- 
- Major Mode
-      The Emacs major modes are a mutually exclusive set of options,
-      each of which configures Emacs for editing a certain sort of text.
-      Ideally, each programming language has its own major mode.  *Note
-      Major Modes::.
- 
- Mark
-      The mark points to a position in the text.  It specifies one end
-      of the region (q.v.), point being the other end.  Many commands
-      operate on all the text from point to the mark.  Each buffer has
-      its own mark.  *Note Mark::.
- 
- Mark Ring
-      The mark ring is used to hold several recent previous locations of
-      the mark, just in case you want to move back to them.  Each buffer
-      has its own mark ring; in addition, there is a single global mark
-      ring (q.v.).  *Note Mark Ring::.
- 
- Menu Bar
-      The menu bar is the line at the top of an Emacs frame.  It contains
-      words you can click on with the mouse to bring up menus.  The menu
-      bar feature is supported only with X.  *Note Menu Bars::.
- 
- Message
-      See `mail'.
- 
- Meta
-      Meta is the name of a modifier bit which a command character may
-      have.  It is present in a character if the character is typed with
-      the META key held down.  Such characters are given names that start
-      with `Meta-' (usually written `M-' for short).  For example, `M-<'
-      is typed by holding down META and at the same time typing `<'
-      (which itself is done, on most terminals, by holding down SHIFT
-      and typing `,').  *Note Meta: User Input.
- 
- Meta Character
-      A Meta character is one whose character code includes the Meta bit.
- 
- Minibuffer
-      The minibuffer is the window that appears when necessary inside the
-      echo area (q.v.), used for reading arguments to commands.  *Note
-      Minibuffer::.
- 
- Minibuffer History
-      The minibuffer history records the text you have specified in the
-      past for minibuffer arguments, so you can conveniently use the
-      same text again.  *Note Minibuffer History::.
- 
- Minor Mode
-      A minor mode is an optional feature of Emacs which can be switched
-      on or off independently of all other features.  Each minor mode
-      has a command to turn it on or off.  *Note Minor Modes::.
- 
- Minor Mode Keymap
-      A keymap that belongs to a minor mode and is active when that mode
-      is enabled.  Minor mode keymaps take precedence over the buffer's
-      local keymap, just as the local keymap takes precedence over the
-      global keymap.  *Note Keymaps::.
- 
- Mode Line
-      The mode line is the line at the bottom of each window (q.v.),
-      giving status information on the buffer displayed in that window.
-      *Note Mode Line::.
- 
- Modified Buffer
-      A buffer (q.v.) is modified if its text has been changed since the
-      last time the buffer was saved (or since when it was created, if it
-      has never been saved).  *Note Saving::.
- 
- Moving Text
-      Moving text means erasing it from one place and inserting it in
-      another.  The usual way to move text by killing (q.v.) and then
-      yanking (q.v.).  *Note Killing::.
- 
- Named Mark
-      A named mark is a register (q.v.) in its role of recording a
-      location in text so that you can move point to that location.
-      *Note Registers::.
- 
- Narrowing
-      Narrowing means creating a restriction (q.v.) that limits editing
-      in the current buffer to only a part of the text in the buffer.
-      Text outside that part is inaccessible to the user until the
-      boundaries are widened again, but it is still there, and saving
-      the file saves it all.  *Note Narrowing::.
- 
- Newline
-      Linefeed characters in the buffer terminate lines of text and are
-      therefore also called newlines.  *Note Newline: Text Characters.
- 
- Numeric Argument
-      A numeric argument is a number, specified before a command, to
-      change the effect of the command.  Often the numeric argument
-      serves as a repeat count.  *Note Arguments::.
- 
- Option
-      An option is a variable (q.v.) that exists so that you can
-      customize Emacs by setting it to a new value.  *Note Variables::.
- 
- Overwrite Mode
-      Overwrite mode is a minor mode.  When it is enabled, ordinary text
-      characters replace the existing text after point rather than
-      pushing it to the right.  *Note Minor Modes::.
- 
- Page
-      A page is a unit of text, delimited by formfeed characters (ASCII
-      control-L, code 014) coming at the beginning of a line.  Some Emacs
-      commands are provided for moving over and operating on pages.
-      *Note Pages::.
- 
- Paragraph
-      Paragraphs are the medium-size unit of English text.  There are
-      special Emacs commands for moving over and operating on paragraphs.
-      *Note Paragraphs::.
- 
- Parsing
-      We say that certain Emacs commands parse words or expressions in
-      the text being edited.  Really, all they know how to do is find
-      the other end of a word or expression.  *Note Syntax::.
- 
- Point
-      Point is the place in the buffer at which insertion and deletion
-      occur.  Point is considered to be between two characters, not at
-      one character.  The terminal's cursor (q.v.) indicates the
-      location of point.  *Note Point: Basic.
- 
- Prefix Argument
-      See `numeric argument'.
- 
- Prefix Key
-      A prefix key is a key sequence (q.v.) whose sole function is to
-      introduce a set of longer key sequences.  `C-x' is an example of
-      prefix key; any two-character sequence starting with `C-x' is
-      therefore a legitimate key sequence.  *Note Keys::.
- 
- Primary Rmail File
-      Your primary Rmail file is the file named `RMAIL' in your home
-      directory.  That's where Rmail stores your incoming mail, unless
-      you specify a different file name.  *Note Rmail::.
- 
- Primary Selection
-      The primary selection is one particular X selection (q.v.); it is
-      the selection that most X applications use for transferring text
-      to and from other applications.
- 
-      The Emacs kill commands set the primary selection and the yank
-      command uses the primary selection when appropriate.  *Note
-      Killing::.
- 
- Prompt
-      A prompt is text printed to ask the user for input.  Displaying a
-      prompt is called prompting.  Emacs prompts always appear in the
-      echo area (q.v.).  One kind of prompting happens when the
-      minibuffer is used to read an argument (*note Minibuffer::.); the
-      echoing which happens when you pause in the middle of typing a
-      multi-character key sequence is also a kind of prompting (*note
-      Echo Area::.).
- 
- Quitting
-      Quitting means canceling a partially typed command or a running
-      command, using `C-g'.  *Note Quitting::.
- 
- Quoting
-      Quoting means depriving a character of its usual special
-      significance.  In Emacs this is usually done with `C-q'.  What
-      constitutes special significance depends on the context and on
-      convention.  For example, an "ordinary" character as an Emacs
-      command inserts itself; so in this context, a special character is
-      any character that does not normally insert itself (such as DEL,
-      for example), and quoting it makes it insert itself as if it were
-      not special.  Not all contexts allow quoting.  *Note Quoting:
-      Basic.
- 
- Read-Only Buffer
-      A read-only buffer is one whose text you are not allowed to change.
-      Normally Emacs makes buffers read-only when they contain text which
-      has a special significance to Emacs; for example, Dired buffers.
-      Visiting a file that is write protected also makes a read-only
-      buffer.  *Note Buffers::.
- 
- Rectangle
-      A rectangle consists of the text in a given range of columns on a
-      given range of lines.  Normally you specify a rectangle by putting
-      point at one corner and putting the mark at the opposite corner.
-      *Note Rectangles::.
- 
- Recursive Editing Level
-      A recursive editing level is a state in which part of the
-      execution of a command involves asking the user to edit some text.
-      This text may or may not be the same as the text to which the
-      command was applied.  The mode line indicates recursive editing
-      levels with square brackets (`[' and `]').  *Note Recursive Edit::.
- 
- Redisplay
-      Redisplay is the process of correcting the image on the screen to
-      correspond to changes that have been made in the text being edited.
-      *Note Redisplay: Screen.
- 
- Regexp
-      See `regular expression'.
- 
- Region
-      The region is the text between point (q.v.) and the mark (q.v.).
-      Many commands operate on the text of the region.  *Note Region:
-      Mark.
- 
- Registers
-      Registers are named slots in which text or buffer positions or
-      rectangles can be saved for later use.  *Note Registers::.
- 
- Regular Expression
-      A regular expression is a pattern that can match various text
-      strings; for example, `l[0-9]+' matches `l' followed by one or more
-      digits.  *Note Regexps::.
- 
- Repeat Count
-      See `numeric argument'.
- 
- Replacement
-      See `global substitution'.
- 
- Restriction
-      A buffer's restriction is the amount of text, at the beginning or
-      the end of the buffer, that is temporarily inaccessible.  Giving a
-      buffer a nonzero amount of restriction is called narrowing (q.v.).
-      *Note Narrowing::.
- 
- RET
-      RET is a character that in Emacs runs the command to insert a
-      newline into the text.  It is also used to terminate most arguments
-      read in the minibuffer (q.v.).  *Note Return: User Input.
- 
- Rmail File
-      An Rmail file is a file containing text in a special format used by
-      Rmail for storing mail.  *Note Rmail::.
- 
- Saving
-      Saving a buffer means copying its text into the file that was
-      visited (q.v.) in that buffer.  This is the way text in files
-      actually gets changed by your Emacs editing.  *Note Saving::.
- 
- Scroll Bar
-      A scroll bar is a tall thin hollow box that appears at the side of
-      a window.  You can use mouse commands in the scroll bar to scroll
-      the window.  The scroll bar feature is supported only with X.
-      *Note Scroll Bars::.
- 
- Scrolling
-      Scrolling means shifting the text in the Emacs window so as to see
-      a different part of the buffer.  *Note Scrolling: Display.
- 
- Searching
-      Searching means moving point to the next occurrence of a specified
-      string or the next match for a specified regular expression.
-      *Note Search::.
- 
- Search Path
-      A search path is a list of directory names, to be used for
-      searching for files for certain purposes.  For example, the
-      variable `load-path' holds a search path for finding Lisp library
-      files.  *Note Lisp Libraries::.
- 
- Secondary Selection
-      The secondary selection is one particular X selection; some X
-      applications can use it for transferring text to and from other
-      applications.  Emacs has special mouse commands for transferring
-      text using the secondary selection.  *Note Secondary Selection::.
- 
- Selecting
-      Selecting a buffer means making it the current (q.v.) buffer.
-      *Note Selecting: Buffers.
- 
- Selection
-      The X window system allows an application program to specify named
-      selections whose values are text.  A program can also read the
-      selections that other programs have set up.  This is the principal
-      way of transferring text between window applications.  Emacs has
-      commands to work with the primary (q.v.) selection and the
-      secondary (q.v.) selection.
- 
- Self-Documentation
-      Self-documentation is the feature of Emacs which can tell you what
-      any command does, or give you a list of all commands related to a
-      topic you specify.  You ask for self-documentation with the help
-      character, `C-h'.  *Note Help::.
- 
- Sentences
-      Emacs has commands for moving by or killing by sentences.  *Note
-      Sentences::.
- 
- Sexp
-      A sexp (short for `s-expression') is the basic syntactic unit of
-      Lisp in its textual form: either a list, or Lisp atom.  Many Emacs
-      commands operate on sexps.  The term `sexp' is generalized to
-      languages other than Lisp, to mean a syntactically recognizable
-      expression.  *Note Sexps: Lists.
- 
- Simultaneous Editing
-      Simultaneous editing means two users modifying the same file at
-      once.  Simultaneous editing if not detected can cause one user to
-      lose his work.  Emacs detects all cases of simultaneous editing
-      and warns one of the users to investigate.  *Note Simultaneous
-      Editing: Interlocking.
- 
- String
-      A string is a kind of Lisp data object which contains a sequence of
-      characters.  Many Emacs variables are intended to have strings as
-      values.  The Lisp syntax for a string consists of the characters
-      in the string with a `"' before and another `"' after.  A `"' that
-      is part of the string must be written as `\"' and a `\' that is
-      part of the string must be written as `\\'.  All other characters,
-      including newline, can be included just by writing them inside the
-      string; however, backslash sequences as in C, such as `\n' for
-      newline or `\241' using an octal character code, are allowed as
-      well.
- 
- String Substitution
-      See `global substitution'.
- 
- Syntax Table
-      The syntax table tells Emacs which characters are part of a word,
-      which characters balance each other like parentheses, etc.  *Note
-      Syntax::.
- 
- Super
-      Super is the name of a modifier bit which a keyboard input
-      character may have.  To make a character Super, type it while
-      holding down the SUPER key.  Such characters are given names that
-      start with `Super-' (usually written `s-' for short).  *Note
-      Super: User Input.
- 
- Tags Table
-      A tags table is a file that serves as an index to the function
-      definitions in one or more other files.  *Note Tags::.
- 
- Termscript File
-      A termscript file contains a record of all characters sent by
-      Emacs to the terminal.  It is used for tracking down bugs in Emacs
-      redisplay.  Emacs does not make a termscript file unless you tell
-      it to.  *Note Bugs::.
- 
- Text
-      Two meanings (*note Text::.):
- 
-         * Data consisting of a sequence of characters, as opposed to
-           binary numbers, images, graphics commands, executable
-           programs, and the like.  The contents of an Emacs buffer are
-           always text in this sense.
- 
-         * Data consisting of written human language, as opposed to
-           programs, or following the stylistic conventions of human
-           language.
- 
- Top Level
-      Top level is the normal state of Emacs, in which you are editing
-      the text of the file you have visited.  You are at top level
-      whenever you are not in a recursive editing level (q.v.) or the
-      minibuffer (q.v.), and not in the middle of a command.  You can
-      get back to top level by aborting (q.v.) and quitting (q.v.).
-      *Note Quitting::.
- 
- Transposition
-      Transposing two units of text means putting each one into the place
-      formerly occupied by the other.  There are Emacs commands to
-      transpose two adjacent characters, words, sexps (q.v.) or lines
-      (*note Transpose::.).
- 
- Truncation
-      Truncating text lines in the display means leaving out any text on
-      a line that does not fit within the right margin of the window
-      displaying it.  See also `continuation line'.  *Note Truncation:
-      Basic.
- 
- Undoing
-      Undoing means making your previous editing go in reverse, bringing
-      back the text that existed earlier in the editing session.  *Note
-      Undo::.
- 
- Variable
-      A variable is an object in Lisp that can store an arbitrary value.
-      Emacs uses some variables for internal purposes, and has others
-      (known as `options' (q.v.)) just so that you can set their values
-      to control the behavior of Emacs.  The variables used in Emacs
-      that you are likely to be interested in are listed in the
-      Variables Index in this manual.  *Note Variables::, for
-      information on variables.
- 
- Version Control
-      Version control systems keep track of multiple versions of a
-      source file.  They provide a more powerful alternative to keeping
-      backup files (q.v.).  *Note Version Control::.
- 
- Visiting
-      Visiting a file means loading its contents into a buffer (q.v.)
-      where they can be edited.  *Note Visiting::.
- 
- Whitespace
-      Whitespace is any run of consecutive formatting characters (space,
-      tab, newline, and backspace).
- 
- Widening
-      Widening is removing any restriction (q.v.) on the current buffer;
-      it is the opposite of narrowing (q.v.).  *Note Narrowing::.
- 
- Window
-      Emacs divides a frame (q.v.) into one or more windows, each of
-      which can display the contents of one buffer (q.v.) at any time.
-      *Note Screen::, for basic information on how Emacs uses the screen.
-      *Note Windows::, for commands to control the use of windows.
- 
- Word Abbrev
-      Synonymous with `abbrev'.
- 
- Word Search
-      Word search is searching for a sequence of words, considering the
-      punctuation between them as insignificant.  *Note Word Search::.
- 
- WYSIWYG
-      WYSIWYG stands for "What you see is what you get."  Emacs generally
-      provides WYSIWYG editing for files of characters; in Enriched mode
-      (*note Formatted Text::.), it provides WYSIWYG editing for files
-      that include text formatting information.
- 
- Yanking
-      Yanking means reinserting text previously killed.  It can be used
-      to undo a mistaken kill, or for copying or moving text.  Some other
-      systems call this "pasting".  *Note Yanking::.
- 
--- 0 ----
Index: emacs/info/emacs-23
diff -c emacs/info/emacs-23:1.1.1.2 emacs/info/emacs-23:removed
*** emacs/info/emacs-23:1.1.1.2	Mon Jul 22 01:52:22 1996
--- emacs/info/emacs-23	Fri Aug  2 20:11:53 1996
***************
*** 1,567 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Acknowledgments,  Next: Screen,  Prev: Concept Index,  Up: Top
- 
- Acknowledgments
- ***************
- 
-    Many people have contributed code included in the Free Software
- Foundation's distribution of GNU Emacs.  To show our appreciation for
- their public spirit, we list here those who have written substantial
- portions.
- 
-    * Per Abrahamsen wrote `double.el', for typing accented characters
-      not normally available from the keyboard, and `cpp.el', which hides
-      or highlights parts of C programs according to preprocessor
-      conditionals.
- 
-    * Jay K. Adams wrote `jka-compr.el', providing automatic
-      decompression and recompression for compressed files.
- 
-    * Joe Arceneax wrote the original text property implementation, and
-      implemented support for X11.
- 
-    * Boaz Ben-Zvi wrote `profile.el', to time Emacs Lisp functions.
- 
-    * Jim Blandy wrote Emacs 19's input system, brought its
-      configuration and build process up to the GNU coding standards,
-      and contributed to the frame support and multi-face support.
- 
-    * Frank Bresz wrote `diff.el', a program to display `diff' output.
- 
-    * Kevin Broadey wrote `foldout.el', providing folding extensions to
-      Emacs's outline modes.
- 
-    * Vincent Broman wrote `ada.el', a mode for editing Ada code.
- 
-    * David M. Brown wrote `array.el', for editing arrays and other
-      tabular data.
- 
-    * Hans Chalupsky wrote `advice.el', an overloading mechanism for
-      Emacs Lisp functions, and `trace.el', a tracing facility for Emacs
-      Lisp.
- 
-    * Bob Chassell wrote `texnfo-upd.el' and `makeinfo.el', modes and
-      utilities for working with Texinfo files.
- 
-    * James Clark wrote `sgml-mode.el', a mode for editing SGML
-      documents, and contributed to Emacs's dumping procedures.
- 
-    * Mike Clarkson wrote `edt.el', an emulation of DEC's EDT editor.
- 
-    * Doug Cutting and Jamie Zawinski wrote `disass.el', a disassembler
-      for compiled Emacs Lisp code.
- 
-    * Michael DeCorte wrote `emacs.csh', a C-shell script that starts a
-      new Emacs job, or restarts a paused Emacs if one exists.
- 
-    * Gary Delp wrote `mailpost.el', an interface between RMAIL and the
-      `/usr/uci/post' mailer.
- 
-    * Matthieu Devin wrote `delsel.el', a package to make newly-typed
-      text replace the current selection.
- 
-    * Scott Draves wrote `tq.el', help functions for maintaining
-      transaction queues between Emacs and its subprocesses.
- 
-    * Viktor Dukhovni wrote support for dumping under SunOS version 4.
- 
-    * Rolf Ebert co-wrote Ada mode (`ada-mode.el').
- 
-    * Torbjorn Einarsson contributed F90 mode (`f90.el').
- 
-    * Hans Henrik Eriksen wrote `simula.el', a mode for editing SIMULA 87
-      code.
- 
-    * Michael Ernst wrote `reposition.el', a command for recentering a
-      function's source code and preceeding comment on the screen.
- 
-    * Ata Etemadi wrote `cdl.el', functions for working with Common Data
-      Language source code.
- 
-    * Fred Fish wrote the support for dumping COFF executable files.
- 
-    * Karl Fogel wrote:
-         * `bookmark.el', for creating named placeholders, saving them
-           and jumping to them later,
- 
-         * `mail-hist.el', a history mechanism for outgoing mail
-           messages, and
- 
-         * `saveplace.el', for preserving point's location in files
-           between editing sessions.
- 
-    * Noah Friedman wrote `rlogin.el', an interface to rlogin, and
-      `type-break.el', which reminds you to take periodic breaks from
-      typing.  With Roland McGrath, he wrote `rsz-mini.el', a minor mode
-      to automatically resize the minibuffer to fit the text it contains.
- 
-    * Keith Gabryelski wrote `hexl.el', a mode for editing binary files.
- 
-    * Kevin Gallagher rewrote and enhanced the EDT emulation, and wrote
-      `flow-ctrl.el', a package for coping with unsuppressible XON/XOFF
-      flow control.
- 
-    * Howard Gayle wrote:
-         * the C and lisp code for display tables and case tables,
- 
-         * `rot13.el', a command to display the plaintext form of a
-           buffer encoded with the Caesar cipher,
- 
-         * much of the support for the ISO-8859 European character set
-           (which includes `iso-ascii.el', `iso-insert.el',
-           `iso-swed.el', `iso-syntax.el', `iso-transl.el', and
-           `swedish.el'), and
- 
-         * `vt100-led.el', a package for controlling the LED's on
-           VT100-compatible terminals.
- 
-    * Stephen Gildea made the Emacs quick reference card.
- 
-    * David Gillespie wrote:
-         * Emacs 19's Common Lisp compatibility packages, replacing the
-           old package by Cesar Augusto Quiroz Gonzalez,
- 
-         * `complete.el', a partial completion mechanism, and
- 
-         * `edmacro.el', a package for editing keyboard macros.
- 
-    * Boris Goldowsky wrote `avoid.el', a package to keep the mouse
-      cursor out of the way of the text cursor; `shadowfile.el', a
-      package for keeping identical copies of files in more than one
-      place; `enriched.el', a package for saving text properties in
-      files; and `facemenu.el', a package for specifying faces.
- 
-    * Michael Gschwind wrote `iso-cvt.el', a package to convert between
-      the ISO 8859-1 character set and the notations for non-`ASCII'
-      characters used by TeX and net tradition.
- 
-    * Henry Guillaume wrote `find-file.el', a package to visit a file
-      which is related to the currently visited fil
- 
-    * Doug Gwyn wrote the portable `alloca' implementation.
- 
-    * Chris Hanson wrote `netuname.el', a package to use HP-UX's Remote
-      File Access facility from Emacs.
- 
-    * K. Shane Hartman wrote:
-         * `chistory.el' and `echistory.el', packages for browsing
-           command history lists,
- 
-         * `electric.el' and `helper.el', providing an alternative
-           command loop and appropriate help facilities,
- 
-         * `emacsbug.el', a package for reporting Emacs bugs,
- 
-         * `picture.el', a mode for editing ASCII pictures, and
- 
-         * `view.el', a package for perusing files and buffers without
-           editing them.
- 
-    * Markus Heritsch co-wrote Ada mode (`ada-mode.el').
- 
-    * Karl Heuer wrote the original blessmail script, implemented the
-      `intangible' text property, and rearranged the structure of the
-      `Lisp_Object' type to allow for more data bits.
- 
-    * Manabu Higashida ported Emacs to the MS-DOS operating system.
- 
-    * Anders Holst wrote `hippie-exp.el', a versatile completion and
-      expansion package.
- 
-    * Lars Ingebrigtsen wrote `gnus-uu.el', an extension to the GNUS
-      newsreader to extract, view, and save articles using various
-      encoding and packaging formats.
- 
-    * Kyle Jones wrote `life.el', a package to play Conway's "life" game,
-      and `mldrag.el', a package which allows the user to resize windows
-      by dragging mode lines and vertical window separators with the
-      mouse.
- 
-    * David Kaufman wrote `yow.c', an essential utility program for the
-      hopelessly pinheaded.
- 
-    * Henry Kautz wrote `bib-mode.el', a mode for maintaining
-      bibliography databases compatible with `refer' (the `troff'
-      version) and `lookbib', and `refbib.el', a package to convert
-      those databases to the format used by the LaTeX text formatting
-      package.
- 
-    * Howard Kaye wrote `sort.el', commands to sort text in Emacs
-      buffers.
- 
-    * Michael Kifer wrote `ediff.el', an interactive interface to the
-      `diff' and `patch' programs, and Viper, the newest emulation for
-      VI.
- 
-    * Richard King wrote the first version of `userlock.el' and
-      `filelock.c', which provide simple support for multiple users
-      editing the same file.
- 
-    * Larry K. Kolodney wrote `cvtmail.c', a program to convert the mail
-      directories used by Gosling Emacs into RMAIL format.
- 
-    * Robert Krawitz wrote the original `xmenu.c', part of Emacs's pop-up
-      menu support.
- 
-    * Sebastian Kremer wrote Emacs 19's `dired-mode', with contributions
-      by Lawrence R. Dodd.
- 
-    * Geoff Kuenning wrote Emacs 19's `ispell.el', based on work by Ken
-      Stevens and others.
- 
-    * David Kegedal wrote `tempo.el', providing support for easy
-      insertion of boilerplate text and other common constructions.
- 
-    * Daniel LaLiberte wrote:
-         * `edebug.el', a source-level debugger for Emacs Lisp,
- 
-         * `cl-specs.el', specifications to help `edebug' debug code
-           written using David Gillespie's Common Lisp support,
- 
-         * `cust-print.el', a customizable package for printing lisp
-           objects,
- 
-         * `eval-reg.el', a re-implementation of `eval-region' in Emacs
-           Lisp, and
- 
-         * `isearch.el', Emacs 19's incremental search minor mode.
- 
-    * James R. Larus wrote `mh-e.el', an interface to the MH mail system.
- 
-    * Lars Lindberg wrote `msb.el', which provides more flexible menus
-      for buffer selection, and rewrote `dabbrev.el'.
- 
-    * Neil M. Mager wrote `appt.el', functions to notify users of their
-      appointments.  It finds appointments recorded in the diary files
-      generated by Edward M. Reingold's `calendar' package.
- 
-    * Ken Manheimer wrote `allout.el', a mode for manipulating and
-      formatting outlines, and `icomplete.el', which provides incremental
-      completion feedback in the minibuffer.
- 
-    * Bill Mann wrote `perl-mode.el', a mode for editing Perl code.
- 
-    * Brian Marick and Daniel LaLiberte wrote `hideif.el', support for
-      hiding selected code within C `#ifdef' clauses.
- 
-    * Simon Marshall wrote `fast-lock.el', which caches the face data
-      computed by Font-Lock mode.
- 
-    * Bengt Martensson, Mark Shapiro, Mike Newton, and Aaron Larson wrote
-      `bibtex.el', a mode for editing BibTeX bibliography files.
- 
-    * Charlie Martin wrote `autoinsert.el', which provides automatic
-      mode-sensitive insertion of text into new files.
- 
-    * Thomas May wrote `blackbox.el', a version of the traditional
-      blackbox game.
- 
-    * Roland McGrath wrote:
-         * `compile.el', a package for running compilations in a buffer,
-           and then visiting the locations reported in error messages,
- 
-         * `etags.el', a package for jumping to function definitions and
-           searching or replacing in all the files mentioned in a `TAGS'
-           file,
- 
-         * `find-dired.el', for using `dired' commands on output from the
-           `find' program, with Sebastian Kremer,
- 
-         * `map-ynp.el', a general purpose boolean question-asker,
- 
-         * `autoload.el', providing semi-automatic maintenance of
-           autoload files, and
- 
-         * `upd-copyr.el', providing semi-automatic maintenance of
-           copyright notices in source code.
- 
-    * David Megginson wrote `derived.el', which allows one to define new
-      major modes by inheriting key bindings and commands from existing
-      major modes.
- 
-    * Richard Mlynarik wrote:
-         * `cl-indent.el', a package for indenting Common Lisp code,
- 
-         * `ebuff-menu.el', an "electric" browser for buffer listings,
- 
-         * `ehelp.el', bindings for browsing help screens,
- 
-         * `rfc822.el', a parser for E-mail addresses in the RFC-822
-           format, used in mail messages and news articles,
- 
-         * `terminal.el', a terminal emulator for Emacs subprocesses, and
- 
-         * `yow.el', an essential utility (try `M-x yow').
- 
-    * Keith Moore wrote `aixcc.lex', a pre-processor designed to help
-      Emacs parse the error messages produced by the AIX C compiler.
- 
-    * Thomas Neumann and Eric Raymond wrote `makefile.el', a mode for
-      editing makefiles.
- 
-    * Jurgen Nickelsen wrote `ws-mode.el', providing WordStar emulation.
- 
-    * Jeff Norden wrote `kermit.el', a package to help the Kermit dialup
-      communications program run comfortably in an Emacs shell buffer.
- 
-      Andrew Norman wrote `ange-ftp.el', providing transparent FTP
-      support.
- 
-    * Jeff Peck wrote:
-         * `emacstool.c', support for running Emacs under SunView/Sun
-           Windows,
- 
-         * `sun-curs.el', cursor definitions for Sun Windows, and
- 
-         * `sun-fns.el', providing mouse support for Sun Windows.
- 
-    * Damon Anton Permezel wrote `hanoi.el', an animated demonstration of
-      the "Towers of Hanoi" puzzle.
- 
-    * Daniel Pfeiffer wrote:
-         * `sh-script.el', a mode for editing shell scripts,
- 
-         * `skeleton.el', implementing a concise language for writing
-           statement skeletons, and
- 
-         * `two-column.el', a minor mode for simultaneous two-column
-           editing.
- 
-    * Fred Pierresteguy and Paul Reilly made Emacs work with X Toolkit
-      widgets.
- 
-    * Christian Plaunt wrote `soundex.el', an implementation of the
-      Soundex algorithm for comparing English words by their
-      pronunciation.
- 
-    * Franceso A. Potorti wrote `cmacexp.el', providing a command which
-      runs the C preprocessor on a region of a file and displays the
-      results.
- 
-    * Michael D. Prange and Steven A. Wood wrote `fortran.el', a mode for
-      editing FORTRAN code.
- 
-    * Mukesh Prasad wrote `vmsproc.el', support for asynchronous
-      processes under VMS.
- 
-    * Ashwin Ram wrote `refer.el', commands to look up references in
-      bibliography files by keyword.
- 
-    * Eric S. Raymond wrote:
-         * `vc.el', an interface to the RCS and SCCS source code version
-           control systems, with Paul Eggert,
- 
-         * `gud.el', a package for running source-level debuggers like
-           GDB and SDB in Emacs,
- 
-         * `asm-mode.el', a mode for editing assembly language code,
- 
-         * `cookie1.el', support for "fortune-cookie" programs like
-           `yow.el' and `spook.el',
- 
-         * `finder.el', a package for finding Emacs Lisp packages by
-           keyword and topic,
- 
-         * `lisp-mnt.el', functions for working with the special headers
-           used in Emacs Lisp library files, and
- 
-         * code to set and make use of the `load-history' lisp variable,
-           which records the source file from which each lisp function
-           loaded into Emacs came.
- 
-    * Edward M. Reingold wrote the extensive calendar and diary support
-      (try `M-x calendar'), with contributions from Stewart Clamen, Paul
-      Eggert, and Lara Rios.  Andy Oram contributed to its documentation.
-      Reingold has also contributed to `tex-mode.el', a mode for editing
-      TeX files, as have William F. Schelter, Dick King, Stephen Gildea,
-      Michael Prange, and Jacob Gore.
- 
-    * Rob Riepel contributed `tpu-edt.el' and its associated files,
-      providing an emulation of the VMS TPU text editor emulating the
-      VMS EDT editor, and `vt-control.el', providing some control
-      functions for the DEC VT line of terminals.
- 
-    * Roland B. Roberts contributed much of the VMS support distributed
-      with Emacs 19, along with Joseph M. Kelsey, and `vms-pmail.el',
-      support for using Emacs within VMS MAIL.
- 
-    * John Robinson wrote `bg-mouse.el', support for the mouse on the BBN
-      Bitgraph terminal.
- 
-    * William Rosenblatt wrote `float.el', implementing a floating-point
-      numeric type using lisp pairs and fixnums.
- 
-    * Guillermo J. Rozas wrote `scheme.el', a mode for editing Scheme
-      code, and `fakemail.c', an interface to the System V mailer.
- 
-    * Wolfgang Rupprecht contributed Emacs 19's floating-point support
-      (including `float-sup.el' and `floatfns.c'), and `sup-mouse.el',
-      support for the Supdup mouse on lisp machines.
- 
-    * James B. Salem and Brewster Kahle wrote `completion.el', providing
-      dynamic word completion.
- 
-    * Masahiko Sato wrote `vip.el', an emulation of the VI editor.
- 
-    * William Schelter wrote `telnet.el', support for `telnet' sessions
-      within Emacs.
- 
-    * Gregor Schmid wrote `tcl.el', a mode for editing Tcl/Tk scripts.
- 
-    * Michael Schmidt and Tom Perrine wrote `modula2.el', a mode for
-      editing Modula-2 code, based on work by Mick Jordan and Peter
-      Robinson.
- 
-    * Ronald S. Schnell wrote `dunnet.el', a text adventure game.
- 
-    * Philippe Schnoebelen wrote `gomoku.el', a gomoku game played
-      against Emacs, and `mpuz.el', a multiplication puzzle.
- 
-    * Randal Schwartz wrote `pp.el', a pretty-printer for lisp objects.
- 
-    * Olin Shivers wrote:
-         * `comint.el', a library for modes running interactive
-           command-line- oriented subprocesses,
- 
-         * `cmuscheme.el', for running inferior Scheme processes,
- 
-         * `inf-lisp.el', for running inferior Lisp process, and
- 
-         * `shell.el', for running inferior shells.
- 
-    * Espen Skoglund wrote `pascal.el', a mode for editing Pascal code.
- 
-    * Rick Sladkey wrote `backquote.el', a lisp macro for creating
-      mostly-constant data.
- 
-    * Lynn Slater wrote `help-macro.el', a macro for writing interactive
-      help for key bindings.
- 
-    * Chris Smith wrote `icon.el', a mode for editing Icon code.
- 
-    * David Smith wrote `ielm.el', a mode for interacting with the Emacs
-      Lisp interpreter as a subprocess.
- 
-    * William Sommerfeld wrote `scribe.el', a mode for editing Scribe
-      files, and `server.el', a package allowing programs to send files
-      to an extant Emacs job to be edited.
- 
-    * Ake Stenhoff and Lars Lindberg wrote `imenu.el', a framework for
-      browsing indices made from buffer contents.
- 
-    * Jonathan Stigelman wrote `hilit19.el', a package providing
-      automatic highlighting in source code buffers, mail readers, and
-      other contexts.
- 
-    * Steve Strassman did not write `spook.el', and even if he did, he
-      really didn't mean for you to use it in an anarchistic way.
- 
-    * Spencer Thomas wrote the original `dabbrev.el', providing a command
-      which completes the partial word before point, based on other
-      nearby words for which it is a prefix.  He also wrote the original
-      dumping support.
- 
-    * Jim Thompson wrote `ps-print.el', which converts Emacs text to
-      Postscript.
- 
-    * Masanobu Umeda wrote:
-         * GNUS, a featureful reader for Usenet news,
- 
-         * `prolog.el', a mode for editing Prolog code,
- 
-         * `rmailsort.el', a package for sorting messages in RMAIL
-           folders,
- 
-         * `metamail.el', an interface to the Metamail program,
- 
-         * `tcp.el', emulation of the `open-network-stream' function for
-           some Emacs configurations which lack it, and
- 
-         * `timezone.el', providing functions for dealing with time
-           zones.
- 
-    * Geoffrey Voelker wrote the Windows NT support.
- 
-    * Johan Vromans wrote `forms.el' and its associated files, defining a
-      mode for filling in forms, and `iso-acc.el', a minor mode providing
-      electric accent keys for text using the ISO-8859 character set.
- 
-    * Barry Warsaw wrote:
-         * `assoc.el', a set of utility functions for working with
-           association lists,
- 
-         * `cc-mode.el', a major mode for editing C and C++ code, based
-           on earlier work by Dave Detlefs, Stewart Clamen, and Richard
-           Stallman,
- 
-         * `elp.el', a new profiler for Emacs Lisp programs.
- 
-         * `man.el', a mode for reading UNIX manual pages,
- 
-         * `regi.el', providing an AWK-like control structure for use in
-           lisp programs, and
- 
-         * `reporter.el', providing customizable bug reporting for lisp
-           packages.
- 
-         * `supercite.el', a minor mode for quoting sections of mail
-           messages and news articles,
- 
-    * Morten Welinder wrote:
-         * `desktop.el', facilities for saving some of Emacs's state
-           between sessions,
- 
-         * `s-region.el', commands for setting the region using the
-           shift key and motion commands, and
- 
-         * `dos-fns.el', functions for use under MS-DOS.
- 
-    * Joseph Brian Wells wrote:
-         * `apropos.el', a command to find commands, functions, and
-           variables whose names contain matches for a regular
-           expression,
- 
-         * `resume.el', support for processing command-line arguments
-           after resuming a suspended Emacs job, and
- 
-         * `mail-extr.el', a package for extracting names and addresses
-           from mail headers, with contributions from Jamie Zawinski.
- 
-    * Ed Wilkinson wrote `b2m.c', a program to convert mail files from
-      RMAIL format to Unix `mbox' format.
- 
-    * Mike Williams wrote `mouse-sel.el', providing enhanced mouse
-      selection, and `thingatpt.el', a library of functions for finding
-      the "thing" (word, line, s-expression) containing point.
- 
-    * Dale R. Worley wrote `emerge.el', a package for interactively
-      merging two versions of a file.
- 
-    * Tom Wurgler wrote `emacs-lock.el', which makes it harder to exit
-      with valuable buffers unsaved.
- 
-    * Jamie Zawinski wrote:
-         * Emacs 19's optimizing byte compiler, with Hallvard Furuseth,
- 
-         * much of the support for faces and X selections,
- 
-         * `mailabbrev.el', a package providing automatic expansion of
-           mail aliases, and
- 
-         * `tar-mode.el', providing simple viewing and editing commands
-           for tar files.
- 
-    * Neal Ziring and Felix S. T. Wu wrote `vi.el', an emulation of the
-      VI text editor.
- 
-    Others too numerous to mention have reported and fixed bugs, and
- added features to many parts of Emacs.  We thank them for their
- generosity as well.
- 
-    This list intended to mention every contributor of a major package or
- feature we currently distribute; if you know of someone we have omitted,
- please report that as a manual bug.
- 
--- 0 ----
Index: emacs/info/emacs-24
diff -c emacs/info/emacs-24:1.1.1.2 emacs/info/emacs-24:removed
*** emacs/info/emacs-24:1.1.1.2	Mon Jul 22 01:52:24 1996
--- emacs/info/emacs-24	Fri Aug  2 20:12:11 1996
***************
*** 1,581 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Key Index,  Next: Command Index,  Prev: Glossary,  Up: Top
- 
- Key (Character) Index
- *********************
- 
- * Menu:
- 
- * ! (Dired):                            Shell Commands in Dired.
- * " (TeX mode):                         TeX Editing.
- * # (Dired):                            Flagging Many Files.
- * $ (Dired):                            Hiding Subdirectories.
- * % C (Dired):                          Transforming File Names.
- * % d (Dired):                          Flagging Many Files.
- * % H (Dired):                          Transforming File Names.
- * % l (Dired):                          Transforming File Names.
- * % m (Dired):                          Marks vs Flags.
- * % R (Dired):                          Transforming File Names.
- * % S (Dired):                          Transforming File Names.
- * % u (Dired):                          Transforming File Names.
- * * (Dired):                            Marks vs Flags.
- * + (Dired):                            Operating on Files.
- * . (Calendar mode):                    Specified Dates.
- * . (Dired):                            Flagging Many Files.
- * . (Rmail):                            Rmail Scrolling.
- * / (Dired):                            Marks vs Flags.
- * < (Rmail):                            Rmail Motion.
- * = (Dired):                            Comparison in Dired.
- * > (Rmail):                            Rmail Motion.
- * @ (Dired):                            Marks vs Flags.
- * BOTTOM:                               Moving Point.
- * DEL (Dired):                          Dired Deletion.
- * ESC ESC ESC:                          Quitting.
- * LEFT:                                 Moving Point.
- * NEXT:                                 Scrolling.
- * PRIOR:                                Scrolling.
- * RET (Dired):                          Dired Visiting.
- * RET (Occur mode):                     Other Repeating Search.
- * RET (Shell mode):                     Shell Mode.
- * RIGHT:                                Moving Point.
- * SPC (Dired):                          Dired Commands.
- * TAB (GUD):                            Commands of GUD.
- * TAB (Shell mode):                     Shell Mode.
- * TOP:                                  Moving Point.
- * a (Calendar mode):                    Holidays.
- * A (Dired):                            Operating on Files.
- * a (Rmail):                            Rmail Labels.
- * B (Dired):                            Operating on Files.
- * b (Rmail):                            Rmail Basics.
- * c (Dired):                            Marks vs Flags.
- * C (Dired):                            Operating on Files.
- * c (Rmail):                            Rmail Reply.
- * C-@:                                  Setting Mark.
- * C-a:                                  Moving Point.
- * C-a (Calendar mode):                  Move to Beginning or End.
- * C-b:                                  Moving Point.
- * C-b (Calendar mode):                  Calendar Unit Motion.
- * C-c ' (Picture mode):                 Insert in Picture.
- * C-c . (Picture mode):                 Insert in Picture.
- * C-c / (Picture mode):                 Insert in Picture.
- * C-c ; (Fortran mode):                 Fortran Comments.
- * C-c < (GUD):                          Commands of GUD.
- * C-c < (Picture mode):                 Insert in Picture.
- * C-c > (GUD):                          Commands of GUD.
- * C-c > (Picture mode):                 Insert in Picture.
- * C-c @ (Outline minor mode):           Outline Mode.
- * C-c RET (Shell mode):                 Shell History Copying.
- * C-c { (TeX mode):                     TeX Editing.
- * C-c } (TeX mode):                     TeX Editing.
- * C-c C-a (Mail mode):                  Mail Aliases.
- * C-c C-a (Outline mode):               Outline Visibility.
- * C-c C-a (Shell mode):                 Shell Mode.
- * C-c C-b (TeX mode):                   TeX Print.
- * C-c C-b (Outline mode):               Outline Motion.
- * C-c C-b (Picture mode):               Insert in Picture.
- * C-c C-b (Shell mode):                 Shell Mode.
- * C-c C-c (Edit Abbrevs):               Editing Abbrevs.
- * C-c C-c (Edit Tab Stops):             Tab Stops.
- * C-c C-c (Mail mode):                  Mail Mode.
- * C-c C-c (Outline mode):               Outline Visibility.
- * C-c C-c (Shell mode):                 Shell Mode.
- * C-c C-d (GUD):                        Commands of GUD.
- * C-c C-d (Outline mode):               Outline Visibility.
- * C-c C-d (Picture mode):               Basic Picture.
- * C-c C-e (LaTeX mode):                 LaTeX Editing.
- * C-c C-e (Outline mode):               Outline Visibility.
- * C-c C-e (Shell mode):                 Shell Mode.
- * C-c C-f (TeX mode):                   TeX Print.
- * C-c C-f (GUD):                        Commands of GUD.
- * C-c C-f (Outline mode):               Outline Motion.
- * C-c C-f (Picture mode):               Insert in Picture.
- * C-c C-f (Shell mode):                 Shell Mode.
- * C-c C-f C-b (Mail mode):              Mail Mode.
- * C-c C-f C-c (Mail mode):              Mail Mode.
- * C-c C-f C-f (Mail mode):              Mail Mode.
- * C-c C-f C-s (Mail mode):              Mail Mode.
- * C-c C-f C-t (Mail mode):              Mail Mode.
- * C-c C-i (GUD):                        Commands of GUD.
- * C-c C-i (Outline mode):               Outline Visibility.
- * C-c C-k (TeX mode):                   TeX Print.
- * C-c C-k (Outline mode):               Outline Visibility.
- * C-c C-k (Picture mode):               Rectangles in Picture.
- * C-c C-l (TeX mode):                   TeX Print.
- * C-c C-l (Calendar mode):              General Calendar.
- * C-c C-l (GUD):                        Commands of GUD.
- * C-c C-l (Outline mode):               Outline Visibility.
- * C-c C-l (Shell mode):                 Shell Mode.
- * C-c C-n (C mode):                     C Mode.
- * C-c C-n (Fortran mode):               Fortran Motion.
- * C-c C-n (GUD):                        Commands of GUD.
- * C-c C-n (Outline mode):               Outline Motion.
- * C-c C-n (Shell mode):                 Shell History Copying.
- * C-c C-o (LaTeX mode):                 LaTeX Editing.
- * C-c C-o (Outline mode):               Outline Visibility.
- * C-c C-o (Shell mode):                 Shell Mode.
- * C-c C-p (TeX mode):                   TeX Print.
- * C-c C-p (C mode):                     C Mode.
- * C-c C-p (Fortran mode):               Fortran Motion.
- * C-c C-p (Outline mode):               Outline Motion.
- * C-c C-p (Shell mode):                 Shell History Copying.
- * C-c C-q (TeX mode):                   TeX Print.
- * C-c C-q (Mail mode):                  Mail Mode.
- * C-c C-q (Outline mode):               Outline Visibility.
- * C-c C-r (TeX mode):                   TeX Print.
- * C-c C-r (Fortran mode):               Fortran Columns.
- * C-c C-r (GUD):                        Commands of GUD.
- * C-c C-r (Shell mode):                 Shell Mode.
- * C-c C-s (GUD):                        Commands of GUD.
- * C-c C-s (Mail mode):                  Mail Mode.
- * C-c C-s (Outline mode):               Outline Visibility.
- * C-c C-t (GUD):                        Commands of GUD.
- * C-c C-t (Mail mode):                  Mail Mode.
- * C-c C-t (Outline mode):               Outline Visibility.
- * C-c C-u (C mode):                     C Mode.
- * C-c C-u (Outline mode):               Outline Motion.
- * C-c C-u (Shell mode):                 Shell Mode.
- * C-c C-v (TeX mode):                   TeX Print.
- * C-c C-w (Fortran mode):               Fortran Columns.
- * C-c C-w (Mail mode):                  Mail Mode.
- * C-c C-w (Picture mode):               Rectangles in Picture.
- * C-c C-w (Shell mode):                 Shell Mode.
- * C-c C-x (Picture mode):               Rectangles in Picture.
- * C-c C-y (Mail mode):                  Mail Mode.
- * C-c C-y (Picture mode):               Rectangles in Picture.
- * C-c C-z (Shell mode):                 Shell Mode.
- * C-c C-\ (Shell mode):                 Shell Mode.
- * C-c TAB (TeX mode):                   TeX Print.
- * C-c TAB (Picture mode):               Tabs in Picture.
- * C-c \ (Picture mode):                 Insert in Picture.
- * C-c ^ (Picture mode):                 Insert in Picture.
- * C-c ` (Picture mode):                 Insert in Picture.
- * C-d:                                  Deletion.
- * C-d (Rmail):                          Rmail Deletion.
- * C-d (Shell mode):                     Shell Mode.
- * C-e:                                  Moving Point.
- * C-e (Calendar mode):                  Move to Beginning or End.
- * C-f:                                  Moving Point.
- * C-f (Calendar mode):                  Calendar Unit Motion.
- * C-g:                                  Quitting.
- * C-g:                                  Minibuffer.
- * C-h a:                                Apropos.
- * C-h b:                                Misc Help.
- * C-h c:                                Key Help.
- * C-h C-c:                              Misc Help.
- * C-h C-d:                              Misc Help.
- * C-h C-f:                              Misc Help.
- * C-h C-k:                              Misc Help.
- * C-h C-p:                              Misc Help.
- * C-h C-w:                              Misc Help.
- * C-h f:                                Name Help.
- * C-h i:                                Misc Help.
- * C-h k:                                Key Help.
- * C-h l:                                Misc Help.
- * C-h m:                                Misc Help.
- * C-h n:                                Misc Help.
- * C-h p:                                Library Keywords.
- * C-h s:                                Syntax.
- * C-h t:                                Basic.
- * C-h w:                                Name Help.
- * C-k:                                  Killing by Lines.
- * C-k (GNUS):                           Summary of GNUS.
- * C-l:                                  Scrolling.
- * C-M-.:                                Find Tag.
- * C-M-/:                                Dynamic Abbrevs.
- * C-M-@:                                List Commands.
- * C-M-DEL:                              List Commands.
- * C-M-a:                                Defuns.
- * C-M-a (Fortran mode):                 Fortran Motion.
- * C-M-b:                                List Commands.
- * C-M-c:                                Recursive Edit.
- * C-M-d:                                List Commands.
- * C-M-d (Dired):                        Subdirectory Motion.
- * C-M-e:                                Defuns.
- * C-M-e (Fortran mode):                 Fortran Motion.
- * C-M-f:                                List Commands.
- * C-M-h:                                Defuns.
- * C-M-h (Fortran mode):                 Fortran Motion.
- * C-M-k:                                List Commands.
- * C-M-l:                                Scrolling.
- * C-M-l (Rmail):                        Rmail Make Summary.
- * C-M-l (Shell mode):                   Shell Mode.
- * C-M-n:                                List Commands.
- * C-M-n (Dired):                        Subdirectory Motion.
- * C-M-n (GNUS Summary mode):            Summary of GNUS.
- * C-M-n (Rmail):                        Rmail Labels.
- * C-M-o:                                Indentation Commands.
- * C-M-p:                                List Commands.
- * C-M-p (Dired):                        Subdirectory Motion.
- * C-M-p (GNUS Summary mode):            Summary of GNUS.
- * C-M-p (Rmail):                        Rmail Labels.
- * C-M-q:                                Multi-line Indent.
- * C-M-q (Fortran mode):                 ForIndent Commands.
- * C-M-r:                                Regexp Search.
- * C-M-r (Rmail):                        Rmail Make Summary.
- * C-M-s:                                Regexp Search.
- * C-M-t:                                List Commands.
- * C-M-t:                                Transpose.
- * C-M-t (Rmail):                        Rmail Make Summary.
- * C-M-u:                                List Commands.
- * C-M-u (Dired):                        Subdirectory Motion.
- * C-M-v:                                Other Window.
- * C-M-w:                                Appending Kills.
- * C-M-x (Emacs-Lisp mode):              Lisp Eval.
- * C-M-x (Lisp mode):                    External Lisp.
- * C-M-\:                                Indentation Commands.
- * C-Mouse-1:                            Frame Parameters.
- * C-Mouse-2 (scroll bar):               Split Window.
- * C-Mouse-3:                            Menu Mouse Clicks.
- * C-n:                                  Moving Point.
- * C-n (Calendar mode):                  Calendar Unit Motion.
- * C-n (Dired):                          Dired Commands.
- * C-n (GNUS Group mode):                Summary of GNUS.
- * C-n (GNUS Summary mode):              Summary of GNUS.
- * C-o:                                  Blank Lines.
- * C-o (Dired):                          Dired Visiting.
- * C-o (Rmail):                          Rmail Output.
- * C-p:                                  Moving Point.
- * C-p (Calendar mode):                  Calendar Unit Motion.
- * C-p (Dired):                          Dired Commands.
- * C-p (GNUS Group mode):                Summary of GNUS.
- * C-p (GNUS Summary mode):              Summary of GNUS.
- * C-q:                                  Inserting Text.
- * C-r:                                  Incremental Search.
- * C-s:                                  Incremental Search.
- * C-SPC:                                Setting Mark.
- * C-t:                                  Moving Point.
- * C-t:                                  Transpose.
- * C-u:                                  Arguments.
- * C-u - C-x ;:                          Comment Commands.
- * C-u C-@:                              Mark Ring.
- * C-u C-SPC:                            Mark Ring.
- * C-u C-x C-q:                          Check-Out.
- * C-u TAB:                              Multi-line Indent.
- * C-v:                                  Scrolling.
- * C-v (Calendar mode):                  Scroll Calendar.
- * C-w:                                  Other Kill Commands.
- * C-x #:                                Emacs Server.
- * C-x $:                                Selective Display.
- * C-x (:                                Basic Kbd Macro.
- * C-x ):                                Basic Kbd Macro.
- * C-x .:                                Fill Prefix.
- * C-x 0:                                Change Window.
- * C-x 1:                                Change Window.
- * C-x 2:                                Split Window.
- * C-x 3:                                Split Window.
- * C-x 4:                                Pop Up Window.
- * C-x 4 .:                              Find Tag.
- * C-x 4 a:                              Change Log.
- * C-x 4 b:                              Select Buffer.
- * C-x 4 d:                              Dired Enter.
- * C-x 4 f:                              Visiting.
- * C-x 4 m:                              Sending Mail.
- * C-x 5:                                Creating Frames.
- * C-x 5 .:                              Find Tag.
- * C-x 5 0:                              Misc X.
- * C-x 5 2:                              Creating Frames.
- * C-x 5 b:                              Select Buffer.
- * C-x 5 d:                              Dired Enter.
- * C-x 5 f:                              Visiting.
- * C-x 5 m:                              Sending Mail.
- * C-x 5 r:                              Creating Frames.
- * C-x 6 1:                              Two-Column.
- * C-x 6 2:                              Two-Column.
- * C-x 6 DEL:                            Two-Column.
- * C-x 6 SPC:                            Two-Column.
- * C-x 6 b:                              Two-Column.
- * C-x 6 C-l:                            Two-Column.
- * C-x 6 d:                              Two-Column.
- * C-x 6 s:                              Two-Column.
- * C-x 8:                                European Display.
- * C-x ;:                                Options for Comments.
- * C-x <:                                Horizontal Scrolling.
- * C-x < (Calendar mode):                Scroll Calendar.
- * C-x =:                                Position Info.
- * C-x >:                                Horizontal Scrolling.
- * C-x > (Calendar mode):                Scroll Calendar.
- * C-x SPC:                              Commands of GUD.
- * C-x TAB (Enriched mode):              Format Indentation.
- * C-x }:                                Change Window.
- * C-x a g:                              Defining Abbrevs.
- * C-x a i g:                            Defining Abbrevs.
- * C-x a i l:                            Defining Abbrevs.
- * C-x a l:                              Defining Abbrevs.
- * C-x b:                                Select Buffer.
- * C-x C-a (GUD):                        Commands of GUD.
- * C-x C-b:                              List Buffers.
- * C-x C-c:                              Exiting.
- * C-x C-d:                              Directories.
- * C-x C-e:                              Lisp Eval.
- * C-x C-f:                              Visiting.
- * C-x C-k:                              Basic Kbd Macro.
- * C-x C-l:                              Case.
- * C-x C-n:                              Moving Point.
- * C-x C-o:                              Blank Lines.
- * C-x C-p:                              Pages.
- * C-x C-q:                              Misc Buffer.
- * C-x C-q (version control):            Check-Out.
- * C-x C-r:                              Visiting.
- * C-x C-s:                              Saving.
- * C-x C-t:                              Transpose.
- * C-x C-u:                              Case.
- * C-x C-v:                              Visiting.
- * C-x C-w:                              Saving.
- * C-x C-x:                              Setting Mark.
- * C-x C-z:                              External Lisp.
- * C-x d:                                Dired Enter.
- * C-x DEL:                              Sentences.
- * C-x e:                                Basic Kbd Macro.
- * C-x ESC ESC:                          Repetition.
- * C-x f:                                Fill Commands.
- * C-x h:                                Marking Objects.
- * C-x k:                                Kill Buffer.
- * C-x l:                                Pages.
- * C-x m:                                Sending Mail.
- * C-x n n:                              Narrowing.
- * C-x n p:                              Narrowing.
- * C-x n w:                              Narrowing.
- * C-x o:                                Other Window.
- * C-x q:                                Kbd Macro Query.
- * C-x r SPC:                            RegPos.
- * C-x r b:                              Bookmarks.
- * C-x r d:                              Rectangles.
- * C-x r f:                              RegConfig.
- * C-x r i:                              RegText.
- * C-x r j:                              RegPos.
- * C-x r k:                              Rectangles.
- * C-x r l:                              Bookmarks.
- * C-x r m:                              Bookmarks.
- * C-x r o:                              Rectangles.
- * C-x r s:                              RegText.
- * C-x r w:                              RegConfig.
- * C-x r y:                              Rectangles.
- * C-x s:                                Saving.
- * C-x TAB:                              Indentation Commands.
- * C-x u:                                Undo.
- * C-x v =:                              Old Versions.
- * C-x v a:                              Change Logs and VC.
- * C-x v c:                              Version Control Undo.
- * C-x v d:                              Status in VC.
- * C-x v h:                              Version Headers.
- * C-x v i:                              Registering.
- * C-x v l:                              Status in VC.
- * C-x v r:                              Making Snapshots.
- * C-x v s:                              Making Snapshots.
- * C-x v u:                              Version Control Undo.
- * C-x v ~:                              Old Versions.
- * C-x [:                                Pages.
- * C-x [ (Calendar mode):                Calendar Unit Motion.
- * C-x ]:                                Pages.
- * C-x ] (Calendar mode):                Calendar Unit Motion.
- * C-x ^:                                Change Window.
- * C-x `:                                Compilation.
- * C-y:                                  Kill Ring.
- * C-z:                                  Exiting.
- * C-z (X windows):                      Misc X.
- * C-]:                                  Quitting.
- * C-_:                                  Undo.
- * d (Calendar mode):                    Diary Commands.
- * d (Dired):                            Dired Deletion.
- * d (Rmail):                            Rmail Deletion.
- * DEL:                                  Deletion.
- * DEL (and major modes):                Major Modes.
- * DEL (GNUS):                           Summary of GNUS.
- * DEL (programming modes):              Program Modes.
- * DEL (Rmail):                          Rmail Scrolling.
- * e (Rmail):                            Rmail Editing.
- * f (Dired):                            Dired Visiting.
- * f (Rmail):                            Rmail Reply.
- * G (Dired):                            Operating on Files.
- * g (Dired):                            Dired Updating.
- * g (Rmail):                            Rmail Files.
- * g CHAR (Calendar mode):               From Other Calendar.
- * g d (Calendar mode):                  Specified Dates.
- * g m (Calendar mode):                  Mayan Calendar.
- * h (Calendar mode):                    Holidays.
- * H (Dired):                            Operating on Files.
- * h (Rmail):                            Rmail Make Summary.
- * Help:                                 Help.
- * i (Dired):                            Subdirectories in Dired.
- * i (Rmail):                            Rmail Files.
- * i a (Calendar mode):                  Special Diary Entries.
- * i b (Calendar mode):                  Special Diary Entries.
- * i c (Calendar mode):                  Special Diary Entries.
- * i d (Calendar mode):                  Adding to Diary.
- * i m (Calendar mode):                  Adding to Diary.
- * i w (Calendar mode):                  Adding to Diary.
- * i y (Calendar mode):                  Adding to Diary.
- * j (Rmail):                            Rmail Motion.
- * k (Dired):                            Dired Updating.
- * k (Rmail):                            Rmail Labels.
- * l (Dired):                            Dired Updating.
- * L (Dired):                            Operating on Files.
- * L (GNUS Group mode):                  Summary of GNUS.
- * l (GNUS Group mode):                  Summary of GNUS.
- * l (Rmail):                            Rmail Make Summary.
- * LFD:                                  Basic Indent.
- * LFD (TeX mode):                       TeX Editing.
- * LFD (and major modes):                Major Modes.
- * LFD (Fortran mode):                   ForIndent Commands.
- * m (Calendar mode):                    Diary Commands.
- * M (Calendar mode):                    Lunar Phases.
- * M (Dired):                            Operating on Files.
- * m (Dired):                            Marks vs Flags.
- * m (Rmail):                            Rmail Reply.
- * M-!:                                  Single Shell.
- * M-$:                                  Spelling.
- * M-$ (Dired):                          Hiding Subdirectories.
- * M-%:                                  Query Replace.
- * M-':                                  Expanding Abbrevs.
- * M-(:                                  Balanced Editing.
- * M-):                                  Balanced Editing.
- * M-,:                                  Tags Search.
- * M-.:                                  Find Tag.
- * M-/:                                  Dynamic Abbrevs.
- * M-1:                                  Arguments.
- * M-::                                  Lisp Eval.
- * M-;:                                  Comment Commands.
- * M-<:                                  Moving Point.
- * M-< (Calendar mode):                  Move to Beginning or End.
- * M-=:                                  Position Info.
- * M-= (Calendar mode):                  Counting Days.
- * M-= (Dired):                          Comparison in Dired.
- * M->:                                  Moving Point.
- * M-> (Calendar mode):                  Move to Beginning or End.
- * M-? (Nroff mode):                     Nroff Mode.
- * M-? (Shell mode):                     Shell Mode.
- * M-@:                                  Words.
- * M-DEL (Dired):                        Marks vs Flags.
- * M--:                                  Arguments.
- * M-- M-c:                              Fixing Case.
- * M-- M-l:                              Fixing Case.
- * M-- M-u:                              Fixing Case.
- * M-{:                                  Paragraphs.
- * M-{ (Calendar mode):                  Calendar Unit Motion.
- * M-}:                                  Paragraphs.
- * M-} (Calendar mode):                  Calendar Unit Motion.
- * M-a:                                  Sentences.
- * M-a (C mode):                         C Mode.
- * M-a (Calendar mode):                  Move to Beginning or End.
- * M-b:                                  Words.
- * M-c:                                  Case.
- * M-d:                                  Words.
- * M-DEL:                                Words.
- * M-Drag-Mouse-1:                       Secondary Selection.
- * M-e:                                  Sentences.
- * M-e (C mode):                         C Mode.
- * M-e (Calendar mode):                  Move to Beginning or End.
- * M-f:                                  Words.
- * M-g b (Enriched mode):                Format Faces.
- * M-g d (Enriched mode):                Format Faces.
- * M-g i (Enriched mode):                Format Faces.
- * M-g l (Enriched mode):                Format Faces.
- * M-g o (Enriched mode):                Format Faces.
- * M-g u (Enriched mode):                Format Faces.
- * M-h:                                  Paragraphs.
- * M-i:                                  Tab Stops.
- * M-j c (Enriched mode):                Format Justification.
- * M-j f (Enriched mode):                Format Justification.
- * M-j l (Enriched mode):                Format Justification.
- * M-j r (Enriched mode):                Format Justification.
- * M-j u (Enriched mode):                Format Justification.
- * M-k:                                  Sentences.
- * M-l:                                  Case.
- * M-LFD:                                Multi-Line Comments.
- * M-LFD (Fortran mode):                 ForIndent Commands.
- * M-m:                                  Indentation Commands.
- * M-m (Rmail):                          Rmail Reply.
- * M-Mouse-1:                            Secondary Selection.
- * M-Mouse-2:                            Secondary Selection.
- * M-Mouse-3:                            Secondary Selection.
- * M-n (minibuffer history):             Minibuffer History.
- * M-n (Nroff mode):                     Nroff Mode.
- * M-n (Rmail):                          Rmail Motion.
- * M-n (Shell mode):                     Shell Ring.
- * M-p (minibuffer history):             Minibuffer History.
- * M-p (Nroff mode):                     Nroff Mode.
- * M-p (Rmail):                          Rmail Motion.
- * M-p (Shell mode):                     Shell Ring.
- * M-q:                                  Fill Commands.
- * M-q (C mode):                         C Mode.
- * M-r:                                  Moving Point.
- * M-r (minibuffer history):             Minibuffer History.
- * M-r (Shell mode):                     Shell Ring.
- * M-S (Enriched mode):                  Format Justification.
- * M-s (GNUS Summary mode):              Summary of GNUS.
- * M-s (minibuffer history):             Minibuffer History.
- * M-s (Rmail):                          Rmail Motion.
- * M-s (Shell mode):                     Shell Ring.
- * M-s (Text mode):                      Fill Commands.
- * M-SPC:                                Deletion.
- * M-t:                                  Transpose.
- * M-t:                                  Words.
- * M-TAB:                                Symbol Completion.
- * M-TAB (Picture mode):                 Tabs in Picture.
- * M-TAB (Text mode):                    Text Mode.
- * M-u:                                  Case.
- * M-v:                                  Scrolling.
- * M-v (Calendar mode):                  Scroll Calendar.
- * M-w:                                  Kill Ring.
- * M-x:                                  M-x.
- * M-y:                                  Earlier Kills.
- * M-z:                                  Other Kill Commands.
- * M-\:                                  Deletion.
- * M-^:                                  Indentation Commands.
- * M-|:                                  Single Shell.
- * M-~:                                  Saving.
- * Mouse-1:                              Mouse Commands.
- * Mouse-2:                              Mouse Commands.
- * Mouse-2 (selection):                  Mouse References.
- * Mouse-3:                              Mouse Commands.
- * n (GNUS):                             Summary of GNUS.
- * n (Rmail):                            Rmail Motion.
- * o (Calendar mode):                    Specified Dates.
- * O (Dired):                            Operating on Files.
- * o (Dired):                            Dired Visiting.
- * o (Rmail):                            Rmail Output.
- * p (Calendar mode):                    To Other Calendar.
- * P (Dired):                            Operating on Files.
- * p (GNUS):                             Summary of GNUS.
- * p (Rmail):                            Rmail Motion.
- * p d (Calendar mode):                  General Calendar.
- * q (Calendar mode):                    General Calendar.
- * Q (Dired):                            Operating on Files.
- * q (GNUS Group mode):                  Summary of GNUS.
- * q (Rmail summary):                    Rmail Summary Edit.
- * q (Rmail):                            Rmail Basics.
- * R (Dired):                            Operating on Files.
- * r (Rmail):                            Rmail Reply.
- * RET:                                  Inserting Text.
- * s (Calendar mode):                    Diary Commands.
- * S (Calendar mode):                    Sunrise/Sunset.
- * s (Dired):                            Dired Updating.
- * S (Dired):                            Operating on Files.
- * s (GNUS Summary mode):                Summary of GNUS.
- * s (Rmail):                            Rmail Basics.
- * SPC:                                  Completion Commands.
- * SPC (Calendar mode):                  General Calendar.
- * SPC (GNUS):                           Summary of GNUS.
- * SPC (Rmail):                          Rmail Scrolling.
- * t (Rmail):                            Rmail Display.
- * TAB:                                  Indentation.
- * TAB (and major modes):                Major Modes.
- * TAB (completion):                     Completion Example.
- * TAB (Indented Text mode):             Text Mode.
- * TAB (programming modes):              Basic Indent.
- * u (Calendar mode):                    Holidays.
- * u (Dired):                            Dired Deletion.
- * u (GNUS Group mode):                  Summary of GNUS.
- * u (Rmail):                            Rmail Deletion.
- * v (Dired):                            Dired Visiting.
- * w (Rmail summary):                    Rmail Summary Edit.
- * x (Calendar mode):                    Holidays.
- * x (Dired):                            Dired Deletion.
- * x (Rmail):                            Rmail Deletion.
- * Z (Dired):                            Operating on Files.
- * z (GNUS Group mode):                  Summary of GNUS.
- * ~ (Dired):                            Flagging Many Files.
- 
--- 0 ----
Index: emacs/info/emacs-25
diff -c emacs/info/emacs-25:1.1.1.1 emacs/info/emacs-25:removed
*** emacs/info/emacs-25:1.1.1.1	Mon Jul 22 01:52:25 1996
--- emacs/info/emacs-25	Fri Aug  2 20:12:35 1996
***************
*** 1,855 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Command Index,  Next: Variable Index,  Prev: Key Index,  Up: Top
- 
- Command and Function Index
- **************************
- 
- * Menu:
- 
- * abbrev-mode:                          Abbrev Concepts.
- * abbrev-prefix-mark:                   Expanding Abbrevs.
- * abort-recursive-edit:                 Quitting.
- * add-change-log-entry-other-window:    Change Log.
- * add-global-abbrev:                    Defining Abbrevs.
- * add-mode-abbrev:                      Defining Abbrevs.
- * add-name-to-file:                     Misc File Ops.
- * american-calendar:                    Date Formats.
- * append-next-kill:                     Appending Kills.
- * append-to-buffer:                     Accumulating Text.
- * append-to-file:                       Accumulating Text.
- * appt-add:                             Appointments.
- * appt-delete:                          Appointments.
- * appt-make-list:                       Appointments.
- * apropos:                              Apropos.
- * ask-user-about-lock:                  Interlocking.
- * auto-fill-mode:                       Auto Fill.
- * auto-lower-mode:                      Frame Parameters.
- * auto-raise-mode:                      Frame Parameters.
- * auto-save-mode:                       Auto Save Control.
- * back-to-indentation:                  Indentation Commands.
- * backward-char:                        Moving Point.
- * backward-delete-char-untabify:        Program Modes.
- * backward-kill-sentence:               Sentences.
- * backward-kill-sexp:                   List Commands.
- * backward-kill-word:                   Words.
- * backward-list:                        List Commands.
- * backward-page:                        Pages.
- * backward-paragraph:                   Paragraphs.
- * backward-sentence:                    Sentences.
- * backward-sexp:                        List Commands.
- * backward-text-line:                   Nroff Mode.
- * backward-up-list:                     List Commands.
- * backward-word:                        Words.
- * beginning-of-buffer:                  Moving Point.
- * beginning-of-defun:                   Defuns.
- * beginning-of-fortran-subprogram:      Fortran Motion.
- * beginning-of-line:                    Moving Point.
- * binary-overwrite-mode:                Minor Modes.
- * blackbox:                             Amusements.
- * bookmark-delete:                      Bookmarks.
- * bookmark-insert:                      Bookmarks.
- * bookmark-jump:                        Bookmarks.
- * bookmark-jump:                        Bookmarks.
- * bookmark-load:                        Bookmarks.
- * bookmark-locale:                      Bookmarks.
- * bookmark-save:                        Bookmarks.
- * bookmark-set:                         Bookmarks.
- * bookmark-set:                         Bookmarks.
- * bookmark-write:                       Bookmarks.
- * buffer-menu:                          Several Buffers.
- * c-backslash-region:                   C Mode.
- * c-backward-conditional:               C Mode.
- * c-beginning-of-statement:             C Mode.
- * c-end-of-statement:                   C Mode.
- * c-fill-paragraph:                     C Mode.
- * c-forward-conditional:                C Mode.
- * c-indent-line:                        Basic Indent.
- * c-macro-expand:                       C Mode.
- * c-up-conditional:                     C Mode.
- * calendar:                             Calendar/Diary.
- * calendar-backward-day:                Calendar Unit Motion.
- * calendar-backward-month:              Calendar Unit Motion.
- * calendar-backward-week:               Calendar Unit Motion.
- * calendar-beginning-of-month:          Move to Beginning or End.
- * calendar-beginning-of-week:           Move to Beginning or End.
- * calendar-beginning-of-year:           Move to Beginning or End.
- * calendar-count-days-region:           Counting Days.
- * calendar-cursor-holidays:             Holidays.
- * calendar-end-of-month:                Move to Beginning or End.
- * calendar-end-of-week:                 Move to Beginning or End.
- * calendar-end-of-year:                 Move to Beginning or End.
- * calendar-forward-day:                 Calendar Unit Motion.
- * calendar-forward-month:               Calendar Unit Motion.
- * calendar-forward-week:                Calendar Unit Motion.
- * calendar-forward-year:                Calendar Unit Motion.
- * calendar-forward-year:                Calendar Unit Motion.
- * calendar-goto-astro-day-number:       From Other Calendar.
- * calendar-goto-date:                   Specified Dates.
- * calendar-goto-french-date:            From Other Calendar.
- * calendar-goto-hebrew-date:            From Other Calendar.
- * calendar-goto-islamic-date:           From Other Calendar.
- * calendar-goto-iso-date:               From Other Calendar.
- * calendar-goto-julian-date:            From Other Calendar.
- * calendar-goto-mayan-long-count-date:  Mayan Calendar.
- * calendar-goto-today:                  Specified Dates.
- * calendar-next-calendar-round-date:    Mayan Calendar.
- * calendar-next-haab-date:              Mayan Calendar.
- * calendar-next-tzolkin-date:           Mayan Calendar.
- * calendar-other-month:                 Specified Dates.
- * calendar-phases-of-moon:              Lunar Phases.
- * calendar-previous-haab-date:          Mayan Calendar.
- * calendar-previous-tzolkin-date:       Mayan Calendar.
- * calendar-print-astro-day-number:      To Other Calendar.
- * calendar-print-day-of-year:           General Calendar.
- * calendar-print-french-date:           To Other Calendar.
- * calendar-print-hebrew-date:           To Other Calendar.
- * calendar-print-islamic-date:          To Other Calendar.
- * calendar-print-iso-date:              To Other Calendar.
- * calendar-print-julian-date:           To Other Calendar.
- * calendar-print-mayan-date:            To Other Calendar.
- * calendar-sunrise-sunset:              Sunrise/Sunset.
- * calendar-unmark:                      Holidays.
- * call-last-kbd-macro:                  Basic Kbd Macro.
- * capitalize-word:                      Case.
- * center-line:                          Fill Commands.
- * change-log-mode:                      Change Log.
- * choose-completion:                    Completion Commands.
- * clear-rectangle:                      Rectangles.
- * comint-bol:                           Shell Mode.
- * comint-continue-subjob:               Shell Mode.
- * comint-copy-old-input:                Shell History Copying.
- * comint-delchar-or-maybe-eof:          Shell Mode.
- * comint-dynamic-complete:              Shell Mode.
- * comint-dynamic-complete-variable:     Shell Options.
- * comint-dynamic-list-filename...:      Shell Mode.
- * comint-dynamic-list-input-ring:       Shell Mode.
- * comint-interrupt-subjob:              Shell Mode.
- * comint-kill-input:                    Shell Mode.
- * comint-kill-output:                   Shell Mode.
- * comint-magic-space:                   History References.
- * comint-next-input:                    Shell Ring.
- * comint-next-matching-input:           Shell Ring.
- * comint-next-prompt:                   Shell History Copying.
- * comint-previous-input:                Shell Ring.
- * comint-previous-matching-input:       Shell Ring.
- * comint-previous-prompt:               Shell History Copying.
- * comint-quit-subjob:                   Shell Mode.
- * comint-run:                           Shell Mode.
- * comint-send-input:                    Shell Mode.
- * comint-show-maximum-output:           Shell Mode.
- * comint-show-output:                   Shell Mode.
- * comint-stop-subjob:                   Shell Mode.
- * comint-strip-ctrl-m:                  Shell Mode.
- * comint-truncate-buffer:               Shell Mode.
- * command-apropos:                      Apropos.
- * comment-region:                       Multi-Line Comments.
- * compare-windows:                      Comparing Files.
- * compile:                              Compilation.
- * compile-goto-error:                   Compilation.
- * complete-tag:                         Symbol Completion.
- * copy-file:                            Misc File Ops.
- * copy-to-buffer:                       Accumulating Text.
- * copy-to-register:                     RegText.
- * count-lines-page:                     Pages.
- * count-lines-region:                   Position Info.
- * count-matches:                        Other Repeating Search.
- * count-text-lines:                     Nroff Mode.
- * cpp-highlight-buffer:                 C Mode.
- * dabbrev-completion:                   Dynamic Abbrevs.
- * dabbrev-expand:                       Dynamic Abbrevs.
- * dbx:                                  Starting GUD.
- * debug_print:                          Checklist.
- * default-value:                        Locals.
- * define-abbrevs:                       Saving Abbrevs.
- * define-key:                           Init Rebinding.
- * define-mail-abbrev:                   Mail Aliases.
- * define-mail-alias:                    Mail Aliases.
- * delete-backward-char:                 Deletion.
- * delete-blank-lines:                   Blank Lines.
- * delete-char:                          Deletion.
- * delete-file:                          Misc File Ops.
- * delete-frame:                         Misc X.
- * delete-horizontal-space:              Deletion.
- * delete-indentation:                   Indentation Commands.
- * delete-matching-lines:                Other Repeating Search.
- * delete-non-matching-lines:            Other Repeating Search.
- * delete-other-windows:                 Change Window.
- * delete-rectangle:                     Rectangles.
- * delete-window:                        Change Window.
- * describe-bindings:                    Misc Help.
- * describe-copying:                     Misc Help.
- * describe-distribution:                Misc Help.
- * describe-function:                    Name Help.
- * describe-key:                         Key Help.
- * describe-key-briefly:                 Key Help.
- * describe-mode:                        Misc Help.
- * describe-no-warranty:                 Misc Help.
- * describe-project:                     Misc Help.
- * describe-syntax:                      Syntax.
- * desktop-save:                         Saving Emacs Sessions.
- * diary:                                Diary Commands.
- * diary-anniversary:                    Special Diary Entries.
- * diary-block:                          Special Diary Entries.
- * diary-cyclic:                         Special Diary Entries.
- * diary-float:                          Special Diary Entries.
- * diff:                                 Comparing Files.
- * diff-backup:                          Comparing Files.
- * digit-argument:                       Arguments.
- * dired:                                Dired Enter.
- * dired-backup-diff:                    Comparison in Dired.
- * dired-change-marks:                   Marks vs Flags.
- * dired-create-directory:               Operating on Files.
- * dired-diff:                           Comparison in Dired.
- * dired-display-file:                   Dired Visiting.
- * dired-do-byte-compile:                Operating on Files.
- * dired-do-chgrp:                       Operating on Files.
- * dired-do-chmod:                       Operating on Files.
- * dired-do-chown:                       Operating on Files.
- * dired-do-compress:                    Operating on Files.
- * dired-do-copy:                        Operating on Files.
- * dired-do-copy-regexp:                 Transforming File Names.
- * dired-do-hardlink:                    Operating on Files.
- * dired-do-hardlink-regexp:             Transforming File Names.
- * dired-do-kill-lines:                  Dired Updating.
- * dired-do-load:                        Operating on Files.
- * dired-do-print:                       Operating on Files.
- * dired-do-query-replace:               Operating on Files.
- * dired-do-redisplay:                   Dired Updating.
- * dired-do-rename:                      Operating on Files.
- * dired-do-rename-regexp:               Transforming File Names.
- * dired-do-search:                      Operating on Files.
- * dired-do-shell-command:               Shell Commands in Dired.
- * dired-do-symlink:                     Operating on Files.
- * dired-do-symlink-regexp:              Transforming File Names.
- * dired-downcase:                       Transforming File Names.
- * dired-expunge:                        Dired Deletion.
- * dired-find-file:                      Dired Visiting.
- * dired-find-file-other-window:         Dired Visiting.
- * dired-flag-auto-save-files:           Flagging Many Files.
- * dired-flag-backup-files:              Flagging Many Files.
- * dired-flag-clean-directory:           Flagging Many Files.
- * dired-flag-files-regexp:              Flagging Many Files.
- * dired-hide-all:                       Hiding Subdirectories.
- * dired-hide-subdir:                    Hiding Subdirectories.
- * dired-mark:                           Marks vs Flags.
- * dired-mark-directories:               Marks vs Flags.
- * dired-mark-executables:               Marks vs Flags.
- * dired-mark-files-regexp:              Marks vs Flags.
- * dired-mark-symlinks:                  Marks vs Flags.
- * dired-maybe-insert-subdir:            Subdirectories in Dired.
- * dired-mouse-find-file-other-window:   Dired Visiting.
- * dired-next-subdir:                    Subdirectory Motion.
- * dired-other-frame:                    Dired Enter.
- * dired-other-window:                   Dired Enter.
- * dired-prev-subdir:                    Subdirectory Motion.
- * dired-sort-toggle-or-edit:            Dired Updating.
- * dired-tree-down:                      Subdirectory Motion.
- * dired-tree-up:                        Subdirectory Motion.
- * dired-unmark-all-files:               Marks vs Flags.
- * dired-upcase:                         Transforming File Names.
- * dired-view-file:                      Dired Visiting.
- * dirs:                                 Interactive Shell.
- * disable-command:                      Disabling.
- * display-time:                         Optional Mode Line.
- * dissociated-press:                    Dissociated Press.
- * do-auto-save:                         Auto Save Control.
- * doctor:                               Total Frustration.
- * down-list:                            List Commands.
- * downcase-region:                      Case.
- * downcase-word:                        Case.
- * dunnet:                               Amusements.
- * edit-abbrevs:                         Editing Abbrevs.
- * edit-kbd-macro:                       Basic Kbd Macro.
- * edit-options:                         Edit Options.
- * edit-picture:                         Picture.
- * edit-tab-stops:                       Tab Stops.
- * edit-tab-stops-note-changes:          Tab Stops.
- * edt-emulation-off:                    Emulation.
- * edt-emulation-on:                     Emulation.
- * electric-nroff-mode:                  Nroff Mode.
- * emacs-lisp-mode:                      Lisp Eval.
- * emacs-version:                        Understanding Bug Reporting.
- * emerge-auto-advance-mode:             Submodes of Emerge.
- * emerge-buffers:                       Overview of Emerge.
- * emerge-buffers-with-ancestor:         Overview of Emerge.
- * emerge-files:                         Overview of Emerge.
- * emerge-files-with-ancestor:           Overview of Emerge.
- * emerge-skip-prefers-mode:             Submodes of Emerge.
- * enable-command:                       Disabling.
- * enable-flow-control:                  Unasked-for Search.
- * enable-flow-control-on:               Unasked-for Search.
- * enable-local-eval:                    File Variables.
- * enable-local-variables:               File Variables.
- * end-kbd-macro:                        Basic Kbd Macro.
- * end-of-buffer:                        Moving Point.
- * end-of-defun:                         Defuns.
- * end-of-fortran-subprogram:            Fortran Motion.
- * end-of-line:                          Moving Point.
- * enlarge-window:                       Change Window.
- * enlarge-window-horizontally:          Change Window.
- * enriched-mode:                        Requesting Formatted Text.
- * european-calendar:                    Date Formats.
- * eval-current-buffer:                  Lisp Eval.
- * eval-defun:                           Lisp Eval.
- * eval-expression:                      Lisp Eval.
- * eval-last-sexp:                       Lisp Eval.
- * eval-region:                          Lisp Eval.
- * exchange-point-and-mark:              Setting Mark.
- * execute-extended-command:             M-x.
- * exit-calendar:                        General Calendar.
- * exit-recursive-edit:                  Recursive Edit.
- * expand-abbrev:                        Expanding Abbrevs.
- * expand-region-abbrevs:                Expanding Abbrevs.
- * facemenu-remove-all:                  Editing Format Info.
- * facemenu-remove-props:                Editing Format Info.
- * facemenu-set-background:              Format Colors.
- * facemenu-set-bold:                    Format Faces.
- * facemenu-set-bold-italic:             Format Faces.
- * facemenu-set-default:                 Format Faces.
- * facemenu-set-face:                    Format Faces.
- * facemenu-set-foreground:              Format Colors.
- * facemenu-set-italic:                  Format Faces.
- * facemenu-set-underline:               Format Faces.
- * fill-c++-comment:                     C Mode.
- * fill-individual-paragraphs:           Fill Prefix.
- * fill-nonuniform-paragraphs:           Fill Prefix.
- * fill-paragraph:                       Fill Commands.
- * fill-region:                          Fill Commands.
- * fill-region-as-paragraph:             Fill Commands.
- * find-alternate-file:                  Visiting.
- * find-dired:                           Dired and Find.
- * find-file:                            Visiting.
- * find-file-other-frame:                Visiting.
- * find-file-other-window:               Visiting.
- * find-file-read-only:                  Visiting.
- * find-file-read-only-other-frame:      Creating Frames.
- * find-grep-dired:                      Dired and Find.
- * find-name-dired:                      Dired and Find.
- * find-tag:                             Find Tag.
- * find-tag-other-frame:                 Find Tag.
- * find-tag-other-window:                Find Tag.
- * find-tag-regexp:                      Find Tag.
- * finder-by-keyword:                    Library Keywords.
- * flush-lines:                          Other Repeating Search.
- * font-lock-mode:                       Faces.
- * format-find-file:                     Forcing Enriched Mode.
- * fortran-auto-fill-mode:               Fortran Autofill.
- * fortran-column-ruler:                 Fortran Columns.
- * fortran-comment-region:               Fortran Comments.
- * fortran-indent-line:                  ForIndent Commands.
- * fortran-indent-new-line:              ForIndent Commands.
- * fortran-indent-subprogram:            ForIndent Commands.
- * fortran-mode:                         Fortran.
- * fortran-next-statement:               Fortran Motion.
- * fortran-previous-statement:           Fortran Motion.
- * fortran-split-line:                   ForIndent Commands.
- * fortran-window-create:                Fortran Columns.
- * forward-char:                         Moving Point.
- * forward-list:                         List Commands.
- * forward-page:                         Pages.
- * forward-paragraph:                    Paragraphs.
- * forward-sentence:                     Sentences.
- * forward-sexp:                         List Commands.
- * forward-text-line:                    Nroff Mode.
- * forward-word:                         Words.
- * frame-configuration-to-register:      RegConfig.
- * gdb:                                  Starting GUD.
- * global-set-key:                       Rebinding.
- * global-unset-key:                     Rebinding.
- * gnus:                                 GNUS.
- * gnus-group-exit:                      Summary of GNUS.
- * gnus-group-kill-group:                Summary of GNUS.
- * gnus-group-list-all-groups:           Summary of GNUS.
- * gnus-group-list-groups:               Summary of GNUS.
- * gnus-group-next-group:                Summary of GNUS.
- * gnus-group-next-unread-group:         Summary of GNUS.
- * gnus-group-prev-group:                Summary of GNUS.
- * gnus-group-prev-unread-group:         Summary of GNUS.
- * gnus-group-read-group:                Summary of GNUS.
- * gnus-group-suspend:                   Summary of GNUS.
- * gnus-group-unsubscribe-current-group: Summary of GNUS.
- * gnus-summary-isearch-article:         Summary of GNUS.
- * gnus-summary-next-same-subject:       Summary of GNUS.
- * gnus-summary-next-subject:            Summary of GNUS.
- * gnus-summary-next-unread-article:     Summary of GNUS.
- * gnus-summary-prev-page:               Summary of GNUS.
- * gnus-summary-prev-same-subject:       Summary of GNUS.
- * gnus-summary-prev-subject:            Summary of GNUS.
- * gnus-summary-prev-unread-article:     Summary of GNUS.
- * gnus-summary-search-article-forward:  Summary of GNUS.
- * gnus-summary-sort-by-author:          Summary of GNUS.
- * gnus-summary-sort-by-date:            Summary of GNUS.
- * gnus-summary-sort-by-number:          Summary of GNUS.
- * gnus-summary-sort-by-subject:         Summary of GNUS.
- * gomoku:                               Amusements.
- * goto-char:                            Moving Point.
- * goto-line:                            Moving Point.
- * grep:                                 Compilation.
- * gud-cont:                             Commands of GUD.
- * gud-def:                              GUD Customization.
- * gud-down:                             Commands of GUD.
- * gud-finish:                           Commands of GUD.
- * gud-gdb-complete-command:             Commands of GUD.
- * gud-next:                             Commands of GUD.
- * gud-refresh:                          Commands of GUD.
- * gud-remove:                           Commands of GUD.
- * gud-step:                             Commands of GUD.
- * gud-stepi:                            Commands of GUD.
- * gud-tbreak:                           Commands of GUD.
- * gud-up:                               Commands of GUD.
- * hanoi:                                Amusements.
- * help-with-tutorial:                   Basic.
- * hide-body:                            Outline Visibility.
- * hide-entry:                           Outline Visibility.
- * hide-leaves:                          Outline Visibility.
- * hide-other:                           Outline Visibility.
- * hide-sublevels:                       Outline Visibility.
- * hide-subtree:                         Outline Visibility.
- * holidays:                             Holidays.
- * iconify-or-deiconify-frame:           Misc X.
- * increase-left-margin:                 Format Indentation.
- * indent-c-exp:                         Multi-line Indent.
- * indent-for-comment:                   Comment Commands.
- * indent-new-comment-line:              Multi-Line Comments.
- * indent-region:                        Indentation Commands.
- * indent-relative:                      Indentation Commands.
- * indent-rigidly:                       Indentation Commands.
- * indent-sexp:                          Multi-line Indent.
- * indented-text-mode:                   Text Mode.
- * info:                                 Misc Help.
- * Info-goto-emacs-command-node:         Misc Help.
- * Info-goto-emacs-key-command-node:     Misc Help.
- * insert-abbrevs:                       Saving Abbrevs.
- * insert-anniversary-diary-entry:       Special Diary Entries.
- * insert-block-diary-entry:             Special Diary Entries.
- * insert-cyclic-diary-entry:            Special Diary Entries.
- * insert-diary-entry:                   Adding to Diary.
- * insert-file:                          Misc File Ops.
- * insert-kbd-macro:                     Save Kbd Macro.
- * insert-monthly-diary-entry:           Adding to Diary.
- * insert-parentheses:                   Balanced Editing.
- * insert-register:                      RegText.
- * insert-weekly-diary-entry:            Adding to Diary.
- * insert-yearly-diary-entry:            Adding to Diary.
- * inverse-add-global-abbrev:            Defining Abbrevs.
- * inverse-add-mode-abbrev:              Defining Abbrevs.
- * invert-face:                          Modifying Faces.
- * isearch-backward:                     Incremental Search.
- * isearch-backward-regexp:              Regexp Search.
- * isearch-forward:                      Incremental Search.
- * isearch-forward-regexp:               Regexp Search.
- * iso-accents-mode:                     European Display.
- * ispell-buffer:                        Spelling.
- * ispell-complete-word:                 Spelling.
- * ispell-kill-ispell:                   Spelling.
- * ispell-message:                       Mail Mode.
- * ispell-region:                        Spelling.
- * ispell-word:                          Spelling.
- * jump-to-register:                     RegPos.
- * just-one-space:                       Deletion.
- * kbd-macro-query:                      Kbd Macro Query.
- * keep-lines:                           Other Repeating Search.
- * keyboard-escape-quit:                 Quitting.
- * keyboard-translate:                   Keyboard Translations.
- * kill-all-abbrevs:                     Defining Abbrevs.
- * kill-buffer:                          Kill Buffer.
- * kill-comment:                         Comment Commands.
- * kill-compilation:                     Compilation.
- * kill-line:                            Killing by Lines.
- * kill-local-variable:                  Locals.
- * kill-rectangle:                       Rectangles.
- * kill-region:                          Other Kill Commands.
- * kill-ring-save:                       Kill Ring.
- * kill-sentence:                        Sentences.
- * kill-sexp:                            List Commands.
- * kill-some-buffers:                    Kill Buffer.
- * kill-word:                            Words.
- * latex-mode:                           TeX Mode.
- * line-number-mode:                     Optional Mode Line.
- * lisp-complete-symbol:                 Symbol Completion.
- * lisp-eval-defun:                      External Lisp.
- * lisp-indent-line:                     Basic Indent.
- * lisp-interaction-mode:                Lisp Interaction.
- * lisp-mode:                            External Lisp.
- * list-abbrevs:                         Editing Abbrevs.
- * list-bookmarks:                       Bookmarks.
- * list-buffers:                         List Buffers.
- * list-calendar-holidays:               Holidays.
- * list-colors-display:                  Modifying Faces.
- * list-command-history:                 Repetition.
- * list-directory:                       Directories.
- * list-faces-display:                   Faces.
- * list-matching-lines:                  Other Repeating Search.
- * list-options:                         Edit Options.
- * list-tags:                            List Tags.
- * list-text-properties-at:              Editing Format Info.
- * list-yahrzeit-dates:                  From Other Calendar.
- * load:                                 Lisp Libraries.
- * load-file:                            Lisp Libraries.
- * load-library:                         Lisp Libraries.
- * local-set-key:                        Rebinding.
- * local-unset-key:                      Rebinding.
- * lpr-buffer:                           Hardcopy.
- * lpr-region:                           Hardcopy.
- * mail:                                 Sending Mail.
- * mail-bcc:                             Mail Mode.
- * mail-cc:                              Mail Mode.
- * mail-fcc:                             Mail Mode.
- * mail-fill-yanked-message:             Mail Mode.
- * mail-interactive-insert-alias:        Mail Aliases.
- * mail-other-frame:                     Sending Mail.
- * mail-other-window:                    Sending Mail.
- * mail-send:                            Mail Mode.
- * mail-send-and-exit:                   Mail Mode.
- * mail-signature:                       Mail Mode.
- * mail-subject:                         Mail Mode.
- * mail-text:                            Mail Mode.
- * mail-to:                              Mail Mode.
- * mail-yank-original:                   Mail Mode.
- * make-face-bold:                       Modifying Faces.
- * make-face-bold-italic:                Modifying Faces.
- * make-face-italic:                     Modifying Faces.
- * make-face-unbold:                     Modifying Faces.
- * make-face-unitalic:                   Modifying Faces.
- * make-frame:                           Creating Frames.
- * make-frame-on-display:                Multiple Displays.
- * make-indirect-buffer:                 Indirect Buffers.
- * make-local-variable:                  Locals.
- * make-symbolic-link:                   Misc File Ops.
- * make-variable-buffer-local:           Locals.
- * Man-fontify-manpage:                  Documentation.
- * manual-entry:                         Documentation.
- * mark-calendar-holidays:               Holidays.
- * mark-defun:                           Defuns.
- * mark-diary-entries:                   Diary Commands.
- * mark-fortran-subprogram:              Fortran Motion.
- * mark-page:                            Pages.
- * mark-paragraph:                       Paragraphs.
- * mark-sexp:                            List Commands.
- * mark-whole-buffer:                    Marking Objects.
- * mark-word:                            Words.
- * minibuffer-complete:                  Completion Example.
- * minibuffer-complete-word:             Completion Commands.
- * modify-face:                          Modifying Faces.
- * mouse-choose-completion:              Completion Commands.
- * mouse-save-then-click:                Mouse Commands.
- * mouse-secondary-save-then-kill:       Secondary Selection.
- * mouse-set-point:                      Mouse Commands.
- * mouse-set-region:                     Mouse Commands.
- * mouse-set-secondary:                  Secondary Selection.
- * mouse-start-secondary:                Secondary Selection.
- * mouse-yank-at-click:                  Mouse Commands.
- * mouse-yank-secondary:                 Secondary Selection.
- * move-over-close-and-reindent:         Balanced Editing.
- * move-to-window-line:                  Moving Point.
- * mpuz:                                 Amusements.
- * mpuz:                                 Amusements.
- * name-last-kbd-macro:                  Save Kbd Macro.
- * narrow-to-page:                       Narrowing.
- * narrow-to-region:                     Narrowing.
- * negative-argument:                    Arguments.
- * newline:                              Inserting Text.
- * newline-and-indent:                   Basic Indent.
- * next-completion:                      Completion Commands.
- * next-error:                           Compilation.
- * next-file:                            Tags Stepping.
- * next-history-element:                 Minibuffer History.
- * next-line:                            Moving Point.
- * next-matching-history-element:        Minibuffer History.
- * normal-mode:                          Choosing Modes.
- * not-modified:                         Saving.
- * nroff-mode:                           Nroff Mode.
- * occur:                                Other Repeating Search.
- * open-dribble-file:                    Checklist.
- * open-line:                            Blank Lines.
- * open-rectangle:                       Rectangles.
- * open-termscript:                      Checklist.
- * other-window:                         Other Window.
- * outline-backward-same-level:          Outline Motion.
- * outline-forward-same-level:           Outline Motion.
- * outline-minor-mode:                   Outline Mode.
- * outline-mode:                         Outline Mode.
- * outline-next-visible-heading:         Outline Motion.
- * outline-previous-visible-heading:     Outline Motion.
- * outline-up-heading:                   Outline Motion.
- * overwrite-mode:                       Minor Modes.
- * perldb:                               Starting GUD.
- * phases-of-moon:                       Lunar Phases.
- * picture-backward-clear-column:        Basic Picture.
- * picture-backward-column:              Basic Picture.
- * picture-clear-column:                 Basic Picture.
- * picture-clear-line:                   Basic Picture.
- * picture-clear-rectangle:              Rectangles in Picture.
- * picture-clear-rectangle-to-register:  Rectangles in Picture.
- * picture-forward-column:               Basic Picture.
- * picture-motion:                       Insert in Picture.
- * picture-motion-reverse:               Insert in Picture.
- * picture-move-down:                    Basic Picture.
- * picture-move-up:                      Basic Picture.
- * picture-movement-down:                Insert in Picture.
- * picture-movement-left:                Insert in Picture.
- * picture-movement-ne:                  Insert in Picture.
- * picture-movement-nw:                  Insert in Picture.
- * picture-movement-right:               Insert in Picture.
- * picture-movement-se:                  Insert in Picture.
- * picture-movement-sw:                  Insert in Picture.
- * picture-movement-up:                  Insert in Picture.
- * picture-newline:                      Basic Picture.
- * picture-open-line:                    Basic Picture.
- * picture-set-tab-stops:                Tabs in Picture.
- * picture-tab:                          Tabs in Picture.
- * picture-tab-search:                   Tabs in Picture.
- * picture-yank-rectangle:               Rectangles in Picture.
- * picture-yank-rectangle-from-register: Rectangles in Picture.
- * plain-tex-mode:                       TeX Mode.
- * point-to-register:                    RegPos.
- * prepend-to-buffer:                    Accumulating Text.
- * previous-completion:                  Completion Commands.
- * previous-history-element:             Minibuffer History.
- * previous-line:                        Moving Point.
- * previous-matching-history-element:    Minibuffer History.
- * print-buffer:                         Hardcopy.
- * print-region:                         Hardcopy.
- * ps-print-buffer:                      Postscript.
- * ps-print-buffer-with-faces:           Postscript.
- * ps-print-region:                      Postscript.
- * ps-print-region-with-faces:           Postscript.
- * ps-spool-buffer:                      Postscript.
- * ps-spool-buffer-with-faces:           Postscript.
- * ps-spool-region:                      Postscript.
- * ps-spool-region-with-faces:           Postscript.
- * query-replace:                        Query Replace.
- * query-replace-regexp:                 Query Replace.
- * quietly-read-abbrev-file:             Saving Abbrevs.
- * quoted-insert:                        Inserting Text.
- * re-search-backward:                   Regexp Search.
- * re-search-forward:                    Regexp Search.
- * read-abbrev-file:                     Saving Abbrevs.
- * recenter:                             Scrolling.
- * recover-file:                         Recover.
- * recover-session:                      Recover.
- * redraw-calendar:                      General Calendar.
- * rename-buffer:                        Misc Buffer.
- * rename-file:                          Misc File Ops.
- * repeat-complex-command:               Repetition.
- * replace-regexp:                       Unconditional Replace.
- * replace-string:                       Unconditional Replace.
- * reposition-window:                    Scrolling.
- * resize-minibuffer-mode:               Minibuffer Edit.
- * revert-buffer:                        Reverting.
- * revert-buffer (Dired):                Dired Updating.
- * rlogin:                               Remote Host.
- * rmail:                                Rmail.
- * rmail-add-label:                      Rmail Labels.
- * rmail-beginning-of-message:           Rmail Scrolling.
- * rmail-bury:                           Rmail Basics.
- * rmail-continue:                       Rmail Reply.
- * rmail-delete-backward:                Rmail Deletion.
- * rmail-delete-forward:                 Rmail Deletion.
- * rmail-edit-current-message:           Rmail Editing.
- * rmail-expunge:                        Rmail Deletion.
- * rmail-first-message:                  Rmail Motion.
- * rmail-forward:                        Rmail Reply.
- * rmail-get-new-mail:                   Rmail Files.
- * rmail-input:                          Rmail Files.
- * rmail-kill-label:                     Rmail Labels.
- * rmail-last-message:                   Rmail Motion.
- * rmail-mail:                           Rmail Reply.
- * rmail-next-labeled-message:           Rmail Labels.
- * rmail-next-message:                   Rmail Motion.
- * rmail-next-undeleted-message:         Rmail Motion.
- * rmail-output:                         Rmail Output.
- * rmail-output-to-rmail-file:           Rmail Output.
- * rmail-previous-labeled-message:       Rmail Labels.
- * rmail-previous-message:               Rmail Motion.
- * rmail-previous-undeleted-message:     Rmail Motion.
- * rmail-quit:                           Rmail Basics.
- * rmail-reply:                          Rmail Reply.
- * rmail-resend:                         Rmail Reply.
- * rmail-retry-failure:                  Rmail Reply.
- * rmail-save:                           Rmail Basics.
- * rmail-search:                         Rmail Motion.
- * rmail-show-message:                   Rmail Motion.
- * rmail-summary:                        Rmail Make Summary.
- * rmail-summary-by-labels:              Rmail Make Summary.
- * rmail-summary-by-recipients:          Rmail Make Summary.
- * rmail-summary-by-topic:               Rmail Make Summary.
- * rmail-summary-quit:                   Rmail Summary Edit.
- * rmail-summary-wipe:                   Rmail Summary Edit.
- * rmail-toggle-header:                  Rmail Display.
- * rmail-undelete-previous-message:      Rmail Deletion.
- * rot13-other-window:                   Rmail Rot13.
- * run-lisp:                             External Lisp.
- * save-buffer:                          Saving.
- * save-buffers-kill-emacs:              Exiting.
- * save-some-buffers:                    Saving.
- * scroll-bar-mode:                      Scroll Bars.
- * scroll-calendar-left:                 Scroll Calendar.
- * scroll-calendar-left-three-months:    Scroll Calendar.
- * scroll-calendar-right:                Scroll Calendar.
- * scroll-calendar-right-three-months:   Scroll Calendar.
- * scroll-down:                          Scrolling.
- * scroll-left:                          Horizontal Scrolling.
- * scroll-other-window:                  Other Window.
- * scroll-right:                         Horizontal Scrolling.
- * scroll-up:                            Scrolling.
- * sdb:                                  Starting GUD.
- * search-backward:                      Nonincremental Search.
- * search-forward:                       Nonincremental Search.
- * self-insert:                          Inserting Text.
- * send-invisible:                       Shell Mode.
- * server-edit:                          Emacs Server.
- * set-background-color:                 Frame Parameters.
- * set-border-color:                     Frame Parameters.
- * set-comment-column:                   Options for Comments.
- * set-cursor-color:                     Frame Parameters.
- * set-default-font:                     Frame Parameters.
- * set-face-background:                  Modifying Faces.
- * set-face-font:                        Modifying Faces.
- * set-face-foreground:                  Modifying Faces.
- * set-face-underline-p:                 Modifying Faces.
- * set-fill-column:                      Fill Commands.
- * set-fill-prefix:                      Fill Prefix.
- * set-foreground-color:                 Frame Parameters.
- * set-goal-column:                      Moving Point.
- * set-justification-center:             Format Justification.
- * set-justification-full:               Format Justification.
- * set-justification-left:               Format Justification.
- * set-justification-none:               Format Justification.
- * set-justification-right:              Format Justification.
- * set-mark-command:                     Setting Mark.
- * set-mouse-color:                      Frame Parameters.
- * set-rmail-inbox-list:                 Rmail Files.
- * set-selective-display:                Selective Display.
- * set-variable:                         Examining.
- * set-visited-file-name:                Saving.
- * setq-default:                         Locals.
- * shell:                                Interactive Shell.
- * shell-backward-command:               Shell Mode.
- * shell-command:                        Single Shell.
- * shell-command-on-region:              Single Shell.
- * shell-forward-command:                Shell Mode.
- * shell-pushd-dextract:                 Shell Options.
- * shell-pushd-dunique:                  Shell Options.
- * shell-pushd-tohome:                   Shell Options.
- * show-all:                             Outline Visibility.
- * show-all-diary-entries:               Diary Commands.
- * show-branches:                        Outline Visibility.
- * show-children:                        Outline Visibility.
- * show-entry:                           Outline Visibility.
- * show-subtree:                         Outline Visibility.
- * slitex-mode:                          TeX Mode.
- * sort-columns:                         Sorting.
- * sort-fields:                          Sorting.
- * sort-lines:                           Sorting.
- * sort-numeric-fields:                  Sorting.
- * sort-pages:                           Sorting.
- * sort-paragraphs:                      Sorting.
- * split-line:                           Indentation Commands.
- * split-window-horizontally:            Split Window.
- * split-window-vertically:              Split Window.
- * spook:                                Distracting NSA.
- * standard-display-european:            European Display.
- * start-kbd-macro:                      Basic Kbd Macro.
- * string-rectangle:                     Rectangles.
- * substitute-key-definition:            Init Rebinding.
- * sunrise-sunset:                       Sunrise/Sunset.
- * super-apropos:                        Apropos.
- * suspend-emacs:                        Exiting.
- * switch-to-buffer:                     Select Buffer.
- * switch-to-buffer-other-frame:         Select Buffer.
- * switch-to-buffer-other-window:        Select Buffer.
- * switch-to-completions:                Completion Commands.
- * tab-to-tab-stop:                      Tab Stops.
- * tabify:                               Just Spaces.
- * tags-apropos:                         List Tags.
- * tags-loop-continue:                   Tags Search.
- * tags-query-replace:                   Tags Search.
- * tags-search:                          Tags Search.
- * tc-associate-buffer:                  Two-Column.
- * tc-dissociate:                        Two-Column.
- * tc-merge:                             Two-Column.
- * tc-recenter:                          Two-Column.
- * tc-scroll-down:                       Two-Column.
- * tc-scroll-up:                         Two-Column.
- * tc-split:                             Two-Column.
- * tc-two-columns:                       Two-Column.
- * telnet:                               Remote Host.
- * tex-bibtex-file:                      TeX Print.
- * tex-buffer:                           TeX Print.
- * tex-close-latex-block:                LaTeX Editing.
- * tex-file:                             TeX Print.
- * tex-insert-braces:                    TeX Editing.
- * tex-insert-quote:                     TeX Editing.
- * tex-kill-job:                         TeX Print.
- * tex-latex-block:                      LaTeX Editing.
- * tex-mode:                             TeX Mode.
- * tex-print:                            TeX Print.
- * tex-recenter-output-buffer:           TeX Print.
- * tex-region:                           TeX Print.
- * tex-show-print-queue:                 TeX Print.
- * tex-terminate-paragraph:              TeX Editing.
- * tex-view:                             TeX Print.
- * text-mode:                            Text Mode.
- * toggle-scroll-bar:                    Scroll Bars.
- * top-level:                            Quitting.
- * transient-mark-mode:                  Transient Mark.
- * transpose-chars:                      Transpose.
- * transpose-lines:                      Transpose.
- * transpose-sexps:                      List Commands.
- * transpose-sexps:                      Transpose.
- * transpose-words:                      Words.
- * transpose-words:                      Transpose.
- * turn-on-font-lock:                    Faces.
- * undigestify-rmail-message:            Rmail Digest.
- * undo:                                 Undo.
- * universal-argument:                   Arguments.
- * untabify:                             Just Spaces.
- * up-list:                              TeX Editing.
- * upcase-region:                        Case.
- * upcase-word:                          Case.
- * validate-tex-region:                  TeX Editing.
- * vc-cancel-version:                    Version Control Undo.
- * vc-create-snapshot:                   Making Snapshots.
- * vc-diff:                              Old Versions.
- * vc-directory:                         Status in VC.
- * vc-insert-headers:                    Version Headers.
- * vc-print-log:                         Status in VC.
- * vc-register:                          Registering.
- * vc-rename-file:                       Renaming and VC.
- * vc-retrieve-snapshot:                 Making Snapshots.
- * vc-revert-buffer:                     Version Control Undo.
- * vc-toggle-read-only:                  Misc Buffer.
- * vc-update-change-log:                 Change Logs and VC.
- * vc-version-other-window:              Old Versions.
- * vi-mode:                              Emulation.
- * view-buffer:                          Misc Buffer.
- * view-diary-entries:                   Diary Commands.
- * view-emacs-news:                      Misc Help.
- * view-file:                            Misc File Ops.
- * view-lossage:                         Misc Help.
- * view-register:                        Registers.
- * vip-mode:                             Emulation.
- * viper-mode:                           Emulation.
- * visit-tags-table:                     Select Tags Table.
- * what-cursor-position:                 Position Info.
- * what-line:                            Position Info.
- * what-page:                            Position Info.
- * where-is:                             Name Help.
- * widen:                                Narrowing.
- * window-configuration-to-register:     RegConfig.
- * word-search-backward:                 Word Search.
- * word-search-forward:                  Word Search.
- * write-abbrev-file:                    Saving Abbrevs.
- * write-file:                           Saving.
- * write-region:                         Misc File Ops.
- * xdb:                                  Starting GUD.
- * yank:                                 Kill Ring.
- * yank-pop:                             Earlier Kills.
- * yank-rectangle:                       Rectangles.
- * yow:                                  Amusements.
- * zap-to-char:                          Other Kill Commands.
- 
--- 0 ----
Index: emacs/info/emacs-26
diff -c emacs/info/emacs-26:1.1.1.1 emacs/info/emacs-26:removed
*** emacs/info/emacs-26:1.1.1.1	Mon Jul 22 01:52:26 1996
--- emacs/info/emacs-26	Fri Aug  2 20:13:13 1996
***************
*** 1,919 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Variable Index,  Next: Concept Index,  Prev: Command Index,  Up: Top
- 
- Variable Index
- **************
- 
- * Menu:
- 
- * abbrev-all-caps:                      Expanding Abbrevs.
- * abbrev-file-name:                     Saving Abbrevs.
- * abbrev-mode:                          Abbrev Concepts.
- * adaptive-fill-mode:                   Fill Commands.
- * appt-display-diary:                   Appointments.
- * appt-issue-message:                   Appointments.
- * auto-mode-alist:                      Choosing Modes.
- * auto-save-default:                    Auto Save Control.
- * auto-save-interval:                   Auto Save Control.
- * auto-save-timeout:                    Auto Save Control.
- * auto-save-visited-file-name:          Auto Save Files.
- * backup-by-copying:                    Backup Copying.
- * backup-by-copying-when-linked:        Backup Copying.
- * backup-by-copying-when-mismatch:      Backup Copying.
- * baud-rate:                            Display Vars.
- * blink-matching-delay:                 Matching.
- * blink-matching-paren:                 Matching.
- * blink-matching-paren-distance:        Matching.
- * bookmark-save-flag:                   Bookmarks.
- * bookmark-search-size:                 Bookmarks.
- * buffer-read-only:                     Misc Buffer.
- * c-argdecl-indent:                     C Indent.
- * c-auto-newline:                       C Indent.
- * c-brace-imaginary-offset:             C Indent.
- * c-brace-offset:                       C Indent.
- * c-continued-statement-offset:         C Indent.
- * c-indent-level:                       C Indent.
- * c-label-offset:                       C Indent.
- * c-mode-hook:                          Program Modes.
- * c-mode-map:                           Local Keymaps.
- * c-tab-always-indent:                  C Indent.
- * calendar-daylight-savings-ends:       Daylight Savings.
- * calendar-daylight-savings-ends-time:  Daylight Savings.
- * calendar-daylight-savings-starts:     Daylight Savings.
- * calendar-daylight-time-offset:        Daylight Savings.
- * calendar-daylight-time-zone-name:     Sunrise/Sunset.
- * calendar-latitude:                    Sunrise/Sunset.
- * calendar-location-name:               Sunrise/Sunset.
- * calendar-longitude:                   Sunrise/Sunset.
- * calendar-standard-time-zone-name:     Sunrise/Sunset.
- * calendar-time-zone:                   Sunrise/Sunset.
- * calendar-week-start-day:              Move to Beginning or End.
- * case-fold-search:                     Search Case.
- * case-replace:                         Replacement and Case.
- * comint-completion-addsuffix:          Shell Options.
- * comint-completion-autolist:           Shell Options.
- * comint-completion-fignore:            Shell Mode.
- * comint-completion-recexact:           Shell Options.
- * comint-input-autoexpand:              History References.
- * comint-input-ignoredups:              Shell Options.
- * comint-prompt-regexp:                 History References.
- * comint-scroll-show-maximum-output:    Shell Options.
- * comint-scroll-to-bottom-on-input:     Shell Options.
- * comint-scroll-to-bottom-on-output:    Shell Options.
- * command-history:                      Repetition.
- * command-line-args:                    Action Arguments.
- * comment-column:                       Options for Comments.
- * comment-end:                          Options for Comments.
- * comment-indent-function:              Options for Comments.
- * comment-line-start:                   Fortran Comments.
- * comment-line-start-skip:              Fortran Comments.
- * comment-multi-line:                   Options for Comments.
- * comment-start:                        Options for Comments.
- * comment-start-skip:                   Options for Comments.
- * compare-ignore-case:                  Comparing Files.
- * compile-command:                      Compilation.
- * completion-auto-help:                 Completion Options.
- * completion-ignored-extensions:        Completion Options.
- * ctl-arrow:                            Display Vars.
- * ctl-x-4-map:                          Prefix Keymaps.
- * ctl-x-map:                            Prefix Keymaps.
- * dabbrev-abbrev-skip-leading-regexp:   Dynamic Abbrevs.
- * dbx-mode-hook:                        GUD Customization.
- * default-directory:                    File Names.
- * default-justification:                Format Justification.
- * default-major-mode:                   Choosing Modes.
- * delete-auto-save-files:               Auto Save Files.
- * delete-old-versions:                  Backup Deletion.
- * desktop-files-not-to-save:            Saving Emacs Sessions.
- * diary-file:                           Format of Diary File.
- * diary-hook:                           Appointments.
- * diff-switches:                        Comparing Files.
- * dired-chown-program:                  Operating on Files.
- * dired-copy-preserve-time:             Operating on Files.
- * dired-kept-versions:                  Flagging Many Files.
- * dired-listing-switches:               Dired Enter.
- * double-click-time:                    Mouse Buttons.
- * echo-keystrokes:                      Display Vars.
- * emacs-lisp-mode-hook:                 Program Modes.
- * emerge-combine-versions-template:     Combining in Emerge.
- * emerge-startup-hook:                  Fine Points of Emerge.
- * enable-recursive-minibuffers:         Minibuffer Edit.
- * enriched-default-right-margin:        Format Indentation.
- * enriched-fill-after-visiting:         Requesting Formatted Text.
- * enriched-translations:                Requesting Formatted Text.
- * esc-map:                              Prefix Keymaps.
- * european-calendar-style:              Date Formats.
- * explicit-shell-file-name:             Interactive Shell.
- * file-name-handler-alist:              File Names.
- * fill-column:                          Fill Commands.
- * fill-prefix:                          Fill Prefix.
- * find-file-existing-other-name:        File Aliases.
- * find-file-hooks:                      Visiting.
- * find-file-not-found-hooks:            Visiting.
- * find-file-run-dired:                  Visiting.
- * find-file-visit-truename:             File Aliases.
- * find-ls-option:                       Dired and Find.
- * font-lock-display-type:               Faces.
- * fortran-analyze-depth:                ForIndent Cont.
- * fortran-break-before-delimiters:      Fortran Autofill.
- * fortran-check-all-num...:             ForIndent Vars.
- * fortran-column-ruler:                 Fortran Columns.
- * fortran-comment-indent-char:          Fortran Comments.
- * fortran-comment-indent-style:         Fortran Comments.
- * fortran-comment-line-extra-indent:    Fortran Comments.
- * fortran-comment-region:               Fortran Comments.
- * fortran-continuation-indent:          ForIndent Vars.
- * fortran-continuation-string:          ForIndent Cont.
- * fortran-do-indent:                    ForIndent Vars.
- * fortran-electric-line-number:         ForIndent Num.
- * fortran-if-indent:                    ForIndent Vars.
- * fortran-line-number-indent:           ForIndent Num.
- * fortran-minimum-statement-indent...:  ForIndent Vars.
- * fortran-structure-indent:             ForIndent Vars.
- * fortran-tab-mode-default:             ForIndent Cont.
- * gdb-mode-hook:                        GUD Customization.
- * gud-xdb-directories:                  Starting GUD.
- * help-map:                             Prefix Keymaps.
- * indent-tabs-mode:                     Just Spaces.
- * indent-tabs-mode (Fortran mode):      ForIndent Cont.
- * inferior-lisp-program:                External Lisp.
- * initial-major-mode:                   Entering Emacs.
- * insert-default-directory:             File Names.
- * interpreter-mode-alist:               Choosing Modes.
- * inverse-video:                        Display Vars.
- * isearch-mode-map:                     Incremental Search.
- * ispell-dictionary:                    Spelling.
- * kept-new-versions:                    Backup Deletion.
- * kept-old-versions:                    Backup Deletion.
- * kill-buffer-hook:                     Kill Buffer.
- * kill-ring:                            Earlier Kills.
- * kill-ring-max:                        Earlier Kills.
- * kill-whole-line:                      Killing by Lines.
- * latex-block-names:                    LaTeX Editing.
- * latex-mode-hook:                      TeX Print.
- * latex-run-command:                    TeX Print.
- * line-number-display-limit:            Optional Mode Line.
- * lisp-body-indent:                     Lisp Indent.
- * lisp-indent-offset:                   Lisp Indent.
- * lisp-interaction-mode-hook:           Program Modes.
- * lisp-mode-hook:                       Program Modes.
- * lisp-mode-map:                        Local Keymaps.
- * list-directory-brief-switches:        Directories.
- * list-directory-verbose-switches:      Directories.
- * load-path:                            Lisp Libraries.
- * lpr-header-switches:                  Hardcopy.
- * lpr-switches:                         Hardcopy.
- * mail-abbrevs:                         Mail Aliases.
- * mail-aliases:                         Mail Aliases.
- * mail-archive-file-name:               Mail Headers.
- * mail-default-reply-to:                Mail Headers.
- * mail-from-style:                      Mail Headers.
- * mail-header-separator:                Mail Format.
- * mail-mode-hook:                       Mail Mode.
- * mail-personal-alias-file:             Mail Aliases.
- * mail-self-blind:                      Mail Headers.
- * mail-setup-hook:                      Mail Mode.
- * mail-signature:                       Mail Mode.
- * mail-yank-prefix:                     Mail Mode.
- * make-backup-files:                    Backup.
- * Man-fontify-manpage-flag:             Documentation.
- * mark-ring:                            Mark Ring.
- * mark-ring-max:                        Mark Ring.
- * message-log-max:                      Echo Area.
- * minibuffer-local-completion-map:      Minibuffer Maps.
- * minibuffer-local-map:                 Minibuffer Maps.
- * minibuffer-local-must-match-map:      Minibuffer Maps.
- * minibuffer-local-ns-map:              Minibuffer Maps.
- * mode-line-inverse-video:              Display Vars.
- * mode-specific-map:                    Prefix Keymaps.
- * mouse-yank-at-point:                  Mouse Commands.
- * muddle-mode-hook:                     Program Modes.
- * next-line-add-newlines:               Moving Point.
- * next-screen-context-lines:            Scrolling.
- * no-redraw-on-reenter:                 Display Vars.
- * nroff-mode-hook:                      Nroff Mode.
- * outline-level:                        Outline Format.
- * outline-minor-mode-prefix:            Outline Mode.
- * outline-mode-hook:                    Outline Mode.
- * outline-regexp:                       Outline Format.
- * page-delimiter:                       Pages.
- * paragraph-separate:                   Paragraphs.
- * paragraph-start:                      Paragraphs.
- * parens-dont-require-spaces:           Balanced Editing.
- * perldb-mode-hook:                     GUD Customization.
- * picture-mode-hook:                    Picture.
- * picture-tab-chars:                    Tabs in Picture.
- * plain-tex-mode-hook:                  TeX Print.
- * ps-lpr-command:                       Postscript.
- * ps-lpr-switches:                      Postscript.
- * ps-print-color-p:                     Postscript.
- * ps-print-header:                      Postscript.
- * require-final-newline:                Saving.
- * rlogin-explicit-args:                 Remote Host.
- * rmail-delete-after-output:            Rmail Output.
- * rmail-dont-reply-to-names:            Rmail Reply.
- * rmail-edit-mode-hook:                 Rmail Editing.
- * rmail-highlighted-headers:            Rmail Display.
- * rmail-ignored-headers:                Rmail Display.
- * rmail-mail-new-frame:                 Rmail Reply.
- * rmail-output-file-alist:              Rmail Output.
- * rmail-primary-inbox-list:             Rmail Inbox.
- * rmail-redisplay-summary:              Rmail Summary Edit.
- * rmail-retry-ignored-headers:          Rmail Reply.
- * rmail-secondary-file-directory:       Rmail Files.
- * rmail-secondary-file-regexp:          Rmail Files.
- * rmail-summary-window-size:            Rmail Make Summary.
- * same-window-buffer-names:             Force Same Window.
- * same-window-regexps:                  Force Same Window.
- * save-abbrevs:                         Saving Abbrevs.
- * scheme-mode-hook:                     Program Modes.
- * scroll-step:                          Scrolling.
- * sdb-mode-hook:                        GUD Customization.
- * search-slow-speed:                    Incremental Search.
- * search-slow-window-lines:             Incremental Search.
- * selective-display-ellipses:           Selective Display.
- * sentence-end:                         Sentences.
- * sentence-end-double-space:            Fill Commands.
- * server-temp-file-regexp:              Emacs Server.
- * server-window:                        Emacs Server.
- * shell-cd-regexp:                      Interactive Shell.
- * shell-command-execonly:               Shell Options.
- * shell-command-regexp:                 Shell Mode.
- * shell-completion-fignore:             Shell Mode.
- * shell-file-name:                      Single Shell.
- * shell-input-ring-file-name:           Shell Ring.
- * shell-popd-regexp:                    Interactive Shell.
- * shell-prompt-pattern:                 History References.
- * shell-prompt-pattern:                 Shell Mode.
- * shell-pushd-regexp:                   Interactive Shell.
- * shell-set-directory-error-hook:       Interactive Shell.
- * slitex-mode-hook:                     TeX Print.
- * slitex-run-command:                   TeX Print.
- * sort-fold-case:                       Sorting.
- * special-display-buffer-names:         Special Buffer Frames.
- * special-display-frame-alist:          Special Buffer Frames.
- * special-display-regexps:              Special Buffer Frames.
- * split-window-keep-point:              Split Window.
- * standard-indent:                      Format Indentation.
- * tab-stop-list:                        Tab Stops.
- * tab-width:                            Display Vars.
- * tags-file-name:                       Select Tags Table.
- * tags-table-list:                      Select Tags Table.
- * term-file-prefix:                     Terminal Init.
- * term-setup-hook:                      Terminal Init.
- * tex-bibtex-command:                   TeX Print.
- * tex-default-mode:                     TeX Mode.
- * tex-directory:                        TeX Print.
- * tex-dvi-print-command:                TeX Print.
- * tex-dvi-view-command:                 TeX Print.
- * tex-mode-hook:                        TeX Print.
- * tex-run-command:                      TeX Print.
- * tex-shell-hook:                       TeX Print.
- * tex-show-queue-command:               TeX Print.
- * text-mode-hook:                       Text Mode.
- * track-eol:                            Moving Point.
- * truncate-lines:                       Continuation Lines.
- * truncate-partial-width-windows:       Split Window.
- * undo-limit:                           Undo.
- * undo-strong-limit:                    Undo.
- * user-mail-address:                    Init Examples.
- * vc-command-messages:                  Customizing VC.
- * vc-comment-alist:                     Version Headers.
- * vc-consult-headers:                   Version Headers.
- * vc-default-back-end:                  Registering.
- * vc-handle-cvs:                        CVS and VC.
- * vc-header-alist:                      Version Headers.
- * vc-initial-comment:                   Registering.
- * vc-keep-workfiles:                    Customizing VC.
- * vc-log-mode-hook:                     Log Entries.
- * vc-make-backup-files:                 Customizing VC.
- * vc-mistrust-permissions:              Customizing VC.
- * vc-path:                              Customizing VC.
- * vc-static-header-alist:               Version Headers.
- * vc-suppress-confirm:                  Customizing VC.
- * version-control:                      Backup Names.
- * visible-bell:                         Display Vars.
- * window-min-height:                    Change Window.
- * window-min-width:                     Change Window.
- * x-cut-buffer-max:                     Mouse Commands.
- * xdb-mode-hook:                        GUD Customization.
- 
- 
- File: emacs,  Node: Concept Index,  Next: Acknowledgments,  Prev: Variable Index,  Up: Top
- 
- Concept Index
- *************
- 
- * Menu:
- 
- * // in file name:                      Minibuffer File.
- * DISPLAY environment variable:         Display X.
- * EDITOR environment variable:          Emacs Server.
- * ESHELL environment variable:          Interactive Shell.
- * etags program:                        Create Tags Table.
- * find and Dired:                       Dired and Find.
- * iso-syntax library:                   European Display.
- * iso-transl library:                   European Display.
- * ispell program:                       Spelling.
- * MAILHOST environment variable:        Rmail Inbox.
- * MAIL environment variable:            Rmail Inbox.
- * movemail program:                     Rmail Inbox.
- * noutline:                             Outline Views.
- * paren library:                        Matching.
- * region face:                          Faces.
- * REPLYTO environment variable:         Mail Headers.
- * SHELL environment variable:           Interactive Shell.
- * TERM environment variable:            Checklist.
- * TEXINPUTS environment variable:       TeX Print.
- * VERSION_CONTROL environment variable: Backup Names.
- * .mailrc file:                         Mail Aliases.
- * ESC replacing META key:               User Input.
- * *Messages* buffer:                    Echo Area.
- * GNUS:                                 GNUS.
- * TeX mode:                             TeX Mode.
- * A and B buffers (Emerge):             Overview of Emerge.
- * Abbrev mode:                          Abbrev Concepts.
- * abbrevs:                              Abbrevs.
- * aborting recursive edit:              Quitting.
- * accented characters:                  European Display.
- * accessible portion:                   Narrowing.
- * accumulating scattered text:          Accumulating Text.
- * action options (command line):        Command Arguments.
- * againformation:                       Dissociated Press.
- * alarm clock:                          Appointments.
- * appending kills in the ring:          Appending Kills.
- * appointment notification:             Appointments.
- * apropos:                              Apropos.
- * arguments (command line):             Command Arguments.
- * arguments, numeric:                   Arguments.
- * arguments, prefix:                    Arguments.
- * arrow keys:                           Moving Point.
- * ASCII:                                User Input.
- * Asm mode:                             Asm Mode.
- * astronomical day numbers:             Calendar Systems.
- * attribute (Rmail):                    Rmail Labels.
- * Auto Fill mode:                       Auto Fill.
- * Auto Save mode:                       Auto Save.
- * Auto-Lower mode:                      Frame Parameters.
- * Auto-Raise mode:                      Frame Parameters.
- * autoload:                             Lisp Libraries.
- * Awk mode:                             Program Modes.
- * back end (version control):           Version Systems.
- * backtrace for bug reports:            Checklist.
- * backup file:                          Backup.
- * base buffer:                          Indirect Buffers.
- * batch mode:                           Initial Options.
- * binding:                              Commands.
- * blank lines:                          Blank Lines.
- * blank lines in programs:              Multi-Line Comments.
- * body lines (Outline mode):            Outline Format.
- * bold font:                            Modifying Faces.
- * bookmarks:                            Bookmarks.
- * borders (X Windows):                  Borders X.
- * boredom:                              Amusements.
- * branch (version control):             Branches.
- * buffer menu:                          Several Buffers.
- * buffers:                              Buffers.
- * buggestion:                           Dissociated Press.
- * bugs:                                 Bugs.
- * building programs:                    Building.
- * button down events:                   Mouse Buttons.
- * byte code:                            Lisp Libraries.
- * C editing:                            Programs.
- * C mode:                               C Mode.
- * C++ mode:                             Program Modes.
- * C-:                                   User Input.
- * calendar:                             Calendar/Diary.
- * calendar, first day of week:          Move to Beginning or End.
- * capitalizing words:                   Case.
- * case conversion:                      Case.
- * centering:                            Fill Commands.
- * change buffers:                       Select Buffer.
- * change log:                           Change Log.
- * Change Log mode:                      Change Log.
- * changes, undoing:                     Undo.
- * character set (keyboard):             User Input.
- * characters (in text):                 Text Characters.
- * checking in files:                    VC Concepts.
- * checking out files:                   VC Concepts.
- * checking spelling:                    Spelling.
- * choosing a major mode:                Choosing Modes.
- * click events:                         Mouse Buttons.
- * collision:                            Interlocking.
- * color of window (X Windows):          Colors X.
- * colors:                               Frame Parameters.
- * colors and faces:                     Modifying Faces.
- * columns (and rectangles):             Rectangles.
- * columns (indentation):                Indentation.
- * columns, splitting:                   Two-Column.
- * Comint mode:                          Shell Mode.
- * command:                              Commands.
- * command history:                      Repetition.
- * command line arguments:               Command Arguments.
- * comments:                             Comments.
- * committing a change (CVS):            CVS and VC.
- * comparing files:                      Comparing Files.
- * compilation errors:                   Compilation.
- * Compilation mode:                     Compilation.
- * complete:                             Completion Options.
- * complete key:                         Keys.
- * completion:                           Completion.
- * completion (symbol names):            Symbol Completion.
- * completion in Lisp:                   Symbol Completion.
- * completion using tags:                Symbol Completion.
- * conflict (CVS):                       CVS and VC.
- * connecting to remote host:            Remote Host.
- * continuation line:                    Continuation Lines.
- * Control:                              User Input.
- * control characters:                   User Input.
- * Control-Meta:                         Lists.
- * converting text to upper or lower case: Case.
- * copying files:                        Misc File Ops.
- * copying text:                         Yanking.
- * correcting spelling:                  Spelling.
- * crashes:                              Auto Save.
- * creating files:                       Visiting.
- * creating frames:                      Creating Frames.
- * current buffer:                       Buffers.
- * cursor:                               Point.
- * cursor location:                      Position Info.
- * cursor motion:                        Moving Point.
- * customization:                        Customization.
- * customizing Lisp indentation:         Lisp Indent.
- * cut buffer:                           Mouse Commands.
- * cutting and X:                        Mouse Commands.
- * cutting text:                         Killing.
- * CVS:                                  Version Systems.
- * CVS (with VC):                        CVS and VC.
- * day of year:                          General Calendar.
- * daylight savings time:                Daylight Savings.
- * DBX:                                  Debuggers.
- * debuggers:                            Debuggers.
- * default argument:                     Minibuffer.
- * default-frame-alist:                  Creating Frames.
- * defining keyboard macros:             Keyboard Macros.
- * defuns:                               Defuns.
- * deleting blank lines:                 Blank Lines.
- * deleting characters and lines:        Erasing.
- * deleting files (in Dired):            Dired Deletion.
- * deletion:                             Killing.
- * deletion (of files):                  Misc File Ops.
- * deletion (Rmail):                     Rmail Deletion.
- * desktop:                              Saving Emacs Sessions.
- * developediment:                       Dissociated Press.
- * diary:                                Diary.
- * diary file:                           Format of Diary File.
- * digest message:                       Rmail Digest.
- * directory header lines:               Subdirectory Motion.
- * directory listing:                    Directories.
- * Dired:                                Dired.
- * Dired sorting:                        Dired Updating.
- * disabled command:                     Disabling.
- * display name (X Windows):             Display X.
- * display table:                        Text Characters.
- * doctor:                               Total Frustration.
- * double clicks:                        Mouse Buttons.
- * double slash in file name:            Minibuffer File.
- * down events:                          Mouse Buttons.
- * drag events:                          Mouse Buttons.
- * drastic changes:                      Reverting.
- * dribble file:                         Checklist.
- * echo area:                            Echo Area.
- * editing binary files:                 Editing Binary Files.
- * editing in Picture mode:              Basic Picture.
- * editing level, recursive:             Recursive Edit.
- * EDT:                                  Emulation.
- * Eliza:                                Total Frustration.
- * Emacs as a server:                    Emacs Server.
- * Emacs initialization file:            Init File.
- * Emacs-Lisp mode:                      Lisp Eval.
- * emacsclient:                          Emacs Server.
- * Emerge:                               Emerge.
- * emulating other editors:              Emulation.
- * Enriched mode:                        Formatted Text.
- * entering Emacs:                       Entering Emacs.
- * environment:                          Single Shell.
- * erasing characters and lines:         Erasing.
- * error log:                            Compilation.
- * error message in the echo area:       Echo Area.
- * European character set:               European Display.
- * exiting:                              Exiting.
- * exiting recursive edit:               Recursive Edit.
- * expanding subdirectories in Dired:    Subdirectories in Dired.
- * expansion (of abbrevs):               Abbrevs.
- * expansion of C macros:                C Mode.
- * expression:                           Lists.
- * expunging (Dired):                    Dired Deletion.
- * expunging (Rmail):                    Rmail Deletion.
- * faces:                                Faces.
- * file dates:                           Interlocking.
- * file directory:                       Directories.
- * file names:                           File Names.
- * file truenames:                       File Aliases.
- * files:                                Files.
- * files, visiting and saving:           Visiting.
- * fill prefix:                          Fill Prefix.
- * filling text:                         Filling.
- * finding strings within text:          Search.
- * flagging files (in Dired):            Dired Deletion.
- * flow control:                         Unasked-for Search.
- * font name (X Windows):                Font X.
- * Font-Lock mode:                       Faces.
- * fonts and faces:                      Modifying Faces.
- * formatted text:                       Formatted Text.
- * formfeed:                             Pages.
- * Fortran continuation lines:           ForIndent Cont.
- * Fortran mode:                         Fortran.
- * forwarding a message:                 Rmail Reply.
- * frames:                               Frames.
- * French Revolutionary calendar:        Calendar Systems.
- * FTP:                                  File Names.
- * function:                             Commands.
- * function definition:                  Commands.
- * function key:                         Keymaps.
- * GDB:                                  Debuggers.
- * geometry (X Windows):                 Window Size X.
- * getting help with keys:               Basic Help.
- * global keymap:                        Keymaps.
- * global mark ring:                     Global Mark Ring.
- * global substitution:                  Replace.
- * Go Moku:                              Amusements.
- * graphic characters:                   Inserting Text.
- * Gregorian calendar:                   Other Calendars.
- * growing minibuffer:                   Minibuffer Edit.
- * GUD library:                          Debuggers.
- * hard newline:                         Hard and Soft Newlines.
- * hardcopy:                             Hardcopy.
- * head version:                         Branches.
- * header (TeX mode):                    TeX Print.
- * header line (Dired):                  Subdirectory Motion.
- * headers (of mail message):            Mail Headers.
- * heading lines (Outline mode):         Outline Format.
- * Hebrew calendar:                      Calendar Systems.
- * height of minibuffer:                 Minibuffer Edit.
- * help:                                 Help.
- * Hexl mode:                            Editing Binary Files.
- * hiding in Dired (Dired):              Hiding Subdirectories.
- * highlighting region:                  Transient Mark.
- * history of commands:                  Repetition.
- * history of minibuffer input:          Minibuffer History.
- * history reference:                    History References.
- * holidays:                             Holidays.
- * hook:                                 Hooks.
- * horizontal scrolling:                 Horizontal Scrolling.
- * Icomplete mode:                       Completion Options.
- * Icon mode:                            Program Modes.
- * icons (X Windows):                    Icons X.
- * ignoriginal:                          Dissociated Press.
- * in-situ subdirectory (Dired):         Subdirectories in Dired.
- * inbox file:                           Rmail Inbox.
- * incremental search:                   Incremental Search.
- * indentation:                          Indentation.
- * indentation for comments:             Comment Commands.
- * indentation for programs:             Program Indent.
- * Indented Text mode:                   Text Mode.
- * indirect buffer:                      Indirect Buffers.
- * indirect buffers and outlines:        Outline Views.
- * inferior process:                     Compilation.
- * Info:                                 Misc Help.
- * init file:                            Init File.
- * initial options (command line):       Command Arguments.
- * initial-frame-alist:                  Creating Frames.
- * input event:                          User Input.
- * input with the keyboard:              User Input.
- * inserted subdirectory (Dired):        Subdirectories in Dired.
- * inserting blank lines:                Blank Lines.
- * insertion:                            Inserting Text.
- * inverse video and faces:              Modifying Faces.
- * invisible lines:                      Outline Mode.
- * Islamic calendar:                     Calendar Systems.
- * ISO Accents mode:                     European Display.
- * ISO commercial calendar:              Calendar Systems.
- * ISO Latin-1 character set:            European Display.
- * italic font:                          Modifying Faces.
- * Julian calendar:                      Calendar Systems.
- * Julian day numbers:                   Calendar Systems.
- * justification:                        Fill Commands.
- * key:                                  Keys.
- * key bindings:                         Key Bindings.
- * key rebinding, permanent:             Init File.
- * key rebinding, this session:          Rebinding.
- * key sequence:                         Keys.
- * keyboard input:                       User Input.
- * keyboard macro:                       Keyboard Macros.
- * keyboard translations:                Keyboard Translations.
- * keymap:                               Keymaps.
- * kill ring:                            Yanking.
- * killing buffers:                      Kill Buffer.
- * killing characters and lines:         Erasing.
- * killing Emacs:                        Exiting.
- * killing rectangular areas of text:    Rectangles.
- * killing text:                         Killing.
- * LaTeX mode:                           TeX Mode.
- * label (Rmail):                        Rmail Labels.
- * leaving Emacs:                        Exiting.
- * libraries:                            Lisp Libraries.
- * line number commands:                 Position Info.
- * Line Number mode:                     Optional Mode Line.
- * line wrapping:                        Continuation Lines.
- * Lisp editing:                         Programs.
- * Lisp mode:                            Program Modes.
- * Lisp string syntax:                   Init Syntax.
- * Lisp symbol completion:               Symbol Completion.
- * list:                                 Lists.
- * listing current buffers:              List Buffers.
- * loading Lisp code:                    Lisp Libraries.
- * local keymap:                         Local Keymaps.
- * local variables:                      Locals.
- * local variables in files:             File Variables.
- * location of point:                    Position Info.
- * locking and version control:          VC Concepts.
- * locking files:                        Interlocking.
- * log entry:                            Log Entries.
- * M-:                                   User Input.
- * macro expansion in C:                 C Mode.
- * mail:                                 Sending Mail.
- * mail (on mode line):                  Optional Mode Line.
- * mail aliases:                         Mail Aliases.
- * Mail mode:                            Mail Mode.
- * mailrc file:                          Mail Aliases.
- * major modes:                          Major Modes.
- * make:                                 Compilation.
- * Makefile mode:                        Program Modes.
- * making pictures out of text characters: Picture.
- * manipulating paragraphs:              Paragraphs.
- * manipulating sentences:               Sentences.
- * manipulating text:                    Text.
- * manuals, on-line:                     Misc Help.
- * mark:                                 Mark.
- * mark ring:                            Mark Ring.
- * marking in Dired:                     Marks vs Flags.
- * marking sections of text:             Marking Objects.
- * Markov chain:                         Dissociated Press.
- * master file:                          VC Concepts.
- * matching parentheses:                 Matching.
- * Mayan calendar:                       Calendar Systems.
- * Mayan calendar round:                 Mayan Calendar.
- * Mayan haab calendar:                  Mayan Calendar.
- * Mayan long count:                     Mayan Calendar.
- * Mayan tzolkin calendar:               Mayan Calendar.
- * memory full:                          Memory Full.
- * Menu Bar mode:                        Menu Bars.
- * merge buffer (Emerge):                Overview of Emerge.
- * merging files:                        Emerge.
- * message:                              Sending Mail.
- * message number:                       Rmail Basics.
- * messages saved from echo area:        Echo Area.
- * Meta:                                 User Input.
- * Meta commands and words:              Words.
- * minibuffer:                           Minibuffer.
- * minibuffer history:                   Minibuffer History.
- * minibuffer keymaps:                   Minibuffer Maps.
- * minor mode keymap:                    Local Keymaps.
- * minor modes:                          Minor Modes.
- * mistakes, correcting:                 Fixit.
- * mode hook:                            Program Modes.
- * mode line:                            Mode Line.
- * mode, TeX:                            TeX Mode.
- * mode, Abbrev:                         Abbrev Concepts.
- * mode, Auto Fill:                      Auto Fill.
- * mode, Auto Save:                      Auto Save.
- * mode, C:                              C Mode.
- * mode, Comint:                         Shell Mode.
- * mode, Compilation:                    Compilation.
- * mode, Emacs-Lisp:                     Lisp Eval.
- * mode, Enriched:                       Formatted Text.
- * mode, Fortran:                        Fortran.
- * mode, Indented Text:                  Text Mode.
- * mode, LaTeX:                          TeX Mode.
- * mode, Line Number:                    Optional Mode Line.
- * mode, major:                          Major Modes.
- * mode, Menu Bar:                       Menu Bars.
- * mode, minor:                          Minor Modes.
- * mode, Outline:                        Outline Mode.
- * mode, Overwrite:                      Minor Modes.
- * mode, Scroll Bar:                     Scroll Bars.
- * mode, Shell:                          Shell Mode.
- * mode, SliTeX:                         TeX Mode.
- * mode, Text:                           Text Mode.
- * mode, Transient Mark:                 Transient Mark.
- * modified (buffer):                    Visiting.
- * moon, phases of:                      Lunar Phases.
- * mouse:                                Keymaps.
- * mouse button events:                  Mouse Buttons.
- * mouse buttons (what they do):         Mouse Commands.
- * movement:                             Moving Point.
- * moving inside the calendar:           Calendar Motion.
- * moving point:                         Moving Point.
- * moving text:                          Yanking.
- * moving the cursor:                    Moving Point.
- * MS-DOG:                               MS-DOS.
- * MS-DOS:                               MS-DOS.
- * multiple displays:                    Multiple Displays.
- * multiple views of outline:            Outline Views.
- * multiple windows in Emacs:            Windows.
- * mustatement:                          Dissociated Press.
- * named configurations (RCS):           Snapshot Caveats.
- * narrowing:                            Narrowing.
- * newline:                              Inserting Text.
- * newlines, hard and soft:              Hard and Soft Newlines.
- * NFS and quitting:                     Quitting.
- * nonincremental search:                Nonincremental Search.
- * nroff:                                Nroff Mode.
- * NSA:                                  Distracting NSA.
- * numeric arguments:                    Arguments.
- * on-line manuals:                      Misc Help.
- * operating on files in Dired:          Operating on Files.
- * operations on a marked region:        Using Region.
- * option:                               Variables.
- * options (command line):               Command Arguments.
- * other editors:                        Emulation.
- * out of memory:                        Memory Full.
- * Outline mode:                         Outline Mode.
- * outline with multiple views:          Outline Views.
- * outragedy:                            Dissociated Press.
- * Overwrite mode:                       Minor Modes.
- * pages:                                Pages.
- * paragraphs:                           Paragraphs.
- * parentheses:                          Matching.
- * parts of the screen:                  Screen.
- * pasting:                              Yanking.
- * pasting and X:                        Mouse Commands.
- * patches, sending:                     Sending Patches.
- * per-buffer variables:                 Locals.
- * Perl mode:                            Program Modes.
- * Perldb:                               Debuggers.
- * phases of the moon:                   Lunar Phases.
- * Picture mode and rectangles:          Rectangles in Picture.
- * pictures:                             Picture.
- * point:                                Point.
- * point location:                       Position Info.
- * POP inboxes:                          Rmail Inbox.
- * prefix arguments:                     Arguments.
- * prefix key:                           Keys.
- * preprocessor highlighting:            C Mode.
- * presidentagon:                        Dissociated Press.
- * primary Rmail file:                   Rmail Basics.
- * primary selection:                    Mouse Commands.
- * program building:                     Building.
- * program editing:                      Programs.
- * prompt:                               Minibuffer.
- * properbose:                           Dissociated Press.
- * puzzles:                              Amusements.
- * query replace:                        Query Replace.
- * quitting:                             Quitting.
- * quitting:                             Quitting.
- * quitting (in search):                 Incremental Search.
- * quitting Emacs:                       Exiting.
- * quoting:                              Inserting Text.
- * RCS:                                  Version Systems.
- * read-only buffer:                     Misc Buffer.
- * reading mail:                         Rmail.
- * reading netnews:                      GNUS.
- * rebinding keys, permanently:          Init File.
- * rebinding keys, this session:         Rebinding.
- * rebinding keys, this session:         Rebinding.
- * rebinding major mode keys:            Local Keymaps.
- * rebinding mouse buttons:              Mouse Buttons.
- * rectangle:                            Rectangles.
- * rectangles and Picture mode:          Rectangles in Picture.
- * recursive editing level:              Recursive Edit.
- * regexp:                               Regexp Search.
- * regexp syntax:                        Regexps.
- * region:                               Mark.
- * region highlighting:                  Transient Mark.
- * region highlighting:                  Faces.
- * registered file:                      VC Concepts.
- * registers:                            Registers.
- * regular expression:                   Regexp Search.
- * remote file access:                   File Names.
- * remote host:                          Remote Host.
- * replacement:                          Replace.
- * reply to a message:                   Rmail Reply.
- * reporting bugs:                       Checklist.
- * Resize-Minibuffer mode:               Minibuffer Edit.
- * resources:                            Resources X.
- * restriction:                          Narrowing.
- * retrying a failed message:            Rmail Reply.
- * Rlogin:                               Remote Host.
- * Rmail:                                Rmail.
- * rot13 code:                           Rmail Rot13.
- * running Lisp functions:               Building.
- * saved echo area messages:             Echo Area.
- * saving:                               Visiting.
- * saving keyboard macros:               Save Kbd Macro.
- * saving sessions:                      Saving Emacs Sessions.
- * SCCS:                                 Version Systems.
- * Scheme mode:                          Program Modes.
- * screen:                               Screen.
- * Scroll Bar mode:                      Scroll Bars.
- * scrolling:                            Scrolling.
- * scrolling in the calendar:            Scroll Calendar.
- * SDB:                                  Debuggers.
- * search-and-replace commands:          Replace.
- * searching:                            Search.
- * secondary selection:                  Secondary Selection.
- * selected buffer:                      Buffers.
- * selected window:                      Basic Window.
- * selecting buffers in other windows:   Pop Up Window.
- * selection, primary:                   Mouse Commands.
- * selective display:                    Outline Mode.
- * self-documentation:                   Help.
- * sending mail:                         Sending Mail.
- * sending patches for GNU Emacs:        Sending Patches.
- * sentences:                            Sentences.
- * server:                               Emacs Server.
- * server (using Emacs as):              Emacs Server.
- * setting a mark:                       Mark.
- * setting variables:                    Examining.
- * sexp:                                 Lists.
- * shell commands:                       Shell.
- * shell commands, Dired:                Shell Commands in Dired.
- * Shell mode:                           Shell Mode.
- * simultaneous editing:                 Interlocking.
- * size of minibuffer:                   Minibuffer Edit.
- * slashes repeated in file name:        Minibuffer File.
- * SliTeX mode:                          TeX Mode.
- * snapshots and version control:        Snapshots.
- * soft newline:                         Hard and Soft Newlines.
- * sorting:                              Sorting.
- * sorting Dired buffer:                 Dired Updating.
- * spelling, checking and correcting:    Spelling.
- * splitting columns:                    Two-Column.
- * starting Emacs:                       Entering Emacs.
- * startup (command line arguments):     Command Arguments.
- * startup (init file):                  Init File.
- * string substitution:                  Replace.
- * string syntax:                        Init Syntax.
- * subdirectories in Dired:              Subdirectories in Dired.
- * subscribe newsgroups:                 Summary of GNUS.
- * subshell:                             Shell.
- * subtree (Outline mode):               Outline Visibility.
- * summary (Rmail):                      Rmail Summary.
- * sunrise and sunset:                   Sunrise/Sunset.
- * suspending:                           Exiting.
- * switch buffers:                       Select Buffer.
- * switches (command line):              Command Arguments.
- * syntax table:                         Syntax.
- * tab stops:                            Tab Stops.
- * tables, indentation for:              Tab Stops.
- * tags completion:                      Symbol Completion.
- * tags table:                           Tags.
- * Tcl mode:                             Program Modes.
- * techniquitous:                        Dissociated Press.
- * television:                           Appending Kills.
- * Telnet:                               Remote Host.
- * termscript file:                      Checklist.
- * TEXEDIT environment variable:         Emacs Server.
- * text:                                 Text.
- * Text mode:                            Text Mode.
- * time (on mode line):                  Optional Mode Line.
- * top level:                            Mode Line.
- * tower of Hanoi:                       Amusements.
- * Transient Mark mode:                  Transient Mark.
- * transposition:                        List Commands.
- * triple clicks:                        Mouse Buttons.
- * truenames of files:                   File Aliases.
- * truncation:                           Continuation Lines.
- * trunk (version control):              Branches.
- * two-column editing:                   Two-Column.
- * typos, fixing:                        Fixit.
- * undeletion (Rmail):                   Rmail Deletion.
- * underlining and faces:                Modifying Faces.
- * undigestify:                          Rmail Digest.
- * undo:                                 Undo.
- * undo limit:                           Undo.
- * unsubscribe newsgroups:               Summary of GNUS.
- * userenced:                            Dissociated Press.
- * using tab stops in making tables:     Tab Stops.
- * variable:                             Variables.
- * version control:                      Version Control.
- * vi:                                   Emulation.
- * View mode:                            Misc File Ops.
- * viewing:                              Misc File Ops.
- * views of an outline:                  Outline Views.
- * visiting:                             Visiting.
- * visiting files:                       Visiting.
- * weeks, which day they start on:       Move to Beginning or End.
- * widening:                             Narrowing.
- * windows in Emacs:                     Windows.
- * word processing:                      Formatted Text.
- * word search:                          Word Search.
- * words:                                Words.
- * words, case conversion:               Case.
- * work file:                            VC Concepts.
- * wrapping:                             Continuation Lines.
- * WYSIWYG:                              Formatted Text.
- * X cutting and pasting:                Mouse Commands.
- * X pasting and cutting:                Mouse Commands.
- * XDB:                                  Debuggers.
- * xon-xoff:                             Unasked-for Search.
- * yahrzeits:                            From Other Calendar.
- * yanking:                              Yanking.
- * yanking previous kills:               Earlier Kills.
- * Zippy:                                Amusements.
- 
- 
--- 0 ----
Index: emacs/info/emacs-3
diff -c emacs/info/emacs-3:1.1.1.2 emacs/info/emacs-3:removed
*** emacs/info/emacs-3:1.1.1.2	Mon Jul 22 01:52:27 1996
--- emacs/info/emacs-3	Fri Aug  2 20:13:54 1996
***************
*** 1,1176 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Position Info,  Next: Arguments,  Prev: Continuation Lines,  Up: Basic
- 
- Cursor Position Information
- ===========================
- 
-    Here are commands to get information about the size and position of
- parts of the buffer, and to count lines.
- 
- `M-x what-page'
-      Print page number of point, and line number within page.
- 
- `M-x what-line'
-      Print line number of point in the buffer.
- 
- `M-x line-number-mode'
-      Toggle automatic display of current line number.
- 
- `M-='
-      Print number of lines in the current region (`count-lines-region').
-      *Note Mark::, for information about the region.
- 
- `C-x ='
-      Print character code of character after point, character position
-      of point, and column of point (`what-cursor-position').
- 
-    There are two commands for working with line numbers.  `M-x
- what-line' computes the current line number and displays it in the echo
- area.  To go to a given line by number, use `M-x goto-line'; it prompts
- you for the number.  These line numbers count from one at the beginning
- of the buffer.
- 
-    `M-x line-number-mode' enables display of the current line number in
- the mode line; once you turn this on, the number updates as you move
- point, so it remains valid all the time.  *Note Mode Line::.  If you
- narrow the buffer, only the accessible portion counts for this feature.
- 
-    By contrast, `M-x what-page' counts pages from the beginning of the
- file, and counts lines within the page, printing both numbers.  *Note
- Pages::.
- 
-    While on this subject, we might as well mention `M-='
- (`count-lines-region'), which prints the number of lines in the region
- (*note Mark::.).  *Note Pages::, for the command `C-x l' which counts
- the lines in the current page.
- 
-    The command `C-x =' (`what-cursor-position') can be used to find out
- the column that the cursor is in, and other miscellaneous information
- about point.  It prints a line in the echo area that looks like this:
- 
-      Char: x (0170)  point=65986 of 563027(12%)  x=44
- 
- (In fact, this is the output produced when point is before the `x=44'
- in the example.)
- 
-    The two values after `Char:' describe the character that follows
- point, first by showing it and second by giving its octal character
- code.
- 
-    `point=' is followed by the position of point expressed as a
- character count.  The front of the buffer counts as position 1, one
- character later as 2, and so on.  The next, larger number is the total
- number of characters in the buffer.  Afterward in parentheses comes the
- position expressed as a percentage of the total size.
- 
-    `x=' is followed by the horizontal position of point, in columns
- from the left edge of the window.
- 
-    If the buffer has been narrowed, making some of the text at the
- beginning and the end temporarily inaccessible, `C-x =' prints
- additional text describing the currently accessible range.  For
- example, it might display this:
- 
-      Char: x (0170)  point=65986 of 563025(12%) <65102 - 68533>  x=44
- 
- where the two extra numbers give the smallest and largest character
- position that point is allowed to assume.  The characters between those
- two positions are the accessible ones.  *Note Narrowing::.
- 
-    If point is at the end of the buffer (or the end of the accessible
- part), `C-x =' omits any description of the character after point.  The
- output looks like this:
- 
-      point=563026 of 563025(100%)  x=0
- 
- 
- File: emacs,  Node: Arguments,  Prev: Position Info,  Up: Basic
- 
- Numeric Arguments
- =================
- 
-    Any Emacs command can be given a "numeric argument" (also called a
- "prefix argument").  Some commands interpret the argument as a
- repetition count.  For example, `C-f' with an argument of ten moves
- forward ten characters instead of one.  With these commands, no argument
- is equivalent to an argument of one.  Negative arguments tell most such
- commands to move or act in the opposite direction.
- 
-    If your terminal keyboard has a META key, the easiest way to specify
- a numeric argument is to type digits and/or a minus sign while holding
- down the the META key.  For example,
-      M-5 C-n
- 
- would move down five lines.  The characters `Meta-1', `Meta-2', and so
- on, as well as `Meta--', do this because they are keys bound to
- commands (`digit-argument' and `negative-argument') that are defined to
- contribute to an argument for the next command.  Digits and `-'
- modified with Control, or Control and Meta, also specify numeric
- arguments.
- 
-    Another way of specifying an argument is to use the `C-u'
- (`universal-argument') command followed by the digits of the argument.
- With `C-u', you can type the argument digits without holding down
- modifier keys; `C-u' works on all terminals.  To type a negative
- argument, type a minus sign after `C-u'.  Just a minus sign without
- digits normally means -1.
- 
-    `C-u' followed by a character which is neither a digit nor a minus
- sign has the special meaning of "multiply by four".  It multiplies the
- argument for the next command by four.  `C-u' twice multiplies it by
- sixteen.  Thus, `C-u C-u C-f' moves forward sixteen characters.  This
- is a good way to move forward "fast", since it moves about 1/5 of a line
- in the usual size screen.  Other useful combinations are `C-u C-n',
- `C-u C-u C-n' (move down a good fraction of a screen), `C-u C-u C-o'
- (make "a lot" of blank lines), and `C-u C-k' (kill four lines).
- 
-    Some commands care only about whether there is an argument, and not
- about its value.  For example, the command `M-q' (`fill-paragraph') with
- no argument fills text; with an argument, it justifies the text as well.
- (*Note Filling::, for more information on `M-q'.)  Plain `C-u' is a
- handy way of providing an argument for such commands.
- 
-    Some commands use the value of the argument as a repeat count, but do
- something peculiar when there is no argument.  For example, the command
- `C-k' (`kill-line') with argument N kills N lines, including their
- terminating newlines.  But `C-k' with no argument is special: it kills
- the text up to the next newline, or, if point is right at the end of
- the line, it kills the newline itself.  Thus, two `C-k' commands with
- no arguments can kill a nonblank line, just like `C-k' with an argument
- of one.  (*Note Killing::, for more information on `C-k'.)
- 
-    A few commands treat a plain `C-u' differently from an ordinary
- argument.  A few others may treat an argument of just a minus sign
- differently from an argument of -1.  These unusual cases are described
- when they come up; they are always for reasons of convenience of use of
- the individual command.
- 
-    You can use a numeric argument to insert multiple copies of a
- character.  This is straightforward unless the character is a digit; for
- example, `C-u 6 4 a' inserts 64 copies of the character `a'.  But this
- does not work for inserting digits; `C-u 6 4 1' specifies an argument
- of 641, rather than inserting anything.  To separate the digit to
- insert from the argument, type another `C-u'; for example, `C-u 6 4 C-u
- 1' does insert 64 copies of the character `1'.
- 
-    We use the term "prefix argument" as well as "numeric argument" to
- emphasize that you type the argument before the command, and to
- distinguish these arguments from minibuffer arguments that come after
- the command.
- 
- 
- File: emacs,  Node: Minibuffer,  Next: M-x,  Prev: Basic,  Up: Top
- 
- The Minibuffer
- **************
- 
-    The "minibuffer" is the facility used by Emacs commands to read
- arguments more complicated than a single number.  Minibuffer arguments
- can be file names, buffer names, Lisp function names, Emacs command
- names, Lisp expressions, and many other things, depending on the command
- reading the argument.  You can use the usual Emacs editing commands in
- the minibuffer to edit the argument text.
- 
-    When the minibuffer is in use, it appears in the echo area, and the
- terminal's cursor moves there.  The beginning of the minibuffer line
- displays a "prompt" which says what kind of input you should supply and
- how it will be used.  Often this prompt is derived from the name of the
- command that the argument is for.  The prompt normally ends with a
- colon.
- 
-    Sometimes a "default argument" appears in parentheses after the
- colon; it too is part of the prompt.  The default will be used as the
- argument value if you enter an empty argument (e.g., just type RET).
- For example, commands that read buffer names always show a default,
- which is the name of the buffer that will be used if you type just RET.
- 
-    The simplest way to enter a minibuffer argument is to type the text
- you want, terminated by RET which exits the minibuffer.  You can cancel
- the command that wants the argument, and get out of the minibuffer, by
- typing `C-g'.
- 
-    Since the minibuffer uses the screen space of the echo area, it can
- conflict with other ways Emacs customarily uses the echo area.  Here is
- how Emacs handles such conflicts:
- 
-    * If a command gets an error while you are in the minibuffer, this
-      does not cancel the minibuffer.  However, the echo area is needed
-      for the error message and therefore the minibuffer itself is
-      hidden for a while.  It comes back after a few seconds, or as soon
-      as you type anything.
- 
-    * If in the minibuffer you use a command whose purpose is to print a
-      message in the echo area, such as `C-x =', the message is printed
-      normally, and the minibuffer is hidden for a while.  It comes back
-      after a few seconds, or as soon as you type anything.
- 
-    * Echoing of keystrokes does not take place while the minibuffer is
-      in use.
- 
- * Menu:
- 
- * File: Minibuffer File.  Entering file names with the minibuffer.
- * Edit: Minibuffer Edit.  How to edit in the minibuffer.
- * Completion::		  An abbreviation facility for minibuffer input.
- * Minibuffer History::    Reusing recent minibuffer arguments.
- * Repetition::		  Re-executing commands that used the minibuffer.
- 
- 
- File: emacs,  Node: Minibuffer File,  Next: Minibuffer Edit,  Up: Minibuffer
- 
- Minibuffers for File Names
- ==========================
- 
-    Sometimes the minibuffer starts out with text in it.  For example,
- when you are supposed to give a file name, the minibuffer starts out
- containing the "default directory", which ends with a slash.  This is
- to inform you which directory the file will be found in if you do not
- specify a directory.
- 
-    For example, the minibuffer might start out with these contents:
- 
-      Find File: /u2/emacs/src/
- 
- where `Find File: ' is the prompt.  Typing `buffer.c' specifies the
- file `/u2/emacs/src/buffer.c'.  To find files in nearby directories,
- use `..'; thus, if you type `../lisp/simple.el', you will get the file
- named `/u2/emacs/lisp/simple.el'.  Alternatively, you can kill with
- `M-DEL' the directory names you don't want (*note Words::.).
- 
-    If you don't want any of the default, you can kill it with `C-a
- C-k'.  But you don't need to kill the default; you can simply ignore it.
- Insert an absolute file name, one starting with a slash or a tilde,
- after the default directory.  For example, to specify the file
- `/etc/termcap', just insert that name, giving these minibuffer contents:
- 
-      Find File: /u2/emacs/src//etc/termcap
- 
- Two slashes in a row are not normally meaningful in a file name, but
- they are allowed in GNU Emacs.  They mean, "ignore everything before
- the second slash in the pair."  Thus, `/u2/emacs/src/' is ignored in
- the example above, and you get the file `/etc/termcap'.
- 
-    If you set `insert-default-directory' to `nil', the default
- directory is not inserted in the minibuffer.  This way, the minibuffer
- starts out empty.  But the name you type, if relative, is still
- interpreted with respect to the same default directory.
- 
- 
- File: emacs,  Node: Minibuffer Edit,  Next: Completion,  Prev: Minibuffer File,  Up: Minibuffer
- 
- Editing in the Minibuffer
- =========================
- 
-    The minibuffer is an Emacs buffer (albeit a peculiar one), and the
- usual Emacs commands are available for editing the text of an argument
- you are entering.
- 
-    Since RET in the minibuffer is defined to exit the minibuffer, you
- can't use it to insert a newline in the minibuffer.  To do that, type
- `C-o' or `C-q LFD'.  (Recall that a newline is really the LFD
- character.)
- 
-    The minibuffer has its own window which always has space on the
- screen but acts as if it were not there when the minibuffer is not in
- use.  When the minibuffer is in use, its window is just like the
- others; you can switch to another window with `C-x o', edit text in
- other windows and perhaps even visit more files, before returning to
- the minibuffer to submit the argument.  You can kill text in another
- window, return to the minibuffer window, and then yank the text to use
- it in the argument.  *Note Windows::.
- 
-    There are some restrictions on the use of the minibuffer window,
- however.  You cannot switch buffers in it--the minibuffer and its
- window are permanently attached.  Also, you cannot split or kill the
- minibuffer window.  But you can make it taller in the normal fashion
- with `C-x ^'.  If you enable Resize-Minibuffer mode, then the
- minibuffer window expands vertically as necessary to hold the text that
- you put in the minibuffer.  Use `M-x resize-minibuffer-mode' to enable
- or disable this minor mode (*note Minor Modes::.).
- 
-    If while in the minibuffer you issue a command that displays help
- text of any sort in another window, you can use the `C-M-v' command
- while in the minibuffer to scroll the help text.  This lasts until you
- exit the minibuffer.  This feature is especially useful if a completing
- minibuffer gives you a list of possible completions.  *Note Other
- Window::.
- 
-    Emacs normally disallows most commands that use the minibuffer while
- the minibuffer is selected.  This rule is to prevent recursive
- minibuffers from confusing novice users.  If you want to be able to use
- such commands in the minibuffer, set the variable
- `enable-recursive-minibuffers' to a non-`nil' value.
- 
- 
- File: emacs,  Node: Completion,  Next: Minibuffer History,  Prev: Minibuffer Edit,  Up: Minibuffer
- 
- Completion
- ==========
- 
-    For certain kinds of arguments, you can use "completion" to enter
- the argument value.  Completion means that you type part of the
- argument, then Emacs visibly fills in the rest, or as much as can be
- determined from the part you have typed.
- 
-    When completion is available, certain keys--TAB, RET, and SPC--are
- rebound to complete the text present in the minibuffer into a longer
- string that it stands for, by matching it against a set of "completion
- alternatives" provided by the command reading the argument.  `?' is
- defined to display a list of possible completions of what you have
- inserted.
- 
-    For example, when `M-x' uses the minibuffer to read the name of a
- command, it provides a list of all available Emacs command names to
- complete against.  The completion keys match the text in the minibuffer
- against all the command names, find any additional name characters
- implied by the ones already present in the minibuffer, and add those
- characters to the ones you have given.  This is what makes it possible
- to type `M-x ins SPC b RET' instead of `M-x insert-buffer RET' (for
- example).
- 
-    Case is normally significant in completion, because it is significant
- in most of the names that you can complete (buffer names, file names and
- command names).  Thus, `fo' does not complete to `Foo'.  Completion
- does ignore case distinctions for certain arguments in which case does
- not matter.
- 
- * Menu:
- 
- * Example: Completion Example.
- * Commands: Completion Commands.
- * Strict Completion::
- * Options: Completion Options.
- 
- 
- File: emacs,  Node: Completion Example,  Next: Completion Commands,  Up: Completion
- 
- Completion Example
- ------------------
- 
-    A concrete example may help here.  If you type `M-x au TAB', the TAB
- looks for alternatives (in this case, command names) that start with
- `au'.  There are only two: `auto-fill-mode' and `auto-save-mode'.
- These are the same as far as `auto-', so the `au' in the minibuffer
- changes to `auto-'.
- 
-    If you type TAB again immediately, there are multiple possibilities
- for the very next character--it could be `s' or `f'--so no more
- characters are added; instead, TAB displays a list of all possible
- completions in another window.
- 
-    If you go on to type `f TAB', this TAB sees `auto-f'.  The only
- command name starting this way is `auto-fill-mode', so completion fills
- in the rest of that.  You now have `auto-fill-mode' in the minibuffer
- after typing just `au TAB f TAB'.  Note that TAB has this effect
- because in the minibuffer it is bound to the command
- `minibuffer-complete' when completion is available.
- 
- 
- File: emacs,  Node: Completion Commands,  Next: Strict Completion,  Prev: Completion Example,  Up: Completion
- 
- Completion Commands
- -------------------
- 
-    Here is a list of the completion commands defined in the minibuffer
- when completion is available.
- 
- `TAB'
-      Complete the text in the minibuffer as much as possible
-      (`minibuffer-complete').
- 
- `SPC'
-      Complete the minibuffer text, but don't go beyond one word
-      (`minibuffer-complete-word').
- 
- `RET'
-      Submit the text in the minibuffer as the argument, possibly
-      completing first as described below
-      (`minibuffer-complete-and-exit').
- 
- `?'
-      Print a list of all possible completions of the text in the
-      minibuffer (`minibuffer-list-completions').
- 
-    SPC completes much like TAB, but never goes beyond the next hyphen
- or space.  If you have `auto-f' in the minibuffer and type SPC, it
- finds that the completion is `auto-fill-mode', but it stops completing
- after `fill-'.  This gives `auto-fill-'.  Another SPC at this point
- completes all the way to `auto-fill-mode'.  SPC in the minibuffer when
- completion is available runs the command `minibuffer-complete-word'.
- 
-    Here are some commands you can use to choose a completion from a
- window that displays a list of completions:
- 
- `Mouse-2'
-      Clicking mouse button 2 on a completion in the list of possible
-      completions chooses that completion (`mouse-choose-completion').
-      You normally use this command while point is in the minibuffer;
-      but you must click in the list of completions, not in the
-      minibuffer itself.
- 
- `PRIOR'
- `M-v'
-      Typing PRIOR or PAGE-UP, or `M-v', while in the minibuffer,
-      selects the window showing the completion list buffer
-      (`switch-to-completions').  This paves the way for using the
-      commands below.  (Selecting that window in the usual ways has the
-      same effect, but this way is more convenient.)
- 
- `RET'
-      Typing RET *in the completion list buffer* chooses the completion
-      that point is in or next to (`choose-completion').  To use this
-      command, you must first switch windows to the window that shows
-      the list of completions.
- 
- `RIGHT'
-      Typing the right-arrow key RIGHT *in the completion list buffer*
-      moves point to the following completion (`next-completion').
- 
- `LEFT'
-      Typing the left-arrow key LEFT *in the completion list buffer*
-      moves point toward the beginning of the buffer, to the previous
-      completion (`previous-completion').
- 
- 
- File: emacs,  Node: Strict Completion,  Next: Completion Options,  Prev: Completion Commands,  Up: Completion
- 
- Strict Completion
- -----------------
- 
-    There are three different ways that RET can work in completing
- minibuffers, depending on how the argument will be used.
- 
-    * "Strict" completion is used when it is meaningless to give any
-      argument except one of the known alternatives.  For example, when
-      `C-x k' reads the name of a buffer to kill, it is meaningless to
-      give anything but the name of an existing buffer.  In strict
-      completion, RET refuses to exit if the text in the minibuffer does
-      not complete to an exact match.
- 
-    * "Cautious" completion is similar to strict completion, except that
-      RET exits only if the text was an exact match already, not needing
-      completion.  If the text is not an exact match, RET does not exit,
-      but it does complete the text.  If it completes to an exact match,
-      a second RET will exit.
- 
-      Cautious completion is used for reading file names for files that
-      must already exist.
- 
-    * "Permissive" completion is used when any string whatever is
-      meaningful, and the list of completion alternatives is just a
-      guide.  For example, when `C-x C-f' reads the name of a file to
-      visit, any file name is allowed, in case you want to create a
-      file.  In permissive completion, RET takes the text in the
-      minibuffer exactly as given, without completing it.
- 
-    The completion commands display a list of all possible completions in
- a window whenever there is more than one possibility for the very next
- character.  Also, typing `?' explicitly requests such a list.  If the
- list of completions is long, you can scroll it with `C-M-v' (*note
- Other Window::.).
- 
- 
- File: emacs,  Node: Completion Options,  Prev: Strict Completion,  Up: Completion
- 
- Completion Options
- ------------------
- 
-    When completion is done on file names, certain file names are usually
- ignored.  The variable `completion-ignored-extensions' contains a list
- of strings; a file whose name ends in any of those strings is ignored
- as a possible completion.  The standard value of this variable has
- several elements including `".o"', `".elc"', `".dvi"' and `"~"'.  The
- effect is that, for example, `foo' can complete to `foo.c' even though
- `foo.o' exists as well.  However, if *all* the possible completions end
- in "ignored" strings, then they are not ignored.  Ignored extensions do
- not apply to lists of completions--those always mention all possible
- completions.
- 
-    Normally, a completion command that finds the next character is
- undetermined automatically displays a list of all possible completions.
- If the variable `completion-auto-help' is set to `nil', this does not
- happen, and you must type `?' to display the possible completions.
- 
-    The `complete' library implements a more powerful kind of completion
- that can complete multiple words at a time.  For example, it can
- complete the command name abbreviation `p-b' into `print-buffer',
- because no other command starts with two words whose initials are `p'
- and `b'.  To use this library, put `(load "complete")' in your
- `~/.emacs' file (*note Init File::.).
- 
-    Icomplete mode presents a constantly-updated display that tells you
- what completions are available for the text you've entered so far.  The
- command to enable or disable this minor mode is `M-x icomplete-mode'.
- 
- 
- File: emacs,  Node: Minibuffer History,  Next: Repetition,  Prev: Completion,  Up: Minibuffer
- 
- Minibuffer History
- ==================
- 
-    Every argument that you enter with the minibuffer is saved on a
- "minibuffer history list" so that you can use it again later in another
- argument.  Special commands load the text of an earlier argument in the
- minibuffer.  They discard the old minibuffer contents, so you can think
- of them as moving through the history of previous arguments.
- 
- `M-p'
-      Move to the next earlier argument string saved in the minibuffer
-      history (`previous-history-element').
- 
- `M-n'
-      Move to the next later argument string saved in the minibuffer
-      history (`next-history-element').
- 
- `M-r REGEXP RET'
-      Move to an earlier saved argument in the minibuffer history that
-      has a match for REGEXP (`previous-matching-history-element').
- 
- `M-s REGEXP RET'
-      Move to a later saved argument in the minibuffer history that has a
-      match for REGEXP (`next-matching-history-element').
- 
-    The simplest way to reuse the saved arguments in the history list is
- to move through the history list one element at a time.  While in the
- minibuffer, type `M-p' (`previous-history-element') to "move to" the
- next earlier minibuffer input, and use `M-n' (`next-history-element')
- to "move to" the next later input.
- 
-    The previous input that you fetch from the history entirely replaces
- the contents of the minibuffer.  To use it as the argument, exit the
- minibuffer as usual with RET.  You can also edit the text before you
- reuse it; this does not change the history element that you "moved" to,
- but your new argument does go at the end of the history list in its own
- right.
- 
-    There are also commands to search forward or backward through the
- history.  As of this writing, they search for history elements that
- match a regular expression that you specify with the minibuffer.  `M-r'
- (`previous-matching-history-element') searches older elements in the
- history, while `M-s' (`next-matching-history-element') searches newer
- elements.  By special dispensation, these commands can use the
- minibuffer to read their arguments even though you are already in the
- minibuffer when you issue them.
- 
-    All uses of the minibuffer record your input on a history list, but
- there are separate history lists for different kinds of arguments.  For
- example, there is a list for file names, used by all the commands that
- read file names.  There is a list for arguments of commands like
- `query-replace'.  There are several very specific history lists,
- including one for command names read by M-x and one for compilation
- commands read by `compile'.  Finally, there is one "miscellaneous"
- history list that most minibuffer arguments use.
- 
- 
- File: emacs,  Node: Repetition,  Prev: Minibuffer History,  Up: Minibuffer
- 
- Repeating Minibuffer Commands
- =============================
- 
-    Every command that uses the minibuffer at least once is recorded on a
- special history list, together with the values of its arguments, so that
- you can repeat the entire command.  In particular, every use of `M-x'
- is recorded there, since `M-x' uses the minibuffer to read the command
- name.
- 
- `C-x ESC ESC'
-      Re-execute a recent minibuffer command (`repeat-complex-command').
- 
- `M-x list-command-history'
-      Display the entire command history, showing all the commands `C-x
-      ESC ESC' can repeat, most recent first.
- 
-    `C-x ESC ESC' is used to re-execute a recent minibuffer-using
- command.  With no argument, it repeats the last such command.  A
- numeric argument specifies which command to repeat; one means the last
- one, and larger numbers specify earlier ones.
- 
-    `C-x ESC ESC' works by turning the previous command into a Lisp
- expression and then entering a minibuffer initialized with the text for
- that expression.  If you type just RET, the command is repeated as
- before.  You can also change the command by editing the Lisp
- expression.  Whatever expression you finally submit is what will be
- executed.  The repeated command is added to the front of the command
- history unless it is identical to the most recently executed command
- already there.
- 
-    Even if you don't understand Lisp syntax, it will probably be obvious
- which command is displayed for repetition.  If you do not change the
- text, it will repeat exactly as before.
- 
-    Once inside the minibuffer for `C-x ESC ESC', you can use the
- minibuffer history commands (`M-p', `M-n', `M-r', `M-s'; *note
- Minibuffer History::.) to move through the history list of saved entire
- commands.  After finding the desired previous command, you can edit its
- expression as usual and then resubmit it by typing RET as usual.
- 
-    The list of previous minibuffer-using commands is stored as a Lisp
- list in the variable `command-history'.  Each element is a Lisp
- expression which describes one command and its arguments.  Lisp programs
- can reexecute a command by calling `eval' with the `command-history'
- element.
- 
- 
- File: emacs,  Node: M-x,  Next: Help,  Prev: Minibuffer,  Up: Top
- 
- Running Commands by Name
- ************************
- 
-    The Emacs commands that are used often or that must be quick to type
- are bound to keys--short sequences of characters--for convenient use.
- Other Emacs commands that do not need to be brief are not bound to
- keys; to run them, you must refer to them by name.
- 
-    A command name is, by convention, made up of one or more words,
- separated by hyphens; for example, `auto-fill-mode' or `manual-entry'.
- The use of English words makes the command name easier to remember than
- a key made up of obscure characters, even though it is more characters
- to type.
- 
-    The way to run a command by name is to start with `M-x', type the
- command name, and finish it with RET.  `M-x' uses the minibuffer to
- read the command name.  RET exits the minibuffer and runs the command.
- The string `M-x' appears at the beginning of the minibuffer as a
- "prompt" to remind you to enter the name of a command to be run.  *Note
- Minibuffer::, for full information on the features of the minibuffer.
- 
-    You can use completion to enter the command name.  For example, the
- command `forward-char' can be invoked by name by typing
- 
-      M-x forward-char RET
- 
- or
- 
-      M-x forw TAB c RET
- 
- Note that `forward-char' is the same command that you invoke with the
- key `C-f'.  You can run any Emacs command by name using `M-x', whether
- or not any keys are bound to it.
- 
-    If you type `C-g' while the command name is being read, you cancel
- the `M-x' command and get out of the minibuffer, ending up at top level.
- 
-    To pass a numeric argument to the command you are invoking with
- `M-x', specify the numeric argument before the `M-x'.  `M-x' passes the
- argument along to the command it runs.  The argument value appears in
- the prompt while the command name is being read.
- 
-    Normally, when describing a command that is run by name, we omit the
- RET that is needed to terminate the name.  Thus we might speak of `M-x
- auto-fill-mode' rather than `M-x auto-fill-mode RET'.  We mention the
- RET only when there is a need to emphasize its presence, such as when
- we show the command together with following arguments.
- 
-    `M-x' works by running the command `execute-extended-command', which
- is responsible for reading the name of another command and invoking it.
- 
- 
- File: emacs,  Node: Help,  Next: Mark,  Prev: M-x,  Up: Top
- 
- Help
- ****
- 
-    Emacs provides extensive help features accessible through a single
- character, `C-h'.  `C-h' is a prefix key that is used only for
- documentation-printing commands.  The characters that you can type after
- `C-h' are called "help options".  One help option is `C-h'; that is how
- you ask for help about using `C-h'.  To cancel, type `C-g'.  The
- function key F1 is equivalent to `C-h'.
- 
-    `C-h C-h' displays a list of the possible help options, each with a
- brief description.  Before you type a help option, you can use SPC or
- DEL to scroll through the list.
- 
-    `C-h' or F1 means "help" in various other contexts as well.  For
- example, in `query-replace', it describes the options available.  After
- a prefix key, it displays a list of the alternatives that can follow
- the prefix key.  (A few prefix keys don't support this because they
- define other meanings for `C-h'.)
- 
- * Menu:
- 
- * Help Summary::	Brief list of all Help commands.
- * Key Help::		Asking what a key does in Emacs.
- * Name Help::		Asking about a command, variable or function name.
- * Apropos::		Asking what pertains to a given topic.
- * Library Keywords::	Finding Lisp libraries by keywords (topics).
- * Misc Help::		Other help commands.
- 
- 
- File: emacs,  Node: Help Summary,  Next: Key Help,  Up: Help
- 
- Help Summary
- ============
- 
-    Here is a summary of the defined help commands.
- 
- `C-h a REGEXP RET'
-      Display list of commands whose names match REGEXP
-      (`command-apropos').
- 
- `C-h b'
-      Display a table of all key bindings in effect now, in this order:
-      minor mode bindings, major mode bindings, and global bindings
-      (`describe-bindings').
- 
- `C-h c KEY'
-      Print the name of the command that KEY runs
-      (`describe-key-briefly').  Here `c' stands for `character'.  For
-      more extensive information on KEY, use `C-h k'.
- 
- `C-h f FUNCTION RET'
-      Display documentation on the Lisp function named FUNCTION
-      (`describe-function').  Since commands are Lisp functions, a
-      command name may be used.
- 
- `C-h i'
-      Run Info, the program for browsing documentation files (`info').
-      The complete Emacs manual is available on-line in Info.
- 
- `C-h k KEY'
-      Display name and documentation of the command that KEY runs
-      (`describe-key').
- 
- `C-h l'
-      Display a description of the last 100 characters you typed
-      (`view-lossage').
- 
- `C-h m'
-      Display documentation of the current major mode (`describe-mode').
- 
- `C-h n'
-      Display documentation of Emacs changes, most recent first
-      (`view-emacs-news').
- 
- `C-h p'
-      Find packages by topic keyword (`finder-by-keyword').
- 
- `C-h s'
-      Display current contents of the syntax table, plus an explanation
-      of what they mean (`describe-syntax').  *Note Syntax::.
- 
- `C-h t'
-      Enter the Emacs interactive tutorial (`help-with-tutorial').
- 
- `C-h v VAR RET'
-      Display the documentation of the Lisp variable VAR
-      (`describe-variable').
- 
- `C-h w COMMAND RET'
-      Print which keys run the command named COMMAND (`where-is').
- 
- `C-h C-f FUNCTION RET'
-      Enter Info and go to the node documenting the Emacs function
-      FUNCTION (`info-goto-emacs-command-node').
- 
- `C-h C-k KEY'
-      Enter Info and go to the node where the key sequence KEY is
-      documented (`info-goto-emacs-key-command-node').
- 
- `C-h C-c'
-      Display the copying conditions for GNU Emacs.
- 
- `C-h C-d'
-      Display information about getting new versions of GNU Emacs.
- 
- `C-h C-p'
-      Display information about the GNU Project.
- 
- 
- File: emacs,  Node: Key Help,  Next: Name Help,  Prev: Help Summary,  Up: Help
- 
- Documentation for a Key
- =======================
- 
-    The most basic `C-h' options are `C-h c' (`describe-key-briefly')
- and `C-h k' (`describe-key').  `C-h c KEY' prints in the echo area the
- name of the command that KEY is bound to.  For example, `C-h c C-f'
- prints `forward-char'.  Since command names are chosen to describe what
- the commands do, this is a good way to get a very brief description of
- what KEY does.
- 
-    `C-h k KEY' is similar but gives more information: it displays the
- documentation string of the command as well as its name.  This is too
- big for the echo area, so a window is used for the display.
- 
-    `C-h c' and `C-h k' work for any sort of key sequences, including
- function keys and mouse events.
- 
- 
- File: emacs,  Node: Name Help,  Next: Apropos,  Prev: Key Help,  Up: Help
- 
- Help by Command or Variable Name
- ================================
- 
-    `C-h f' (`describe-function') reads the name of a Lisp function
- using the minibuffer, then displays that function's documentation string
- in a window.  Since commands are Lisp functions, you can use this to get
- the documentation of a command that you know by name.  For example,
- 
-      C-h f auto-fill-mode RET
- 
- displays the documentation of `auto-fill-mode'.  This is the only way
- to get the documentation of a command that is not bound to any key (one
- which you would normally run using `M-x').
- 
-    `C-h f' is also useful for Lisp functions that you are planning to
- use in a Lisp program.  For example, if you have just written the
- expression `(make-vector len)' and want to check that you are using
- `make-vector' properly, type `C-h f make-vector RET'.  Because `C-h f'
- allows all function names, not just command names, you may find that
- some of your favorite abbreviations that work in `M-x' don't work in
- `C-h f'.  An abbreviation may be unique among command names yet fail to
- be unique when other function names are allowed.
- 
-    The function name for `C-h f' to describe has a default which is
- used if you type RET leaving the minibuffer empty.  The default is the
- function called by the innermost Lisp expression in the buffer around
- point, *provided* that is a valid, defined Lisp function name.  For
- example, if point is located following the text `(make-vector (car x)',
- the innermost list containing point is the one that starts with
- `(make-vector', so the default is to describe the function
- `make-vector'.
- 
-    `C-h f' is often useful just to verify that you have the right
- spelling for the function name.  If `C-h f' mentions a name from the
- buffer as the default, that name must be defined as a Lisp function.  If
- that is all you want to know, just type `C-g' to cancel the `C-h f'
- command, then go on editing.
- 
-    `C-h w COMMAND RET' tells you what keys are bound to COMMAND.  It
- prints a list of the keys in the echo area.  If it says the command is
- not on any key, you must use `M-x' to run it.  `C-h w' runs the command
- `where-is'.
- 
-    `C-h v' (`describe-variable') is like `C-h f' but describes Lisp
- variables instead of Lisp functions.  Its default is the Lisp symbol
- around or before point, but only if that is the name of a known Lisp
- variable.  *Note Variables::.
- 
- 
- File: emacs,  Node: Apropos,  Next: Library Keywords,  Prev: Name Help,  Up: Help
- 
- Apropos
- =======
- 
-    A more sophisticated sort of question to ask is, "What are the
- commands for working with files?"  To ask this question, type `C-h a
- file RET', which displays a list of all command names that contain
- `file', including `copy-file', `find-file', and so on.  With each
- command name appears a brief description of how to use the command, and
- what keys you can currently invoke it with.  For example, it would say
- that you can invoke `find-file' by typing `C-x C-f'.  The `a' in `C-h
- a' stands for `Apropos'; `C-h a' runs the command `command-apropos'.
- 
-    Because `C-h a' looks only for functions whose names contain the
- string which you specify, you must use ingenuity in choosing the
- string.  If you are looking for commands for killing backwards and `C-h
- a kill-backwards RET' doesn't reveal any, don't give up.  Try just
- `kill', or just `backwards', or just `back'.  Be persistent.  Also note
- that you can use a regular expression as the argument, for more
- flexibility (*note Regexps::.).
- 
-    Here is a set of arguments to give to `C-h a' that covers many
- classes of Emacs commands, since there are strong conventions for naming
- the standard Emacs commands.  By giving you a feel for the naming
- conventions, this set should also serve to aid you in developing a
- technique for picking `apropos' strings.
- 
-      char, line, word, sentence, paragraph, region, page, sexp, list,
-      defun, rect, buffer, frame, window, face, file, dir, register,
-      mode, beginning, end, forward, backward, next, previous, up, down,
-      search, goto, kill, delete, mark, insert, yank, fill, indent,
-      case, change, set, what, list, find, view, describe, default.
- 
-    To list all Lisp symbols that contain a match for a regexp, not just
- the ones that are defined as commands, use the command `M-x apropos'
- instead of `C-h a'.  This command does not check key bindings by
- default; specify a numeric argument if you want it to check them.
- 
-    The `super-apropos' command is like `apropos' except that it
- searches documentation strings as well as symbol names for matches for
- the specified regular expression.
- 
- 
- File: emacs,  Node: Library Keywords,  Next: Misc Help,  Prev: Apropos,  Up: Help
- 
- Keyword Search for Lisp Libraries
- =================================
- 
-    The `C-h p' command lets you search the standard Emacs Lisp
- libraries by topic keywords.  Here is a partial list of keywords you can
- use:
- 
- `abbrev'
-      Abbreviation handling, typing shortcuts, macros.
- 
- `bib'
-      Support for the bibliography processor `bib'.
- 
- `c'
-      C and C++ language support.
- 
- `calendar'
-      Calendar and time management support.
- 
- `comm'
-      Communications, networking, remote access to files.
- 
- `data'
-      Support for editing files of data.
- 
- `debugging'
-      Support for debugging programs.
- 
- `docs'
-      Support for Emacs documentation.
- 
- `emulations'
-      Emulations of other editors.
- 
- `extensions'
-      Emacs Lisp language extensions.
- 
- `faces'
-      Support for using faces (fonts and colors; *note Faces::.).
- 
- `frames'
-      Support for Emacs frames and window systems.
- 
- `games'
-      Games, jokes and amusements.
- 
- `hardware'
-      Support for interfacing with exotic hardware.
- 
- `help'
-      Support for on-line help systems.
- 
- `hypermedia'
-      Support for links within text, or other media types.
- 
- `i18n'
-      Internationalization and alternate character-set support.
- 
- `internal'
-      Code for Emacs internals, build process, defaults.
- 
- `languages'
-      Specialized modes for editing programming languages.
- 
- `lisp'
-      Support for using Lisp (including Emacs Lisp).
- 
- `local'
-      Libraries local to your site.
- 
- `maint'
-      Maintenance aids for the Emacs development group.
- 
- `mail'
-      Modes for electronic-mail handling.
- 
- `matching'
-      Searching and matching.
- 
- `news'
-      Support for netnews reading and posting.
- 
- `non-text'
-      Support for editing files that are not ordinary text.
- 
- `oop'
-      Support for object-oriented programming.
- 
- `outlines'
-      Hierarchical outlining.
- 
- `processes'
-      Process, subshell, compilation, and job control support.
- 
- `terminals'
-      Support for terminal types.
- 
- `tex'
-      Support for the TeX formatter.
- 
- `tools'
-      Programming tools.
- 
- `unix'
-      Front-ends/assistants for, or emulators of, Unix features.
- 
- `vms'
-      Support code for VMS.
- 
- `wp'
-      Word processing.
- 
- 
- File: emacs,  Node: Misc Help,  Prev: Library Keywords,  Up: Help
- 
- Other Help Commands
- ===================
- 
-    `C-h i' (`info') runs the Info program, which is used for browsing
- through structured documentation files.  The entire Emacs manual is
- available within Info.  Eventually all the documentation of the GNU
- system will be available.  Type `h' after entering Info to run a
- tutorial on using Info.
- 
-    There are two special help commands for accessing Emacs documentation
- through Info.  `C-h C-f FUNCTION RET' enters Info and goes straight to
- the documentation of the Emacs function FUNCTION.  `C-h C-k KEY' enters
- Info and goes straight to the documentation of the key KEY.  These two
- keys run the commands `Info-goto-emacs-command-node' and
- `Info-goto-emacs-key-command-node'.
- 
-    If something surprising happens, and you are not sure what commands
- you typed, use `C-h l' (`view-lossage').  `C-h l' prints the last 100
- command characters you typed in.  If you see commands that you don't
- know, you can use `C-h c' to find out what they do.
- 
-    Emacs has numerous major modes, each of which redefines a few keys
- and makes a few other changes in how editing works.  `C-h m'
- (`describe-mode') prints documentation on the current major mode, which
- normally describes all the commands that are changed in this mode.
- 
-    `C-h b' (`describe-bindings') and `C-h s' (`describe-syntax')
- present other information about the current Emacs mode.  `C-h b'
- displays a list of all the key bindings now in effect; the local
- bindings defined by the current minor modes first, then the local
- bindings defined by the current major mode, and finally the global
- bindings (*note Key Bindings::.).  `C-h s' displays the contents of the
- syntax table, with explanations of each character's syntax (*note
- Syntax::.).
- 
-    You can get a similar list for a particular prefix key by typing
- `C-h' after the prefix key.  (There are a few prefix keys for which
- this does not work--those that provide their own bindings for `C-h'.
- One of these is ESC, because `ESC C-h' is actually `C-M-h', which marks
- a defun.)
- 
-    The other `C-h' options display various files of useful information.
- `C-h C-w' displays the full details on the complete absence of
- warranty for GNU Emacs.  `C-h n' (`view-emacs-news') displays the file
- `emacs/etc/NEWS', which contains documentation on Emacs changes
- arranged chronologically.  `C-h t' (`help-with-tutorial') displays the
- learn-by-doing Emacs tutorial.  `C-h C-c' (`describe-copying') displays
- the file `emacs/etc/COPYING', which tells you the conditions you must
- obey in distributing copies of Emacs.  `C-h C-d'
- (`describe-distribution') displays the file `emacs/etc/DISTRIB', which
- tells you how you can order a copy of the latest version of Emacs.
- `C-h C-p' (`describe-project') displays general information about the
- GNU Project.
- 
- 
- File: emacs,  Node: Mark,  Next: Killing,  Prev: Help,  Up: Top
- 
- The Mark and the Region
- ***********************
- 
-    Many Emacs commands operate on an arbitrary contiguous part of the
- current buffer.  To specify the text for such a command to operate on,
- you set "the mark" at one end of it, and move point to the other end.
- The text between point and the mark is called "the region".  Emacs
- highlights the region whenever there is one, if you enable Transient
- Mark mode (*note Transient Mark::.).
- 
-    You can move point or the mark to adjust the boundaries of the
- region.  It doesn't matter which one is set first chronologically, or
- which one comes earlier in the text.  Once the mark has been set, it
- remains where you put it until you set it again at another place.  Each
- Emacs buffer has its own mark, so that when you return to a buffer that
- had been selected previously, it has the same mark it had before.
- 
-    Many commands that insert text, such as `C-y' (`yank') and `M-x
- insert-buffer', position point and the mark at opposite ends of the
- inserted text, so that the region contains the text just inserted.
- 
-    Aside from delimiting the region, the mark is also useful for
- remembering a spot that you may want to go back to.  To make this
- feature more useful, each buffer remembers 16 previous locations of the
- mark in the "mark ring".
- 
- * Menu:
- 
- * Setting Mark::	Commands to set the mark.
- * Transient Mark::	How to make Emacs highlight the region-
- 			  when there is one.
- * Using Region::	Summary of ways to operate on contents of the region.
- * Marking Objects::	Commands to put region around textual units.
- * Mark Ring::   	Previous mark positions saved so you can go back there.
- * Global Mark Ring::    Previous mark positions in various buffers.
- 
- 
- File: emacs,  Node: Setting Mark,  Next: Transient Mark,  Up: Mark
- 
- Setting the Mark
- ================
- 
-    Here are some commands for setting the mark:
- 
- `C-SPC'
-      Set the mark where point is (`set-mark-command').
- 
- `C-@'
-      The same.
- 
- `C-x C-x'
-      Interchange mark and point (`exchange-point-and-mark').
- 
- `Drag-Mouse-1'
-      Set point and the mark around the text you drag across.
- 
- `Mouse-3'
-      Set the mark where point is, then move point to where you click
-      (`mouse-save-then-kill').
- 
-    For example, suppose you wish to convert part of the buffer to all
- upper-case, using the `C-x C-u' (`upcase-region') command which
- operates on the text in the region.  You can first go to the beginning
- of the text to be capitalized, type `C-SPC' to put the mark there, move
- to the end, and then type `C-x C-u'.  Or, you can set the mark at the
- end of the text, move to the beginning, and then type `C-x C-u'.
- 
-    The most common way to set the mark is with the `C-SPC' command
- (`set-mark-command').  This sets the mark where point is.  Then you can
- move point away, leaving the mark behind.
- 
-    There are two ways to set the mark with the mouse.  You can drag
- mouse button one across a range of text; that puts point where you
- release the mouse button, and sets the mark at the other end of that
- range.  Or you can click mouse button three, which sets the mark at
- point (like `C-SPC') and them moves point (like `Mouse-1').  Both of
- these methods copy the region into the kill ring in addition to setting
- the mark; that gives behavior consistent with other window-driven
- applications, but if you don't want to modify the kill ring, you must
- use keyboard commands to set the mark.  *Note Mouse Commands::.
- 
-    Ordinary terminals have only one cursor, so there is no way for Emacs
- to show you where the mark is located.  You have to remember.  The usual
- solution to this problem is to set the mark and then use it soon, before
- you forget where it is.  Alternatively, you can see where the mark is
- with the command `C-x C-x' (`exchange-point-and-mark') which puts the
- mark where point was and point where the mark was.  The extent of the
- region is unchanged, but the cursor and point are now at the previous
- position of the mark.  In Transient Mark mode, this command reactivates
- the mark.
- 
-    `C-x C-x' is also useful when you are satisfied with the position of
- point but want to move the mark; do `C-x C-x' to put point at that end
- of the region, and then move it.  A second use of `C-x C-x', if
- necessary, puts the mark at the new position with point back at its
- original position.
- 
-    There is no such character as `C-SPC' in ASCII; when you type SPC
- while holding down CTRL, what you get on most ordinary terminals is the
- character `C-@'.  This key is actually bound to `set-mark-command'.
- But unless you are unlucky enough to have a terminal where typing
- `C-SPC' does not produce `C-@', you might as well think of this
- character as `C-SPC'.  Under X, `C-SPC' is actually a distinct
- character, but its binding is still `set-mark-command'.
- 
--- 0 ----
Index: emacs/info/emacs-4
diff -c emacs/info/emacs-4:1.1.1.2 emacs/info/emacs-4:removed
*** emacs/info/emacs-4:1.1.1.2	Mon Jul 22 01:52:29 1996
--- emacs/info/emacs-4	Fri Aug  2 20:14:33 1996
***************
*** 1,1138 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Transient Mark,  Next: Using Region,  Prev: Setting Mark,  Up: Mark
- 
- Transient Mark Mode
- ===================
- 
-    Emacs can highlight the current region, using X Windows.  But
- normally it does not.  Why not?
- 
-    Highlighting the region doesn't work well ordinarily in Emacs,
- because once you have set a mark, there is *always* a region (in that
- buffer).  And highlighting the region all the time would be a nuisance.
- 
-    You can turn on region highlighting by enabling Transient Mark mode.
- This is a more rigid mode of operation in which the region "lasts" only
- temporarily, so you must set up a region for each command that uses
- one.  In Transient Mark mode, most of the time there is no region;
- therefore, highlighting the region when it exists is convenient.
- 
-    To enable Transient Mark mode, type `M-x transient-mark-mode'.  This
- command toggles the mode, so you can repeat the command to turn off the
- mode.
- 
-    Here are the details of Transient Mark mode:
- 
-    * To set the mark, type `C-SPC' (`set-mark-command').  This makes
-      the mark active; as you move point, you will see the region
-      highlighting change in extent.
- 
-    * The mouse commands for specifying the mark also make it active.
-      So do keyboard commands whose purpose is to specify a region,
-      including `M-@', `C-M-@', `M-h', `C-M-h', `C-x C-p', and `C-x h'.
- 
-    * When the mark is active, you can execute commands that operate on
-      the region, such as killing, indentation, or writing to a file.
- 
-    * Any change to the buffer, such as inserting or deleting a
-      character, deactivates the mark.  This means any subsequent
-      command that operates on a region will get an error and refuse to
-      operate.  You can make the region active again by typing `C-x C-x'.
- 
-    * Commands like `M->' and `C-s' that "leave the mark behind" in
-      addition to some other primary purpose do not activate the new
-      mark.  You can activate the new region by executing `C-x C-x'
-      (`exchange-point-and-mark').
- 
-    * `C-s' when the mark is active does not alter the mark.
- 
-    * Quitting with `C-g' deactivates the mark.
- 
-    Transient Mark mode is also sometimes known as "Zmacs mode" because
- the Zmacs editor on the MIT Lisp Machine handled the mark in a similar
- way.
- 
-    When multiple windows show the same buffer, they can have different
- regions, because they can have different values of point (though they
- all share common one mark position).  In Transient Mark mode, each
- window highlights its own region.  The part that is highlighted in the
- selected window is the region that editing commands use.  *Note
- Windows::.
- 
-    When Transient Mark mode is not enabled, every command that sets the
- mark also activates it, and nothing ever deactivates it.
- 
- 
- File: emacs,  Node: Using Region,  Next: Marking Objects,  Prev: Transient Mark,  Up: Mark
- 
- Operating on the Region
- =======================
- 
-    Once you have a region and the mark is active, here are some of the
- ways you can operate on the region:
- 
-    * Kill it with `C-w' (*note Killing::.).
- 
-    * Save it in a register with `C-x r s' (*note Registers::.).
- 
-    * Save it in a buffer or a file (*note Accumulating Text::.).
- 
-    * Convert case with `C-x C-l' or `C-x C-u' (*note Case::.).
- 
-    * Indent it with `C-x TAB' or `C-M-\' (*note Indentation::.).
- 
-    * Fill it as text with `M-x fill-region' (*note Filling::.).
- 
-    * Print hardcopy with `M-x print-region' (*note Hardcopy::.).
- 
-    * Evaluate it as Lisp code with `M-x eval-region' (*note Lisp
-      Eval::.).
- 
-    Most commands that operate on the text in the region have the word
- `region' in their names.
- 
- 
- File: emacs,  Node: Marking Objects,  Next: Mark Ring,  Prev: Using Region,  Up: Mark
- 
- Commands to Mark Textual Objects
- ================================
- 
-    Here are the commands for placing point and the mark around a textual
- object such as a word, list, paragraph or page.
- 
- `M-@'
-      Set mark after end of next word (`mark-word').  This command and
-      the following one do not move point.
- 
- `C-M-@'
-      Set mark after end of next Lisp expression (`mark-sexp').
- 
- `M-h'
-      Put region around current paragraph (`mark-paragraph').
- 
- `C-M-h'
-      Put region around current Lisp defun (`mark-defun').
- 
- `C-x h'
-      Put region around entire buffer (`mark-whole-buffer').
- 
- `C-x C-p'
-      Put region around current page (`mark-page').
- 
-    `M-@' (`mark-word') puts the mark at the end of the next word, while
- `C-M-@' (`mark-sexp') puts it at the end of the next Lisp expression.
- These commands handle arguments just like `M-f' and `C-M-f'.
- 
-    Other commands set both point and mark, to delimit an object in the
- buffer.  For example, `M-h' (`mark-paragraph') moves point to the
- beginning of the paragraph that surrounds or follows point, and puts
- the mark at the end of that paragraph (*note Paragraphs::.).  It
- prepares the region so you can indent, case-convert, or kill a whole
- paragraph.
- 
-    `C-M-h' (`mark-defun') similarly puts point before and the mark
- after the current or following defun (*note Defuns::.).  `C-x C-p'
- (`mark-page') puts point before the current page, and mark at the end
- (*note Pages::.).  The mark goes after the terminating page delimiter
- (to include it), while point goes after the preceding page delimiter
- (to exclude it).  A numeric argument specifies a later page (if
- positive) or an earlier page (if negative) instead of the current page.
- 
-    Finally, `C-x h' (`mark-whole-buffer') sets up the entire buffer as
- the region, by putting point at the beginning and the mark at the end.
- 
-    In Transient Mark mode, all of these commands activate the mark.
- 
- 
- File: emacs,  Node: Mark Ring,  Next: Global Mark Ring,  Prev: Marking Objects,  Up: Mark
- 
- The Mark Ring
- =============
- 
-    Aside from delimiting the region, the mark is also useful for
- remembering a spot that you may want to go back to.  To make this
- feature more useful, each buffer remembers 16 previous locations of the
- mark, in the "mark ring".  Commands that set the mark also push the old
- mark onto this ring.  To return to a marked location, use `C-u C-SPC'
- (or `C-u C-@'); this is the command `set-mark-command' given a numeric
- argument.  It moves point to where the mark was, and restores the mark
- from the ring of former marks.  Thus, repeated use of this command
- moves point to all of the old marks on the ring, one by one.  The mark
- positions you move through in this way are not lost; they go to the end
- of the ring.
- 
-    Each buffer has its own mark ring.  All editing commands use the
- current buffer's mark ring.  In particular, `C-u C-SPC' always stays in
- the same buffer.
- 
-    Many commands that can move long distances, such as `M-<'
- (`beginning-of-buffer'), start by setting the mark and saving the old
- mark on the mark ring.  This is to make it easier for you to move back
- later.  Searches set the mark if they move point.  You can tell when a
- command sets the mark because it displays `Mark Set' in the echo area.
- 
-    If you want to move back to the same place over and over, the mark
- ring may not be convenient enough.  If so, you can record the position
- in a register for later retrieval (*note RegPos::.).
- 
-    The variable `mark-ring-max' specifies the maximum number of entries
- to keep in the mark ring.  If that many entries exist and another one
- is pushed, the last one in the list is discarded.  Repeating `C-u
- C-SPC' circulates through the positions currently in the ring.
- 
-    The variable `mark-ring' holds the mark ring itself, as a list of
- marker objects in the order most recent first.  This variable is local
- in every buffer.
- 
- 
- File: emacs,  Node: Global Mark Ring,  Prev: Mark Ring,  Up: Mark
- 
- The Global Mark Ring
- ====================
- 
-    In addition to the ordinary mark ring that belongs to each buffer,
- Emacs has a single "global mark ring".  It records a sequence of
- buffers in which you have recently set the mark, so you can go back to
- those buffers.
- 
-    Setting the mark always makes an entry on the current buffer's mark
- ring.  If you have switched buffers since the previous mark setting, the
- new mark position makes an entry on the global mark ring also.  The
- result is that the global mark ring records a sequence of buffers that
- you have been in, and, for each buffer, a place where you set the mark.
- 
-    The command `C-x C-SPC' (`pop-global-mark') jumps to the buffer and
- position of the latest entry in the global ring.  It also rotates the
- ring, so that successive uses of `C-x C-SPC' take you to earlier and
- earlier buffers.
- 
- 
- File: emacs,  Node: Killing,  Next: Yanking,  Prev: Mark,  Up: Top
- 
- Deletion and Killing
- ====================
- 
-    Most commands which erase text from the buffer save it in the kill
- ring so that you can move or copy it to other parts of the buffer.
- These commands are known as "kill" commands.  The rest of the commands
- that erase text do not save it in the kill ring; they are known as
- "delete" commands.  (This distinction is made only for erasure of text
- in the buffer.)  If you do a kill or delete command by mistake, you can
- use the `C-x u' (`undo') command to undo it (*note Undo::.).
- 
-    The delete commands include `C-d' (`delete-char') and DEL
- (`delete-backward-char'), which delete only one character at a time,
- and those commands that delete only spaces or newlines.  Commands that
- can destroy significant amounts of nontrivial data generally kill.  The
- commands' names and individual descriptions use the words `kill' and
- `delete' to say which they do.
- 
- * Menu:
- 
- * Deletion::            Commands for deleting small amounts of text and
-                           blank areas.
- * Killing by Lines::    How to kill entire lines of text at one time.
- * Other Kill Commands:: Commands to kill large regions of text and
-                           syntactic units such as words and sentences.
- 
- 
- File: emacs,  Node: Deletion,  Next: Killing by Lines,  Up: Killing
- 
- Deletion
- --------
- 
- `C-d'
-      Delete next character (`delete-char').
- 
- `DEL'
-      Delete previous character (`delete-backward-char').
- 
- `M-\'
-      Delete spaces and tabs around point (`delete-horizontal-space').
- 
- `M-SPC'
-      Delete spaces and tabs around point, leaving one space
-      (`just-one-space').
- 
- `C-x C-o'
-      Delete blank lines around the current line (`delete-blank-lines').
- 
- `M-^'
-      Join two lines by deleting the intervening newline, along with any
-      indentation following it (`delete-indentation').
- 
-    The most basic delete commands are `C-d' (`delete-char') and DEL
- (`delete-backward-char').  `C-d' deletes the character after point, the
- one the cursor is "on top of".  This doesn't move point.  DEL deletes
- the character before the cursor, and moves point back.  You can delete
- newlines like any other characters in the buffer; deleting a newline
- joins two lines.  Actually, `C-d' and DEL aren't always delete
- commands; when given arguments, they kill instead, since they can erase
- more than one character this way.
- 
-    The other delete commands are those which delete only whitespace
- characters: spaces, tabs and newlines.  `M-\'
- (`delete-horizontal-space') deletes all the spaces and tab characters
- before and after point.  `M-SPC' (`just-one-space') does likewise but
- leaves a single space after point, regardless of the number of spaces
- that existed previously (even zero).
- 
-    `C-x C-o' (`delete-blank-lines') deletes all blank lines after the
- current line.  If the current line is blank, it deletes all blank lines
- preceding the current line as well (leaving one blank line, the current
- line).
- 
-    `M-^' (`delete-indentation') joins the current line and the previous
- line, by deleting a newline and all surrounding spaces, usually leaving
- a single space.  *Note M-^: Indentation.
- 
- 
- File: emacs,  Node: Killing by Lines,  Next: Other Kill Commands,  Prev: Deletion,  Up: Killing
- 
- Killing by Lines
- ----------------
- 
- `C-k'
-      Kill rest of line or one or more lines (`kill-line').
- 
-    The simplest kill command is `C-k'.  If given at the beginning of a
- line, it kills all the text on the line, leaving it blank.  When used
- on a blank line, it kills the whole line including its newline.  To kill
- an entire non-blank line, go to the beginning and type `C-k' twice.
- 
-    More generally, `C-k' kills from point up to the end of the line,
- unless it is at the end of a line.  In that case it kills the newline
- following point, thus merging the next line into the current one.
- Spaces and tabs that you can't see at the end of the line are ignored
- when deciding which case applies, so if point appears to be at the end
- of the line, you can be sure `C-k' will kill the newline.
- 
-    When `C-k' is given a positive argument, it kills that many lines
- and the newlines that follow them (however, text on the current line
- before point is spared).  With a negative argument -N, it kills N lines
- preceding the current line (together with the text on the current line
- before point).  Thus, `C-u - 2 C-k' at the front of a line kills the
- two previous lines.
- 
-    `C-k' with an argument of zero kills the text before point on the
- current line.
- 
-    If the variable `kill-whole-line' is non-`nil', `C-k' at the very
- beginning of a line kills the entire line including the following
- newline.  This variable is normally `nil'.
- 
- 
- File: emacs,  Node: Other Kill Commands,  Prev: Killing by Lines,  Up: Killing
- 
- Other Kill Commands
- -------------------
- 
- `C-w'
-      Kill region (from point to the mark) (`kill-region').
- 
- `M-d'
-      Kill word (`kill-word').  *Note Words::.
- 
- `M-DEL'
-      Kill word backwards (`backward-kill-word').
- 
- `C-x DEL'
-      Kill back to beginning of sentence (`backward-kill-sentence').
-      *Note Sentences::.
- 
- `M-k'
-      Kill to end of sentence (`kill-sentence').
- 
- `C-M-k'
-      Kill sexp (`kill-sexp').  *Note Lists::.
- 
- `M-z CHAR'
-      Kill through the next occurrence of CHAR (`zap-to-char').
- 
-    A kill command which is very general is `C-w' (`kill-region'), which
- kills everything between point and the mark.  With this command, you
- can kill any contiguous sequence of characters, if you first set the
- region around them.
- 
-    A convenient way of killing is combined with searching: `M-z'
- (`zap-to-char') reads a character and kills from point up to (and
- including) the next occurrence of that character in the buffer.  A
- numeric argument acts as a repeat count.  A negative argument means to
- search backward and kill text before point.
- 
-    Other syntactic units can be killed: words, with `M-DEL' and `M-d'
- (*note Words::.); sexps, with `C-M-k' (*note Lists::.); and sentences,
- with `C-x DEL' and `M-k' (*note Sentences::.).
- 
-    You can use kill commands in read-only buffers.  They don't actually
- change the buffer, and they beep to warn you of that, but they do copy
- the text you tried to kill into the kill ring, so you can yank it into
- other buffers.  Most of the kill commands move point across the text
- they copy in this way, so that successive kill commands build up a
- single kill ring entry as usual.
- 
- 
- File: emacs,  Node: Yanking,  Next: Accumulating Text,  Prev: Killing,  Up: Top
- 
- Yanking
- =======
- 
-    "Yanking" means reinserting text previously killed.  This is what
- some systems call "pasting".  The usual way to move or copy text is to
- kill it and then yank it elsewhere one or more times.
- 
- `C-y'
-      Yank last killed text (`yank').
- 
- `M-y'
-      Replace text just yanked with an earlier batch of killed text
-      (`yank-pop').
- 
- `M-w'
-      Save region as last killed text without actually killing it
-      (`kill-ring-save').
- 
- `C-M-w'
-      Append next kill to last batch of killed text (`append-next-kill').
- 
- * Menu:
- 
- * Kill Ring::		Where killed text is stored.  Basic yanking.
- * Appending Kills::	Several kills in a row all yank together.
- * Earlier Kills::	Yanking something killed some time ago.
- 
- 
- File: emacs,  Node: Kill Ring,  Next: Appending Kills,  Up: Yanking
- 
- The Kill Ring
- -------------
- 
-    All killed text is recorded in the "kill ring", a list of blocks of
- text that have been killed.  There is only one kill ring, shared by all
- buffers, so you can kill text in one buffer and yank it in another
- buffer.  This is the usual way to move text from one file to another.
- (*Note Accumulating Text::, for some other ways.)
- 
-    The command `C-y' (`yank') reinserts the text of the most recent
- kill.  It leaves the cursor at the end of the text.  It sets the mark at
- the beginning of the text.  *Note Mark::.
- 
-    `C-u C-y' leaves the cursor in front of the text, and sets the mark
- after it.  This happens only if the argument is specified with just a
- `C-u', precisely.  Any other sort of argument, including `C-u' and
- digits, specifies an earlier kill to yank (*note Earlier Kills::.).
- 
-    To copy a block of text, you can use `M-w' (`kill-ring-save'), which
- copies the region into the kill ring without removing it from the
- buffer.  This is approximately equivalent to `C-w' followed by `C-x u',
- except that `M-w' does not alter the undo history and does not
- temporarily change the screen.
- 
- 
- File: emacs,  Node: Appending Kills,  Next: Earlier Kills,  Prev: Kill Ring,  Up: Yanking
- 
- Appending Kills
- ---------------
- 
-    Normally, each kill command pushes a new entry onto the kill ring.
- However, two or more kill commands in a row combine their text into a
- single entry, so that a single `C-y' yanks all the text as a unit, just
- as it was before it was killed.
- 
-    Thus, if you want to yank text as a unit, you need not kill all of it
- with one command; you can keep killing line after line, or word after
- word, until you have killed it all, and you can still get it all back at
- once.
- 
-    Commands that kill forward from point add onto the end of the
- previous killed text.  Commands that kill backward from point add text
- onto the beginning.  This way, any sequence of mixed forward and
- backward kill commands puts all the killed text into one entry without
- rearrangement.  Numeric arguments do not break the sequence of
- appending kills.  For example, suppose the buffer contains this text:
- 
-      This is a line -!-of sample text.
- 
- with point shown by -!-.  If you type `M-d M-DEL M-d M-DEL', killing
- alternately forward and backward, you end up with `a line of sample' as
- one entry in the kill ring, and `This is  text.' in the buffer.  (Note
- the double space, which you can clean up with `M-SPC' or `M-q'.)
- 
-    Another way to kill the same text is to move back two words with
- `M-b M-b', then kill all four words forward with `C-u M-d'.  This
- produces exactly the same results in the buffer and in the kill ring.
- `M-f M-f C-u M-DEL' kills the same text, all going backward; once
- again, the result is the same.  The text in the kill ring entry always
- has the same order that it had in the buffer before you killed it.
- 
-    If a kill command is separated from the last kill command by other
- commands (not just numeric arguments), it starts a new entry on the kill
- ring.  But you can force it to append by first typing the command
- `C-M-w' (`append-next-kill') right before it.  The `C-M-w' tells the
- following command, if it is a kill command, to append the text it kills
- to the last killed text, instead of starting a new entry.  With
- `C-M-w', you can kill several separated pieces of text and accumulate
- them to be yanked back in one place.
- 
-    A kill command following `M-w' does not append to the text that
- `M-w' copied into the kill ring.
- 
- 
- File: emacs,  Node: Earlier Kills,  Prev: Appending Kills,  Up: Yanking
- 
- Yanking Earlier Kills
- ---------------------
- 
-    To recover killed text that is no longer the most recent kill, use
- the `M-y' command (`yank-pop').  It takes the text previously yanked
- and replaces it with the text from an earlier kill.  So, to recover the
- text of the next-to-the-last kill, first use `C-y' to yank the last
- kill, and then use `M-y' to replace it with the previous kill.  `M-y'
- is allowed only after a `C-y' or another `M-y'.
- 
-    You can understand `M-y' in terms of a "last yank" pointer which
- points at an entry in the kill ring.  Each time you kill, the "last
- yank" pointer moves to the newly made entry at the front of the ring.
- `C-y' yanks the entry which the "last yank" pointer points to.  `M-y'
- moves the "last yank" pointer to a different entry, and the text in the
- buffer changes to match.  Enough `M-y' commands can move the pointer to
- any entry in the ring, so you can get any entry into the buffer.
- Eventually the pointer reaches the end of the ring; the next `M-y'
- moves it to the first entry again.
- 
-    `M-y' moves the "last yank" pointer around the ring, but it does not
- change the order of the entries in the ring, which always runs from the
- most recent kill at the front to the oldest one still remembered.
- 
-    `M-y' can take a numeric argument, which tells it how many entries
- to advance the "last yank" pointer by.  A negative argument moves the
- pointer toward the front of the ring; from the front of the ring, it
- moves "around" to the last entry and continues forward from there.
- 
-    Once the text you are looking for is brought into the buffer, you can
- stop doing `M-y' commands and it will stay there.  It's just a copy of
- the kill ring entry, so editing it in the buffer does not change what's
- in the ring.  As long as no new killing is done, the "last yank"
- pointer remains at the same place in the kill ring, so repeating `C-y'
- will yank another copy of the same previous kill.
- 
-    If you know how many `M-y' commands it would take to find the text
- you want, you can yank that text in one step using `C-y' with a numeric
- argument.  `C-y' with an argument restores the text the specified
- number of entries back in the kill ring.  Thus, `C-u 2 C-y' gets the
- next to the last block of killed text.  It is equivalent to `C-y M-y'.
- `C-y' with a numeric argument starts counting from the "last yank"
- pointer, and sets the "last yank" pointer to the entry that it yanks.
- 
-    The length of the kill ring is controlled by the variable
- `kill-ring-max'; no more than that many blocks of killed text are saved.
- 
-    The actual contents of the kill ring are stored in a variable named
- `kill-ring'; you can view the entire contents of the kill ring with the
- command `C-h v kill-ring'.
- 
- 
- File: emacs,  Node: Accumulating Text,  Next: Rectangles,  Prev: Yanking,  Up: Top
- 
- Accumulating Text
- =================
- 
-    Usually we copy or move text by killing it and yanking it, but there
- are other methods convenient for copying one block of text in many
- places, or for copying many scattered blocks of text into one place.  To
- copy one block to many places, store it in a register (*note
- Registers::.).  Here we describe the commands to accumulate scattered
- pieces of text into a buffer or into a file.
- 
- `M-x append-to-buffer'
-      Append region to contents of specified buffer.
- 
- `M-x prepend-to-buffer'
-      Prepend region to contents of specified buffer.
- 
- `M-x copy-to-buffer'
-      Copy region into specified buffer, deleting that buffer's old
-      contents.
- 
- `M-x insert-buffer'
-      Insert contents of specified buffer into current buffer at point.
- 
- `M-x append-to-file'
-      Append region to contents of specified file, at the end.
- 
-    To accumulate text into a buffer, use `M-x append-to-buffer'.  This
- reads a buffer name, them inserts a copy of the region into the buffer
- specified.  If you specify a nonexistent buffer, `append-to-buffer'
- creates the buffer.  The text is inserted wherever point is in that
- buffer.  If you have been using the buffer for editing, the copied text
- goes into the middle of the text of the buffer, wherever point happens
- to be in it.
- 
-    Point in that buffer is left at the end of the copied text, so
- successive uses of `append-to-buffer' accumulate the text in the
- specified buffer in the same order as they were copied.  Strictly
- speaking, `append-to-buffer' does not always append to the text already
- in the buffer--only if point in that buffer is at the end.  However, if
- `append-to-buffer' is the only command you use to alter a buffer, then
- point is always at the end.
- 
-    `M-x prepend-to-buffer' is just like `append-to-buffer' except that
- point in the other buffer is left before the copied text, so successive
- prependings add text in reverse order.  `M-x copy-to-buffer' is similar
- except that any existing text in the other buffer is deleted, so the
- buffer is left containing just the text newly copied into it.
- 
-    To retrieve the accumulated text from another buffer, use `M-x
- insert-buffer'; this too takes BUFFERNAME as an argument.  It inserts a
- copy of the text in buffer BUFFERNAME into the selected buffer.  You
- can alternatively select the other buffer for editing, then optionally
- move text from it by killing.  *Note Buffers::, for background
- information on buffers.
- 
-    Instead of accumulating text within Emacs, in a buffer, you can
- append text directly into a file with `M-x append-to-file', which takes
- FILENAME as an argument.  It adds the text of the region to the end of
- the specified file.  The file is changed immediately on disk.
- 
-    You should use `append-to-file' only with files that are *not* being
- visited in Emacs.  Using it on a file that you are editing in Emacs
- would change the file behind Emacs's back, which can lead to losing
- some of your editing.
- 
- 
- File: emacs,  Node: Rectangles,  Next: Registers,  Prev: Accumulating Text,  Up: Top
- 
- Rectangles
- ==========
- 
-    The rectangle commands operate on rectangular areas of the text: all
- the characters between a certain pair of columns, in a certain range of
- lines. Commands are provided to kill rectangles, yank killed rectangles,
- clear them out, fill them with blanks or text, or delete them. Rectangle
- commands are useful with text in multicolumn formats, and for changing
- text into or out of such formats.
- 
-    When you must specify a rectangle for a command to work on, you do it
- by putting the mark at one corner and point at the opposite corner.  The
- rectangle thus specified is called the "region-rectangle" because you
- control it in about the same way the region is controlled.  But
- remember that a given combination of point and mark values can be
- interpreted either as a region or as a rectangle, depending on the
- command that uses them.
- 
-    If point and the mark are in the same column, the rectangle they
- delimit is empty.  If they are in the same line, the rectangle is one
- line high.  This asymmetry between lines and columns comes about
- because point (and likewise the mark) is between two columns, but within
- a line.
- 
- `C-x r k'
-      Kill the text of the region-rectangle, saving its contents as the
-      "last killed rectangle" (`kill-rectangle').
- 
- `C-x r d'
-      Delete the text of the region-rectangle (`delete-rectangle').
- 
- `C-x r y'
-      Yank the last killed rectangle with its upper left corner at point
-      (`yank-rectangle').
- 
- `C-x r o'
-      Insert blank space to fill the space of the region-rectangle
-      (`open-rectangle').  This pushes the previous contents of the
-      region-rectangle rightward.
- 
- `M-x clear-rectangle'
-      Clear the region-rectangle by replacing its contents with spaces.
- 
- `M-x string-rectangle RET STRING RET'
-      Insert STRING on each line of the region-rectangle.
- 
-    The rectangle operations fall into two classes: commands deleting and
- inserting rectangles, and commands for blank rectangles.
- 
-    There are two ways to get rid of the text in a rectangle: you can
- discard the text (delete it) or save it as the "last killed" rectangle.
- The commands for these two ways are `C-x r d' (`delete-rectangle') and
- `C-x r k' (`kill-rectangle').  In either case, the portion of each line
- that falls inside the rectangle's boundaries is deleted, causing
- following text (if any) on the line to move left into the gap.
- 
-    Note that "killing" a rectangle is not killing in the usual sense;
- the rectangle is not stored in the kill ring, but in a special place
- that can only record the most recent rectangle killed.  This is because
- yanking a rectangle is so different from yanking linear text that
- different yank commands have to be used and yank-popping is hard to
- make sense of.
- 
-    To yank the last killed rectangle, type `C-x r y'
- (`yank-rectangle').  Yanking a rectangle is the opposite of killing
- one.  Point specifies where to put the rectangle's upper left corner.
- The rectangle's first line is inserted there, the rectangle's second
- line is inserted at a position one line vertically down, and so on.  The
- number of lines affected is determined by the height of the saved
- rectangle.
- 
-    You can convert single-column lists into double-column lists using
- rectangle killing and yanking; kill the second half of the list as a
- rectangle and then yank it beside the first line of the list.  *Note
- Two-Column::, for another way to edit multi-column text.
- 
-    You can also copy rectangles into and out of registers with `C-x r r
- R' and `C-x r i R'.  *Note Rectangle Registers: RegRect.
- 
-    There are two commands for making with blank rectangles: `M-x
- clear-rectangle' to blank out existing text, and `C-x r o'
- (`open-rectangle') to insert a blank rectangle.  Clearing a rectangle
- is equivalent to deleting it and then inserting a blank rectangle of
- the same size.
- 
-    The command `M-x string-rectangle' is similar to `C-x r o', but it
- inserts a specified string instead of blanks.  You specify the string
- with the minibuffer.  Since the length of the string specifies how many
- columns to insert, the width of the region-rectangle does not matter
- for this command.  What does matter is the position of the left edge
- (which specifies the column position for the insertion in each line)
- and the range of lines that the rectangle occupies.  The previous
- contents of the text beyond the insertion column are pushed rightward.
- 
- 
- File: emacs,  Node: Registers,  Next: Display,  Prev: Rectangles,  Up: Top
- 
- Registers
- *********
- 
-    Emacs "registers" are places you can save text or positions for
- later use.  Once you save text or a rectangle in a register, you can
- copy it into the buffer once or many times; you can move point to a
- position saved in a register once or many times.
- 
-    Each register has a name which is a single character.  A register can
- store a piece of text, a rectangle, a position, a window configuration,
- or a file name, but only one thing at any given time.  Whatever you
- store in a register remains there until you store something else in that
- register.  To see what a register R contains, use `M-x view-register'.
- 
- `M-x view-register RET R'
-      Display a description of what register R contains.
- 
- * Menu:
- 
- * Position: RegPos.           Saving positions in registers.
- * Text: RegText.              Saving text in registers.
- * Rectangle: RegRect.         Saving rectangles in registers.
- * Configurations: RegConfig.  Saving window configurations in registers.
- * Files: RegFiles.            File names in registers.
- * Bookmarks::                 Bookmarks are like registers, but persistent.
- 
- 
- File: emacs,  Node: RegPos,  Next: RegText,  Up: Registers
- 
- Saving Positions in Registers
- =============================
- 
-    Saving a position records a place in a buffer so that you can move
- back there later.  Moving to a saved position switches to that buffer
- and moves point to that place in it.
- 
- `C-x r SPC R'
-      Save position of point in register R (`point-to-register').
- 
- `C-x r j R'
-      Jump to the position saved in register R (`jump-to-register').
- 
-    To save the current position of point in a register, choose a name R
- and type `C-x r SPC R'.  The register R retains the position thus saved
- until you store something else in that register.
- 
-    The command `C-x r j R' moves point to the position recorded in
- register R.  The register is not affected; it continues to record the
- same position.  You can jump to the saved position any number of times.
- 
- 
- File: emacs,  Node: RegText,  Next: RegRect,  Prev: RegPos,  Up: Registers
- 
- Saving Text in Registers
- ========================
- 
-    When you want to insert a copy of the same piece of text several
- times, it may be inconvenient to yank it from the kill ring, since each
- subsequent kill moves that entry further down the ring.  An alternative
- is to store the text in a register and later retrieve it.
- 
- `C-x r s R'
-      Copy region into register R (`copy-to-register').
- 
- `C-x r i R'
-      Insert text from register R (`insert-register').
- 
-    `C-x r s R' stores a copy of the text of the region into the
- register named R.  Given a numeric argument, `C-x r s R' deletes the
- text from the buffer as well.
- 
-    `C-x r i R' inserts in the buffer the text from register R.
- Normally it leaves point before the text and places the mark after, but
- with a numeric argument (`C-u') it puts point after the text and the
- mark before.
- 
- 
- File: emacs,  Node: RegRect,  Next: RegConfig,  Prev: RegText,  Up: Registers
- 
- Saving Rectangles in Registers
- ==============================
- 
-    A register can contain a rectangle instead of linear text.  The
- rectangle is represented as a list of strings.  *Note Rectangles::, for
- basic information on how to specify a rectangle in the buffer.
- 
- `C-x r r R'
-      Copy the region-rectangle into register R
-      (`copy-region-to-rectangle').  With numeric argument, delete it as
-      well.
- 
- `C-x r i R'
-      Insert the rectangle stored in register R (if it contains a
-      rectangle) (`insert-register').
- 
-    The `C-x r i R' command inserts a text string if the register
- contains one, and inserts a rectangle if the register contains one.
- 
-    See also the command `sort-columns', which you can think of as
- sorting a rectangle.  *Note Sorting::.
- 
- 
- File: emacs,  Node: RegConfig,  Next: RegFiles,  Prev: RegRect,  Up: Registers
- 
- Saving Window Configurations in Registers
- =========================================
- 
-    You can save the window configuration of the selected frame in a
- register, or even the configuration of all windows in all frames, and
- restore the configuration later.
- 
- `C-x r w R'
-      Save the state of the selected frame's windows in register R
-      (`window-configuration-to-register').
- 
- `C-x r f R'
-      Save the state of all frames, including all their windows, in
-      register R (`frame-configuration-to-register').
- 
-    Use `C-x r j R' to restore a window or frame configuration.  This is
- the same command used to restore a cursor position.  When you restore a
- frame configuration, any existing frames not included in the
- configuration become invisible.  If you wish to delete these frames
- instead, use `C-u C-x r j R'.
- 
- 
- File: emacs,  Node: RegFiles,  Next: Bookmarks,  Prev: RegConfig,  Up: Registers
- 
- Keeping File Names in Registers
- ===============================
- 
-    If you visit certain file names frequently, you can visit them more
- conveniently if you put their names in registers.  Here's the Lisp code
- used to put a file name in a register:
- 
-      (set-register ?R '(file . NAME))
- 
- For example,
- 
-      (set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))
- 
- puts the file name shown in register `z'.
- 
-    To visit the file whose name is in register R, type `C-x r j R'.
- (This is the same command used to jump to a position or restore a frame
- configuration.)
- 
- 
- File: emacs,  Node: Bookmarks,  Prev: RegFiles,  Up: Registers
- 
- Bookmarks
- =========
- 
-    "Bookmarks" are somewhat like registers in that they record
- positions you can jump to.  Unlike registers, they have long names, and
- they persist automatically from one Emacs session to the next.  The
- prototypical use of bookmarks is to record "where you were reading" in
- various files.
- 
- `C-x r m RET'
-      Set the bookmark for the visited file, at point.
- 
- `C-x r m BOOKMARK RET'
-      Set the bookmark named BOOKMARK at point (`bookmark-set').
- 
- `C-x r b BOOKMARK RET'
-      Jump to the bookmark named BOOKMARK (`bookmark-jump').
- 
- `C-x r l'
-      List all bookmarks (`list-bookmarks').
- 
- `M-x bookmark-save'
-      Save all the current bookmark values in the default bookmark file.
- 
-    The prototypical use for bookmarks is to record one current position
- in each of several files.  So the command `C-x r m', which sets a
- bookmark, uses the visited file name as the default for the bookmark
- name.  If you name each bookmark after the file it points to, then you
- can conveniently revisit any of those files with `C-x r b', and move to
- the position of the bookmark at the same time.
- 
-    To display a list of all your bookmarks in a separate buffer, type
- `C-x r l' (`list-bookmarks').  If you switch to that buffer, you can
- use it to edit your bookmark definitions or annotate the bookmarks.
- Type `C-h m' in that buffer for more information about its special
- editing commands.
- 
-    When you kill Emacs, Emacs offers to save your bookmark values in
- your default bookmark file, `~/.emacs.bmk', if you have changed any
- bookmark values.  You can also save the bookmarks at any time with the
- `M-x bookmark-save' command.  The bookmark commands load your default
- bookmark file automatically.  This saving and loading is how bookmarks
- persist from one Emacs session to the next.
- 
-    If you set the variable `bookmark-save-flag' to 1, then each command
- that sets a bookmark will also save your bookmarks; this way, you don't
- lose any bookmark values even if Emacs crashes.  (The value, if a
- number, says how many bookmark modifications should go by between
- saving.)
- 
-    Bookmark position values are saved with surrounding context, so that
- `bookmark-jump' can find the proper position even if the file is
- modified slightly.  The variable `bookmark-search-size' says how many
- characters of context to record, on each side of the bookmark's
- position.
- 
-    Here are some additional commands for working with bookmarks:
- 
- `M-x bookmark-load RET FILENAME RET'
-      Load a file named FILENAME that contains a list of bookmark
-      values.  You can use this command, as well as `bookmark-write', to
-      work with other files of bookmark values in addition to your
-      default bookmark file.
- 
- `M-x bookmark-write RET FILENAME RET'
-      Save all the current bookmark values in the file FILENAME.
- 
- `M-x bookmark-delete RET BOOKMARK RET'
-      Delete the bookmark named BOOKMARK.
- 
- `M-x bookmark-locate RET BOOKMARK RET'
-      Insert in the buffer the name of the file that bookmark BOOKMARK
-      points to.
- 
- `M-x bookmark-insert RET BOOKMARK RET'
-      Insert in the buffer the *contents* of the file that bookmark
-      BOOKMARK points to.
- 
- 
- File: emacs,  Node: Display,  Next: Search,  Prev: Registers,  Up: Top
- 
- Controlling the Display
- ***********************
- 
-    Since only part of a large buffer fits in the window, Emacs tries to
- show the part that is likely to be interesting.  The display control
- commands allow you to specify which part of the text you want to see.
- 
- `C-l'
-      Clear screen and redisplay, scrolling the selected window to center
-      point vertically within it (`recenter').
- 
- `C-v'
-      Scroll forward (a windowful or a specified number of lines)
-      (`scroll-up').
- 
- `NEXT'
-      Likewise, scroll forward.
- 
- `M-v'
-      Scroll backward (`scroll-down').
- 
- `PRIOR'
-      Likewise, scroll backward.
- 
- `ARG C-l'
-      Scroll so point is on screen line ARG (`recenter').
- 
- `C-x <'
-      Scroll text in current window to the left (`scroll-left').
- 
- `C-x >'
-      Scroll to the right (`scroll-right').
- 
- `C-x $'
-      Make deeply indented lines invisible (`set-selective-display').
- 
-    The names of all scroll commands are based on the direction that the
- text moves in the window.  Thus, the command to scrolling forward is
- called `scroll-up', since the text moves up.
- 
- * Menu:
- 
- * Scrolling::	           Moving text up and down in a window.
- * Horizontal Scrolling::   Moving text left and right in a window.
- * Selective Display::      Hiding lines with lots of indentation.
- * European Display::	   Displaying (and entering) European characters.
- * Optional Mode Line::     Optional mode line display features.
- * Display Vars::           Information on variables for customizing display.
- 
- 
- File: emacs,  Node: Scrolling,  Next: Horizontal Scrolling,  Up: Display
- 
- Scrolling
- =========
- 
-    If a buffer contains text that is too large to fit entirely within a
- window that is displaying the buffer, Emacs shows a contiguous portion
- of the text.  The portion shown always contains point.
- 
-    "Scrolling" means moving text up or down in the window so that
- different parts of the text are visible.  Scrolling forward means that
- text moves up, and new text appears at the bottom.  Scrolling backward
- moves text down and new text appears at the top.
- 
-    Scrolling happens automatically if you move point past the bottom or
- top of the window.  You can also explicitly request scrolling with the
- commands in this section.
- 
- `C-l'
-      Clear screen and redisplay, scrolling the selected window to center
-      point vertically within it (`recenter').
- 
- `C-v'
-      Scroll forward (a windowful or a specified number of lines)
-      (`scroll-up').
- 
- `NEXT'
-      Likewise, scroll forward.
- 
- `M-v'
-      Scroll backward (`scroll-down').
- 
- `PRIOR'
-      Likewise, scroll backward.
- 
- `ARG C-l'
-      Scroll so point is on line ARG (`recenter').
- 
- `C-M-l'
-      Scroll heuristically to bring useful information onto the screen
-      (`reposition-window').
- 
-    The most basic scrolling command is `C-l' (`recenter') with no
- argument.  It clears the entire screen and redisplays all windows.  In
- addition, it scrolls the selected window so that point is halfway down
- from the top of the window.
- 
-    The scrolling commands `C-v' and `M-v' let you move all the text in
- the window up or down a few lines.  `C-v' (`scroll-up') with an
- argument shows you that many more lines at the bottom of the window,
- moving the text and point up together as `C-l' might.  `C-v' with a
- negative argument shows you more lines at the top of the window.  `M-v'
- (`scroll-down') is like `C-v', but moves in the opposite direction.
- The function keys NEXT and PRIOR are equivalent to `C-v' and `M-v'.
- 
-    To read the buffer a windowful at a time, use `C-v' with no argument.
- It takes the last two lines at the bottom of the window and puts them at
- the top, followed by nearly a whole windowful of lines not previously
- visible.  If point was in the text scrolled off the top, it moves to the
- new top of the window.  `M-v' with no argument moves backward with
- overlap similarly.  The number of lines of overlap across a `C-v' or
- `M-v' is controlled by the variable `next-screen-context-lines'; by
- default, it is two.
- 
-    Another way to do scrolling is with `C-l' with a numeric argument.
- `C-l' does not clear the screen when given an argument; it only scrolls
- the selected window.  With a positive argument N, it repositions text
- to put point N lines down from the top.  An argument of zero puts point
- on the very top line.  Point does not move with respect to the text;
- rather, the text and point move rigidly on the screen.  `C-l' with a
- negative argument puts point that many lines from the bottom of the
- window.  For example, `C-u - 1 C-l' puts point on the bottom line, and
- `C-u - 5 C-l' puts it five lines from the bottom.  Just `C-u' as
- argument, as in `C-u C-l', scrolls point to the center of the screen.
- 
-    The `C-M-l' command (`reposition-window') scrolls the current window
- heuristically in a way designed to get useful information onto the
- screen.  For example, in a Lisp file, this command tries to get the
- entire current defun onto the screen if possible.
- 
-    Scrolling happens automatically if point has moved out of the visible
- portion of the text when it is time to display.  Usually the scrolling
- is done so as to put point vertically centered within the window.
- However, if the variable `scroll-step' has a nonzero value, an attempt
- is made to scroll the buffer by that many lines; if that is enough to
- bring point back into visibility, that is what is done.
- 
- 
- File: emacs,  Node: Horizontal Scrolling,  Next: Selective Display,  Prev: Scrolling,  Up: Display
- 
- Horizontal Scrolling
- ====================
- 
- `C-x <'
-      Scroll text in current window to the left (`scroll-left').
- 
- `C-x >'
-      Scroll to the right (`scroll-right').
- 
-    The text in a window can also be scrolled horizontally.  This means
- that each line of text is shifted sideways in the window, and one or
- more characters at the beginning of each line are not displayed at all.
- When a window has been scrolled horizontally in this way, text lines
- are truncated rather than continued (*note Continuation Lines::.), with
- a `$' appearing in the first column when there is text truncated to the
- left, and in the last column when there is text truncated to the right.
- 
-    The command `C-x <' (`scroll-left') scrolls the selected window to
- the left by N columns with argument N.  This moves part of the
- beginning of each line off the left edge of the window.  With no
- argument, it scrolls by almost the full width of the window (two
- columns less, to be precise).
- 
-    `C-x >' (`scroll-right') scrolls similarly to the right.  The window
- cannot be scrolled any farther to the right once it is displayed
- normally (with each line starting at the window's left margin);
- attempting to do so has no effect.  This means that you don't have to
- calculate the argument precisely for `C-x >'; any sufficiently large
- argument will restore normally display.
- 
- 
- File: emacs,  Node: Selective Display,  Next: European Display,  Prev: Horizontal Scrolling,  Up: Display
- 
- Selective Display
- =================
- 
-    Emacs has the ability to hide lines indented more than a certain
- number of columns (you specify how many columns).  You can use this to
- get an overview of a part of a program.
- 
-    To hide lines, type `C-x $' (`set-selective-display') with a numeric
- argument N.  Then lines with at least N columns of indentation
- disappear from the screen.  The only indication of their presence is
- that three dots (`...') appear at the end of each visible line that is
- followed by one or more invisible ones.
- 
-    The commands `C-n' and `C-p' move across the invisible lines as if
- they were not there.
- 
-    The invisible lines are still present in the buffer, and most editing
- commands see them as usual, so you may find point in the middle of
- invisible text.  When this happens, the cursor appears at the end of the
- previous line, after the three dots.  If point is at the end of the
- visible line, before the newline that ends it, the cursor appears before
- the three dots.
- 
-    To make all lines visible again, type `C-x $' with no argument.
- 
-    If you set the variable `selective-display-ellipses' to `nil', the
- three dots do not appear at the end of a line that precedes invisible
- lines.  Then there is no visible indication of the invisible lines.
- This variable becomes local automatically when set.
- 
--- 0 ----
Index: emacs/info/emacs-5
diff -c emacs/info/emacs-5:1.1.1.2 emacs/info/emacs-5:removed
*** emacs/info/emacs-5:1.1.1.2	Mon Jul 22 01:52:31 1996
--- emacs/info/emacs-5	Fri Aug  2 20:15:10 1996
***************
*** 1,1114 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: European Display,  Next: Optional Mode Line,  Prev: Selective Display,  Up: Display
- 
- European Character Set Display
- ==============================
- 
-    Some European languages use accented letters and other special
- symbols.  The ISO 8859 Latin-1 character set defines character codes for
- many European languages in the range 160 to 255.
- 
-    Emacs can display those characters according to Latin-1, provided the
- terminal or font in use supports them.  The `M-x
- standard-display-european' command toggles European character display
- mode.  With a numeric argument, `M-x standard-display-european' enables
- European character display if and only if the argument is positive.
- Load the library `iso-syntax' to specify the correct syntactic
- properties and case conversion table for the Latin-1 character set.
- 
-    Some operating systems let you specify the language you are using by
- setting a locale.  Emacs handles one common special case of this: if
- your locale name for character types contains the string `8859-1' or
- `88591', Emacs automatically enables European character display mode
- and its syntax.
- 
-    There are three different ways you can enter Latin-1 characters:
- 
-    * If your keyboard can generate character codes 128 and up,
-      representing ISO Latin-1 characters, execute the following
-      expression to enable Emacs to understand them:
- 
-           (set-input-mode (car (current-input-mode))
-                           (nth 1 (current-input-mode))
-                           0)
- 
-    * You can load the library `iso-transl' to turn the key `C-x 8' into
-      a "compose character" prefix for entry of the extra ISO Latin-1
-      printing characters.  `C-x 8' is good for insertion (in the
-      minibuffer as well as other buffers), for searching, and in any
-      other context where a key sequence is allowed.  The ALT modifier
-      key, if you have one, serves the same purpose as `C-x 8'; use ALT
-      together with an accent character to modify the following letter.
- 
-    * You can use ISO Accents mode.  This minor mode is convenient if you
-      enter non-ASCII ISO Latin-1 characters often.  When this minor
-      mode is enabled, the characters ``', `'', `"', `^', `/' and `~'
-      modify the following letter by adding the corresponding
-      diacritical mark to it, if possible.  To enable or disable ISO
-      Accents mode, use the command `M-x iso-accents-mode'.  This
-      command affects only the current buffer.
- 
-      To enter one of those six special characters while in ISO Accents
-      mode, type the character, followed by a space.  Some of those
-      characters have a corresponding "dead key" accent character in the
-      ISO Latin-1 character set; to enter that character, type the
-      corresponding ASCII character twice.  For example, `''' enters the
-      Latin-1 character acute-accent (character code 0264).
- 
-      ISO Accents mode input is available whenever a key sequence is
-      expected: for ordinary insertion, for searching, for the
-      minibuffer, and for certain command arguments.
- 
-      In addition to the accented letters, you can use these special
-      sequences in ISO Accents mode to enter certain other ISO Latin-1
-      characters:
- 
-     `/A'
-           `A' with ring.
- 
-     `~C'
-           `C' with cedilla.
- 
-     `~D'
-           `D' with stroke.
- 
-     `/E'
-           `AE' ligature.
- 
-     `/a'
-           `a' with ring.
- 
-     `~c'
-           `c' with cedilla.
- 
-     `~d'
-           `d' with stroke.
- 
-     `/e'
-           `ae' ligature.
- 
-     `"s'
-           German sharp `s'.
- 
-     `~<'
-           Left guillemet.
- 
-     `~>'
-           Right guillemet.
- 
-     `~!'
-           Inverted exclamation mark.
- 
-     `~?'
-           Inverted question mark.
- 
- 
- File: emacs,  Node: Optional Mode Line,  Next: Display Vars,  Prev: European Display,  Up: Display
- 
- Optional Mode Line Features
- ===========================
- 
-    To add the current line number of point to the mode line, enable Line
- Number mode with the command `M-x line-number-mode'.  The line number
- appears before the buffer percentage POS, with the letter `L' to
- indicate what it is.  *Note Minor Modes::, for more information about
- minor modes and about how to use this command.
- 
-    If the buffer is very large (larger than the value of
- `line-number-display-limit'), then the line number doesn't appear.
- Emacs doesn't compute the line number when the buffer is large, because
- that would be too slow.  If you have narrowed the buffer (*note
- Narrowing::.), the displayed line number is relative to the accessible
- portion of the buffer.
- 
-    Emacs can optionally display the time and system load in all mode
- lines.  To enable this feature, type `M-x display-time'.  The
- information added to the mode line usually appears after the buffer
- name, before the mode names and their parentheses.  It looks like this:
- 
-      HH:MMpm L.LL
- 
- Here HH and MM are the hour and minute, followed always by `am' or
- `pm'.  L.LL is the average number of running processes in the whole
- system recently.  (Some fields may be missing if your operating system
- cannot support them.)
- 
-    The word `Mail' appears after the load level if there is mail for
- you that you have not read yet.
- 
- 
- File: emacs,  Node: Display Vars,  Prev: Optional Mode Line,  Up: Display
- 
- Variables Controlling Display
- =============================
- 
-    This section contains information for customization only.  Beginning
- users should skip it.
- 
-    The variable `mode-line-inverse-video' controls whether the mode
- line is displayed in inverse video (assuming the terminal supports it);
- `nil' means don't do so.  *Note Mode Line::.  If you specify the
- foreground color for the `modeline' face, and `mode-line-inverse-video'
- is non-`nil', then the default background color for that face is the
- usual foreground color.  *Note Faces::.
- 
-    If the variable `inverse-video' is non-`nil', Emacs attempts to
- invert all the lines of the display from what they normally are.
- 
-    If the variable `visible-bell' is non-`nil', Emacs attempts to make
- the whole screen blink when it would normally make an audible bell
- sound.  This variable has no effect if your terminal does not have a way
- to make the screen blink.
- 
-    When you reenter Emacs after suspending, Emacs normally clears the
- screen and redraws the entire display.  On some terminals with more than
- one page of memory, it is possible to arrange the termcap entry so that
- the `ti' and `te' strings (output to the terminal when Emacs is entered
- and exited, respectively) switch between pages of memory so as to use
- one page for Emacs and another page for other output.  Then you might
- want to set the variable `no-redraw-on-reenter' non-`nil'; this tells
- Emacs to assume, when resumed, that the screen page it is using still
- contains what Emacs last wrote there.
- 
-    The variable `echo-keystrokes' controls the echoing of
- multi-character keys; its value is the number of seconds of pause
- required to cause echoing to start, or zero meaning don't echo at all.
- *Note Echo Area::.
- 
-    If the variable `ctl-arrow' is `nil', control characters in the
- buffer are displayed with octal escape sequences, all except newline
- and tab.  Altering the value of `ctl-arrow' makes it local to the
- current buffer; until that time, the default value is in effect.  The
- default is initially `t'.  *Note Display Tables: (elisp)Display Tables.
- 
-    Normally, a tab character in the buffer is displayed as whitespace
- which extends to the next display tab stop position, and display tab
- stops come at intervals equal to eight spaces.  The number of spaces
- per tab is controlled by the variable `tab-width', which is made local
- by changing it, just like `ctl-arrow'.  Note that how the tab character
- in the buffer is displayed has nothing to do with the definition of TAB
- as a command.  The variable `tab-width' must have an integer value
- between 1 and 1000, inclusive.
- 
-    If the variable `truncate-lines' is non-`nil', then each line of
- text gets just one screen line for display; if the text line is too
- long, display shows only the part that fits.  If `truncate-lines' is
- `nil', then long text lines display as more than one screen line,
- enough to show the whole text of the line.  *Note Continuation Lines::.
- Altering the value of `truncate-lines' makes it local to the current
- buffer; until that time, the default value is in effect.  The default
- is initially `nil'.
- 
-    If the variable `truncate-partial-width-windows' is non-`nil', it
- forces truncation rather than continuation in any window less than the
- full width of the screen or frame, regardless of the value of
- `truncate-lines'.  For information about side-by-side windows, see
- *Note Split Window::.  See also *Note Display: (elisp)Display.
- 
-    The variable `baud-rate' holds the the output speed of the terminal,
- as far as Emacs knows.  Setting this variable does not change the speed
- of actual data transmission, but the value is used for calculations
- such as padding.  It also affects decisions about whether to scroll
- part of the screen or redraw it instead--even when using a window
- system.  (We designed it this way, despite the fact that a window
- system has no true "output speed", to give you a way to tune these
- decisions.)
- 
- 
- File: emacs,  Node: Search,  Next: Fixit,  Prev: Display,  Up: Top
- 
- Searching and Replacement
- *************************
- 
-    Like other editors, Emacs has commands for searching for occurrences
- of a string.  The principal search command is unusual in that it is
- "incremental"; it begins to search before you have finished typing the
- search string.  There are also nonincremental search commands more like
- those of other editors.
- 
-    Besides the usual `replace-string' command that finds all
- occurrences of one string and replaces them with another, Emacs has a
- fancy replacement command called `query-replace' which asks
- interactively which occurrences to replace.
- 
- * Menu:
- 
- * Incremental Search::	   Search happens as you type the string.
- * Nonincremental Search::  Specify entire string and then search.
- * Word Search::		   Search for sequence of words.
- * Regexp Search::	   Search for match for a regexp.
- * Regexps::		   Syntax of regular expressions.
- * Search Case::		   To ignore case while searching, or not.
- * Replace::		   Search, and replace some or all matches.
- * Other Repeating Search:: Operating on all matches for some regexp.
- 
- 
- File: emacs,  Node: Incremental Search,  Next: Nonincremental Search,  Prev: Search,  Up: Search
- 
- Incremental Search
- ==================
- 
-    An incremental search begins searching as soon as you type the first
- character of the search string.  As you type in the search string, Emacs
- shows you where the string (as you have typed it so far) would be
- found.  When you have typed enough characters to identify the place you
- want, you can stop.  Depending on what you plan to do next, you may or
- may not need to terminate the search explicitly with RET.
- 
- `C-s'
-      Incremental search forward (`isearch-forward').
- 
- `C-r'
-      Incremental search backward (`isearch-backward').
- 
-    `C-s' starts an incremental search.  `C-s' reads characters from the
- keyboard and positions the cursor at the first occurrence of the
- characters that you have typed.  If you type `C-s' and then `F', the
- cursor moves right after the first `F'.  Type an `O', and see the
- cursor move to after the first `FO'.  After another `O', the cursor is
- after the first `FOO' after the place where you started the search.
- Meanwhile, the search string `FOO' has been echoed in the echo area.
- 
-    If you make a mistake in typing the search string, you can cancel
- characters with DEL.  Each DEL cancels the last character of search
- string.  This does not happen until Emacs is ready to read another
- input character; first it must either find, or fail to find, the
- character you want to erase.  If you do not want to wait for this to
- happen, use `C-g' as described below.
- 
-    When you are satisfied with the place you have reached, you can type
- RET, which stops searching, leaving the cursor where the search brought
- it.  Also, any command not specially meaningful in searches stops the
- searching and is then executed.  Thus, typing `C-a' would exit the
- search and then move to the beginning of the line.  RET is necessary
- only if the next command you want to type is a printing character, DEL,
- RET, or another control character that is special within searches
- (`C-q', `C-w', `C-r', `C-s', `C-y', `M-y', `M-r', or `M-s').
- 
-    Sometimes you search for `FOO' and find it, but not the one you
- expected to find.  There was a second `FOO' that you forgot about,
- before the one you were looking for.  In this event, type another `C-s'
- to move to the next occurrence of the search string.  This can be done
- any number of times.  If you overshoot, you can cancel some `C-s'
- characters with DEL.
- 
-    After you exit a search, you can search for the same string again by
- typing just `C-s C-s': the first `C-s' is the key that invokes
- incremental search, and the second `C-s' means "search again".
- 
-    To reuse earlier search strings, use the "search ring".  The
- commands `M-p' and `M-n' move through the ring to pick a search string
- to reuse.  These commands leave the selected search ring element in the
- minibuffer, where you can edit it.  Type `C-s' or `C-r' to terminate
- editing the string and search for it.
- 
-    If your string is not found at all, the echo area says `Failing
- I-Search'.  The cursor is after the place where Emacs found as much of
- your string as it could.  Thus, if you search for `FOOT', and there is
- no `FOOT', you might see the cursor after the `FOO' in `FOOL'.  At this
- point there are several things you can do.  If your string was
- mistyped, you can rub some of it out and correct it.  If you like the
- place you have found, you can type RET or some other Emacs command to
- "accept what the search offered".  Or you can type `C-g', which removes
- from the search string the characters that could not be found (the `T'
- in `FOOT'), leaving those that were found (the `FOO' in `FOOT').  A
- second `C-g' at that point cancels the search entirely, returning point
- to where it was when the search started.
- 
-    An upper-case letter in the search string makes the search
- case-sensitive.  If you delete the upper-case character from the search
- string, it ceases to have this effect.  *Note Search Case::.
- 
-    If a search is failing and you ask to repeat it by typing another
- `C-s', it starts again from the beginning of the buffer.  Repeating a
- failing reverse search with `C-r' starts again from the end.  This is
- called "wrapping around".  `Wrapped' appears in the search prompt once
- this has happened.
- 
-    The `C-g' "quit" character does special things during searches; just
- what it does depends on the status of the search.  If the search has
- found what you specified and is waiting for input, `C-g' cancels the
- entire search.  The cursor moves back to where you started the search.
- If `C-g' is typed when there are characters in the search string that
- have not been found--because Emacs is still searching for them, or
- because it has failed to find them--then the search string characters
- which have not been found are discarded from the search string.  With
- them gone, the search is now successful and waiting for more input, so
- a second `C-g' will cancel the entire search.
- 
-    To search for a newline, type LFD (also known as `C-j').  To search
- for another control character such as control-S or carriage return, you
- must quote it by typing `C-q' first.  This function of `C-q' is
- analogous to its meaning as an Emacs command: it causes the following
- character to be treated the way a graphic character would normally be
- treated in the same context.  You can also specify a character by its
- octal code: enter `C-q' followed by three octal digits.
- 
-    You can change to searching backwards with `C-r'.  If a search fails
- because the place you started was too late in the file, you should do
- this.  Repeated `C-r' keeps looking for more occurrences backwards.  A
- `C-s' starts going forwards again.  `C-r' in a search can be canceled
- with DEL.
- 
-    If you know initially that you want to search backwards, you can use
- `C-r' instead of `C-s' to start the search, because `C-r' as a key runs
- a command (`isearch-backward') to search backward.
- 
-    The characters `C-y' and `C-w' can be used in incremental search to
- grab text from the buffer into the search string.  This makes it
- convenient to search for another occurrence of text at point.  `C-w'
- copies the word after point as part of the search string, advancing
- point over that word.  Another `C-s' to repeat the search will then
- search for a string including that word.  `C-y' is similar to `C-w' but
- copies all the rest of the current line into the search string.  Both
- `C-y' and `C-w' convert the text they copy to lower case if the search
- is current not case-sensitive; this is so the search remains
- case-insensitive.
- 
-    The character `M-y' copies text from the kill ring into the search
- string.  It uses the same text that `C-y' as a command would yank.
- *Note Yanking::.
- 
-    When you exit the incremental search, it sets the mark to where point
- *was*, before the search.  That is convenient for moving back there.
- In Transient Mark mode, incremental search sets the mark without
- activating it, and does so only if the mark is not already active.
- 
-    To customize the special characters that incremental search
- understands, alter their bindings in the keymap `isearch-mode-map'.
- For a list of bindings, look at the documentation of `isearch-mode' with
- `C-h f isearch-mode RET'.
- 
- Slow Terminal Incremental Search
- --------------------------------
- 
-    Incremental search on a slow terminal uses a modified style of
- display that is designed to take less time.  Instead of redisplaying
- the buffer at each place the search gets to, it creates a new
- single-line window and uses that to display the line that the search
- has found.  The single-line window comes into play as soon as point
- gets outside of the text that is already on the screen.
- 
-    When you terminate the search, the single-line window is removed.
- Then Emacs redisplays the window in which the search was done, to show
- its new position of point.
- 
-    The slow terminal style of display is used when the terminal baud
- rate is less than or equal to the value of the variable
- `search-slow-speed', initially 1200.
- 
-    The number of lines to use in slow terminal search display is
- controlled by the variable `search-slow-window-lines'.  1 is its normal
- value.
- 
- 
- File: emacs,  Node: Nonincremental Search,  Next: Word Search,  Prev: Incremental Search,  Up: Search
- 
- Nonincremental Search
- =====================
- 
-    Emacs also has conventional nonincremental search commands, which
- require you to type the entire search string before searching begins.
- 
- `C-s RET STRING RET'
-      Search for STRING.
- 
- `C-r RET STRING RET'
-      Search backward for STRING.
- 
-    To do a nonincremental search, first type `C-s RET'.  This enters
- the minibuffer to read the search string; terminate the string with
- RET, and then the search takes place.  If the string is not found, the
- search command gets an error.
- 
-    The way `C-s RET' works is that the `C-s' invokes incremental
- search, which is specially programmed to invoke nonincremental search
- if the argument you give it is empty.  (Such an empty argument would
- otherwise be useless.)  `C-r RET' also works this way.
- 
-    However, nonincremental searches performed using `C-s RET' do not
- call `search-forward' right away.  The first thing done is to see if
- the next character is `C-w', which requests a word search.  *Note Word
- Search::.
- 
-    Forward and backward nonincremental searches are implemented by the
- commands `search-forward' and `search-backward'.  These commands may be
- bound to keys in the usual manner.  The feature that you can get to
- them via the incremental search commands exists for historical reasons,
- and to avoid the need to find suitable key sequences for them.
- 
- 
- File: emacs,  Node: Word Search,  Next: Regexp Search,  Prev: Nonincremental Search,  Up: Search
- 
- Word Search
- ===========
- 
-    Word search searches for a sequence of words without regard to how
- the words are separated.  More precisely, you type a string of many
- words, using single spaces to separate them, and the string can be
- found even if there are multiple spaces, newlines or other punctuation
- between the words.
- 
-    Word search is useful for editing a printed document made with a text
- formatter.  If you edit while looking at the printed, formatted version,
- you can't tell where the line breaks are in the source file.  With word
- search, you can search without having to know them.
- 
- `C-s RET C-w WORDS RET'
-      Search for WORDS, ignoring details of punctuation.
- 
- `C-r RET C-w WORDS RET'
-      Search backward for WORDS, ignoring details of punctuation.
- 
-    Word search is a special case of nonincremental search and is invoked
- with `C-s RET C-w'.  This is followed by the search string, which must
- always be terminated with RET.  Being nonincremental, this search does
- not start until the argument is terminated.  It works by constructing a
- regular expression and searching for that; see *Note Regexp Search::.
- 
-    Use `C-r RET C-w' to do backward word search.
- 
-    Forward and backward word searches are implemented by the commands
- `word-search-forward' and `word-search-backward'.  These commands may
- be bound to keys in the usual manner.  The feature that you can get to
- them via the incremental search commands exists for historical reasons,
- and to avoid the need to find suitable key sequences for them.
- 
- 
- File: emacs,  Node: Regexp Search,  Next: Regexps,  Prev: Word Search,  Up: Search
- 
- Regular Expression Search
- =========================
- 
-    A "regular expression" ("regexp", for short) is a pattern that
- denotes a class of alternative strings to match, possibly infinitely
- many.  In GNU Emacs, you can search for the next match for a regexp
- either incrementally or not.
- 
-    Incremental search for a regexp is done by typing `C-M-s'
- (`isearch-forward-regexp').  This command reads a search string
- incrementally just like `C-s', but it treats the search string as a
- regexp rather than looking for an exact match against the text in the
- buffer.  Each time you add text to the search string, you make the
- regexp longer, and the new regexp is searched for.  To search backward
- in the buffer, use `C-M-r' (`isearch-backward-regexp').
- 
-    All of the control characters that do special things within an
- ordinary incremental search have the same function in incremental regexp
- search.  Typing `C-s' or `C-r' immediately after starting the search
- retrieves the last incremental search regexp used; that is to say,
- incremental regexp and non-regexp searches have independent defaults.
- They also have separate search rings that you can access with `M-p' and
- `M-n'.
- 
-    If you type SPC in incremental regexp search, it matches any
- sequence of whitespace characters, including newlines.  If you want to
- match just a space, type `C-q SPC'.
- 
-    Note that adding characters to the regexp in an incremental regexp
- search can make the cursor move back and start again.  For example, if
- you have searched for `foo' and you add `\|bar', the cursor backs up in
- case the first `bar' precedes the first `foo'.
- 
-    Nonincremental search for a regexp is done by the functions
- `re-search-forward' and `re-search-backward'.  You can invoke these
- with `M-x', or bind them to keys, or invoke them by way of incremental
- regexp search with `C-M-s RET' and `C-M-r RET'.
- 
- 
- File: emacs,  Node: Regexps,  Next: Search Case,  Prev: Regexp Search,  Up: Search
- 
- Syntax of Regular Expressions
- =============================
- 
-    Regular expressions have a syntax in which a few characters are
- special constructs and the rest are "ordinary".  An ordinary character
- is a simple regular expression which matches that same character and
- nothing else.  The special characters are `$', `^', `.', `*', `+', `?',
- `[', `]' and `\'.  Any other character appearing in a regular
- expression is ordinary, unless a `\' precedes it.
- 
-    For example, `f' is not a special character, so it is ordinary, and
- therefore `f' is a regular expression that matches the string `f' and
- no other string.  (It does *not* match the string `ff'.)  Likewise, `o'
- is a regular expression that matches only `o'.  (When case distinctions
- are being ignored, these regexps also match `F' and `O', but we
- consider this a generalization of "the same string", rather than an
- exception.)
- 
-    Any two regular expressions A and B can be concatenated.  The result
- is a regular expression which matches a string if A matches some amount
- of the beginning of that string and B matches the rest of the string.
- 
-    As a simple example, we can concatenate the regular expressions `f'
- and `o' to get the regular expression `fo', which matches only the
- string `fo'.  Still trivial.  To do something nontrivial, you need to
- use one of the special characters.  Here is a list of them.
- 
- `. (Period)'
-      is a special character that matches any single character except a
-      newline.  Using concatenation, we can make regular expressions
-      like `a.b' which matches any three-character string which begins
-      with `a' and ends with `b'.
- 
- `*'
-      is not a construct by itself; it is a postfix operator, which
-      means to match the preceding regular expression repetitively as
-      many times as possible.  Thus, `o*' matches any number of `o's
-      (including no `o's).
- 
-      `*' always applies to the *smallest* possible preceding
-      expression.  Thus, `fo*' has a repeating `o', not a repeating
-      `fo'.  It matches `f', `fo', `foo', and so on.
- 
-      The matcher processes a `*' construct by matching, immediately, as
-      many repetitions as can be found.  Then it continues with the rest
-      of the pattern.  If that fails, backtracking occurs, discarding
-      some of the matches of the `*'-modified construct in case that
-      makes it possible to match the rest of the pattern.  For example,
-      matching `ca*ar' against the string `caaar', the `a*' first tries
-      to match all three `a's; but the rest of the pattern is `ar' and
-      there is only `r' left to match, so this try fails.  The next
-      alternative is for `a*' to match only two `a's.  With this choice,
-      the rest of the regexp matches successfully.
- 
- `+'
-      is a postfix character, similar to `*' except that it must match
-      the preceding expression at least once.  So, for example, `ca+r'
-      matches the strings `car' and `caaaar' but not the string `cr',
-      whereas `ca*r' matches all three strings.
- 
- `?'
-      is a postfix character, similar to `*' except that it can match the
-      preceding expression either once or not at all.  For example,
-      `ca?r' matches `car' or `cr'; nothing else.
- 
- `[ ... ]'
-      is a "character set", which begins with `[' and is terminated by
-      `]'.  In the simplest case, the characters between the two
-      brackets are what this set can match.
- 
-      Thus, `[ad]' matches either one `a' or one `d', and `[ad]*'
-      matches any string composed of just `a's and `d's (including the
-      empty string), from which it follows that `c[ad]*r' matches `cr',
-      `car', `cdr', `caddaar', etc.
- 
-      You can also include character ranges a character set, by writing
-      two characters with a `-' between them.  Thus, `[a-z]' matches any
-      lower-case letter.  Ranges may be intermixed freely with individual
-      characters, as in `[a-z$%.]', which matches any lower case letter
-      or `$', `%' or period.
- 
-      Note that the usual regexp special characters are not special
-      inside a character set.  A completely different set of special
-      characters exists inside character sets: `]', `-' and `^'.
- 
-      To include a `]' in a character set, you must make it the first
-      character.  For example, `[]a]' matches `]' or `a'.  To include a
-      `-', write `-' as the first or last character of the set, or put
-      it after a range.  Thus, `[]-]' matches both `]' and `-'.
- 
-      To include `^', make it other than the first character in the set.
- 
- `[^ ... ]'
-      `[^' begins a "complemented character set", which matches any
-      character except the ones specified.  Thus, `[^a-z0-9A-Z]' matches
-      all characters *except* letters and digits.
- 
-      `^' is not special in a character set unless it is the first
-      character.  The character following the `^' is treated as if it
-      were first (`-' and `]' are not special there).
- 
-      A complemented character set can match a newline, unless newline is
-      mentioned as one of the characters not to match.  This is in
-      contrast to the handling of regexps in programs such as `grep'.
- 
- `^'
-      is a special character that matches the empty string, but only at
-      the beginning of a line in the text being matched.  Otherwise it
-      fails to match anything.  Thus, `^foo' matches a `foo' which
-      occurs at the beginning of a line.
- 
- `$'
-      is similar to `^' but matches only at the end of a line.  Thus,
-      `xx*$' matches a string of one `x' or more at the end of a line.
- 
- `\'
-      has two functions: it quotes the special characters (including
-      `\'), and it introduces additional special constructs.
- 
-      Because `\' quotes special characters, `\$' is a regular
-      expression which matches only `$', and `\[' is a regular
-      expression which matches only `[', etc.
- 
-    Note: for historical compatibility, special characters are treated as
- ordinary ones if they are in contexts where their special meanings make
- no sense.  For example, `*foo' treats `*' as ordinary since there is no
- preceding expression on which the `*' can act.  It is poor practice to
- depend on this behavior; better to quote the special character anyway,
- regardless of where is appears.
- 
-    For the most part, `\' followed by any character matches only that
- character.  However, there are several exceptions: two-character
- sequences starting with `\' which have special meanings.  The second
- character in the sequence is always an ordinary character on their own.
- Here is a table of `\' constructs.
- 
- `\|'
-      specifies an alternative.  Two regular expressions A and B with
-      `\|' in between form an expression that matches anything that
-      either A or B matches.
- 
-      Thus, `foo\|bar' matches either `foo' or `bar' but no other string.
- 
-      `\|' applies to the largest possible surrounding expressions.
-      Only a surrounding `\( ... \)' grouping can limit the scope of
-      `\|'.
- 
-      Full backtracking capability exists to handle multiple uses of
-      `\|'.
- 
- `\( ... \)'
-      is a grouping construct that serves three purposes:
- 
-        1. To enclose a set of `\|' alternatives for other operations.
-           Thus, `\(foo\|bar\)x' matches either `foox' or `barx'.
- 
-        2. To enclose a complicated expression for the postfix operators
-           `*', `+' and `?' to operate on.  Thus, `ba\(na\)*' matches
-           `bananana', etc., with any (zero or more) number of `na'
-           strings.
- 
-        3. To mark a matched substring for future reference.
- 
-      This last application is not a consequence of the idea of a
-      parenthetical grouping; it is a separate feature which is assigned
-      as a second meaning to the same `\( ... \)' construct.  In practice
-      there is no conflict between the two meanings.  Here is an
-      explanation of this feature:
- 
- `\D'
-      after the end of a `\( ... \)' construct, the matcher remembers
-      the beginning and end of the text matched by that construct.  Then,
-      later on in the regular expression, you can use `\' followed by the
-      digit D to mean "match the same text matched the Dth time by the
-      `\( ... \)' construct."
- 
-      The strings matching the first nine `\( ... \)' constructs
-      appearing in a regular expression are assigned numbers 1 through 9
-      in order that the open-parentheses appear in the regular
-      expression.  `\1' through `\9' refer to the text previously
-      matched by the corresponding `\( ... \)' construct.
- 
-      For example, `\(.*\)\1' matches any newline-free string that is
-      composed of two identical halves.  The `\(.*\)' matches the first
-      half, which may be anything, but the `\1' that follows must match
-      the same exact text.
- 
-      If a particular `\( ... \)' construct matches more than once
-      (which can easily happen if it is followed by `*'), only the last
-      match is recorded.
- 
- `\`'
-      matches the empty string, provided it is at the beginning of the
-      buffer.
- 
- `\''
-      matches the empty string, provided it is at the end of the buffer.
- 
- `\b'
-      matches the empty string, provided it is at the beginning or end
-      of a word.  Thus, `\bfoo\b' matches any occurrence of `foo' as a
-      separate word.  `\bballs?\b' matches `ball' or `balls' as a
-      separate word.
- 
-      `\b' matches at the beginning or end of the buffer regardless of
-      what text appears next to it.
- 
- `\B'
-      matches the empty string, provided it is *not* at the beginning or
-      end of a word.
- 
- `\<'
-      matches the empty string, provided it is at the beginning of a
-      word.  `\<' matches at the beginning of the buffer only if a
-      word-constituent character follows.
- 
- `\>'
-      matches the empty string, provided it is at the end of a word.
-      `\>' matches at the end of the buffer only if the contents end with
-      a word-constituent character.
- 
- `\w'
-      matches any word-constituent character.  The syntax table
-      determines which characters these are.  *Note Syntax::.
- 
- `\W'
-      matches any character that is not a word-constituent.
- 
- `\sC'
-      matches any character whose syntax is C.  Here C is a character
-      which represents a syntax code: thus, `w' for word constituent,
-      `(' for open-parenthesis, etc.  Represent a character of
-      whitespace (which can be a newline) by either `-' or a space
-      character.
- 
- `\SC'
-      matches any character whose syntax is not C.
- 
-    The constructs that pertain to words and syntax are controlled by the
- setting of the syntax table (*note Syntax::.).
- 
-    Here is a complicated regexp, used by Emacs to recognize the end of a
- sentence together with any whitespace that follows.  It is given in Lisp
- syntax to enable you to distinguish the spaces from the tab characters.
- In Lisp syntax, the string constant begins and ends with a
- double-quote.  `\"' stands for a double-quote as part of the regexp,
- `\\' for a backslash as part of the regexp, `\t' for a tab and `\n' for
- a newline.
- 
-      "[.?!][]\"')]*\\($\\|\t\\|  \\)[ \t\n]*"
- 
- This contains four parts in succession: a character set matching period,
- `?', or `!'; a character set matching close-brackets, quotes, or
- parentheses, repeated any number of times; an alternative in
- backslash-parentheses that matches end-of-line, a tab, or two spaces;
- and a character set matching whitespace characters, repeated any number
- of times.
- 
-    To enter the same regexp interactively, you would type TAB to enter
- a tab, and `C-q C-j' to enter a newline.  You would also type single
- slashes as themselves, instead of doubling them for Lisp syntax.
- 
- 
- File: emacs,  Node: Search Case,  Next: Replace,  Prev: Regexps,  Up: Search
- 
- Searching and Case
- ==================
- 
-    Incremental searches in Emacs normally ignore the case of the text
- they are searching through, if you specify the text in lower case.
- Thus, if you specify searching for `foo', then `Foo' and `foo' are also
- considered a match.  Regexps, and in particular character sets, are
- included: `[ab]' would match `a' or `A' or `b' or `B'.
- 
-    An upper-case letter in the incremental search string makes the
- search case-sensitive.  Thus, searching for `Foo' does not find `foo'
- or `FOO'.  This applies to regular expression search as well as to
- string search.  The effect ceases if you delete the upper-case letter
- from the search string.
- 
-    If you set the variable `case-fold-search' to `nil', then all
- letters must match exactly, including case.  This is a per-buffer
- variable; altering the variable affects only the current buffer, but
- there is a default value which you can change as well.  *Note Locals::.
- This variable applies to nonincremental searches also, including those
- performed by the replace commands (*note Replace::.).
- 
- 
- File: emacs,  Node: Replace,  Next: Other Repeating Search,  Prev: Search Case,  Up: Search
- 
- Replacement Commands
- ====================
- 
-    Global search-and-replace operations are not needed as often in Emacs
- as they are in other editors(1), but they are available.  In addition
- to the simple `M-x replace-string' command which is like that found in
- most editors, there is a `M-x query-replace' command which asks you, for
- each occurrence of the pattern, whether to replace it.
- 
-    The replace commands all replace one string (or regexp) with one
- replacement string.  It is possible to perform several replacements in
- parallel using the command `expand-region-abbrevs'.  *Note Expanding
- Abbrevs::.
- 
- * Menu:
- 
- * Unconditional Replace::  Replacing all matches for a string.
- * Regexp Replace::         Replacing all matches for a regexp.
- * Replacement and Case::   How replacements preserve case of letters.
- * Query Replace::          How to use querying.
- 
-    ---------- Footnotes ----------
- 
-    (1)  In some editors, search-and-replace operations are the only
- convenient way to make a single change in the text.
- 
- 
- File: emacs,  Node: Unconditional Replace,  Next: Regexp Replace,  Prev: Replace,  Up: Replace
- 
- Unconditional Replacement
- -------------------------
- 
- `M-x replace-string RET STRING RET NEWSTRING RET'
-      Replace every occurrence of STRING with NEWSTRING.
- 
- `M-x replace-regexp RET REGEXP RET NEWSTRING RET'
-      Replace every match for REGEXP with NEWSTRING.
- 
-    To replace every instance of `foo' after point with `bar', use the
- command `M-x replace-string' with the two arguments `foo' and `bar'.
- Replacement happens only in the text after point, so if you want to
- cover the whole buffer you must go to the beginning first.  All
- occurrences up to the end of the buffer are replaced; to limit
- replacement to part of the buffer, narrow to that part of the buffer
- before doing the replacement (*note Narrowing::.).
- 
-    When `replace-string' exits, it leaves point at the last occurrence
- replaced.  It sets the mark to the prior position of point (where the
- `replace-string' command was issued); use `C-u C-SPC' to move back
- there.
- 
-    A numeric argument restricts replacement to matches that are
- surrounded by word boundaries.  The argument's value doesn't matter.
- 
- 
- File: emacs,  Node: Regexp Replace,  Next: Replacement and Case,  Prev: Unconditional Replace,  Up: Replace
- 
- Regexp Replacement
- ------------------
- 
-    The `M-x replace-string' command replaces exact matches for a single
- string.  The similar command `M-x replace-regexp' replaces any match
- for a specified pattern.
- 
-    In `replace-regexp', the NEWSTRING need not be constant: it can
- refer to all or part of what is matched by the REGEXP.  `\&' in
- NEWSTRING stands for the entire match being replaced.  `\D' in
- NEWSTRING, where D is a digit, stands for whatever matched the Dth
- parenthesized grouping in REGEXP.  To include a `\' in the text to
- replace with, you must enter `\\'.  For example,
- 
-      M-x replace-regexp RET c[ad]+r RET \&-safe RET
- 
- replaces (for example) `cadr' with `cadr-safe' and `cddr' with
- `cddr-safe'.
- 
-      M-x replace-regexp RET \(c[ad]+r\)-safe RET \1 RET
- 
- performs the inverse transformation.
- 
- 
- File: emacs,  Node: Replacement and Case,  Next: Query Replace,  Prev: Regexp Replace,  Up: Replace
- 
- Replace Commands and Case
- -------------------------
- 
-    If the arguments to a replace command are in lower case, it preserves
- case when it makes a replacement.  Thus, the command
- 
-      M-x replace-string RET foo RET bar RET
- 
- replaces a lower case `foo' with a lower case `bar', an all-caps `FOO'
- with `BAR', and a capitalized `Foo' with `Bar'.  (These three
- alternatives-lower case, all caps, and capitalized, are the only ones
- that `replace-string' can distinguish.)
- 
-    If upper case letters are used in the second argument, they remain
- upper case every time that argument is inserted.  If upper case letters
- are used in the first argument, the second argument is always
- substituted exactly as given, with no case conversion.  Likewise, if the
- variable `case-replace' is set to `nil', replacement is done without
- case conversion.  If `case-fold-search' is set to `nil', case is
- significant in matching occurrences of `foo' to replace; this also
- inhibits case conversion of the replacement string.
- 
- 
- File: emacs,  Node: Query Replace,  Prev: Replacement and Case,  Up: Replace
- 
- Query Replace
- -------------
- 
- `M-% STRING RET NEWSTRING RET'
- `M-x query-replace RET STRING RET NEWSTRING RET'
-      Replace some occurrences of STRING with NEWSTRING.
- 
- `M-x query-replace-regexp RET REGEXP RET NEWSTRING RET'
-      Replace some matches for REGEXP with NEWSTRING.
- 
-    If you want to change only some of the occurrences of `foo' to
- `bar', not all of them, then you cannot use an ordinary
- `replace-string'.  Instead, use `M-%' (`query-replace').  This command
- finds occurrences of `foo' one by one, displays each occurrence and
- asks you whether to replace it.  A numeric argument to `query-replace'
- tells it to consider only occurrences that are bounded by
- word-delimiter characters.  This preserves case, just like
- `replace-string', provided `case-replace' is non-`nil', as it normally
- is.
- 
-    Aside from querying, `query-replace' works just like
- `replace-string', and `query-replace-regexp' works just like
- `replace-regexp'.  The shortest way to type this command name is `M-x
- que SPC SPC SPC RET'.
- 
-    The things you can type when you are shown an occurrence of STRING
- or a match for REGEXP are:
- 
- `SPC'
-      to replace the occurrence with NEWSTRING.
- 
- `DEL'
-      to skip to the next occurrence without replacing this one.
- 
- `, (Comma)'
-      to replace this occurrence and display the result.  You are then
-      asked for another input character to say what to do next.  Since
-      the replacement has already been made, DEL and SPC are equivalent
-      in this situation; both move to the next occurrence.
- 
-      You could type `C-r' at this point (see below) to alter the
-      replaced text.  You could also type `C-x u' to undo the
-      replacement; this exits the `query-replace', so if you want to do
-      further replacement you must use `C-x ESC ESC RET' to restart
-      (*note Repetition::.).
- 
- `RET'
-      to exit without doing any more replacements.
- 
- `. (Period)'
-      to replace this occurrence and then exit without searching for more
-      occurrences.
- 
- `!'
-      to replace all remaining occurrences without asking again.
- 
- `^'
-      to go back to the position of the previous occurrence (or what
-      used to be an occurrence), in case you changed it by mistake.
-      This works by popping the mark ring.  Only one `^' in a row is
-      meaningful, because only one previous replacement position is kept
-      during `query-replace'.
- 
- `C-r'
-      to enter a recursive editing level, in case the occurrence needs
-      to be edited rather than just replaced with NEWSTRING.  When you
-      are done, exit the recursive editing level with `C-M-c' to proceed
-      to the next occurrence.  *Note Recursive Edit::.
- 
- `C-w'
-      to delete the occurrence, and then enter a recursive editing level
-      as in `C-r'.  Use the recursive edit to insert text to replace the
-      deleted occurrence of STRING.  When done, exit the recursive
-      editing level with `C-M-c' to proceed to the next occurrence.
- 
- `C-l'
-      to redisplay the screen.  Then you must type another character to
-      specify what to do with this occurrence.
- 
- `C-h'
-      to display a message summarizing these options.  Then you must type
-      another character to specify what to do with this occurrence.
- 
-    Some other characters are aliases for the ones listed above: `y',
- `n' and `q' are equivalent to SPC, DEL and RET.
- 
-    Aside from this, any other character exits the `query-replace', and
- is then reread as part of a key sequence.  Thus, if you type `C-k', it
- exits the `query-replace' and then kills to end of line.
- 
-    To restart a `query-replace' once it is exited, use `C-x ESC ESC',
- which repeats the `query-replace' because it used the minibuffer to
- read its arguments.  *Note C-x ESC ESC: Repetition.
- 
-    See also *Note Transforming File Names::, for Dired commands to
- rename, copy, or link files by replacing regexp matches in file names.
- 
- 
- File: emacs,  Node: Other Repeating Search,  Prev: Replace,  Up: Search
- 
- Other Search-and-Loop Commands
- ==============================
- 
-    Here are some other commands that find matches for a regular
- expression.  They all operate from point to the end of the buffer.
- 
- `M-x occur RET REGEXP RET'
-      Display a list showing each line in the buffer that contains a
-      match for REGEXP.  A numeric argument specifies the number of
-      context lines to print before and after each matching line; the
-      default is none.  To limit the search to part of the buffer,
-      narrow to that part (*note Narrowing::.).
- 
-      The buffer `*Occur*' containing the output serves as a menu for
-      finding the occurrences in their original context.  Click `Mouse-2'
-      on an occurrence listed in `*Occur*', or position point there and
-      type RET; this switches to the buffer that was searched and moves
-      point to the original of the chosen occurrence.
- 
- `M-x list-matching-lines'
-      Synonym for `M-x occur'.
- 
- `M-x count-matches RET REGEXP RET'
-      Print the number of matches for REGEXP after point.
- 
- `M-x flush-lines RET REGEXP RET'
-      Delete each line that follows point and contains a match for
-      REGEXP.
- 
- `M-x keep-lines RET REGEXP RET'
-      Delete each line that follows point and *does not* contain a match
-      for REGEXP.
- 
- 
- File: emacs,  Node: Fixit,  Next: Files,  Prev: Search,  Up: Top
- 
- Commands for Fixing Typos
- *************************
- 
-    In this chapter we describe the commands that are especially useful
- for the times when you catch a mistake in your text just after you have
- made it, or change your mind while composing text on the fly.
- 
-    The most fundamental command for correcting erroneous editing is the
- undo command, `C-x u' or `C-_'.  This command undoes a single command
- (usually), a part of a command (in the case of `query-replace'), or
- several consecutive self-inserting characters.  Consecutive repetitions
- of `C-_' or `C-x u' undo earlier and earlier changes, back to the limit
- of the undo information available.  *Note Undo::, for for more
- information.
- 
- * Menu:
- 
- * Kill Errors:: Commands to kill a batch of recently entered text.
- * Transpose::   Exchanging two characters, words, lines, lists...
- * Fixing Case:: Correcting case of last word entered.
- * Spelling::    Apply spelling checker to a word, or a whole file.
- 
- 
- File: emacs,  Node: Kill Errors,  Next: Transpose,  Up: Fixit
- 
- Killing Your Mistakes
- =====================
- 
- `DEL'
-      Delete last character (`delete-backward-char').
- 
- `M-DEL'
-      Kill last word (`backward-kill-word').
- 
- `C-x DEL'
-      Kill to beginning of sentence (`backward-kill-sentence').
- 
-    The DEL character (`delete-backward-char') is the most important
- correction command.  It deletes the character before point.  When DEL
- follows a self-inserting character command, you can think of it as
- canceling that command.  However, avoid the mistake of thinking of DEL
- as a general way to cancel a command!
- 
-    When your mistake is longer than a couple of characters, it might be
- more convenient to use `M-DEL' or `C-x DEL'.  `M-DEL' kills back to the
- start of the last word, and `C-x DEL' kills back to the start of the
- last sentence.  `C-x DEL' is particularly useful when you change your
- mind about the phrasing of the text you are writing.  `M-DEL' and `C-x
- DEL' save the killed text for `C-y' and `M-y' to retrieve.  *Note
- Yanking::.
- 
-    `M-DEL' is often useful even when you have typed only a few
- characters wrong, if you know you are confused in your typing and aren't
- sure exactly what you typed.  At such a time, you cannot correct with
- DEL except by looking at the screen to see what you did.  Often it
- requires less thought to kill the whole word and start again.
- 
--- 0 ----
Index: emacs/info/emacs-6
diff -c emacs/info/emacs-6:1.1.1.2 emacs/info/emacs-6:removed
*** emacs/info/emacs-6:1.1.1.2	Mon Jul 22 01:52:34 1996
--- emacs/info/emacs-6	Fri Aug  2 20:15:51 1996
***************
*** 1,1124 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Transpose,  Next: Fixing Case,  Prev: Kill Errors,  Up: Fixit
- 
- Transposing Text
- ================
- 
- `C-t'
-      Transpose two characters (`transpose-chars').
- 
- `M-t'
-      Transpose two words (`transpose-words').
- 
- `C-M-t'
-      Transpose two balanced expressions (`transpose-sexps').
- 
- `C-x C-t'
-      Transpose two lines (`transpose-lines').
- 
-    The common error of transposing two characters can be fixed, when
- they are adjacent, with the `C-t' command (`transpose-chars').
- Normally, `C-t' transposes the two characters on either side of point.
- When given at the end of a line, rather than transposing the last
- character of the line with the newline, which would be useless, `C-t'
- transposes the last two characters on the line.  So, if you catch your
- transposition error right away, you can fix it with just a `C-t'.  If
- you don't catch it so fast, you must move the cursor back to between
- the two transposed characters.  If you transposed a space with the last
- character of the word before it, the word motion commands are a good
- way of getting there.  Otherwise, a reverse search (`C-r') is often the
- best way.  *Note Search::.
- 
-    `M-t' (`transpose-words') transposes the word before point with the
- word after point.  It moves point forward over a word, dragging the
- word preceding or containing point forward as well.  The punctuation
- characters between the words do not move.  For example, `FOO, BAR'
- transposes into `BAR, FOO' rather than `BAR FOO,'.
- 
-    `C-M-t' (`transpose-sexps') is a similar command for transposing two
- expressions (*note Lists::.), and `C-x C-t' (`transpose-lines')
- exchanges lines.  They work like `M-t' except in determining the
- division of the text into syntactic units.
- 
-    A numeric argument to a transpose command serves as a repeat count:
- it tells the transpose command to move the character (word, sexp, line)
- before or containing point across several other characters (words,
- sexps, lines).  For example, `C-u 3 C-t' moves the character before
- point forward across three other characters.  It would change
- `f-!-oobar' into `oobf-!-ar'.  This is equivalent to repeating `C-t'
- three times.  `C-u - 4 M-t' moves the word before point backward across
- four words.  `C-u - C-M-t' would cancel the effect of plain `C-M-t'.
- 
-    A numeric argument of zero is assigned a special meaning (because
- otherwise a command with a repeat count of zero would do nothing): to
- transpose the character (word, sexp, line) ending after point with the
- one ending after the mark.
- 
- 
- File: emacs,  Node: Fixing Case,  Next: Spelling,  Prev: Transpose,  Up: Fixit
- 
- Case Conversion
- ===============
- 
- `M-- M-l'
-      Convert last word to lower case.  Note `Meta--' is Meta-minus.
- 
- `M-- M-u'
-      Convert last word to all upper case.
- 
- `M-- M-c'
-      Convert last word to lower case with capital initial.
- 
-    A very common error is to type words in the wrong case.  Because of
- this, the word case-conversion commands `M-l', `M-u' and `M-c' have a
- special feature when used with a negative argument: they do not move the
- cursor.  As soon as you see you have mistyped the last word, you can
- simply case-convert it and go on typing.  *Note Case::.
- 
- 
- File: emacs,  Node: Spelling,  Prev: Fixing Case,  Up: Fixit
- 
- Checking and Correcting Spelling
- ================================
- 
-    This section describes the commands to check the spelling of a single
- word or of a portion of a buffer.  These commands work with the spelling
- checker program Ispell, which is not part of Emacs.  *Note Ispell: (The
- Ispell Manual)Top.
- 
- `M-$'
-      Check and correct spelling of word at point (`ispell-word').
- 
- `M-TAB'
-      Complete the word before point based on the spelling dictionary
-      (`ispell-complete-word').
- 
- `M-x ispell-buffer'
-      Check and correct spelling of each word in the buffer.
- 
- `M-x ispell-region'
-      Check and correct spelling of each word in the region.
- 
- `M-x ispell-message'
-      Check and correct spelling of each word in a draft mail message,
-      excluding cited material.
- 
- `M-x ispell-change-dictionary RET DICT RET'
-      Restart the ispell process, using DICT as the dictionary.
- 
- `M-x ispell-kill-ispell'
-      Kill the Ispell subprocess.
- 
-    To check the spelling of the word around or next to point, and
- optionally correct it as well, use the command `M-$' (`ispell-word').
- If the word is not correct, the command offers you various alternatives
- for what to do about it.
- 
-    To check the entire current buffer, use `M-x ispell-buffer'.  Use
- `M-x ispell-region' to check just the current region.  To check
- spelling in an email message you are writing, use `M-x ispell-message';
- that checks the whole buffer, but does not check material that is
- indented or appears to be cited from other messages.
- 
-    Each time these commands encounter an incorrect word, they ask you
- what to do.  It displays a list of alternatives, usually including
- several "near-misses"--words that are close to the word being checked.
- Then you must type a character.  Here are the valid responses:
- 
- `SPC'
-      Skip this word--continue to consider it incorrect, but don't
-      change it here.
- 
- `r NEW RET'
-      Replace the word (just this time) with NEW.
- 
- `R NEW RET'
-      Replace the word with NEW, and do a `query-replace' so you can
-      replace it elsewhere in the buffer if you wish.
- 
- `DIGIT'
-      Replace the word (just this time) with one of the displayed
-      near-misses.  Each near-miss is listed with a digit; type that
-      digit to select it.
- 
- `a'
-      Accept the incorrect word--treat it as correct, but only in this
-      editing session.
- 
- `A'
-      Accept the incorrect word--treat it as correct, but only in this
-      editing session and for this buffer.
- 
- `i'
-      Insert this word in your private dictionary file so that Ispell
-      will consider it correct it from now on, even in future sessions.
- 
- `u'
-      Insert a lower-case version of this word in your private dictionary
-      file.
- 
- `m'
-      Like `i', but you can also specify dictionary completion
-      information.
- 
- `l WORD RET'
-      Look in the dictionary for words that match WORD.  These words
-      become the new list of "near-misses"; you can select one of them to
-      replace with by typing a digit.  You can use `*' in WORD as a
-      wildcard.
- 
- `C-g'
-      Quit interactive spell checking.  You can restart it again
-      afterward with `C-u M-$'.
- 
- `X'
-      Same as `C-g'.
- 
- `x'
-      Quit interactive spell checking and move point back to where it was
-      when you started spell checking.
- 
- `q'
-      Quit interactive spell checking and kill the Ispell subprocess.
- 
- `C-l'
-      Refresh the screen.
- 
- `C-z'
-      This key has its normal command meaning (suspend Emacs or iconify
-      this frame).
- 
-    The command `ispell-complete-word', which is bound to the key
- `M-TAB' in Text mode and related modes, shows a list of completions
- based on spelling correction.  Insert the beginning of a word, and then
- type `M-TAB'; the command displays a completion list window.  To choose
- one of the completions listed, click `Mouse-2' on it, or move the
- cursor there in the completions window and type RET.  *Note Text Mode::.
- 
-    Once started, the Ispell subprocess continues to run (waiting for
- something to do), so that subsequent spell checking commands complete
- more quickly.  If you want to get rid of the Ispell process, use `M-x
- ispell-kill-ispell'.  This is not usually necessary, since the process
- uses no time except when you do spelling correction.
- 
-    Ispell uses two dictionaries: the standard dictionary and your
- private dictionary.  The variable `ispell-dictionary' specifies the file
- name of the standard dictionary to use.  A value of `nil' says to use
- the default dictionary.  The command `M-x ispell-change-dictionary'
- sets this variable and then restarts the Ispell subprocess, so that it
- will use a different dictionary.
- 
- 
- File: emacs,  Node: Files,  Next: Buffers,  Prev: Fixit,  Up: Top
- 
- File Handling
- *************
- 
-    The operating system stores data permanently in named "files".  So
- most of the text you edit with Emacs comes from a file and is ultimately
- stored in a file.
- 
-    To edit a file, you must tell Emacs to read the file and prepare a
- buffer containing a copy of the file's text.  This is called "visiting"
- the file.  Editing commands apply directly to text in the buffer; that
- is, to the copy inside Emacs.  Your changes appear in the file itself
- only when you "save" the buffer back into the file.
- 
-    In addition to visiting and saving files, Emacs can delete, copy,
- rename, and append to files, keep multiple versions of them, and operate
- on file directories.
- 
- * Menu:
- 
- * File Names::       How to type and edit file name arguments.
- * Visiting::         Visiting a file prepares Emacs to edit the file.
- * Saving::           Saving makes your changes permanent.
- * Reverting::        Reverting cancels all the changes not saved.
- * Auto Save::        Auto Save periodically protects against loss of data.
- * File Aliases::     Handling multiple names for one file.
- * Version Control::  Version control systems (RCS, CVS and SCCS).
- * Directories::      Creating, deleting and listing file directories.
- * Comparing Files::  Finding where two files differ.
- * Misc File Ops::    Other things you can do on files.
- 
- 
- File: emacs,  Node: File Names,  Next: Visiting,  Up: Files
- 
- File Names
- ==========
- 
-    Most Emacs commands that operate on a file require you to specify the
- file name.  (Saving and reverting are exceptions; the buffer knows which
- file name to use for them.)  You enter the file name using the
- minibuffer (*note Minibuffer::.).  "Completion" is available, to make
- it easier to specify long file names.  *Note Completion::.
- 
-    For most operations, there is a "default file name" which is used if
- you type just RET to enter an empty argument.  Normally the default
- file name is the name of the file visited in the current buffer; this
- makes it easy to operate on that file with any of the Emacs file
- commands.
- 
-    Each buffer has a default directory, normally the same as the
- directory of the file visited in that buffer.  When you enter a file
- name without a directory, the default directory is used.  If you specify
- a directory in a relative fashion, with a name that does not start with
- a slash, it is interpreted with respect to the default directory.  The
- default directory is kept in the variable `default-directory', which
- has a separate value in every buffer.
- 
-    For example, if the default file name is `/u/rms/gnu/gnu.tasks' then
- the default directory is `/u/rms/gnu/'.  If you type just `foo', which
- does not specify a directory, it is short for `/u/rms/gnu/foo'.
- `../.login' would stand for `/u/rms/.login'.  `new/foo' would stand for
- the file name `/u/rms/gnu/new/foo'.
- 
-    The command `M-x pwd' prints the current buffer's default directory,
- and the command `M-x cd' sets it (to a value read using the
- minibuffer).  A buffer's default directory changes only when the `cd'
- command is used.  A file-visiting buffer's default directory is
- initialized to the directory of the file that is visited there.  If you
- create a buffer with `C-x b', its default directory is copied from that
- of the buffer that was current at the time.
- 
-    The default directory actually appears in the minibuffer when the
- minibuffer becomes active to read a file name.  This serves two
- purposes: it *shows* you what the default is, so that you can type a
- relative file name and know with certainty what it will mean, and it
- allows you to *edit* the default to specify a different directory.
- This insertion of the default directory is inhibited if the variable
- `insert-default-directory' is set to `nil'.
- 
-    Note that it is legitimate to type an absolute file name after you
- enter the minibuffer, ignoring the presence of the default directory
- name as part of the text.  The final minibuffer contents may look
- invalid, but that is not so.  For example, if the minibuffer starts out
- with `/usr/tmp/' and you add `/x1/rms/foo', you get
- `/usr/tmp//x1/rms/foo'; but Emacs ignores everything through the first
- slash in the double slash; the result is `/x1/rms/foo'.  *Note
- Minibuffer File::.
- 
-    You can refer to files on other machines using a special file name
- syntax:
- 
-      /HOST:FILENAME
-      /USER@HOST:FILENAME
- 
- When you do this, Emacs uses the FTP program to read and write files on
- the specified host.  It logs in through FTP using your user name or the
- name USER.  It may ask you for a password from time to time; this is
- used for logging in on HOST.
- 
-    You can turn off the FTP file name feature by setting the variable
- `file-name-handler-alist' to `nil'.
- 
-    `$' in a file name is used to substitute environment variables.  For
- example, if you have used the shell command `export FOO=rms/hacks' to
- set up an environment variable named `FOO', then you can use
- `/u/$FOO/test.c' or `/u/${FOO}/test.c' as an abbreviation for
- `/u/rms/hacks/test.c'.  The environment variable name consists of all
- the alphanumeric characters after the `$'; alternatively, it may be
- enclosed in braces after the `$'.  Note that shell commands to set
- environment variables affect Emacs only if done before Emacs is started.
- 
-    To access a file with `$' in its name, type `$$'.  This pair is
- converted to a single `$' at the same time as variable substitution is
- performed for single `$'.  The Lisp function that performs the
- substitution is called `substitute-in-file-name'.  The substitution is
- performed only on file names read as such using the minibuffer.
- 
- 
- File: emacs,  Node: Visiting,  Next: Saving,  Prev: File Names,  Up: Files
- 
- Visiting Files
- ==============
- 
- `C-x C-f'
-      Visit a file (`find-file').
- 
- `C-x C-r'
-      Visit a file for viewing, without allowing changes to it
-      (`find-file-read-only').
- 
- `C-x C-v'
-      Visit a different file instead of the one visited last
-      (`find-alternate-file').
- 
- `C-x 4 C-f'
-      Visit a file, in another window (`find-file-other-window').  Don't
-      change the selected window.
- 
- `C-x 5 C-f'
-      Visit a file, in a new frame (`find-file-other-frame').  Don't
-      change the selected frame.
- 
-    "Visiting" a file means copying its contents into an Emacs buffer so
- you can edit them.  Emacs makes a new buffer for each file that you
- visit.  We say that this buffer is visiting the file that it was created
- to hold.  Emacs constructs the buffer name from the file name by
- throwing away the directory, keeping just the name proper.  For example,
- a file named `/usr/rms/emacs.tex' would get a buffer named `emacs.tex'.
- If there is already a buffer with that name, a unique name is
- constructed by appending `<2>', `<3>', or so on, using the lowest
- number that makes a name that is not already in use.
- 
-    Each window's mode line shows the name of the buffer that is being
- displayed in that window, so you can always tell what buffer you are
- editing.
- 
-    The changes you make with editing commands are made in the Emacs
- buffer.  They do not take effect in the file that you visited, or any
- place permanent, until you "save" the buffer.  Saving the buffer means
- that Emacs writes the current contents of the buffer into its visited
- file.  *Note Saving::.
- 
-    If a buffer contains changes that have not been saved, we say the
- buffer is "modified".  This is important because it implies that some
- changes will be lost if the buffer is not saved.  The mode line
- displays two stars near the left margin to indicate that the buffer is
- modified.
- 
-    To visit a file, use the command `C-x C-f' (`find-file').  Follow
- the command with the name of the file you wish to visit, terminated by a
- RET.
- 
-    The file name is read using the minibuffer (*note Minibuffer::.),
- with defaulting and completion in the standard manner (*note File
- Names::.).  While in the minibuffer, you can abort `C-x C-f' by typing
- `C-g'.
- 
-    Your confirmation that `C-x C-f' has completed successfully is the
- appearance of new text on the screen and a new buffer name in the mode
- line.  If the specified file does not exist and could not be created, or
- cannot be read, then you get an error, with an error message displayed
- in the echo area.
- 
-    If you visit a file that is already in Emacs, `C-x C-f' does not make
- another copy.  It selects the existing buffer containing that file.
- However, before doing so, it checks that the file itself has not changed
- since you visited or saved it last.  If the file has changed, a warning
- message is printed.  *Note Simultaneous Editing: Interlocking.
- 
-    What if you want to create a new file?  Just visit it.  Emacs prints
- `(New File)' in the echo area, but in other respects behaves as if you
- had visited an existing empty file.  If you make any changes and save
- them, the file is created.
- 
-    If the file you specify is actually a directory, `C-x C-f' invokes
- Dired, the Emacs directory browser so that you can "edit" the contents
- of the directory (*note Dired::.).  Dired is a convenient way to delete,
- look at, or operate on the files in the directory.  However, if the
- variable `find-file-run-dired' is `nil', then it is an error to try to
- visit a directory.
- 
-    If you visit a file that the operating system won't let you modify,
- Emacs makes the buffer read-only, so that you won't go ahead and make
- changes that you'll have trouble saving afterward.  You can make the
- buffer writable with `C-x C-q' (`vc-toggle-read-only').  *Note Misc
- Buffer::.
- 
-    Occasionally you might want to visit a file as read-only in order to
- protect yourself from entering changes accidentally; do so by visiting
- the file with the command `C-x C-r' (`find-file-read-only').
- 
-    If you visit a nonexistent file unintentionally (because you typed
- the wrong file name), use the `C-x C-v' command (`find-alternate-file')
- to visit the file you really wanted.  `C-x C-v' is similar to `C-x
- C-f', but it kills the current buffer (after first offering to save it
- if it is modified).  When it reads the file name to visit, it inserts
- the entire default file name in the buffer, with point just after the
- directory part; this is convenient if you made a slight error in typing
- the name.
- 
-    `C-x 4 f' (`find-file-other-window') is like `C-x C-f' except that
- the buffer containing the specified file is selected in another window.
- The window that was selected before `C-x 4 f' continues to show the
- same buffer it was already showing.  If this command is used when only
- one window is being displayed, that window is split in two, with one
- window showing the same buffer as before, and the other one showing the
- newly requested file.  *Note Windows::.
- 
-    `C-x 5 f' (`find-file-other-frame') is similar, but opens a new
- frame, or makes visible any existing frame showing the file you seek.
- This feature is available only when you are using a window system.
- *Note Frames::.
- 
-    Two special hook variables allow extensions to modify the operation
- of visiting files.  Visiting a file that does not exist runs the
- functions in the list `find-file-not-found-hooks'; this variable holds
- a list of functions, and the functions are called one by one until one
- of them returns non-`nil'.  Any visiting of a file, whether extant or
- not, expects `find-file-hooks' to contain a list of functions and calls
- them all, one by one.  In both cases the functions receive no
- arguments.  Of these two variables, `find-file-not-found-hooks' takes
- effect first.  These variables are *not* normal hooks, and their names
- end in `-hooks' rather than `-hook' to indicate that fact.  *Note
- Hooks::.
- 
-    There are several ways to specify automatically the major mode for
- editing the file (*note Choosing Modes::.), and to specify local
- variables defined for that file (*note File Variables::.).
- 
- 
- File: emacs,  Node: Saving,  Next: Reverting,  Prev: Visiting,  Up: Files
- 
- Saving Files
- ============
- 
-    "Saving" a buffer in Emacs means writing its contents back into the
- file that was visited in the buffer.
- 
- `C-x C-s'
-      Save the current buffer in its visited file (`save-buffer').
- 
- `C-x s'
-      Save any or all buffers in their visited files
-      (`save-some-buffers').
- 
- `M-~'
-      Forget that the current buffer has been changed (`not-modified').
- 
- `C-x C-w'
-      Save the current buffer in a specified file (`write-file').
- 
- `M-x set-visited-file-name'
-      Change file the name under which the current buffer will be saved.
- 
-    When you wish to save the file and make your changes permanent, type
- `C-x C-s' (`save-buffer').  After saving is finished, `C-x C-s'
- displays a message like this:
- 
-      Wrote /u/rms/gnu/gnu.tasks
- 
- If the selected buffer is not modified (no changes have been made in it
- since the buffer was created or last saved), saving is not really done,
- because it would have no effect.  Instead, `C-x C-s' displays a message
- like this in the echo area:
- 
-      (No changes need to be written)
- 
-    The command `C-x s' (`save-some-buffers') offers to save any or all
- modified buffers.  It asks you what to do with each buffer.  The
- possible responses are analogous to those of `query-replace':
- 
- `y'
-      Save this buffer and ask about the rest of the buffers.
- 
- `n'
-      Don't save this buffer, but ask about the rest of the buffers.
- 
- `!'
-      Save this buffer and all the rest with no more questions.
- 
- `RET'
-      Terminate `save-some-buffers' without any more saving.
- 
- `.'
-      Save this buffer, then exit `save-some-buffers' without even asking
-      about other buffers.
- 
- `C-r'
-      View the buffer that you are currently being asked about.  When
-      you exit View mode, you get back to `save-some-buffers', which
-      asks the question again.
- 
- `C-h'
-      Display a help message about these options.
- 
-    `C-x C-c', the key sequence to exit Emacs, invokes
- `save-some-buffers' and therefore asks the same questions.
- 
-    If you have changed a buffer but you do not want to save the changes,
- you should take some action to prevent it.  Otherwise, each time you use
- `C-x s' or `C-x C-c', you are liable to save this buffer by mistake.
- One thing you can do is type `M-~' (`not-modified'), which clears out
- the indication that the buffer is modified.  If you do this, none of
- the save commands will believe that the buffer needs to be saved.  (`~'
- is often used as a mathematical symbol for `not'; thus `M-~' is `not',
- metafied.)  You could also use `set-visited-file-name' (see below) to
- mark the buffer as visiting a different file name, one which is not in
- use for anything important.  Alternatively, you can cancel all the
- changes made since the file was visited or saved, by reading the text
- from the file again.  This is called "reverting".  *Note Reverting::.
- You could also undo all the changes by repeating the undo command `C-x
- u' until you have undone all the changes; but reverting is easier.
- 
-    `M-x set-visited-file-name' alters the name of the file that the
- current buffer is visiting.  It reads the new file name using the
- minibuffer.  Then it specifies the visited file name and changes the
- buffer name correspondingly (as long as the new name is not in use).
- `set-visited-file-name' does not save the buffer in the newly visited
- file; it just alters the records inside Emacs in case you do save
- later.  It also marks the buffer as "modified" so that `C-x C-s' in
- that buffer *will* save.
- 
-    If you wish to mark the buffer as visiting a different file and save
- it right away, use `C-x C-w' (`write-file').  It is precisely
- equivalent to `set-visited-file-name' followed by `C-x C-s'.  `C-x C-s'
- used on a buffer that is not visiting with a file has the same effect
- as `C-x C-w'; that is, it reads a file name, marks the buffer as
- visiting that file, and saves it there.  The default file name in a
- buffer that is not visiting a file is made by combining the buffer name
- with the buffer's default directory.
- 
-    If Emacs is about to save a file and sees that the date of the latest
- version on disk does not match what Emacs last read or wrote, Emacs
- notifies you of this fact, because it probably indicates a problem
- caused by simultaneous editing and requires your immediate attention.
- *Note Simultaneous Editing: Interlocking.
- 
-    If the variable `require-final-newline' is non-`nil', Emacs puts a
- newline at the end of any file that doesn't already end in one, every
- time a file is saved or written.
- 
- * Menu:
- 
- * Backup::        How Emacs saves the old version of your file.
- * Interlocking::  How Emacs protects against simultaneous editing
-                     of one file by two users.
- 
- 
- File: emacs,  Node: Backup,  Next: Interlocking,  Up: Saving
- 
- Backup Files
- ------------
- 
-    On most operating systems, rewriting a file automatically destroys
- all record of what the file used to contain.  Thus, saving a file from
- Emacs throws away the old contents of the file--or it would, except that
- Emacs carefully copies the old contents to another file, called the
- "backup" file, before actually saving.  (This assumes that the variable
- `make-backup-files' is non-`nil'.  Backup files are not written if this
- variable is `nil'.)
- 
-    At your option, Emacs can keep either a single backup file or a
- series of numbered backup files for each file that you edit.
- 
-    Emacs makes a backup for a file only the first time the file is saved
- from one buffer.  No matter how many times you save a file, its backup
- file continues to contain the contents from before the file was visited.
- Normally this means that the backup file contains the contents from
- before the current editing session; however, if you kill the buffer and
- then visit the file again, a new backup file will be made by the next
- save.
- 
- * Menu:
- 
- * Names: Backup Names.		How backup files are named;
- 				  choosing single or numbered backup files.
- * Deletion: Backup Deletion.	Emacs deletes excess numbered backups.
- * Copying: Backup Copying.	Backups can be made by copying or renaming.
- 
- 
- File: emacs,  Node: Backup Names,  Next: Backup Deletion,  Up: Backup
- 
- Single or Numbered Backups
- ..........................
- 
-    If you choose to have a single backup file (this is the default),
- the backup file's name is constructed by appending `~' to the file name
- being edited; thus, the backup file for `eval.c' would be `eval.c~'.
- 
-    If you choose to have a series of numbered backup files, backup file
- names are made by appending `.~', the number, and another `~' to the
- original file name.  Thus, the backup files of `eval.c' would be called
- `eval.c.~1~', `eval.c.~2~', and so on, through names like
- `eval.c.~259~' and beyond.
- 
-    If protection stops you from writing backup files under the usual
- names, the backup file is written as `%backup%~' in your home directory.
- Only one such file can exist, so only the most recently made such
- backup is available.
- 
-    The choice of single backup or numbered backups is controlled by the
- variable `version-control'.  Its possible values are
- 
- `t'
-      Make numbered backups.
- 
- `nil'
-      Make numbered backups for files that have numbered backups already.
-      Otherwise, make single backups.
- 
- `never'
-      Do not in any case make numbered backups; always make single
-      backups.
- 
- You can set `version-control' locally in an individual buffer to
- control the making of backups for that buffer's file.  For example,
- Rmail mode locally sets `version-control' to `never' to make sure that
- there is only one backup for an Rmail file.  *Note Locals::.
- 
-    If you set the environment variable `VERSION_CONTROL', to tell
- various GNU utilities what to do with backup files, Emacs also obeys the
- environment variable by setting the Lisp variable `version-control'
- accordingly at startup.  If the environment variable's value is `t' or
- `numbered', then `version-control' becomes `t'; if the value is `nil'
- or `existing', then `version-control' becomes `nil'; if it is `never'
- or `simple', then `version-control' becomes `never'.
- 
-    For files under version control (*note Version Control::.), the
- variable `vc-make-backup-files' determines whether to make backup
- files.  By default, it is `nil', since backup files are redundant when
- you store all the previous versions in a version control system.  *Note
- Editing with VC::.
- 
- 
- File: emacs,  Node: Backup Deletion,  Next: Backup Copying,  Prev: Backup Names,  Up: Backup
- 
- Automatic Deletion of Backups
- .............................
- 
-    To prevent unlimited consumption of disk space, Emacs can delete
- numbered backup versions automatically.  Generally Emacs keeps the
- first few backups and the latest few backups, deleting any in between.
- This happens every time a new backup is made.
- 
-    The two variables `kept-old-versions' and `kept-new-versions'
- control this deletion.  Their values are, respectively the number of
- oldest (lowest-numbered) backups to keep and the number of newest
- (highest-numbered) ones to keep, each time a new backup is made.
- Recall that these values are used just after a new backup version is
- made; that newly made backup is included in the count in
- `kept-new-versions'.  By default, both variables are 2.
- 
-    If `delete-old-versions' is non-`nil', the excess middle versions
- are deleted without a murmur.  If it is `nil', the default, then you
- are asked whether the excess middle versions should really be deleted.
- 
-    Dired's `.' (Period) command can also be used to delete old versions.
- *Note Dired Deletion::.
- 
- 
- File: emacs,  Node: Backup Copying,  Prev: Backup Deletion,  Up: Backup
- 
- Copying vs. Renaming
- ....................
- 
-    Backup files can be made by copying the old file or by renaming it.
- This makes a difference when the old file has multiple names.  If the
- old file is renamed into the backup file, then the alternate names
- become names for the backup file.  If the old file is copied instead,
- then the alternate names remain names for the file that you are
- editing, and the contents accessed by those names will be the new
- contents.
- 
-    The method of making a backup file may also affect the file's owner
- and group.  If copying is used, these do not change.  If renaming is
- used, you become the file's owner, and the file's group becomes the
- default (different operating systems have different defaults for the
- group).
- 
-    Having the owner change is usually a good idea, because then the
- owner always shows who last edited the file.  Also, the owners of the
- backups show who produced those versions.  Occasionally there is a file
- whose owner should not change; it is a good idea for such files to
- contain local variable lists to set `backup-by-copying-when-mismatch'
- locally (*note File Variables::.).
- 
-    The choice of renaming or copying is controlled by three variables.
- Renaming is the default choice.  If the variable `backup-by-copying' is
- non-`nil', copying is used.  Otherwise, if the variable
- `backup-by-copying-when-linked' is non-`nil', then copying is used for
- files that have multiple names, but renaming may still used when the
- file being edited has only one name.  If the variable
- `backup-by-copying-when-mismatch' is non-`nil', then copying is used if
- renaming would cause the file's owner or group to change.
- 
- 
- File: emacs,  Node: Interlocking,  Prev: Backup,  Up: Saving
- 
- Protection against Simultaneous Editing
- ---------------------------------------
- 
-    Simultaneous editing occurs when two users visit the same file, both
- make changes, and then both save them.  If nobody were informed that
- this was happening, whichever user saved first would later find that his
- changes were lost.  On some systems, Emacs notices immediately when the
- second user starts to change the file, and issues an immediate warning.
- 
-    For the sake of systems where that is not possible, and in case
- someone else proceeds to change the file despite the warning, Emacs also
- checks when the file is saved, and issues a second warning if you are
- about to overwrite a file containing another user's changes.  You can
- prevent loss of the other user's work by taking the proper corrective
- action at that time.
- 
-    When you make the first modification in an Emacs buffer that is
- visiting a file, Emacs records that  the file is "locked" by you.  (It
- does this by writing another file in a directory reserved for this
- purpose.)  The lock is removed when you save the changes.  The idea is
- that the file is locked whenever an Emacs buffer visiting it has
- unsaved changes.
- 
-    If you begin to modify the buffer while the visited file is locked by
- someone else, this constitutes a "collision".  When Emacs detects a
- collision, it asks you what to do, by calling the Lisp function
- `ask-user-about-lock'.  You can redefine this function for the sake of
- customization.  The standard definition of this function asks you a
- question and accepts three possible answers:
- 
- `s'
-      Steal the lock.  Whoever was already changing the file loses the
-      lock, and you gain the lock.
- 
- `p'
-      Proceed.  Go ahead and edit the file despite its being locked by
-      someone else.
- 
- `q'
-      Quit.  This causes an error (`file-locked') and the modification
-      you were trying to make in the buffer does not actually take place.
- 
-    Note that locking works on the basis of a file name; if a file has
- multiple names, Emacs does not realize that the two names are the same
- file and cannot prevent two users from editing it simultaneously under
- different names.  However, basing locking on names means that Emacs can
- interlock the editing of new files that will not really exist until
- they are saved.
- 
-    Some systems are not configured to allow Emacs to make locks.  On
- these systems, Emacs cannot detect trouble in advance, but it still can
- detect the collision when you try to save a file and overwrite someone
- else's changes.
- 
-    Every time Emacs saves a buffer, it first checks the
- last-modification date of the existing file on disk to verify that it
- has not changed since the file was last visited or saved.  If the date
- does not match, it implies that changes were made in the file in some
- other way, and these changes are about to be lost if Emacs actually
- does save.  To prevent this, Emacs prints a warning message and asks
- for confirmation before saving.  Occasionally you will know why the
- file was changed and know that it does not matter; then you can answer
- `yes' and proceed.  Otherwise, you should cancel the save with `C-g'
- and investigate the situation.
- 
-    The first thing you should do when notified that simultaneous editing
- has already taken place is to list the directory with `C-u C-x C-d'
- (*note Directories::.).  This shows the file's current author.  You
- should attempt to contact him to warn him not to continue editing.
- Often the next step is to save the contents of your Emacs buffer under a
- different name, and use `diff' to compare the two files.
- 
-    Simultaneous editing checks are also made when you visit with `C-x
- C-f' a file that is already visited and when you start to modify a
- file.  This is not strictly necessary, but it can cause you to find out
- about the collision earlier, when perhaps correction takes less work.
- 
- 
- File: emacs,  Node: Reverting,  Next: Auto Save,  Prev: Saving,  Up: Files
- 
- Reverting a Buffer
- ==================
- 
-    If you have made extensive changes to a file and then change your
- mind about them, you can get rid of them by reading in the previous
- version of the file.  To do this, use `M-x revert-buffer', which
- operates on the current buffer.  Since reverting a buffer
- unintentionally could lose a lot of work, you must confirm this command
- with `yes'.
- 
-    `revert-buffer' keeps point at the same distance (measured in
- characters) from the beginning of the file.  If the file was edited only
- slightly, you will be at approximately the same piece of text after
- reverting as before.  If you have made drastic changes, the same value
- of point in the old file may address a totally different piece of text.
- 
-    Reverting marks the buffer as "not modified" until another change is
- made.
- 
-    Some kinds of buffers whose contents reflect data bases other than
- files, such as Dired buffers, can also be reverted.  For them,
- reverting means recalculating their contents from the appropriate data
- base.  Buffers created randomly with `C-x b' cannot be reverted;
- `revert-buffer' reports an error when asked to do so.
- 
- 
- File: emacs,  Node: Auto Save,  Next: File Aliases,  Prev: Reverting,  Up: Files
- 
- Auto-Saving: Protection Against Disasters
- =========================================
- 
-    Emacs saves all the visited files from time to time (based on
- counting your keystrokes) without being asked.  This is called
- "auto-saving".  It prevents you from losing more than a limited amount
- of work if the system crashes.
- 
-    When Emacs determines that it is time for auto-saving, each buffer is
- considered, and is auto-saved if auto-saving is turned on for it and it
- has been changed since the last time it was auto-saved.  The message
- `Auto-saving...' is displayed in the echo area during auto-saving, if
- any files are actually auto-saved.  Errors occurring during auto-saving
- are caught so that they do not interfere with the execution of commands
- you have been typing.
- 
- * Menu:
- 
- * Files: Auto Save Files.       The file where auto-saved changes are
-                                   actually made until you save the file.
- * Control: Auto Save Control.   Controlling when and how often to auto-save.
- * Recover::		        Recovering text from auto-save files.
- 
- 
- File: emacs,  Node: Auto Save Files,  Next: Auto Save Control,  Up: Auto Save
- 
- Auto-Save Files
- ---------------
- 
-    Auto-saving does not normally save in the files that you visited,
- because it can be very undesirable to save a program that is in an
- inconsistent state when you have made half of a planned change.
- Instead, auto-saving is done in a different file called the "auto-save
- file", and the visited file is changed only when you request saving
- explicitly (such as with `C-x C-s').
- 
-    Normally, the auto-save file name is made by appending `#' to the
- front and rear of the visited file name.  Thus, a buffer visiting file
- `foo.c' is auto-saved in a file `#foo.c#'.  Most buffers that are not
- visiting files are auto-saved only if you request it explicitly; when
- they are auto-saved, the auto-save file name is made by appending `#%'
- to the front and `#' to the rear of buffer name.  For example, the
- `*mail*' buffer in which you compose messages to be sent is auto-saved
- in a file named `#%*mail*#'.  Auto-save file names are made this way
- unless you reprogram parts of Emacs to do something different (the
- functions `make-auto-save-file-name' and `auto-save-file-name-p').  The
- file name to be used for auto-saving in a buffer is calculated when
- auto-saving is turned on in that buffer.
- 
-    When you delete a substantial part of the text in a large buffer,
- auto save turns off temporarily in that buffer.  This is so that if you
- delete text accidentally, it is likely to remain present in the auto
- save file.  To reenable auto-saving after this happens, simply save the
- file explicitly with `C-x C-s'.  Using `C-u 1 M-x auto-save-mode' also
- cancels this particular state.
- 
-    If you want auto-saving to be done in the visited file, set the
- variable `auto-save-visited-file-name' to be non-`nil'.  In this mode,
- there is really no difference between auto-saving and explicit saving.
- 
-    A buffer's auto-save file is deleted when you save the buffer in its
- visited file.  To inhibit this, set the variable
- `delete-auto-save-files' to `nil'.  Changing the visited file name with
- `C-x C-w' or `set-visited-file-name' renames any auto-save file to go
- with the new visited name.
- 
-    When you delete a large amount of a buffer's text, auto-saving turns
- off in that buffer.  This is because if you deleted the text
- unintentionally, you might find the auto-save file more useful if it
- contains the deleted text.  To restart auto-saving in that buffer, save
- the buffer with `C-x C-s', or use `M-x auto-save'.
- 
- 
- File: emacs,  Node: Auto Save Control,  Next: Recover,  Prev: Auto Save Files,  Up: Auto Save
- 
- Controlling Auto-Saving
- -----------------------
- 
-    Each time you visit a file, auto-saving is turned on for that file's
- buffer if the variable `auto-save-default' is non-`nil' (but not in
- batch mode; *note Entering Emacs::.).  The default for this variable is
- `t', so auto-saving is the usual practice for file-visiting buffers.
- Auto-saving can be turned on or off for any existing buffer with the
- command `M-x auto-save-mode'.  Like other minor mode commands, `M-x
- auto-save-mode' turns auto-saving on with a positive argument, off with
- a zero or negative argument; with no argument, it toggles.
- 
-    Emacs does auto-saving periodically based on counting how many
- characters you have typed since the last time auto-saving was done.
- The variable `auto-save-interval' specifies how many characters there
- are between auto-saves.  By default, it is 300.
- 
-    Auto-saving also takes place when you stop typing for a while.  The
- variable `auto-save-timeout' says how many seconds Emacs should wait
- before it does an auto save (and perhaps also a garbage collection).
- (The actual time period is longer if the current buffer is long; this
- is a heuristic which aims to keep out of your way when you are editing
- long buffers in which auto-save takes an appreciable amount of time.)
- Auto-saving during idle periods accomplishes two things: first, it
- makes sure all your work is saved if you go away from the terminal for
- a while; second, it may avoid some auto-saving while you are actually
- typing.
- 
-    Emacs also does auto-saving whenever it gets a fatal error.  This
- includes killing the Emacs job with a shell command such as `kill
- %emacs', or disconnecting a phone line or network connection.
- 
-    You can request an auto-save explicitly with the command `M-x
- do-auto-save'.
- 
- 
- File: emacs,  Node: Recover,  Prev: Auto Save Control,  Up: Auto Save
- 
- Recovering Data from Auto-Saves
- -------------------------------
- 
-    You can use the contents of an auto-save file to recover from a loss
- of data with the command `M-x recover-file RET FILE RET'.  This visits
- FILE and then (after your confirmation) restores the contents from from
- its auto-save file `#FILE#'.  You can then save with `C-x C-s' to put
- the recovered text into FILE itself.  For example, to recover file
- `foo.c' from its auto-save file `#foo.c#', do:
- 
-      M-x recover-file RET foo.c RET
-      yes RET
-      C-x C-s
- 
-    Before asking for confirmation, `M-x recover-file' displays a
- directory listing describing the specified file and the auto-save file,
- so you can compare their sizes and dates.  If the auto-save file is
- older, `M-x recover-file' does not offer to read it.
- 
-    If Emacs or the computer crashes, you can recover all the files you
- were editing from their auto save files with the command `M-x
- recover-session'.  This first shows you a list of recorded interrupted
- sessions.  Move point to the one you choose, and type `C-c C-c'.
- 
-    Then `recover-session' asks about each of the files that were being
- edited during that session, asking whether to recover that file.  If
- you answer `y', it calls `recover-file', which works in its normal
- fashion.  It shows the dates of the original file and its auto-save
- file, and asks once again whether to recover that file.
- 
-    When `recover-session' is done, the files you've chosen to recover
- are present in Emacs buffers.  You should then save them.  Only
- this--saving them--updates the files themselves.
- 
- 
- File: emacs,  Node: File Aliases,  Next: Version Control,  Prev: Auto Save,  Up: Files
- 
- File Name Aliases
- =================
- 
-    Symbolic links and hard links both make it possible for several file
- names to refer to the same file.  Hard links are alternate names that
- refer directly to the file; all the names are equally valid, and no one
- of them is preferred.  By contrast, a symbolic link is a kind of defined
- alias: when `foo' is a symbolic link to `bar', you can use either name
- to refer to the file, but `bar' is the real name, while `foo' is just
- an alias.  More complex cases occur when symbolic links point to
- directories.
- 
-    If you visit two names for the same file, normally Emacs makes two
- different buffers, but it warns you about the situation.
- 
-    If you wish to avoid visiting the same file in two buffers under
- different names, set the variable `find-file-existing-other-name' to a
- non-`nil' value.  Then `find-file' uses the existing buffer visiting
- the file, no matter which of the file's names you specify.
- 
-    If the variable `find-file-visit-truename' is non-`nil', then the
- file name recorded for a buffer is the file's "truename" (made by
- replacing all symbolic links with their target names), rather than the
- name you specify.  Setting `find-file-visit-truename' also implies the
- effect of `find-file-existing-other-name'.
- 
- 
- File: emacs,  Node: Version Control,  Next: Directories,  Prev: File Aliases,  Up: Files
- 
- Version Control
- ===============
- 
-    "Version control systems" are packages that can record multiple
- versions of a source file, usually storing the unchanged parts of the
- file just once.  Version control systems also record history information
- such as the creation time of each version, who created it, and a
- description of what was changed in that version.
- 
-    The Emacs version control commands work with three version control
- systems--RCS, CVS and SCCS.  The GNU project recommends the version
- control system known as RCS, which is free software and available from
- the Free Software Foundation.
- 
- * Menu:
- 
- * Version Systems::             Supported version control back end systems.
- * VC Concepts::                 Basic version control information;
-                                   checking files in and out.
- * Editing with VC::             Commands for editing a file maintained
-                                   with version control.
- * Log Entries::                 Logging your changes.
- * Change Logs and VC::          Generating a change log file from log entries.
- * Old Versions::                Examining and comparing old versions.
- * Branches::                    Selecting a branch to put your changes in,
-                                   and creating a new branch.
- * Status in VC::                Commands to view the VC status of files and
-                                   look at log entries.
- * Renaming and VC::             A command to rename both the source and
-                                   master file correctly.
- * Snapshots::                   How to make and use snapshots, a set of
-                                   file versions that can be treated as a unit.
- * Version Headers::             Inserting version control headers into
-                                   working files.
- * Customizing VC::              Variables to change VC's behavior.
- 
- 
- File: emacs,  Node: Version Systems,  Next: VC Concepts,  Up: Version Control
- 
- Supported Version Control Systems
- ---------------------------------
- 
-    VC currently works with three different version control systems or
- "back ends": RCS, CVS, and SCCS.
- 
-    RCS is a free version control system that is available from the Free
- Software Foundation.  It is perhaps the most mature of the supported
- back ends, and the VC commands are conceptually closest to RCS.  Almost
- everything you can do with RCS can be done through VC.
- 
-    CVS is built on top of RCS, and extends the features of RCS, allowing
- for more sophisticated release management, and concurrent multi-user
- development.  However, its concepts are rather different from those of
- RCS and VC; consequently, some VC commands work differently when used
- with CVS.  Note that before using CVS you must set up a repository,
- which is a subject too complex to treat here.  *Note CVS and VC::.
- 
-    SCCS is a proprietary but widely used version control system.  In
- terms of capabilities, it is the weakest of the the three that VC
- supports.  VC compensates for certain features missing in SCCS
- (snapshots, for example) by implementing them itself, but some other VC
- features, such as multiple branches, are not available with SCCS.  You
- should use SCCS only if for some reason you cannot use RCS.
- 
- 
- File: emacs,  Node: VC Concepts,  Next: Editing with VC,  Prev: Version Systems,  Up: Version Control
- 
- Concepts of Version Control
- ---------------------------
- 
-    When a file is under version control, we also say that it is
- "registered" in the version control system.  Each registered file has a
- corresponding "master file" which represents the file's present state
- plus its change history, so that you can reconstruct from it either the
- current version or any specified earlier version.  Usually the master
- file also records a "log entry" for each version describing what was
- changed in that version.
- 
-    The file that is maintained under version control is sometimes called
- the "work file" corresponding to its master file.
- 
-    To examine a file, you "check it out".  This extracts a version of
- the source file (typically, the most recent) from the master file.  If
- you want to edit the file, you must check it out "locked".  Only one
- user can do this at a time for any given source file.  (This kind of
- locking is completely unrelated to the locking that Emacs uses to detect
- simultaneous editing of a file.)
- 
-    When you are done with your editing, you must "check in" the new
- version.  This records the new version in the master file, and unlocks
- the source file so that other people can lock it and thus modify it.
- 
-    Checkin and checkout are the basic operations of version control.
- You can do both of them with a single Emacs command: `C-x C-q'
- (`vc-toggle-read-only').
- 
-    A "snapshot" is a coherent collection of versions of the various
- files that make up a program.  *Note Snapshots::.
- 
-    The model of checkin and checkout does not quite fit CVS.  CVS has no
- such thing as locking; multiple users can simultaneously edit their
- copies of a file, and then check in their own variants of the file, but
- these variants must be reconciled later.  *Note CVS and VC::.
- 
--- 0 ----
Index: emacs/info/emacs-7
diff -c emacs/info/emacs-7:1.1.1.2 emacs/info/emacs-7:removed
*** emacs/info/emacs-7:1.1.1.2	Mon Jul 22 01:52:36 1996
--- emacs/info/emacs-7	Fri Aug  2 20:16:28 1996
***************
*** 1,1130 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Editing with VC,  Next: Log Entries,  Prev: VC Concepts,  Up: Version Control
- 
- Editing with Version Control
- ----------------------------
- 
-    These are the commands for editing a file maintained with version
- control:
- 
- `C-x C-q'
- `C-x v v'
-      Check the visited file in or out.
- 
- `C-x v u'
-      Revert the buffer and the file to the last checked in version.
- 
- `C-x v c'
-      Remove the last-entered change from the master for the visited
-      file.  This undoes your last check-in.
- 
- `C-x v i'
-      Register the visited file for version control.
- 
- (`C-x v' is the prefix key for version control commands; all of these
- commands except for `C-x C-q' start with `C-x v'.)
- 
- * Menu:
- 
- * Check-Out::                   Checking out a file so you can edit it.
- * Check-In::                    After you edit, you check in your changes
-                                   to make a new version.
- * Version Control Undo::        Canceling changes before or after checkin.
- * Registering::                 How to start using version control
-                                   for a file.
- * VC Mode Line::                Mode line indicates version and lock status.
- * CVS and VC::                  Checkout and checkin work differently in CVS.
- 
- 
- File: emacs,  Node: Check-Out,  Next: Check-In,  Up: Editing with VC
- 
- Check-Out
- .........
- 
-    When you want to modify a file maintained with version control, type
- `C-x C-q' (`vc-toggle-read-only').  This "checks out" the file, and
- tells RCS or SCCS to lock the file.  This means making the file
- writable for you (but not for anyone else).
- 
-    If you specify a prefix argument (`C-u C-x C-q') for checkout, Emacs
- asks you for a version number, and checks out that version *unlocked*.
- This lets you move to old versions, or existing branches of the file
- (*note Branches::.).  You can then start editing the selected version
- by typing `C-x C-q' again.  (If you edit an old version of a file this
- way, checking it in again creates a new branch.)
- 
- 
- File: emacs,  Node: Check-In,  Next: Version Control Undo,  Prev: Check-Out,  Up: Editing with VC
- 
- Check-In
- ........
- 
-    When you are finished editing the file, type `C-x C-q' again.  When
- used on a file that is checked out, this command checks the file in.
- But check-in does not start immediately; first, you must enter the "log
- entry"--a description of the changes in the new version.  `C-x C-q'
- pops up a buffer for you to enter this in.  When you are finished
- typing in the log entry, type `C-c C-c' to terminate it; this is when
- actual check-in takes place.  *Note Log Entries::.
- 
-    With RCS and SCCS, a checked-out file is also "locked", which means
- it is writable for you, but not for anyone else.  As long as you own
- the lock on the file, nobody else can modify it, and nobody can check
- in any changes to that particular version.  Checking in your changes
- unlocks the file, so that other users can lock it and modify it.
- 
-    CVS, on the contrary, doesn't have a concept of locking.  The working
- files are always modifiable, allowing concurrent development, with
- possible conflicts being resolved at check-in time.  *Note CVS and VC::.
- 
-    To specify the version number for the new version, type `C-u C-x
- C-q' to check in a file.  Then Emacs asks you for the new version number
- in the minibuffer.  This can be used to create a new "branch" of the
- file (*note Branches::.), or to increment the file's major version
- number.
- 
-    It is not impossible to lock a file that someone else has locked.  If
- you try to check out a file that is locked, `C-x C-q' asks you whether
- you want to "steal the lock."  If you say yes, the file becomes locked
- by you, but a message is sent to the person who had formerly locked the
- file, to inform him of what has happened.  The mode line indicates that
- a file is locked by someone else by displaying the login name of that
- person, before the version number.
- 
- 
- File: emacs,  Node: Registering,  Next: VC Mode Line,  Prev: Version Control Undo,  Up: Editing with VC
- 
- Registering a File for Version Control
- ......................................
- 
- `C-x v i'
-      Register the visited file for version control.
- 
-    You can put any file under version control by simply visiting it, and
- then typing `C-x v i' (`vc-register'). After `C-x v i', the file is
- unlocked and read-only.  Type `C-x C-q' if you wish to start editing it.
- 
-    When you register the file, Emacs must choose which version control
- system to use for it.  You can specify your choice explicitly by setting
- `vc-default-back-end' to `RCS', `CVS' or `SCCS'.  Otherwise, if there
- is a subdirectory named `RCS', `SCCS', or `CVS', Emacs uses the
- corresponding version control system.  In the absence of any
- specification, the default choice is RCS if RCS is installed, otherwise
- SCCS.
- 
-    After registering a file with CVS, you must subsequently commit the
- initial version by typing `C-x C-q'.  *Note CVS and VC::.
- 
-    The initial version number for a newly registered file is 1.1, by
- default.  To specify a different number, give `C-x v i' a numeric
- argument; then it reads the initial version number using the minibuffer.
- 
-    If `vc-initial-comment' is non-`nil', `C-x v i' reads an initial
- comment (much like a log entry) to describe the purpose of this source
- file.
- 
- 
- File: emacs,  Node: Version Control Undo,  Next: Registering,  Prev: Check-In,  Up: Editing with VC
- 
- Undoing Version Control Actions
- ...............................
- 
- `C-x v u'
-      Revert the buffer and the file to the last checked in version.
- 
- `C-x v c'
-      Remove the last-entered change from the master for the visited
-      file.  This undoes your last checkin.
- 
-    If you want to discard your current set of changes and revert to the
- last version checked in, use `C-x v u' (`vc-revert-buffer').  This
- cancels your last check-out, leaving the file unlocked.  If you want to
- make a different set of changes, you must first check the file out
- again.  `C-x v u' requires confirmation, unless it sees that you
- haven't made any changes since the last checked-in version.
- 
-    `C-x v u' is also the command to use to unlock a file if you lock it
- and then decide not to change it.
- 
-    You can cancel a change after checking it in, with `C-x v c'
- (`vc-cancel-version').  This command discards all record of the most
- recent checked in version.  `C-x v c' also offers to revert your work
- file and buffer to the previous version (the one that precedes the
- version that is deleted).  If you say `no', then the buffer and work
- file do not change.
- 
-    Be careful when invoking `C-x v c', as it is easy to throw away a
- lot of work with it.  To help you be careful, this command always
- requires confirmation with `yes'.
- 
- 
- File: emacs,  Node: VC Mode Line,  Next: CVS and VC,  Prev: Registering,  Up: Editing with VC
- 
- The VC Mode Line
- ................
- 
-    When you visit a file that is under version control, the mode line
- indicates the current status of the file: the name of the version
- control back end system, the locking state, and the version.
- 
-    The locking state is displayed as a single character, which can be
- either `-' or `:'.  `-' means the file is not locked or not modified by
- you.  Once you lock the file, the state indicator changes to `:'.  If
- the file is locked by someone else, that user's name appears after the
- version number.
- 
-    For example, `RCS-1.3' means you are looking at RCS version 1.3,
- which is not locked.  `RCS:1.3' means that you have locked the file,
- and possibly already changed it.  `RCS:jim:1.3' means that the file is
- locked by jim.
- 
- 
- File: emacs,  Node: CVS and VC,  Prev: VC Mode Line,  Up: Editing with VC
- 
- Using VC with CVS
- .................
- 
-    In CVS, files are never locked.  Two users can check out the same
- file at the same time; each user has a separate copy and can edit it.
- Work files are always writable; once you have one, you need not type a
- VC command to start editing the file.  You can edit it at any time.
- 
-    CVS terminology speaks of "committing" a change rather than checking
- it in.  But in practical terms they work the same way: Emacs asks you
- to type in a log entry, and you finish it with `C-c C-c'.  When using
- RCS and SCCS, you normally use `C-x C-q' twice for each change; once
- before the change, for checkout, and once after, for checkin.  With
- CVS, it's different: you normally use `C-x C-q' just once for each
- change, to commit the change when it is done.  The work file remains
- writable, so you can begin editing again with no special commands.
- 
-    When you commit a change in a file, and someone else has committed
- another change in the meanwhile, that creates a "conflict".  Then `C-x
- C-q' asks you to resolve the conflict and try again.
- 
-    VC does not provide a way to check out a working copy of an existing
- file in the repository.  You have to use the CVS shell commands to do
- that.  Once you have a work file, you can start using VC for that file.
- 
-    You can turn off use of VC for CVS-managed files by setting the
- variable `vc-handle-cvs' to `nil'.  If you do this, Emacs treats these
- files as if they were not managed, and the VC commands are not
- available for them.  You must do all CVS operations manually.
- 
- 
- File: emacs,  Node: Log Entries,  Next: Change Logs and VC,  Prev: Editing with VC,  Up: Version Control
- 
- Log Entries
- -----------
- 
-    When you're editing an initial comment or log entry for inclusion in
- a master file, finish your entry by typing `C-c C-c'.
- 
- `C-c C-c'
-      Finish the comment edit normally (`vc-finish-logentry').  This
-      finishes check-in.
- 
-    To abort check-in, just *don't* type `C-c C-c' in that buffer.  You
- can switch buffers and do other editing.  As long as you don't try to
- check in another file, the entry you were editing remains in its
- buffer, and you can go back to that buffer at any time to complete the
- check-in.
- 
-    If you change several source files for the same reason, it is often
- convenient to specify the same log entry for many of the files.  To do
- this, use the history of previous log entries.  The commands `M-n',
- `M-p', `M-s' and `M-r' for doing this work just like the minibuffer
- history commands (except that these versions are used outside the
- minibuffer).
- 
-    Each time you check in a file, the log entry buffer is put into VC
- Log mode, which involves running two hooks: `text-mode-hook' and
- `vc-log-mode-hook'.  *Note Hooks::.
- 
- 
- File: emacs,  Node: Change Logs and VC,  Next: Old Versions,  Prev: Log Entries,  Up: Version Control
- 
- Change Logs and VC
- ------------------
- 
-    If you use RCS for a program and also maintain a change log file for
- it (*note Change Log::.), you can generate change log entries
- automatically from the version control log entries:
- 
- `C-x v a'
-      Visit the current directory's change log file and create new
-      entries for versions checked in since the most recent entry in the
-      change log file (`vc-update-change-log').
- 
-      This command works with RCS only; it does not work with CVS or
-      SCCS.
- 
-    For example, suppose the first line of `ChangeLog' is dated 10 April
- 1992, and that the only check-in since then was by Nathaniel Bowditch
- to `rcs2log' on 8 May 1992 with log text `Ignore log messages that
- start with `#'.'.  Then `C-x v a' visits `ChangeLog' and inserts text
- like this:
- 
-      Fri May  8 21:45:00 1992  Nathaniel Bowditch  <nat@apn.org>
-      
-              * rcs2log: Ignore log messages that start with `#'.
- 
- You can then edit the new change log entry further as you wish.
- 
-    Normally, the log entry for file `foo' is displayed as `* foo: TEXT
- OF LOG ENTRY'.  The `:' after `foo' is omitted if the text of the log
- entry starts with `(FUNCTIONNAME): '.  For example, if the log entry
- for `vc.el' is `(vc-do-command): Check call-process status.', then the
- text in `ChangeLog' looks like this:
- 
-      Wed May  6 10:53:00 1992  Nathaniel Bowditch  <nat@apn.org>
-      
-              * vc.el (vc-do-command): Check call-process status.
- 
-    When `C-x v a' adds several change log entries at once, it groups
- related log entries together if they all are checked in by the same
- author at nearly the same time.  If the log entries for several such
- files all have the same text, it coalesces them into a single entry.
- For example, suppose the most recent checkins have the following log
- entries:
- 
- * For `vc.texinfo': `Fix expansion typos.'
- * For `vc.el': `Don't call expand-file-name.'
- * For `vc-hooks.el': `Don't call expand-file-name.'
- 
- They appear like this in `ChangeLog':
- 
-      Wed Apr  1 08:57:59 1992  Nathaniel Bowditch  <nat@apn.org>
-      
-              * vc.texinfo: Fix expansion typos.
-      
-              * vc.el, vc-hooks.el: Don't call expand-file-name.
- 
-    Normally, `C-x v a' separates log entries by a blank line, but you
- can mark several related log entries to be clumped together (without an
- intervening blank line) by starting the text of each related log entry
- with a label of the form `{CLUMPNAME} '.  The label itself is not
- copied to `ChangeLog'.  For example, suppose the log entries are:
- 
- * For `vc.texinfo': `{expand} Fix expansion typos.'
- * For `vc.el': `{expand} Don't call expand-file-name.'
- * For `vc-hooks.el': `{expand} Don't call expand-file-name.'
- 
- Then the text in `ChangeLog' looks like this:
- 
-      Wed Apr  1 08:57:59 1992  Nathaniel Bowditch  <nat@apn.org>
-      
-              * vc.texinfo: Fix expansion typos.
-              * vc.el, vc-hooks.el: Don't call expand-file-name.
- 
-    A log entry whose text begins with `#' is not copied to `ChangeLog'.
- For example, if you merely fix some misspellings in comments, you can
- log the change with an entry beginning with `#' to avoid putting such
- trivia into `ChangeLog'.
- 
- 
- File: emacs,  Node: Old Versions,  Next: Branches,  Prev: Change Logs and VC,  Up: Version Control
- 
- Examining And Comparing Old Versions
- ------------------------------------
- 
- `C-u C-x C-q VERSION RET'
-      Select version VERSION as the current work file version.
- 
- `C-x v ~ VERSION RET'
-      Examine version VERSION of the visited file, in a buffer of its
-      own.
- 
- `C-x v ='
-      Compare the current buffer contents with the latest checked-in
-      version of the file.
- 
- `C-u C-x v = FILE RET OLDVERS RET NEWVERS RET'
-      Compare the specified two versions of FILE.
- 
-    There are two ways to work with an old version of a file.  You can
- make the old version your current work file, for example if you want to
- reproduce a former stage of development, or if you want to create a
- branch from the old version (*note Branches::.).  To do this, visit the
- file and type `C-u C-x C-q VERSION RET'.  (This works only with RCS.)
- 
-    If you want only to examine an old version, without changing your
- work file, visit the file and then type `C-x v ~ VERSION RET'
- (`vc-version-other-window').  This puts the text of version VERSION in
- a file named `FILENAME.~VERSION~', and visits it in its own buffer in a
- separate window.
- 
-    To compare two versions of a file, use the command `C-x v ='
- (`vc-diff').  Plain `C-x v =' compares the current buffer contents
- (saving them in the file if necessary) with the last checked-in version
- of the file.  `C-u C-x v =', with a numeric argument, reads a file name
- and two version numbers, then compares those versions of the specified
- file.
- 
-    If you supply a directory name instead of the name of a work file,
- this command compares the two specified versions of all registered files
- in that directory and its subdirectories.  You can also specify a
- snapshot name (*note Snapshots::.) instead of one or both version
- numbers.
- 
-    You can specify a checked-in version by its number; an empty input
- specifies the current contents of the work file (which may be different
- from all the checked-in versions).
- 
-    This command works by running the `diff' utility, getting the
- options from the variable `diff-switches'.  It displays the output in a
- special buffer in another window.  Unlike the `M-x diff' command, `C-x
- v =' does not try to locate the changes in the old and new versions.
- This is because normally one or both versions do not exist as files
- when you compare them; they exist only in the records of the master
- file.  *Note Comparing Files::, for more information about `M-x diff'.
- 
- 
- File: emacs,  Node: Branches,  Next: Status in VC,  Prev: Old Versions,  Up: Version Control
- 
- Multiple Branches of a File
- ---------------------------
- 
-    One use of version control is to maintain multiple "current"
- versions of a file.  For example, you might have different versions of a
- program in which you are gradually adding various unfinished new
- features.  Each such independent line of development is called a
- "branch".  VC allows you to create branches, and switch between
- existing branches.  Note, however, that branches are supported only with
- RCS.
- 
-    A file's main line of development is usually called the "trunk".
- The versions on the trunk are normally numbered 1.1, 1.2, 1.3, etc.  At
- any such version, you may start an independent branch.  A branch
- starting at version 1.2 would have version number 1.2.1.1.  Consecutive
- versions on this branch would have numbers 1.2.1.2, 1.2.1.3, 1.2.1.4,
- and so on.  If there is a second branch also starting at version 1.2; it
- would consist of versions 1.2.2.1, 1.2.2.2, 1.2.2.3, and so on.
- 
-    If you omit the final component of a version number, that is called a
- "branch number".  It refers to the highest existing version on that
- branch.  The branches in the example above have branch numbers 1.2.1 and
- 1.2.2.
- 
-    A version which is the last in its branch is called a "head" version.
- 
- * Menu:
- 
- * Switching Branches::    How to get to another existing branch.
- * Creating Branches::     How to start a new branch.
- * Multi-User Branching::  Multiple users working at multiple branches
-                             in parallel.
- 
- 
- File: emacs,  Node: Switching Branches,  Next: Creating Branches,  Up: Branches
- 
- Switching between Branches
- ..........................
- 
-    To switch between branches, type `C-u C-x C-q' and specify the
- version number you want to select.  This version is then checked out
- *unlocked* (write-protected), so you can examine it before really
- checking it out.  Switching branches in this way is allowed only when
- the file is not locked.
- 
-    You may omit the minor version number, thus giving only the branch
- number; this takes you to the highest version on the indicated branch.
- If you only type `RET', Emacs goes to the highest version on the trunk.
- 
-    After you have switched to any branch (including the main branch),
- you stay on it for subsequent VC commands, until you explicitly select
- some other branch.
- 
- 
- File: emacs,  Node: Creating Branches,  Next: Multi-User Branching,  Prev: Switching Branches,  Up: Branches
- 
- Creating New Branches
- .....................
- 
-    To create a new branch from a head version (one that is the latest in
- the branch that contains it), first select that version if necessary,
- lock it with `C-x C-q', and make whatever changes you want.  Then, when
- you check in the changes, use `C-u C-x C-q'.  This lets you specify the
- version number for the new version.  You should specify a suitable
- branch number for a branch starting at the current version.  For
- example, if the current version is 2.5, the branch number should be
- 2.5.1, 2.5.2, and so on, depending on the number of existing branches at
- that point.
- 
-    To create a new branch at an older version (one that is no longer the
- head of a branch), first select that version, lock it with `C-x C-q',
- and make your changes.  Then type `C-x C-q' again to check in a new
- version.  This automatically creates a new branch starting from the
- selected version.  You need not specially request a new branch, because
- that's the only way to add a new version at a point that is not the
- head of a branch.
- 
-    After the branch is created, you "stay" on it.  That means that
- subsequent checkouts and checkins create new versions on that branch.
- To leave the branch, you must explicitly select a different version with
- `C-u C-x C-q' for checkout.
- 
- 
- File: emacs,  Node: Multi-User Branching,  Prev: Creating Branches,  Up: Branches
- 
- Multi-User Branching
- ....................
- 
-    It is sometimes useful for multiple developers to work simultaneously
- on different branches of a file.  This is possible if you create
- multiple source directories.  Each source directory should have a link
- named `RCS' which points to a common directory of RCS master files.
- Then each source directory can have its own choice of versions checked
- out, but all share the same common RCS records.
- 
-    This technique works reliably and automatically, provided that the
- source files contain RCS version headers (*note Version Headers::.).
- The headers enable Emacs to be sure, at all times, which version number
- is present in the work file.
- 
-    If the files do not have version headers, you must instead tell Emacs
- explicitly in each session which branch you are working on.  To do this,
- first find the file, then type `C-u C-x C-q' and specify the correct
- branch number.  This ensures that Emacs knows which branch it is using
- during this particular editing session.
- 
- 
- File: emacs,  Node: Status in VC,  Next: Renaming and VC,  Prev: Branches,  Up: Version Control
- 
- VC Status Commands
- ------------------
- 
-    To view the detailed version control status and history of a file,
- type `C-x v l' (`vc-print-log').  It displays the history of changes to
- the current file, including the text of the log entries.  The output
- appears in a separate window.
- 
-    When you are working on a large program, it's often useful to find
- all the files that are currently locked, or all the files maintained in
- version control at all.  You can use `C-x v d' (`vc-directory') to show
- all the locked files in or beneath the current directory.  This
- includes all files that are locked by any user.  `C-u C-x v d' lists
- all files in or beneath the current directory that are maintained with
- version control.
- 
-    The list of files is displayed as a buffer that uses an augmented
- Dired mode.  The names of the users locking various files are shown (in
- parentheses) in place of the owner and group.  All the normal Dired
- commands work in this buffer.  Most interactive VC commands work also,
- and apply to the file name on the current line.
- 
-    The `C-x v v' command (`vc-next-action'), when used in the augmented
- Dired buffer, operates on all the marked files (or the file on the
- current line).  If it operates on more than one file, it handles each
- file according to its current state; thus, it may check out one file
- and check in another (because it is already checked out).  If it has to
- check in any files, it reads a single log entry, then uses that text
- for all the files being checked in.  This can be convenient for
- registering or checking in several files at once, as part of the same
- change.
- 
- 
- File: emacs,  Node: Renaming and VC,  Next: Snapshots,  Prev: Status in VC,  Up: Version Control
- 
- Renaming VC Work Files and Master Files
- ---------------------------------------
- 
-    When you rename a registered file, you must also rename its master
- file correspondingly to get proper results.  Use `vc-rename-file' to
- rename the source file as you specify, and rename its master file
- accordingly.  It also updates any snapshots (*note Snapshots::.) that
- mention the file, so that they use the new name; despite this, the
- snapshot thus modified may not completely work (*note Snapshot
- Caveats::.).
- 
-    You cannot use `vc-rename-file' on a file that is locked by someone
- else.
- 
- 
- File: emacs,  Node: Snapshots,  Next: Version Headers,  Prev: Renaming and VC,  Up: Version Control
- 
- Snapshots
- ---------
- 
-    A "snapshot" is a named set of file versions (one for each
- registered file) that you can treat as a unit.  One important kind of
- snapshot is a "release", a (theoretically) stable version of the system
- that is ready for distribution to users.
- 
- * Menu:
- 
- * Making Snapshots::		The snapshot facilities.
- * Snapshot Caveats::		Things to be careful of when using snapshots.
- 
- 
- File: emacs,  Node: Making Snapshots,  Next: Snapshot Caveats,  Up: Snapshots
- 
- Making and Using Snapshots
- ..........................
- 
-    There are two basic commands for snapshots; one makes a snapshot
- with a given name, the other retrieves a named snapshot.
- 
- `C-x v s NAME RET'
-      Define the last saved versions of every registered file in or
-      under the current directory as a snapshot named NAME
-      (`vc-create-snapshot').
- 
- `C-x v r NAME RET'
-      Check out all registered files at or below the current directory
-      level using whatever versions correspond to the snapshot NAME
-      (`vc-retrieve-snapshot').
- 
-      This command reports an error if any files are locked at or below
-      the current directory, without changing anything; this is to avoid
-      overwriting work in progress.
- 
-    A snapshot uses a very small amount of resources--just enough to
- record the list of file names and which version belongs to the
- snapshot.  Thus, you need not hesitate to create snapshots whenever
- they are useful.
- 
-    You can give a snapshot name as an argument to `C-x v =' or `C-x v
- ~' (*note Old Versions::.).  Thus, you can use it to compare a snapshot
- against the current files, or two snapshots against each other, or a
- snapshot against a named version.
- 
- 
- File: emacs,  Node: Snapshot Caveats,  Prev: Making Snapshots,  Up: Snapshots
- 
- Snapshot Caveats
- ................
- 
-    VC's snapshot facilities are modeled on RCS's named-configuration
- support.  They use RCS's native facilities for this, so under VC
- snapshots made using RCS are visible even when you bypass VC.
- 
-    For SCCS, VC implements snapshots itself.  The files it uses contain
- name/file/version-number triples.  These snapshots are visible only
- through VC.
- 
-    A snapshot is a set of checked-in versions.  So make sure that all
- the files are checked in and not locked when you make a snapshot.
- 
-    File renaming and deletion can create some difficulties with
- snapshots.  This is not a VC-specific problem, but a general design
- issue in version control systems that no one has solved very well yet.
- 
-    If you rename a registered file, you need to rename its master along
- with it (the command `vc-rename-file' does this automatically).  If you
- are using SCCS, you must also update the records of the snapshot, to
- mention the file by its new name (`vc-rename-file' does this, too).  An
- old snapshot that refers to a master file that no longer exists under
- the recorded name is invalid; VC can no longer retrieve it.  It would
- be beyond the scope of this manual to explain enough about RCS and SCCS
- to explain how to update the snapshots by hand.
- 
-    Using `vc-rename-file' makes the snapshot remain valid for
- retrieval, but it does not solve all problems.  For example, some of the
- files in the program probably refer to others by name.  At the very
- least, the makefile probably mentions the file that you renamed.  If you
- retrieve an old snapshot, the renamed file is retrieved under its new
- name, which is not the name that the makefile expects.  So the program
- won't really work as retrieved.
- 
- 
- File: emacs,  Node: Version Headers,  Next: Customizing VC,  Prev: Snapshots,  Up: Version Control
- 
- Inserting Version Control Headers
- ---------------------------------
- 
-    Sometimes it is convenient to put version identification strings
- directly into working files.  Certain special strings called "version
- headers" are replaced in each successive version by the number of that
- version.
- 
-    If you are using RCS, and version headers are present in your working
- files, Emacs can use them to determine the current version and the
- locking state of the files.  This is more reliable than referring to the
- master files, which is done when there are no version headers.  Note
- that in a multi-branch environment, version headers are necessary to
- make VC behave correctly (*note Multi-User Branching::.).
- 
-    Searching for version headers is controlled by the variable
- `vc-consult-headers'.  If it is non-`nil', Emacs searches for headers
- to determine the version number you are editing.  Setting it to `nil'
- disables this feature.
- 
-    You can use the `C-x v h' command (`vc-insert-headers') to insert a
- suitable header string.
- 
- `C-x v h'
-      Insert headers in a file for use with your version-control system.
- 
-    The default header string is `$Id$' for RCS and `%W%' for SCCS.  You
- can specify other headers to insert by setting the variable
- `vc-header-alist'.  Its value is a list of elements of the form
- `(PROGRAM . STRING)' where PROGRAM is `RCS' or `SCCS' and STRING is the
- string to use.
- 
-    Instead of a single string, you can specify a list of strings; then
- each string in the list is inserted as a separate header on a line of
- its own.
- 
-    It is often necessary to use "superfluous" backslashes when writing
- the strings that you put in this variable.  This is to prevent the
- string in the constant from being interpreted as a header itself if the
- Emacs Lisp file containing it is maintained with version control.
- 
-    Each header is inserted surrounded by tabs, inside comment
- delimiters, on a new line at the start of the buffer.  Normally the
- ordinary comment start and comment end strings of the current mode are
- used, but for certain modes, there are special comment delimiters for
- this purpose; the variable `vc-comment-alist' specifies them.  Each
- element of this list has the form `(MODE STARTER ENDER)'.
- 
-    The variable `vc-static-header-alist' specifies further strings to
- add based on the name of the buffer.  Its value should be a list of
- elements of the form `(REGEXP . FORMAT)'.  Whenever REGEXP matches the
- buffer name, FORMAT is inserted as part of the header.  A header line
- is inserted for each element that matches the buffer name, and for each
- string specified by `vc-header-alist'.  The header line is made by
- processing the string from `vc-header-alist' with the format taken from
- the element.  The default value for `vc-static-header-alist' is as
- follows:
- 
-      (("\\.c$" .
-        "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n\
-      #endif /* lint */\n"))
- 
- It specifies insertion of text of this form:
- 
- 
-      #ifndef lint
-      static char vcid[] = "STRING";
-      #endif /* lint */
- 
- Note that the text above starts with a blank line.
- 
-    If you use more than one version header in a file, put them close
- together in the file.  The mechanism in `revert-buffer' that preserves
- markers may not handle markers positioned between two version headers.
- 
- 
- File: emacs,  Node: Customizing VC,  Prev: Version Headers,  Up: Version Control
- 
- Customizing VC
- --------------
- 
-    Emacs normally does not save backup files for source files that are
- maintained with version control.  If you want to make backup files even
- for files that use version control, set the variable
- `vc-make-backup-files' to a non-`nil' value.
- 
-    Normally the work file exists all the time, whether it is locked or
- not.  If you set `vc-keep-workfiles' to `nil', then checking in a new
- version with `C-x C-q' deletes the work file; but any attempt to visit
- the file with Emacs creates it again.  (With CVS, work files are always
- kept.)
- 
-    If `vc-suppress-confirm' is non-`nil', then `C-x C-q' and `C-x v i'
- can save the current buffer without asking, and `C-x v u' also operates
- without asking for confirmation.  (This variable does not affect `C-x v
- c'; that operation is so drastic that it should always ask for
- confirmation.)
- 
-    VC mode does much of its work by running the shell commands for RCS,
- CVS and SCCS.  If `vc-command-messages' is non-`nil', VC displays
- messages to indicate which shell commands it runs, and additional
- messages when the commands finish.
- 
-    When deducing the locked/unlocked state of a file, VC first looks for
- an RCS version header string in the file (*note Version Headers::.).  If
- there is no header string (or if the backend system is SCCS), VC
- normally looks at the file permissions of the work file; this is fast.
- But there might be situations when the file permissions cannot be
- trusted.  In this case the master file has to be consulted, which is
- rather expensive.  Also the master file can only tell you *if* there's
- any lock on the file, but not whether your work file really contains
- that locked version.
- 
-    You can tell VC not to use version headers to determine lock status
- by setting `vc-consult-headers' to `nil'.  VC then always uses the file
- permissions (if it can trust them), or else checks the master file.
- 
-    You can specify the criterion for whether to trust the file
- permissions by setting the variable `vc-mistrust-permissions'.  Its
- value may be `t' (always mistrust the file permissions and check the
- master file), `nil' (always trust the file permissions), or a function
- of one argument which makes the decision.  The argument is the
- directory name of the `RCS', `CVS' or `SCCS' subdirectory.  A non-`nil'
- value from the function says to mistrust the file permissions.  If you
- find that the file permissions of work files are changed erroneously,
- set `vc-mistrust-permissions' to `t'.  Then VC always checks the master
- file to determine the file's status.
- 
-    You can specify additional directories to search for version control
- programs by setting the variable `vc-path'.  These directories are
- searched before the usual search path.  But the proper files are usually
- found automatically.
- 
- 
- File: emacs,  Node: Directories,  Next: Comparing Files,  Prev: Version Control,  Up: Files
- 
- File Directories
- ================
- 
-    The file system groups files into "directories".  A "directory
- listing" is a list of all the files in a directory.  Emacs provides
- commands to create and delete directories, and to make directory
- listings in brief format (file names only) and verbose format (sizes,
- dates, and authors included).  There is also a directory browser called
- Dired; see *Note Dired::.
- 
- `C-x C-d DIR-OR-PATTERN RET'
-      Display a brief directory listing (`list-directory').
- 
- `C-u C-x C-d DIR-OR-PATTERN RET'
-      Display a verbose directory listing.
- 
- `M-x make-directory RET DIRNAME RET'
-      Create a new directory named DIRNAME.
- 
- `M-x delete-directory RET DIRNAME RET'
-      Delete the directory named DIRNAME.  It must be empty, or you get
-      an error.
- 
-    The command to display a directory listing is `C-x C-d'
- (`list-directory').  It reads using the minibuffer a file name which is
- either a directory to be listed or a wildcard-containing pattern for
- the files to be listed.  For example,
- 
-      C-x C-d /u2/emacs/etc RET
- 
- lists all the files in directory `/u2/emacs/etc'.  Here is an example
- of specifying a file name pattern:
- 
-      C-x C-d /u2/emacs/src/*.c RET
- 
-    Normally, `C-x C-d' prints a brief directory listing containing just
- file names.  A numeric argument (regardless of value) tells it to make
- a verbose listing including sizes, dates, and authors (like `ls -l').
- 
-    The text of a directory listing is obtained by running `ls' in an
- inferior process.  Two Emacs variables control the switches passed to
- `ls': `list-directory-brief-switches' is a string giving the switches
- to use in brief listings (`"-CF"' by default), and
- `list-directory-verbose-switches' is a string giving the switches to
- use in a verbose listing (`"-l"' by default).
- 
- 
- File: emacs,  Node: Comparing Files,  Next: Misc File Ops,  Prev: Directories,  Up: Files
- 
- Comparing Files
- ===============
- 
-    The command `M-x diff' compares two files, displaying the
- differences in an Emacs buffer named `*Diff*'.  It works by running the
- `diff' program, using options taken from the variable `diff-switches',
- whose value should be a string.
- 
-    The buffer `*Diff*' has Compilation mode as its major mode, so you
- can use `C-x `' to visit successive changed locations in the two source
- files.  You can also move to a particular hunk of changes and type RET
- or `C-c C-c', or click `Mouse-2' on it, to move to the corresponding
- source location.  You can also use the other special commands of
- Compilation mode: SPC and DEL for scrolling, and `M-p' and `M-n' for
- cursor motion.  *Note Compilation::.
- 
-    The command `M-x diff-backup' compares a specified file with its most
- recent backup.  If you specify the name of a backup file, `diff-backup'
- compares it with the source file that it is a backup of.
- 
-    The command `M-x compare-windows' compares the text in the current
- window with that in the next window.  Comparison starts at point in each
- window, and each starting position is pushed on the mark ring in its
- respective buffer.  Then point moves forward in each window, a character
- at a time, until a mismatch between the two windows is reached.  Then
- the command is finished.  For more information about windows in Emacs,
- *Note Windows::.
- 
-    With a numeric argument, `compare-windows' ignores changes in
- whitespace.  If the variable `compare-ignore-case' is non-`nil', it
- ignores differences in case as well.
- 
-    See also *Note Emerge::, for convenient facilities for merging two
- similar files.
- 
- 
- File: emacs,  Node: Misc File Ops,  Prev: Comparing Files,  Up: Files
- 
- Miscellaneous File Operations
- =============================
- 
-    Emacs has commands for performing many other operations on files.
- All operate on one file; they do not accept wild card file names.
- 
-    `M-x view-file' allows you to scan or read a file by sequential
- screenfuls.  It reads a file name argument using the minibuffer.  After
- reading the file into an Emacs buffer, `view-file' displays the
- beginning.  You can then type SPC to scroll forward one windowful, or
- DEL to scroll backward.  Various other commands are provided for moving
- around in the file, but none for changing it; type `C-h' while viewing
- for a list of them.  They are mostly the same as normal Emacs cursor
- motion commands.  To exit from viewing, type `C-c'.  The commands for
- viewing are defined by a special major mode called View mode.
- 
-    A related command, `M-x view-buffer', views a buffer already present
- in Emacs.  *Note Misc Buffer::.
- 
-    `M-x insert-file' inserts a copy of the contents of the specified
- file into the current buffer at point, leaving point unchanged before
- the contents and the mark after them.
- 
-    `M-x write-region' is the inverse of `M-x insert-file'; it copies
- the contents of the region into the specified file.  `M-x
- append-to-file' adds the text of the region to the end of the specified
- file.  *Note Accumulating Text::.
- 
-    `M-x delete-file' deletes the specified file, like the `rm' command
- in the shell.  If you are deleting many files in one directory, it may
- be more convenient to use Dired (*note Dired::.).
- 
-    `M-x rename-file' reads two file names OLD and NEW using the
- minibuffer, then renames file OLD as NEW.  If a file named NEW already
- exists, you must confirm with `yes' or renaming is not done; this is
- because renaming causes the old meaning of the name NEW to be lost.  If
- OLD and NEW are on different file systems, the file OLD is copied and
- deleted.
- 
-    The similar command `M-x add-name-to-file' is used to add an
- additional name to an existing file without removing its old name.  The
- new name must belong on the same file system that the file is on.
- 
-    `M-x copy-file' reads the file OLD and writes a new file named NEW
- with the same contents.  Confirmation is required if a file named NEW
- already exists, because copying has the consequence of overwriting the
- old contents of the file NEW.
- 
-    `M-x make-symbolic-link' reads two file names OLD and LINKNAME, then
- creates a symbolic link named LINKNAME and pointing at OLD.  The effect
- is that future attempts to open file LINKNAME will refer to whatever
- file is named OLD at the time the opening is done, or will get an error
- if the name OLD is not in use at that time.  This command does not
- expand the argument FILENAME, so that it allows you to specify a
- relative name as the target of the link.
- 
-    Confirmation is required when creating the link if LINKNAME is in
- use.  Note that not all systems support symbolic links.
- 
- 
- File: emacs,  Node: Buffers,  Next: Windows,  Prev: Files,  Up: Top
- 
- Using Multiple Buffers
- **********************
- 
-    The text you are editing in Emacs resides in an object called a
- "buffer".  Each time you visit a file, a buffer is created to hold the
- file's text.  Each time you invoke Dired, a buffer is created to hold
- the directory listing.  If you send a message with `C-x m', a buffer
- named `*mail*' is used to hold the text of the message.  When you ask
- for a command's documentation, that appears in a buffer called `*Help*'.
- 
-    At any time, one and only one buffer is "selected".  It is also
- called the "current buffer".  Often we say that a command operates on
- "the buffer" as if there were only one; but really this means that the
- command operates on the selected buffer (most commands do).
- 
-    When Emacs has multiple windows, each window has a chosen buffer
- which is displayed there, but at any time only one of the windows is
- selected and its chosen buffer is the selected buffer.  Each window's
- mode line displays the name of the buffer that the window is displaying
- (*note Windows::.).
- 
-    Each buffer has a name, which can be of any length, and you can
- select any buffer by giving its name.  Most buffers are made by
- visiting files, and their names are derived from the files' names.  But
- you can also create an empty buffer with any name you want.  A newly
- started Emacs has a buffer named `*scratch*' which can be used for
- evaluating Lisp expressions in Emacs.  The distinction between upper
- and lower case matters in buffer names.
- 
-    Each buffer records individually what file it is visiting, whether
- it is modified, and what major mode and minor modes are in effect in it
- (*note Major Modes::.).  Any Emacs variable can be made "local to" a
- particular buffer, meaning its value in that buffer can be different
- from the value in other buffers.  *Note Locals::.
- 
- * Menu:
- 
- * Select Buffer::      Creating a new buffer or reselecting an old one.
- * List Buffers::       Getting a list of buffers that exist.
- * Misc Buffer::	       Renaming; changing read-onliness; copying text.
- * Kill Buffer::	       Killing buffers you no longer need.
- * Several Buffers::    How to go through the list of all buffers
- 			 and operate variously on several of them.
- * Indirect Buffers::   An indirect buffer shares the text of another buffer.
- 
- 
- File: emacs,  Node: Select Buffer,  Next: List Buffers,  Up: Buffers
- 
- Creating and Selecting Buffers
- ==============================
- 
- `C-x b BUFFER RET'
-      Select or create a buffer named BUFFER (`switch-to-buffer').
- 
- `C-x 4 b BUFFER RET'
-      Similar, but select BUFFER in another window
-      (`switch-to-buffer-other-window').
- 
- `C-x 5 b BUFFER RET'
-      Similar, but select BUFFER in a separate frame
-      (`switch-to-buffer-other-frame').
- 
-    To select the buffer named BUFNAME, type `C-x b BUFNAME RET'.  This
- runs the command `switch-to-buffer' with argument BUFNAME.  You can use
- completion on an abbreviation for the buffer name you want (*note
- Completion::.).  An empty argument to `C-x b' specifies the most
- recently selected buffer that is not displayed in any window.
- 
-    Most buffers are created by visiting files, or by Emacs commands that
- want to display some text, but you can also create a buffer explicitly
- by typing `C-x b BUFNAME RET'.  This makes a new, empty buffer which is
- not visiting any file, and selects it for editing.  Such buffers are
- used for making notes to yourself.  If you try to save one, you are
- asked for the file name to use.  The new buffer's major mode is
- determined by the value of `default-major-mode' (*note Major Modes::.).
- 
-    Note that `C-x C-f', and any other command for visiting a file, can
- also be used to switch to an existing file-visiting buffer.  *Note
- Visiting::.
- 
- 
- File: emacs,  Node: List Buffers,  Next: Misc Buffer,  Prev: Select Buffer,  Up: Buffers
- 
- Listing Existing Buffers
- ========================
- 
- `C-x C-b'
-      List the existing buffers (`list-buffers').
- 
-    To display a list of all the buffers that exist, type `C-x C-b'.
- Each line in the list shows one buffer's name, major mode and visited
- file.  The buffers are listed in the order, most recently visited first.
- 
-    `*' at the beginning of a line indicates the buffer is "modified".
- If several buffers are modified, it may be time to save some with `C-x
- s' (*note Saving::.).  `%' indicates a read-only buffer.  `.' marks the
- selected buffer.  Here is an example of a buffer list:
- 
-       MR Buffer         Size  Mode           File
-       -- ------         ----  ----           ----
-      .*  emacs.tex      383402 Texinfo       /u2/emacs/man/emacs.tex
-          *Help*         1287  Fundamental
-          files.el       23076 Emacs-Lisp     /u2/emacs/lisp/files.el
-        % RMAIL          64042 RMAIL          /u/rms/RMAIL
-       *% man            747   Dired          /u2/emacs/man/
-          net.emacs      343885 Fundamental   /u/rms/net.emacs
-          fileio.c       27691 C              /u2/emacs/src/fileio.c
-          NEWS           67340 Text           /u2/emacs/etc/NEWS
-          *scratch*	   0	 Lisp Interaction
- 
- Note that the buffer `*Help*' was made by a help request; it is not
- visiting any file.  The buffer `man' was made by Dired on the directory
- `/u2/emacs/man/'.
- 
- 
- File: emacs,  Node: Misc Buffer,  Next: Kill Buffer,  Prev: List Buffers,  Up: Buffers
- 
- Miscellaneous Buffer Operations
- ===============================
- 
- `C-x C-q'
-      Toggle read-only status of buffer (`vc-toggle-read-only').
- 
- `M-x rename-buffer RET NAME RET'
-      Change the name of the current buffer.
- 
- `M-x rename-uniquely'
-      Rename the current buffer by adding `<NUMBER>' to the end.
- 
- `M-x view-buffer RET BUFFER RET'
-      Scroll through buffer BUFFER.
- 
-    A buffer can be "read-only", which means that commands to change its
- contents are not allowed.  The mode line indicates read-only buffers
- with `%%' or `%*' near the left margin.  Read-only buffers are usually
- made by subsystems such as Dired and Rmail that have special commands
- to operate on the text; also by visiting a file whose access control
- says you cannot write it.
- 
-    If you wish to make changes in a read-only buffer, use the command
- `C-x C-q' (`vc-toggle-read-only').  It makes a read-only buffer
- writable, and makes a writable buffer read-only.  In most cases, this
- works by setting the variable `buffer-read-only', which has a local
- value in each buffer and makes the buffer read-only if its value is
- non-`nil'.  If the file is maintained with version control, `C-x C-q'
- works through the version control system to change the read-only status
- of the file as well as the buffer.  *Note Version Control::.
- 
-    `M-x rename-buffer' changes the name of the current buffer.  Specify
- the new name as a minibuffer argument.  There is no default.  If you
- specify a name that is in use for some other buffer, an error happens
- and no renaming is done.
- 
-    `M-x rename-uniquely' renames the current buffer to a similar name
- with a numeric suffix added to make it both different and unique.  This
- command does not need an argument.  It is useful for creating multiple
- shell buffers: if you rename the `*Shell*' buffer, then do `M-x shell'
- again, it makes a new shell buffer named `*Shell*'; meanwhile, the old
- shell buffer continues to exist under its new name.  This method is
- also good for mail buffers, compilation buffers, and most Emacs
- features that create special buffers with particular names.
- 
-    `M-x view-buffer' is much like `M-x view-file' (*note Misc File
- Ops::.) except that it examines an already existing Emacs buffer.  View
- mode provides commands for scrolling through the buffer conveniently
- but not for changing it.  When you exit View mode, the value of point
- that resulted from your perusal remains in effect.
- 
-    The commands `M-x append-to-buffer' and `M-x insert-buffer' can be
- used to copy text from one buffer to another.  *Note Accumulating
- Text::.
- 
- 
- File: emacs,  Node: Kill Buffer,  Next: Several Buffers,  Prev: Misc Buffer,  Up: Buffers
- 
- Killing Buffers
- ===============
- 
-    If you continue an Emacs session for a while, you may accumulate a
- large number of buffers.  You may then find it convenient to "kill" the
- buffers you no longer need.  On most operating systems, killing a
- buffer releases its space back to the operating system so that other
- programs can use it.  Here are some commands for killing buffers:
- 
- `C-x k BUFNAME RET'
-      Kill buffer BUFNAME (`kill-buffer').
- 
- `M-x kill-some-buffers'
-      Offer to kill each buffer, one by one.
- 
-    `C-x k' (`kill-buffer') kills one buffer, whose name you specify in
- the minibuffer.  The default, used if you type just RET in the
- minibuffer, is to kill the current buffer.  If you kill the current
- buffer, another buffer is selected; one that has been selected recently
- but does not appear in any window now.  If you ask to kill a
- file-visiting buffer that is modified (has unsaved editing), then you
- must confirm with `yes' before the buffer is killed.
- 
-    The command `M-x kill-some-buffers' asks about each buffer, one by
- one.  An answer of `y' means to kill the buffer.  Killing the current
- buffer or a buffer containing unsaved changes selects a new buffer or
- asks for confirmation just like `kill-buffer'.
- 
-    The buffer menu feature (*note Several Buffers::.) is also convenient
- for killing various buffers.
- 
-    If you want to do something special every time a buffer is killed,
- you can add hook functions to the hook `kill-buffer-hook' (*note
- Hooks::.).
- 
--- 0 ----
Index: emacs/info/emacs-8
diff -c emacs/info/emacs-8:1.1.1.2 emacs/info/emacs-8:removed
*** emacs/info/emacs-8:1.1.1.2	Mon Jul 22 01:52:38 1996
--- emacs/info/emacs-8	Fri Aug  2 20:17:06 1996
***************
*** 1,1186 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Several Buffers,  Next: Indirect Buffers,  Prev: Kill Buffer,  Up: Buffers
- 
- Operating on Several Buffers
- ============================
- 
-    The "buffer-menu" facility is like a "Dired for buffers"; it allows
- you to request operations on various Emacs buffers by editing an Emacs
- buffer containing a list of them.  You can save buffers, kill them
- (here called "deleting" them, for consistency with Dired), or display
- them.
- 
- `M-x buffer-menu'
-      Begin editing a buffer listing all Emacs buffers.
- 
-    The command `buffer-menu' writes a list of all Emacs buffers into
- the buffer `*Buffer List*', and selects that buffer in Buffer Menu
- mode.  The buffer is read-only, and can be changed only through the
- special commands described in this section.  The usual Emacs cursor
- motion commands can be used in the `*Buffer List*' buffer.  The
- following commands apply to the buffer described on the current line.
- 
- `d'
-      Request to delete (kill) the buffer, then move down.  The request
-      shows as a `D' on the line, before the buffer name.  Requested
-      deletions take place when you type the `x' command.
- 
- `C-d'
-      Like `d' but move up afterwards instead of down.
- 
- `s'
-      Request to save the buffer.  The request shows as an `S' on the
-      line.  Requested saves take place when you type the `x' command.
-      You may request both saving and deletion for the same buffer.
- 
- `x'
-      Perform previously requested deletions and saves.
- 
- `u'
-      Remove any request made for the current line, and move down.
- 
- `DEL'
-      Move to previous line and remove any request made for that line.
- 
-    The `d', `C-d', `s' and `u' commands to add or remove flags also
- move down (or up) one line.  They accept a numeric argument as a repeat
- count.
- 
-    These commands operate immediately on the buffer listed on the
- current line:
- 
- `~'
-      Mark the buffer "unmodified".  The command `~' does this
-      immediately when you type it.
- 
- `%'
-      Toggle the buffer's read-only flag.  The command `%' does this
-      immediately when you type it.
- 
- `t'
-      Visit the buffer as a tags table.  *Note Select Tags Table::.
- 
-    There are also commands to select another buffer or buffers:
- 
- `q'
-      Quit the buffer menu--immediately display the most recent formerly
-      visible buffer in its place.
- 
- `RET'
- `f'
-      Immediately select this line's buffer in place of the `*Buffer
-      List*' buffer.
- 
- `o'
-      Immediately select this line's buffer in another window as if by
-      `C-x 4 b', leaving `*Buffer List*' visible.
- 
- `C-o'
-      Immediately display this line's buffer in another window, but don't
-      select the window.
- 
- `1'
-      Immediately select this line's buffer in a full-screen window.
- 
- `2'
-      Immediately set up two windows, with this line's buffer in one,
-      and the previously selected buffer (aside from the buffer `*Buffer
-      List*') in the other.
- 
- `m'
-      Mark this line's buffer to be displayed in another window if you
-      exit with the `v' command.  The request shows as a `>' at the
-      beginning of the line.  (A single buffer may not have both a delete
-      request and a display request.)
- 
- `v'
-      Immediately select this line's buffer, and also display in other
-      windows any buffers previously marked with the `m' command.  If
-      you have not marked any buffers, this command is equivalent to `1'.
- 
-    All that `buffer-menu' does directly is create and switch to a
- suitable buffer, and turn on Buffer Menu mode.  Everything else
- described above is implemented by the special commands provided in
- Buffer Menu mode.  One consequence of this is that you can switch from
- the `*Buffer List*' buffer to another Emacs buffer, and edit there.
- You can reselect the `*Buffer List*' buffer later, to perform the
- operations already requested, or you can kill it, or pay no further
- attention to it.
- 
-    The only difference between `buffer-menu' and `list-buffers' is that
- `buffer-menu' switches to the `*Buffer List*' buffer in the selected
- window; `list-buffers' displays it in another window.  If you run
- `list-buffers' (that is, type `C-x C-b') and select the buffer list
- manually, you can use all of the commands described here.
- 
-    The buffer `*Buffer List*' is not updated automatically when buffers
- are created and killed; its contents are just text.  If you have
- created, deleted or renamed buffers, the way to update `*Buffer List*'
- to show what you have done is to type `g' (`revert-buffer') or repeat
- the `buffer-menu' command.
- 
- 
- File: emacs,  Node: Indirect Buffers,  Prev: Several Buffers,  Up: Buffers
- 
- Indirect Buffers
- ================
- 
-    An "indirect buffer" shares the text of some other buffer, which is
- called the "base buffer" of the indirect buffer.  In some ways it is
- the analogue, for buffers, of a symbolic link between files.
- 
- `M-x make-indirect-buffer BASE-BUFFER RET INDIRECT-NAME RET'
-      Create an indirect buffer named INDIRECT-NAME whose base buffer is
-      BASE-BUFFER.
- 
-    The text of the indirect buffer is always identical to the text of
- its base buffer; changes made by editing either one are visible
- immediately in the other.  But in all other respects, the indirect
- buffer and its base buffer are completely separate.  They have
- different names, different values of point, different narrowing,
- different markers, different major modes, and different local variables.
- 
-    An indirect buffer cannot visit a file, but its base buffer can.  If
- you try to save the indirect buffer, that actually works by saving the
- base buffer.  Killing the base buffer effectively kills the indirect
- buffer, but killing an indirect buffer has no effect on its base buffer.
- 
-    One way to use indirect buffers is to display multiple views of an
- outline.  *Note Outline Views::.
- 
- 
- File: emacs,  Node: Windows,  Next: Frames,  Prev: Buffers,  Up: Top
- 
- Multiple Windows
- ****************
- 
-    Emacs can split a frame into two or many windows.  Multiple windows
- can display parts of different buffers, or different parts of one
- buffer.  Multiple frames always imply multiple windows, because each
- frame has its own set of windows.  Each window belongs to one and only
- one frame.
- 
- * Menu:
- 
- * Basic Window::       Introduction to Emacs windows.
- * Split Window::       New windows are made by splitting existing windows.
- * Other Window::       Moving to another window or doing something to it.
- * Pop Up Window::      Finding a file or buffer in another window.
- * Force Same Window::  Forcing certain buffers to appear in the selected
-                          window rather than in another window.
- * Change Window::      Deleting windows and changing their sizes.
- 
- 
- File: emacs,  Node: Basic Window,  Next: Split Window,  Up: Windows
- 
- Concepts of Emacs Windows
- =========================
- 
-    Each Emacs window displays one Emacs buffer at any time.  A single
- buffer may appear in more than one window; if it does, any changes in
- its text are displayed in all the windows where it appears.  But the
- windows showing the same buffer can show different parts of it, because
- each window has its own value of point.
- 
-    At any time, one of the windows is the "selected window"; the buffer
- this window is displaying is the current buffer.  The terminal's cursor
- shows the location of point in this window.  Each other window has a
- location of point as well, but since the terminal has only one cursor
- there is no way to show where those locations are.  When multiple
- frames are visible in X Windows, each frame has a cursor which appears
- in the frame's selected window.  The cursor in the selected frame is
- solid; the cursor in other frames is a hollow box.
- 
-    Commands to move point affect the value of point for the selected
- Emacs window only.  They do not change the value of point in any other
- Emacs window, even one showing the same buffer.  The same is true for
- commands such as `C-x b' to change the selected buffer in the selected
- window; they do not affect other windows at all.  However, there are
- other commands such as `C-x 4 b' that select a different window and
- switch buffers in it.  Also, all commands that display information in a
- window, including (for example) `C-h f' (`describe-function') and `C-x
- C-b' (`list-buffers'), work by switching buffers in a nonselected window
- without affecting the selected window.
- 
-    When multiple windows show the same buffer, they can have different
- regions, because they can have different values of point.  This means
- that in Transient Mark mode, each window highlights a different part of
- the buffer.  The part that is highlighted in the selected window is the
- region that editing commands use.
- 
-    Each window has its own mode line, which displays the buffer name,
- modification status and major and minor modes of the buffer that is
- displayed in the window.  *Note Mode Line::, for full details on the
- mode line.
- 
- 
- File: emacs,  Node: Split Window,  Next: Other Window,  Prev: Basic Window,  Up: Windows
- 
- Splitting Windows
- =================
- 
- `C-x 2'
-      Split the selected window into two windows, one above the other
-      (`split-window-vertically').
- 
- `C-x 3'
-      Split the selected window into two windows positioned side by side
-      (`split-window-horizontally').
- 
- `C-Mouse-2'
-      In the mode line or scroll bar of a window, split that window.
- 
-    The command `C-x 2' (`split-window-vertically') breaks the selected
- window into two windows, one above the other.  Both windows start out
- displaying the same buffer, with the same value of point.  By default
- the two windows each get half the height of the window that was split; a
- numeric argument specifies how many lines to give to the top window.
- 
-    `C-x 3' (`split-window-horizontally') breaks the selected window
- into two side-by-side windows.  A numeric argument specifies how many
- columns to give the one on the left.  A line of vertical bars separates
- the two windows.  Windows that are not the full width of the screen
- have mode lines, but they are truncated; also, they do not always
- appear in inverse video, because the Emacs display routines have not
- been taught how to display a region of inverse video that is only part
- of a line on the screen.
- 
-    You can split a window horizontally or vertically by clicking
- `C-Mouse-2' in the mode line or the scroll bar.  The line of splitting
- goes through the place where you click: if you click on the mode line,
- the new scroll bar goes above the spot; if you click in the scroll bar,
- the mode line of the split window is side by side with your click.
- 
-    When a window is less than the full width, text lines too long to
- fit are frequent.  Continuing all those lines might be confusing.  The
- variable `truncate-partial-width-windows' can be set non-`nil' to force
- truncation in all windows less than the full width of the screen,
- independent of the buffer being displayed and its value for
- `truncate-lines'.  *Note Continuation Lines::.
- 
-    Horizontal scrolling is often used in side-by-side windows.  *Note
- Display::.
- 
-    If `split-window-keep-point' is non-nil, `C-x 2' tries to avoid
- shifting any text on the screen by putting point in whichever window
- happens to contain the screen line the cursor is already on.  The
- default is that `split-window-keep-point' is non-nil on slow terminals.
- 
- 
- File: emacs,  Node: Other Window,  Next: Pop Up Window,  Prev: Split Window,  Up: Windows
- 
- Using Other Windows
- ===================
- 
- `C-x o'
-      Select another window (`other-window').  That is `o', not zero.
- 
- `C-M-v'
-      Scroll the next window (`scroll-other-window').
- 
- `M-x compare-windows'
-      Find next place where the text in the selected window does not
-      match the text in the next window.
- 
- `Mouse-1'
-      `Mouse-1', in a window's mode line, selects that window but does
-      not move point in it (`mouse-select-region').
- 
-    To select a different window, click with `Mouse-1' on its mode line.
- With the keyboard, you can switch windows by typing `C-x o'
- (`other-window').  That is an `o', for `other', not a zero.  When there
- are more than two windows, this command moves through all the windows
- in a cyclic order, generally top to bottom and left to right.  After
- the rightmost and bottommost window, it goes back to the one at the
- upper left corner.  A numeric argument means to move several steps in
- the cyclic order of windows.  A negative argument moves around the
- cycle in the opposite order.  When the minibuffer is active, the
- minibuffer is the last window in the cycle; you can switch from the
- minibuffer window to one of the other windows, and later switch back and
- finish supplying the minibuffer argument that is requested.  *Note
- Minibuffer Edit::.
- 
-    The usual scrolling commands (*note Display::.) apply to the selected
- window only, but there is one command to scroll the next window.
- `C-M-v' (`scroll-other-window') scrolls the window that `C-x o' would
- select.  It takes arguments, positive and negative, like `C-v'.  (In
- the minibuffer, `C-M-v' scrolls the window that contains the minibuffer
- help display, if any, rather than the next window in the standard
- cyclic order.)
- 
-    The command `M-x compare-windows' lets you compare two files or
- buffers visible in two windows, by moving through them to the next
- mismatch.  *Note Comparing Files::, for details.
- 
- 
- File: emacs,  Node: Pop Up Window,  Next: Force Same Window,  Prev: Other Window,  Up: Windows
- 
- Displaying in Another Window
- ============================
- 
-    `C-x 4' is a prefix key for commands that select another window
- (splitting the window if there is only one) and select a buffer in that
- window.  Different `C-x 4' commands have different ways of finding the
- buffer to select.
- 
- `C-x 4 b BUFNAME RET'
-      Select buffer BUFNAME in another window.  This runs
-      `switch-to-buffer-other-window'.
- 
- `C-x 4 C-o BUFNAME RET'
-      Display buffer BUFNAME in another window, but don't select that
-      buffer or that window.  This runs `display-buffer'.
- 
- `C-x 4 f FILENAME RET'
-      Visit file FILENAME and select its buffer in another window.  This
-      runs `find-file-other-window'.  *Note Visiting::.
- 
- `C-x 4 d DIRECTORY RET'
-      Select a Dired buffer for directory DIRECTORY in another window.
-      This runs `dired-other-window'.  *Note Dired::.
- 
- `C-x 4 m'
-      Start composing a mail message in another window.  This runs
-      `mail-other-window'; its same-window analogue is `C-x m' (*note
-      Sending Mail::.).
- 
- `C-x 4 .'
-      Find a tag in the current tags table, in another window.  This runs
-      `find-tag-other-window', the multiple-window variant of `M-.'
-      (*note Tags::.).
- 
- `C-x 4 r FILENAME RET'
-      Visit file FILENAME read-only, and select its buffer in another
-      window.  This runs `find-file-read-only-other-window'.  *Note
-      Visiting::.
- 
- 
- File: emacs,  Node: Force Same Window,  Next: Change Window,  Prev: Pop Up Window,  Up: Windows
- 
- Forcing Display in the Same Window
- ==================================
- 
-    Certain Emacs commands switch to a specific buffer with special
- contents.  For example, `M-x shell' switches to a buffer named
- `*Shell*'.  By convention, all these commands are written to pop up the
- buffer in a separate window.  But you can specify that certain of these
- buffers should appear in the selected window.
- 
-    If you add a buffer name to the list `same-window-buffer-names', the
- effect is that such commands display that particular buffer by
- switching to it in the selected window.  For example, if you add the
- element `"*grep*"' to the list, the `grep' command will display its
- output buffer in the selected window.
- 
-    The default value of `same-window-buffer-names' is not `nil'.  It
- specifies the buffers `*info*', `*mail*' and `*shell*'.  This is why
- `M-x shell' normally switches to the `*shell*' buffer in the selected
- window.  If you delete this element from the value of
- `same-window-buffer-names', the behavior of `M-x shell' will change--it
- will pop up the buffer in another window instead.
- 
-    You can specify these buffers more generally with the variable
- `same-window-regexps'.  Set it to a list of regular expressions; then
- any buffer whose name matches one of those regular expressions is
- displayed by switching to it in the selected window.  (Once again, this
- applies only to buffers that normally get displayed for you in a
- separate window.)  The default value of this variable specifies Telnet
- and rlogin buffers.
- 
-    An analogous feature lets you specify buffers which should be
- displayed in their own individual frames.  *Note Special Buffer
- Frames::.
- 
- 
- File: emacs,  Node: Change Window,  Prev: Force Same Window,  Up: Windows
- 
- Deleting and Rearranging Windows
- ================================
- 
- `C-x 0'
-      Delete the selected window (`delete-window').  That is a zero.
- 
- `C-x 1'
-      Delete all windows in the selected frame except the selected window
-      (`delete-other-windows').
- 
- `C-x ^'
-      Make selected window taller (`enlarge-window').
- 
- `C-x }'
-      Make selected window wider (`enlarge-window-horizontally').
- 
- `Drag-Mouse-1'
-      Dragging a window's mode line up or down with `Mouse-1' changes
-      window heights.
- 
- `Mouse-2'
-      `Mouse-2' in a window's mode line deletes all other windows in the
-      frame (`mouse-delete-other-windows').
- 
- `Mouse-3'
-      `Mouse-3' in a window's mode line deletes that window
-      (`mouse-delete-window').
- 
-    To delete a window, type `C-x 0' (`delete-window').  (That is a
- zero.)  The space occupied by the deleted window is given to an
- adjacent window (but not the minibuffer window, even if that is active
- at the time).  Once a window is deleted, its attributes are forgotten;
- only restoring a window configuration can bring it back.  Deleting the
- window has no effect on the buffer it used to display; the buffer
- continues to exist, and you can select it in any window with `C-x b'.
- 
-    `C-x 1' (`delete-other-windows') is more powerful than `C-x 0'; it
- deletes all the windows except the selected one (and the minibuffer);
- the selected window expands to use the whole frame except for the echo
- area.
- 
-    You can also delete a window by clicking on its mode line with
- `Mouse-2', and expand a window to fill its frame by clicking on its
- mode line with `Mouse-3'.
- 
-    The easiest way to adjust window heights is with a mouse.  If you
- press `Mouse-1' on a mode line, you can drag that mode line up or down,
- changing the heights of the windows above and below it.
- 
-    To readjust the division of space among vertically adjacent windows,
- use `C-x ^' (`enlarge-window').  It makes the currently selected window
- get one line bigger, or as many lines as is specified with a numeric
- argument.  With a negative argument, it makes the selected window
- smaller.  `C-x }' (`enlarge-window-horizontally') makes the selected
- window wider by the specified number of columns.  The extra screen
- space given to a window comes from one of its neighbors, if that is
- possible.  If this makes any window too small, it is deleted and its
- space is given to an adjacent window.  The minimum size is specified by
- the variables `window-min-height' and `window-min-width'.
- 
-    *Note Minibuffer Edit::, for information about the Resize-Minibuffer
- mode, which automatically changes the size of the minibuffer window to
- fit the text in the minibuffer.
- 
- 
- File: emacs,  Node: Frames,  Next: Major Modes,  Prev: Windows,  Up: Top
- 
- Frames and X Windows
- ********************
- 
-    When using the X Window System, you can create multiple windows at
- the X level in a single Emacs session.  Each X window that belongs to
- Emacs displays a "frame" which can contain one or several Emacs windows.
- A frame initially contains a single general-purpose Emacs window which
- you can subdivide vertically or horizontally into smaller windows.  A
- frame normally contains its own echo area and minibuffer, but you can
- make frames that don't have these--they use the echo area and
- minibuffer of another frame.
- 
-    Editing you do in one frame also affects the other frames.  For
- instance, if you put text in the kill ring in one frame, you can yank it
- in another frame.  If you exit Emacs through `C-x C-c' in one frame, it
- terminates all the frames.  To delete just one frame, use `C-x 5 0'.
- 
-    To avoid confusion, we reserve the word "window" for the
- subdivisions that Emacs implements, and never use it to refer to a
- frame.
- 
- * Menu:
- 
- * Mouse Commands::     Moving, cutting, and pasting, with the mouse.
- * Secondary Selection::Cutting without altering point and mark.
- * Mouse References::   Using the mouse to select an item from a list.
- * Menu Mouse Clicks::  Mouse clicks that bring up menus.
- * Mode Line Mouse::    Mouse clicks on the mode line.
- * Creating Frames::    Creating additional Emacs frames with various contents.
- * Multiple Displays::  How one Emacs job can talk to several displays.
- * Special Buffer Frames::  You can make certain buffers have their own frames.
- * Frame Parameters::   Changing the colors and other modes of frames.
- * Scroll Bars::	       How to enable and disable scroll bars; how to use them.
- * Menu Bars::	       Enabling and disabling the menu bar.
- * Faces::	       How to change the display style using faces.
- * Modifying Faces::    How to change what a particular face looks like.
- * Misc X::	       Iconifying and deleting frames.	Region highlighting.
- 
- 
- File: emacs,  Node: Mouse Commands,  Next: Secondary Selection,  Up: Frames
- 
- Mouse Commands for Editing
- ==========================
- 
-    The mouse commands for selecting and copying a region are mostly
- compatible with the `xterm' program.  You can use the same mouse
- commands for copying between Emacs and other X client programs.
- 
- `Mouse-1'
-      Move point to where you click (`mouse-set-point').  This is
-      normally the left button.
- 
- `Drag-Mouse-1'
-      Set the region to the text you select by dragging, and copy it to
-      the kill ring (`mouse-set-region').  You can specify both ends of
-      the region with this single command.
- 
-      If you move the mouse off the top or bottom of the window while
-      dragging, the window scrolls at a steady rate until you move the
-      mouse back into the window.  This way, you can select regions that
-      don't fit entirely on the screen.
- 
- `Mouse-2'
-      Yank the last killed text, where you click (`mouse-yank-at-click').
-      This is normally the middle button.
- 
- `Mouse-3'
-      This command, `mouse-save-then-kill', has several functions
-      depending on where you click and the status of the region.
- 
-      The most basic case is when you click `Mouse-1' in one place and
-      then `Mouse-3' in another.  This selects the text between those two
-      positions as the region.  It also copies the new region to the kill
-      ring, so that you can copy it to someplace else.
- 
-      If you click `Mouse-1', scroll with the scroll bar, and then click
-      `Mouse-3', it remembers where point was before scrolling (where you
-      put it with `Mouse-1'), and uses that position as the other end of
-      the region.  This is so that you can select a region that doesn't
-      fit entirely on the screen.
- 
-      More generally, if you do not have a highlighted region, `Mouse-3'
-      selects the text between point and the click position as the
-      region.  It does this by setting the mark where point was, and
-      moving point to where you click.
- 
-      If you have a highlighted region, or if the region was set just
-      before by dragging button 1, `Mouse-3' adjusts the nearer end of
-      the region by moving it to where you click.  The adjusted region's
-      text also replaces the old region's text in the kill ring.
- 
-      If you originally specified the region using a double or triple
-      `Mouse-1', so that the region is defined to consist of entire words
-      or lines, then adjusting the region with `Mouse-3' also proceeds by
-      entire words or lines.
- 
-      If you use `Mouse-3' a second time consecutively, at the same
-      place, that kills the region already selected.
- 
- `Double-Mouse-1'
-      This key sets the region around the word which you click on.
- 
- `Double-Drag-Mouse-1'
-      This key selects a region made up of the words that you drag
-      across.
- 
- `Triple-Mouse-1'
-      This key sets the region around the line which you click on.
- 
- `Triple-Drag-Mouse-1'
-      This key selects a region made up of the lines that you drag
-      across.
- 
-    The simplest way to kill text with the mouse is to press `Mouse-1'
- at one end, then press `Mouse-3' twice at the other end.  *Note
- Killing::.  To copy the text into the kill ring without deleting it
- from the buffer, press `Mouse-3' just once--or just drag across the
- text with `Mouse-1'.  Then you can copy it elsewhere by yanking it.
- 
-    To yank the killed or copied text somewhere else, move the mouse
- there and press `Mouse-2'.  *Note Yanking::.  However, if
- `mouse-yank-at-point' is non-`nil', `Mouse-2' yanks at point.  Then it
- does not matter precisely where you click; all that matters is which
- window you click on.  The default value is `nil'.  This variable also
- effects yanking the secondary selection.
- 
-    To copy text to another X window, kill it or save it in the kill
- ring.  Under X, this also sets the "primary selection".  Then use the
- "paste" or "yank" command of the program operating the other window to
- insert the text from the selection.
- 
-    To copy text from another X window, use the "cut" or "copy" command
- of the program operating the other window, to select the text you want.
- Then yank it in Emacs with `C-y' or `Mouse-2'.
- 
-    When Emacs puts text into the kill ring, or rotates text to the front
- of the kill ring, it sets the "primary selection" in the X server.
- This is how other X clients can access the text.  Emacs also stores the
- text in the cut buffer, but only if the text is short enough
- (`x-cut-buffer-max' specifies the maximum number of characters);
- putting long strings in the cut buffer can be slow.
- 
-    The commands to yank the first entry in the kill ring actually check
- first for a primary selection in another program; after that, they check
- for text in the cut buffer.  If neither of those sources provides text
- to yank, the kill ring contents are used.
- 
- 
- File: emacs,  Node: Secondary Selection,  Next: Mouse References,  Prev: Mouse Commands,  Up: Frames
- 
- Secondary Selection
- ===================
- 
-    The "secondary selection" is another way of selecting text using X.
- It does not use point or the mark, so you can use it to kill text
- without setting point or the mark.
- 
- `M-Drag-Mouse-1'
-      Set the secondary selection, with one end at the place where you
-      press down the button, and the other end at the place where you
-      release it (`mouse-set-secondary').  The highlighting appears and
-      changes as you drag.
- 
-      If you move the mouse off the top or bottom of the window while
-      dragging, the window scrolls at a steady rate until you move the
-      mouse back into the window.  This way, you can mark regions that
-      don't fit entirely on the screen.
- 
- `M-Mouse-1'
-      Set one endpoint for the "secondary selection"
-      (`mouse-start-secondary').
- 
- `M-Mouse-3'
-      Make a secondary selection, using the place specified with
-      `M-Mouse-1' as the other end (`mouse-secondary-save-then-kill').
-      A second click at the same place kills the secondary selection
-      just made.
- 
- `M-Mouse-2'
-      Insert the secondary selection where you click
-      (`mouse-kill-secondary').  This places point at the end of the
-      yanked text.
- 
-    Double or triple clicking of `M-Mouse-1' operates on words and
- lines, much like `Mouse-1'.
- 
-    If `mouse-yank-at-point' is non-`nil', `M-Mouse-2' yanks at point.
- Then it does not matter precisely where you click; all that matters is
- which window you click on.  *Note Mouse Commands::.
- 
- 
- File: emacs,  Node: Mouse References,  Next: Menu Mouse Clicks,  Prev: Secondary Selection,  Up: Frames
- 
- Following References with the Mouse
- ===================================
- 
-    Some Emacs buffers display lists of various sorts.  These include
- lists of files, of buffers, of possible completions, of matches for a
- pattern, and so on.
- 
-    Since yanking text into these buffers is not very useful, most of
- them define `Mouse-2' specially, as a command to use or view the item
- you click on.
- 
-    For example, if you click `Mouse-2' on a file name in a Dired
- buffer, you visit the that file.  If you click `Mouse-2' on an error
- message in the `*Compilation*' buffer, you go to the source code for
- that error message.  If you click `Mouse-2' on a completion in the
- `*Completions*' buffer, you choose that completion.
- 
-    You can usually tell when `Mouse-2' has this special sort of meaning
- because the sensitive text highlights when you move the mouse over it.
- 
- 
- File: emacs,  Node: Menu Mouse Clicks,  Next: Mode Line Mouse,  Prev: Mouse References,  Up: Frames
- 
- Mouse Clicks for Menus
- ======================
- 
-    Mouse clicks modified with the CONTROL bring up menus.
- 
- `C-Mouse-1'
-      This menu is for specifying the frame's default font.
- 
- `C-Mouse-2'
-      This menu is for specifying faces and other text properties for
-      editing formatted text.  *Note Formatted Text::.
- 
- `C-Mouse-3'
-      This menu is mode-specific.  For most modes, this menu has the same
-      items as all the mode-specific menu bar menus put together.  Some
-      modes may specify a different menu for this button.(1)
- 
-    ---------- Footnotes ----------
- 
-    (1)  Some systems use `Mouse-3' for a mode-specific menu.  We took a
- survey of users, and found they preferred to keep `Mouse-3' for
- selecting and killing regions.  Hence the decision to use `C-Mouse-3'
- for this menu.
- 
- 
- File: emacs,  Node: Mode Line Mouse,  Next: Creating Frames,  Prev: Menu Mouse Clicks,  Up: Frames
- 
- Mode Line Mouse Commands
- ========================
- 
-    You can use mouse clicks on window mode lines to select and
- manipulate windows.
- 
- `Mouse-1'
-      `Mouse-1' on a mode line selects the window above.  By dragging
-      `Mouse-1' on the mode line, you can move it, thus changing the
-      height of the windows above and below.
- 
- `Mouse-2'
-      `Mouse-2' on a mode line expands that window to fill its frame.
- 
- `Mouse-3'
-      `Mouse-3' on a mode line deletes the window above.
- 
- `C-Mouse-2'
-      `C-Mouse-2' on a mode line splits the window above horizontally,
-      above the place in the mode line where you click.
- 
-    `C-Mouse-2' on a scroll bar splits the corresponding window
- vertically.  *Note Split Window::.
- 
- 
- File: emacs,  Node: Creating Frames,  Next: Multiple Displays,  Prev: Mode Line Mouse,  Up: Frames
- 
- Creating Frames
- ===============
- 
-    The prefix key `C-x 5' is analogous to `C-x 4', with parallel
- subcommands.  The difference is that `C-x 5' commands create a new
- frame rather than just a new window in the selected frame  (*Note Pop
- Up Window::).  If an existing visible or iconified frame already
- displays the requested material, these commands use the existing frame,
- after raising or deiconifying as necessary.
- 
-    The various `C-x 5' commands differ in how they find or create the
- buffer to select:
- 
- `C-x 5 2'
-      Create a new frame (`make-frame').
- 
- `C-x 5 b BUFNAME RET'
-      Select buffer BUFNAME in another window.  This runs
-      `switch-to-buffer-other-frame'.
- 
- `C-x 5 f FILENAME RET'
-      Visit file FILENAME and select its buffer in another frame.  This
-      runs `find-file-other-frame'.  *Note Visiting::.
- 
- `C-x 5 d DIRECTORY RET'
-      Select a Dired buffer for directory DIRECTORY in another frame.
-      This runs `dired-other-frame'.  *Note Dired::.
- 
- `C-x 5 m'
-      Start composing a mail message in another frame.  This runs
-      `mail-other-frame'.  It is the other-frame variant of `C-x m'.
-      *Note Sending Mail::.
- 
- `C-x 5 .'
-      Find a tag in the current tag table in another frame.  This runs
-      `find-tag-other-frame', the multiple-frame variant of `M-.'.
-      *Note Tags::.
- 
- `C-x 5 r FILENAME RET'
-      Visit file FILENAME read-only, and select its buffer in another
-      frame.  This runs `find-file-read-only-other-frame'.  *Note
-      Visiting::.
- 
-    You can control the appearance of new frames you create by setting
- the frame parameters in `default-frame-alist'.  You can use the
- variable `initial-frame-alist' to specify parameters that affect only
- the initial frame.  *Note Initial Parameters: (elisp)Initial
- Parameters, for more information.
- 
- 
- File: emacs,  Node: Multiple Displays,  Next: Special Buffer Frames,  Prev: Creating Frames,  Up: Frames
- 
- Multiple Displays
- =================
- 
-    A single Emacs can talk to more than one X Windows display.
- Initially, Emacs uses just one display--the one specified with the
- `DISPLAY' environment variable or with the `--display' option (*note
- Initial Options::.).  To connect to another display, use the command
- `make-frame-on-display':
- 
- `M-x make-frame-on-display RET DISPLAY RET'
-      Create a new frame on display DISPLAY.
- 
-    A single X server can handle more than one screen.  When you open
- frames on two screens belonging to one server, Emacs knows they share a
- single keyboard, and it treats all the commands arriving from these
- screens as a single stream of input.
- 
-    When you open frames on different X servers, Emacs makes a separate
- input stream for each server.  This way, two users can type
- simultaneously on the two displays, and Emacs will not garble their
- input.  Each server also has its own selected frame.  The commands you
- enter with a particular X server apply to that server's selected frame.
- 
-    Despite these features, people using the same Emacs job from
- different displays can still interfere with each other if they are not
- careful.  For example, if any one types `C-x C-c', that exits the Emacs
- job for all of them!
- 
- 
- File: emacs,  Node: Special Buffer Frames,  Next: Frame Parameters,  Prev: Multiple Displays,  Up: Frames
- 
- Special Buffer Frames
- =====================
- 
-    You can make certain chosen buffers, for which Emacs normally creates
- a second window when you have just one window, appear in special frames
- of their own.  To do this, set the variable
- `special-display-buffer-names' to a list of buffer names; any buffer
- whose name is in that list automatically gets a special frame, when an
- Emacs command wants to display it "in another window."
- 
-    For example, if you set the variable this way,
- 
-      (setq special-display-buffer-names
-            '("*Completions*" "*grep*" "*tex-shell*"))
- 
- then completion lists, `grep' output and the TeX mode shell buffer get
- individual frames of their own.  These frames, and the windows in them,
- are never automatically split or reused for any other buffers.  They
- continue to show the buffers they were created for, unless you alter
- them by hand.  Killing the special buffer deletes its frame
- automatically.
- 
-    More generally, you can set `special-display-regexps' to a list of
- regular expressions; then a buffer gets its own frame if its name
- matches any of those regular expressions.  (Once again, this applies
- only to buffers that normally get displayed for you in a separate
- window.)
- 
-    The variable `special-display-frame-alist' specifies the frame
- parameters for these frames.  It has a default value, so you don't need
- to set it.
- 
-    For those who know Lisp, an element of
- `special-display-buffer-names' or `special-display-regexps' can also be
- a list.  Then the first element is the buffer name or regular
- expression; the rest of the list specifies how to create the frame.  It
- can be an association list specifying frame parameter values; these
- values take precedence over parameter values specified in
- `special-display-frame-alist'.  Alternatively, it can have this form:
- 
-      (FUNCTION ARGS...)
- 
- where FUNCTION is a symbol.  Then the frame is constructed by calling
- FUNCTION; its first argument is the buffer, and its remaining arguments
- are ARGS.
- 
- 
- File: emacs,  Node: Frame Parameters,  Next: Scroll Bars,  Prev: Special Buffer Frames,  Up: Frames
- 
- Setting Frame Parameters
- ========================
- 
-    This section describes commands for altering the display style and
- window management behavior of the selected frame.
- 
- `M-x set-foreground-color RET COLOR RET'
-      Specify color COLOR for the foreground of the selected frame.
- 
- `M-x set-background-color RET COLOR RET'
-      Specify color COLOR for the background of the selected frame.
-      This changes the foreground color of the `modeline' face also, so
-      that it remains in inverse video compared with the default.
- 
- `M-x set-cursor-color RET COLOR RET'
-      Specify color COLOR for the cursor of the selected frame.
- 
- `M-x set-mouse-color RET COLOR RET'
-      Specify color COLOR for the mouse cursor when it is over the
-      selected frame.
- 
- `M-x set-border-color RET COLOR RET'
-      Specify color COLOR for the border of the selected frame.
- 
- `M-x list-colors-display'
-      Display the defined color names and show what the colors look like.
-      This command is somewhat slow.
- 
- `M-x auto-raise-mode'
-      Toggle whether or not the selected frame should auto-raise.
-      Auto-raise means that every time you move the mouse onto the
-      frame, it raises the frame.
- 
-      Note that this auto-raise feature is implemented by Emacs itself.
-      Some window managers also implement auto-raise.  If you enable
-      auto-raise for Emacs frames in your X window manager, it should
-      work, but it is beyond Emacs's control and therefore
-      `auto-raise-mode' has no effect on it.
- 
- `M-x auto-lower-mode'
-      Toggle whether or not the selected frame should auto-lower.
-      Auto-lower means that every time you move the mouse off of the
-      frame, the frame moves to the bottom of the stack of X windows.
- 
-      The command `auto-lower-mode' has no effect on auto-lower
-      implemented by the X window manager.  To control that, you must use
-      the appropriate window manager features.
- 
- `M-x set-default-font RET FONT RET'
-      Specify font FONT as the default for the selected frame.  *Note
-      Font X::, for ways to list the available fonts on your system.
- 
-      You can also set a frame's default font through a pop-up menu.
-      Press `C-Mouse-1' to activate this menu.
- 
-    In Emacs versions that use an X toolkit, the color-setting and
- font-setting functions don't affect menus and the menu bar, since they
- are displayed by their own widget classes.  To change the appearance of
- the menus and menu bar, you must use X resources (*note Resources X::.).
- *Note Colors X::, regarding colors.  *Note Font X::, regarding choice of
- font.
- 
-    For information on frame parameters and customization, see *Note
- Frame Parameters: (elisp)Frame Parameters.
- 
- 
- File: emacs,  Node: Scroll Bars,  Next: Menu Bars,  Prev: Frame Parameters,  Up: Frames
- 
- Scroll Bars
- ===========
- 
-    When using X, Emacs normally makes a "scroll bar" at the right of
- each Emacs window.  The scroll bar runs the height of the window, and
- shows a moving rectangular inner box which represents the portion of the
- buffer currently displayed.  The entire height of the scroll bar
- represents the entire length of the buffer.
- 
-    You can use `Mouse-2' (normally, the middle button) in the scroll
- bar to move or drag the inner box up and down.  If you move it to the
- top of the scroll bar, you see the top of the buffer.  If you move it to
- the bottom of the scroll bar, you see the bottom of the buffer.
- 
-    The left and right buttons in the scroll bar scroll by controlled
- increments.  `Mouse-1' (normally, the left button) moves the line at
- the level where you click up to the top of the window.  `Mouse-3'
- (normally, the right button) moves the line at the top of the window
- down to the level where you click.  By clicking repeatedly in the same
- place, you can scroll by the same distance over and over.
- 
-    Aside from scrolling, you can also click `C-Mouse-2' in the scroll
- bar to split a window vertically.  The split occurs on the line where
- you click.
- 
-    You can enable or disable Scroll Bar mode with the command `M-x
- scroll-bar-mode'.  With no argument, it toggles the use of scroll bars.
- With an argument, it turns use of scroll bars on if and only if the
- argument is positive.  This command applies to all frames, including
- frames yet to be created.  You can use the X resource
- `verticalScrollBars' to control the initial setting of Scroll Bar mode.
- *Note Resources X::.
- 
-    To enable or disable scroll bars for just the selected frame, use the
- `M-x toggle-scroll-bar' command.
- 
- 
- File: emacs,  Node: Menu Bars,  Next: Faces,  Prev: Scroll Bars,  Up: Frames
- 
- Menu Bars
- =========
- 
-    By default, each Emacs frame has a menu bar at the top which you can
- use to perform certain common operations.  There's no need to describe
- them in detail here, as you can more easily see for yourself; also, we
- may change them and add to them in subsequent Emacs versions.
- 
-    Each of the operations in the menu bar is bound to an ordinary Emacs
- command which you can invoke equally well with `M-x' or with its own
- key bindings.  The menu lists one equivalent key binding (if the command
- has any) at the right margin.  To see the command's name and
- documentation, type `C-h k' and then select the menu bar item you are
- interested in.
- 
-    You can turn display of menu bars on or off with `M-x
- menu-bar-mode'.  With no argument, this command toggles Menu Bar mode, a
- minor mode.  With an argument, the command turns Menu Bar mode on if the
- argument is positive, off if the argument is not positive.  You can use
- the X resource `menuBarLines' to control the initial setting of Menu
- Bar mode.  *Note Resources X::.
- 
- 
- File: emacs,  Node: Faces,  Next: Modifying Faces,  Prev: Menu Bars,  Up: Frames
- 
- Using Multiple Typefaces
- ========================
- 
-    When using Emacs with X, you can set up multiple styles of displaying
- characters.  The aspects of style that you can control are the type
- font, the foreground color, the background color, and whether to
- underline.  Emacs 19.29 does not support faces on MS-DOS, but future
- versions may support them partially (*note MS-DOS::.).
- 
-    The way you control display style is by defining named "faces".
- Each face can specify a type font, a foreground color, a background
- color, and an underline flag; but it does not have to specify all of
- them.
- 
-    The style of display used for a given character in the text is
- determined by combining several faces.  Any aspect of the display style
- that isn't specified by overlays or text properties comes from the frame
- itself.
- 
-    Enriched mode, the mode for editing formatted text, includes several
- commands and menus for specifying faces.  *Note Format Faces::, for how
- to specify the font for text in the buffer.  *Note Format Colors::, for
- how to specify the foreground and background color.
- 
-    To see what faces are currently defined, and what they look like,
- type `M-x list-faces-display'.  It's possible for a given face to look
- different in different frames; this command shows the appearance in the
- frame in which you type it.  Here's a list of the standardly defined
- faces:
- 
- `default'
-      This face is used for ordinary text that doesn't specify any other
-      face.
- 
- `modeline'
-      This face is used for mode lines.  By default, it's set up as the
-      inverse of the default face.  *Note Display Vars::.
- 
- `highlight'
-      This face is used for highlighting portions of text, in various
-      modes.
- 
- `region'
-      This face is used for displaying a selected region (when Transient
-      Mark mode is enabled--see below).
- 
- `secondary-selection'
-      This face is used for displaying a secondary selection (*note
-      Secondary Selection::.).
- 
- `bold'
-      This face uses a bold variant of the default font, if it has one.
- 
- `italic'
-      This face uses an italic variant of the default font, if it has
-      one.
- 
- `bold-italic'
-      This face uses a bold italic variant of the default font, if it
-      has one.
- 
- `underline'
-      This face underlines text.
- 
-    When Transient Mark mode is enabled, the text of the region is
- highlighted when the mark is active.  This uses the face named
- `region'; you can control the style of highlighting by changing the
- style of this face (*note Modifying Faces::.).  *Note Transient Mark::,
- for more information about Transient Mark mode and activation and
- deactivation of the mark.
- 
-    One easy way to use faces is to turn on Font-Lock mode.  This minor
- mode, which is always local to a particular buffer, arranges to choose
- faces according to the syntax of the text you are editing.  It can
- recognize comments and strings in most languages; in several languages,
- it can also recognize and properly highlight various other important
- constructs--for example, names of functions being defined.
- 
-    Font-Lock mode is a minor mode.  The command `M-x font-lock-mode'
- turns the mode on or off.  The function `turn-on-font-lock'
- unconditionally enables Font-Lock mode.  This is useful in mode-hook
- functions.  For example, to enable Font-Lock mode whenever you edit a C
- file, you can do this:
- 
-      (add-hook 'c-mode-hook 'turn-on-font-lock)
- 
-    To get the full benefit of Font-Lock mode, you need to choose a
- default font which has bold, italic, and bold-italic variants; or else
- you need to have a color or grayscale screen.  The variable
- `font-lock-display-type' specifies whether Font-Lock mode should use
- font styles, colors, or shades of gray to distinguish the various kinds
- of text.  Emacs chooses the default value according to the
- characteristics of your display.
- 
- 
- File: emacs,  Node: Modifying Faces,  Next: Misc X,  Prev: Faces,  Up: Frames
- 
- Modifying Faces
- ===============
- 
-    Here are the commands for changing the font of a face:
- 
- `M-x set-face-font RET FACE RET FONT RET'
-      Change face FACE to use font FONT.  *Note Font X::, for more
-      information about font naming under X.
- 
- `M-x make-face-bold RET FACE RET'
-      Convert face FACE to use a bold version of its current font.
- 
- `M-x make-face-italic RET FACE RET'
-      Convert face FACE to use a italic version of its current font.
- 
- `M-x make-face-bold-italic RET FACE RET'
-      Convert face FACE to use a bold-italic version of its current font.
- 
- `M-x make-face-unbold RET FACE RET'
-      Convert face FACE to use a non-bold version of its current font.
- 
- `M-x make-face-unitalic RET FACE RET'
-      Convert face FACE to use a non-italic version of its current font.
- 
-    Here are the commands for setting the colors and underline flag of a
- face:
- 
- `M-x set-face-foreground RET FACE RET COLOR RET'
-      Use color COLOR for the foreground of characters in face FACE.
- 
- `M-x set-face-background RET FACE RET COLOR RET'
-      Use color COLOR for the background of characters in face FACE.
- 
-      On a black-and-white display, the colors you can use for the
-      background are `black', `white', `gray', `gray1' and `gray3'.
-      Emacs supports the gray colors by using background stipple
-      patterns instead of a color.
- 
- `M-x set-face-stipple RET FACE RET PATTERN RET'
-      Use stipple pattern PATTERN for the background of characters in
-      face FACE.
- 
- `M-x list-colors-display'
-      Display the defined color names and show what the colors look like.
- 
- `M-x set-face-underline-p RET FACE RET FLAG RET'
-      Specify whether to underline characters in face FACE.
- 
- `M-x invert-face RET FACE RET'
-      Swap the foreground and background colors of face FACE.
- 
- `M-x modify-face RET FACE RET ATTRIBUTES...'
-      Change various attributes of face FACE.  This command prompts for
-      all the attribute of the face, one attribute at a time.  For the
-      color and stipple attributes, the attribute's current value is the
-      default--type just RET if you don't want to change that attribute.
-      Type `none' if you want to clear out the attribute.
- 
-    You can also use X resources to specify attributes of particular
- faces.  *Note Resources X::.
- 
- 
- File: emacs,  Node: Misc X,  Prev: Modifying Faces,  Up: Frames
- 
- Miscellaneous X Window Features
- ===============================
- 
-    The following commands let you create, delete and operate on frames:
- 
- `C-z'
-      To iconify the selected Emacs frame, type `C-z'
-      (`iconify-or-deiconify-frame').  The normal meaning of `C-z', to
-      suspend Emacs, is not useful under a window system, so it has a
-      different binding in that case.
- 
-      If you type this command on an Emacs frame's icon, it deiconifies
-      the frame.
- 
- `C-x 5 0'
-      To delete the selected frame, type `C-x 5 0' (`delete-frame').
-      This is not allowed if there is only one frame.
- 
- `M-x transient-mark-mode'
-      Under X Windows, when Transient Mark mode is enabled, Emacs
-      highlights the region when the mark is active.  This feature is
-      the main motive for using Transient Mark mode.  To toggle the
-      state of this mode, use the command `M-x transient-mark-mode'.
-      *Note Mark::.
- 
--- 0 ----
Index: emacs/info/emacs-9
diff -c emacs/info/emacs-9:1.1.1.2 emacs/info/emacs-9:removed
*** emacs/info/emacs-9:1.1.1.2	Mon Jul 22 01:52:41 1996
--- emacs/info/emacs-9	Fri Aug  2 20:17:43 1996
***************
*** 1,1133 ****
- This is Info file ../info/emacs, produced by Makeinfo-1.55 from the
- input file emacs.texi.
- 
- 
- File: emacs,  Node: Major Modes,  Next: Indentation,  Prev: Frames,  Up: Top
- 
- Major Modes
- ***********
- 
-    Emacs provides many alternative "major modes", each of which
- customizes Emacs for editing text of a particular sort.  The major modes
- are mutually exclusive, and each buffer has one major mode at any time.
- The mode line normally shows the name of the current major mode, in
- parentheses (*note Mode Line::.).
- 
-    The least specialized major mode is called "Fundamental mode".  This
- mode has no mode-specific redefinitions or variable settings, so that
- each Emacs command behaves in its most general manner, and each option
- is in its default state.  For editing text of a specific type that
- Emacs knows about, such as Lisp code or English text, you should switch
- to the appropriate major mode, such as Lisp mode or Text mode.
- 
-    Selecting a major mode changes the meanings of a few keys to become
- more specifically adapted to the language being edited.  The ones which
- are changed frequently are TAB, DEL, and LFD.  The prefix key `C-c'
- normally contains mode-specific commands.  In addition, the commands
- which handle comments use the mode to determine how comments are to be
- delimited.  Many major modes redefine the syntactical properties of
- characters appearing in the buffer.  *Note Syntax::.
- 
-    The major modes fall into three major groups.  Lisp mode (which has
- several variants), C mode, Fortran mode and others are for specific
- programming languages.  Text mode, Nroff mode, TeX mode and Outline
- mode are for editing English text.  The remaining major modes are not
- intended for use on users' files; they are used in buffers created for
- specific purposes by Emacs, such as Dired mode for buffers made by Dired
- (*note Dired::.), and Mail mode for buffers made by `C-x m' (*note
- Sending Mail::.), and Shell mode for buffers used for communicating
- with an inferior shell process (*note Interactive Shell::.).
- 
-    Most programming language major modes specify that only blank lines
- separate paragraphs.  This is to make the paragraph commands useful.
- (*Note Paragraphs::.)  They also cause Auto Fill mode to use the
- definition of TAB to indent the new lines it creates.  This is because
- most lines in a program are usually indented.  (*Note Indentation::.)
- 
- * Menu:
- 
- * Choosing Modes::     How major modes are specified or chosen.
- 
- 
- File: emacs,  Node: Choosing Modes,  Prev: Major Modes,  Up: Major Modes
- 
- How Major Modes are Chosen
- ==========================
- 
-    You can select a major mode explicitly for the current buffer, but
- most of the time Emacs determines which mode to use based on the file
- name or on special text in the file.
- 
-    Explicit selection of a new major mode is done with a `M-x' command.
- From the name of a major mode, add `-mode' to get the name of a command
- to select that mode.  Thus, you can enter Lisp mode by executing `M-x
- lisp-mode'.
- 
-    When you visit a file, Emacs usually chooses the right major mode
- based on the file's name.  For example, files whose names end in `.c'
- are edited in C mode.  The correspondence between file names and major
- mode is controlled by the variable `auto-mode-alist'.  Its value is a
- list in which each element has the form
- 
-      (REGEXP . MODE-FUNCTION)
- 
- For example, one element normally found in the list has the form
- `("\\.c\\'" . c-mode)', and it is responsible for selecting C mode for
- files whose names end in `.c'.  (Note that `\\' is needed in Lisp
- syntax to include a `\' in the string, which is needed to suppress the
- special meaning of `.' in regexps.)  The only practical way to change
- this variable is with Lisp code.
- 
-    You can specify which major mode should be used for editing a certain
- file by a special sort of text in the first nonblank line of the file.
- The mode name should appear in this line both preceded and followed by
- `-*-'.  Other text may appear on the line as well.  For example,
- 
-      ;-*-Lisp-*-
- 
- tells Emacs to use Lisp mode.  Such an explicit specification overrides
- any defaulting based on the file name.  Note how the semicolon is used
- to make Lisp treat this line as a comment.
- 
-    Another format of mode specification is
- 
-      -*-Mode: MODENAME;-*-
- 
- which allows you to specify local variables as well, like this:
- 
-      -*- mode: MODENAME; VAR: VALUE; ... -*-
- 
- *Note File Variables::, for more information about this.
- 
-    When a file's contents begin with `#!', it can serve as an
- executable shell command, which works by running an interpreter named on
- the file's first line.  The rest of the file is used as input to the
- interpreter.
- 
-    When you visit such a file in Emacs, if the file's name does not
- specify a major mode, Emacs uses the interpreter name on the first line
- to choose a mode.  If the first line is the name of a recognized
- interpreter program, such as `perl' or `tcl', Emacs uses a mode
- appropriate for programs for that interpreter.  The variable
- `interpreter-mode-alist' specifies the correspondence between
- interpreter program names and major modes.
- 
-    When you visit a file that does not specify a major mode to use, or
- when you create a new buffer with `C-x b', the variable
- `default-major-mode' specifies which major mode to use.  Normally its
- value is the symbol `fundamental-mode', which specifies Fundamental
- mode.  If `default-major-mode' is `nil', the major mode is taken from
- the previously selected buffer.
- 
-    If you change the major mode of a buffer, you can go back to the
- major mode Emacs would choose automatically: use the command `M-x
- normal-mode' to do this.  This is the same function that `find-file'
- calls to choose the major mode.  It also processes the file's local
- variables list if any.
- 
- 
- File: emacs,  Node: Indentation,  Next: Text,  Prev: Major Modes,  Up: Top
- 
- Indentation
- ***********
- 
-    This chapter describes the Emacs commands that add, remove, or
- adjust indentation.
- 
- `TAB'
-      Indent current line "appropriately" in a mode-dependent fashion.
- 
- `LFD'
-      Perform RET followed by TAB (`newline-and-indent').
- 
- `M-^'
-      Merge two lines (`delete-indentation').  This would cancel out the
-      effect of LFD.
- 
- `C-M-o'
-      Split line at point; text on the line after point becomes a new
-      line indented to the same column that it now starts in
-      (`split-line').
- 
- `M-m'
-      Move (forward or back) to the first nonblank character on the
-      current line (`back-to-indentation').
- 
- `C-M-\'
-      Indent several lines to same column (`indent-region').
- 
- `C-x TAB'
-      Shift block of lines rigidly right or left (`indent-rigidly').
- 
- `M-i'
-      Indent from point to the next prespecified tab stop column
-      (`tab-to-tab-stop').
- 
- `M-x indent-relative'
-      Indent from point to under an indentation point in the previous
-      line.
- 
-    Most programming languages have some indentation convention.  For
- Lisp code, lines are indented according to their nesting in
- parentheses.  The same general idea is used for C code, though many
- details are different.
- 
-    Whatever the language, to indent a line, use the TAB command.  Each
- major mode defines this command to perform the sort of indentation
- appropriate for the particular language.  In Lisp mode, TAB aligns the
- line according to its depth in parentheses.  No matter where in the
- line you are when you type TAB, it aligns the line as a whole.  In C
- mode, TAB implements a subtle and sophisticated indentation style that
- knows about many aspects of C syntax.
- 
-    In Text mode, TAB runs the command `tab-to-tab-stop', which indents
- to the next tab stop column.  You can set the tab stops with `M-x
- edit-tab-stops'.
- 
- * Menu:
- 
- * Indentation Commands::  Various commands and techniques for indentation.
- * Tab Stops::             You can set arbitrary "tab stops" and then
-                             indent to the next tab stop when you want to.
- * Just Spaces::           You can request indentation using just spaces.
- 
- 
- File: emacs,  Node: Indentation Commands,  Next: Tab Stops,  Prev: Indentation,  Up: Indentation
- 
- Indentation Commands and Techniques
- ===================================
- 
-    To move over the indentation on a line, do `M-m'
- (`back-to-indentation').  This command, given anywhere on a line,
- positions point at the first nonblank character on the line.
- 
-    To insert an indented line before the current line, do `C-a C-o
- TAB'.  To make an indented line after the current line, use `C-e LFD'.
- 
-    If you just want to insert a tab character in the buffer, you can
- type `C-q TAB'.
- 
-    `C-M-o' (`split-line') moves the text from point to the end of the
- line vertically down, so that the current line becomes two lines.
- `C-M-o' first moves point forward over any spaces and tabs.  Then it
- inserts after point a newline and enough indentation to reach the same
- column point is on.  Point remains before the inserted newline; in this
- regard, `C-M-o' resembles `C-o'.
- 
-    To join two lines cleanly, use the `M-^' (`delete-indentation')
- command.  It deletes the indentation at the front of the current line,
- and the line boundary as well, replacing them with a single space.  As
- a special case (useful for Lisp code) the single space is omitted if
- the characters to be joined are consecutive open parentheses or closing
- parentheses, or if the junction follows another newline.  To delete
- just the indentation of a line, go to the beginning of the line and use
- `M-\' (`delete-horizontal-space'), which deletes all spaces and tabs
- around the cursor.
- 
-    If you have a fill prefix, `M-^' deletes the fill prefix if it
- appears after the newline that is deleted.  *Note Fill Prefix::.
- 
-    There are also commands for changing the indentation of several lines
- at once.  `C-M-\' (`indent-region') applies to all the lines that begin
- in the region; it indents each line in the "usual" way, as if you had
- typed TAB at the beginning of the line.  A numeric argument specifies
- the column to indent to, and each line is shifted left or right so that
- its first nonblank character appears in that column.  `C-x TAB'
- (`indent-rigidly') moves all of the lines in the region right by its
- argument (left, for negative arguments).  The whole group of lines
- moves rigidly sideways, which is how the command gets its name.
- 
-    `M-x indent-relative' indents at point based on the previous line
- (actually, the last nonempty line).  It inserts whitespace at point,
- moving point, until it is underneath an indentation point in the
- previous line.  An indentation point is the end of a sequence of
- whitespace or the end of the line.  If point is farther right than any
- indentation point in the previous line, the whitespace before point is
- deleted and the first indentation point then applicable is used.  If no
- indentation point is applicable even then, `indent-relative' runs
- `tab-to-tab-stop' (*note Tab Stops::.).
- 
-    `indent-relative' is the definition of TAB in Indented Text mode.
- *Note Text::.
- 
-    *Note Format Indentation::, for another way of specifying the
- indentation for part of your text.
- 
- 
- File: emacs,  Node: Tab Stops,  Next: Just Spaces,  Prev: Indentation Commands,  Up: Indentation
- 
- Tab Stops
- =========
- 
-    For typing in tables, you can use Text mode's definition of TAB,
- `tab-to-tab-stop'.  This command inserts indentation before point,
- enough to reach the next tab stop column.  If you are not in Text mode,
- this command can be found on the key `M-i'.
- 
-    You can specify the tab stops used by `M-i'.  They are stored in a
- variable called `tab-stop-list', as a list of column-numbers in
- increasing order.
- 
-    The convenient way to set the tab stops is with `M-x edit-tab-stops',
- which creates and selects a buffer containing a description of the tab
- stop settings.  You can edit this buffer to specify different tab
- stops, and then type `C-c C-c' to make those new tab stops take effect.
- In the tab stop buffer, `C-c C-c' runs the function
- `edit-tab-stops-note-changes' rather than its usual definition
- `save-buffer'.  `edit-tab-stops' records which buffer was current when
- you invoked it, and stores the tab stops back in that buffer; normally
- all buffers share the same tab stops and changing them in one buffer
- affects all, but if you happen to make `tab-stop-list' local in one
- buffer then `edit-tab-stops' in that buffer will edit the local
- settings.
- 
-    Here is what the text representing the tab stops looks like for
- ordinary tab stops every eight columns.
- 
-              :       :       :       :       :       :
-      0         1         2         3         4
-      0123456789012345678901234567890123456789012345678
-      To install changes, type C-c C-c
- 
-    The first line contains a colon at each tab stop.  The remaining
- lines are present just to help you see where the colons are and know
- what to do.
- 
-    Note that the tab stops that control `tab-to-tab-stop' have nothing
- to do with displaying tab characters in the buffer.  *Note Display
- Vars::, for more information on that.
- 
- 
- File: emacs,  Node: Just Spaces,  Prev: Tab Stops,  Up: Indentation
- 
- Tabs vs. Spaces
- ===============
- 
-    Emacs normally uses both tabs and spaces to indent lines.  If you
- prefer, all indentation can be made from spaces only.  To request this,
- set `indent-tabs-mode' to `nil'.  This is a per-buffer variable;
- altering the variable affects only the current buffer, but there is a
- default value which you can change as well.  *Note Locals::.
- 
-    There are also commands to convert tabs to spaces or vice versa,
- always preserving the columns of all nonblank text.  `M-x tabify' scans
- the region for sequences of spaces, and converts sequences of at least
- three spaces to tabs if that can be done without changing indentation.
- `M-x untabify' changes all tabs in the region to appropriate numbers of
- spaces.
- 
- 
- File: emacs,  Node: Text,  Next: Programs,  Prev: Indentation,  Up: Top
- 
- Commands for Human Languages
- ****************************
- 
-    The term "text" has two widespread meanings in our area of the
- computer field.  One is data that is a sequence of characters.  Any file
- that you edit with Emacs is text, in this sense of the word.  The other
- meaning is more restrictive: a sequence of characters in a human
- language for humans to read (possibly after processing by a text
- formatter), as opposed to a program or commands for a program.
- 
-    Human languages have syntactic/stylistic conventions that can be
- supported or used to advantage by editor commands: conventions involving
- words, sentences, paragraphs, and capital letters.  This chapter
- describes Emacs commands for all of these things.  There are also
- commands for "filling", which means rearranging the lines of a
- paragraph to be approximately equal in length.  The commands for moving
- over and killing words, sentences and paragraphs, while intended
- primarily for editing text, are also often useful for editing programs.
- 
-    Emacs has several major modes for editing human language text.  If
- the file contains text pure and simple, use Text mode, which customizes
- Emacs in small ways for the syntactic conventions of text.  Outline mode
- provides special commands for operating on text with an outline
- structure.
- 
-    For text which contains embedded commands for text formatters, Emacs
- has other major modes, each for a particular text formatter.  Thus, for
- input to TeX, you would use TeX mode.  For input to nroff, use Nroff
- mode.
- 
-    Instead of using a text formatter, you can edit formatted text in
- WYSIWYG style ("what you see is what you get"), with Enriched mode.
- Then the formatting appears on the screen in Emacs while you edit.
- 
- * Menu:
- 
- * Words::         Moving over and killing words.
- * Sentences::     Moving over and killing sentences.
- * Paragraphs::	  Moving over paragraphs.
- * Pages::	  Moving over pages.
- * Filling::       Filling or justifying text.
- * Case::          Changing the case of text.
- * Text Mode::     The major modes for editing text files.
- * Outline Mode::  The major mode for editing outlines.
- * TeX Mode::      The major modes for editing input to the formatter TeX.
- * Nroff Mode::    The major mode for editing input to the formatter nroff.
- * Formatted Text::Editing formatted text directly in WYSIWYG fashion.
- 
- 
- File: emacs,  Node: Words,  Next: Sentences,  Up: Text
- 
- Words
- =====
- 
-    Emacs has commands for moving over or operating on words.  By
- convention, the keys for them are all Meta characters.
- 
- `M-f'
-      Move forward over a word (`forward-word').
- 
- `M-b'
-      Move backward over a word (`backward-word').
- 
- `M-d'
-      Kill up to the end of a word (`kill-word').
- 
- `M-DEL'
-      Kill back to the beginning of a word (`backward-kill-word').
- 
- `M-@'
-      Mark the end of the next word (`mark-word').
- 
- `M-t'
-      Transpose two words or drag a word across other words
-      (`transpose-words').
- 
-    Notice how these keys form a series that parallels the
- character-based `C-f', `C-b', `C-d', `C-t' and DEL.  `M-@' is cognate
- to `C-@', which is an alias for `C-SPC'.
- 
-    The commands `M-f' (`forward-word') and `M-b' (`backward-word') move
- forward and backward over words.  These Meta characters are thus
- analogous to the corresponding control characters, `C-f' and `C-b',
- which move over single characters in the text.  The analogy extends to
- numeric arguments, which serve as repeat counts.  `M-f' with a negative
- argument moves backward, and `M-b' with a negative argument moves
- forward.  Forward motion stops right after the last letter of the word,
- while backward motion stops right before the first letter.
- 
-    `M-d' (`kill-word') kills the word after point.  To be precise, it
- kills everything from point to the place `M-f' would move to.  Thus, if
- point is in the middle of a word, `M-d' kills just the part after
- point.  If some punctuation comes between point and the next word, it
- is killed along with the word.  (If you wish to kill only the next word
- but not the punctuation before it, simply do `M-f' to get the end, and
- kill the word backwards with `M-DEL'.) `M-d' takes arguments just like
- `M-f'.
- 
-    `M-DEL' (`backward-kill-word') kills the word before point.  It
- kills everything from point back to where `M-b' would move to.  If
- point is after the space in `FOO, BAR', then `FOO, ' is killed.  (If
- you wish to kill just `FOO', do `M-b M-d' instead of `M-DEL'.)
- 
-    `M-t' (`transpose-words') exchanges the word before or containing
- point with the following word.  The delimiter characters between the
- words do not move.  For example, `FOO, BAR' transposes into `BAR, FOO'
- rather than `BAR FOO,'.  *Note Transpose::, for more on transposition
- and on arguments to transposition commands.
- 
-    To operate on the next N words with an operation which applies
- between point and mark, you can either set the mark at point and then
- move over the words, or you can use the command `M-@' (`mark-word')
- which does not move point, but sets the mark where `M-f' would move to.
- `M-@' accepts a numeric argument that says how many words to scan for
- the place to put the mark.  In Transient Mark mode, this command
- activates the mark.
- 
-    The word commands' understanding of syntax is completely controlled
- by the syntax table.  Any character can, for example, be declared to be
- a word delimiter.  *Note Syntax::.
- 
- 
- File: emacs,  Node: Sentences,  Next: Paragraphs,  Prev: Words,  Up: Text
- 
- Sentences
- =========
- 
-    The Emacs commands for manipulating sentences and paragraphs are
- mostly on Meta keys, so as to be like the word-handling commands.
- 
- `M-a'
-      Move back to the beginning of the sentence (`backward-sentence').
- 
- `M-e'
-      Move forward to the end of the sentence (`forward-sentence').
- 
- `M-k'
-      Kill forward to the end of the sentence (`kill-sentence').
- 
- `C-x DEL'
-      Kill back to the beginning of the sentence
-      (`backward-kill-sentence').
- 
-    The commands `M-a' and `M-e' (`backward-sentence' and
- `forward-sentence') move to the beginning and end of the current
- sentence, respectively.  They were chosen to resemble `C-a' and `C-e',
- which move to the beginning and end of a line.  Unlike them, `M-a' and
- `M-e' if repeated or given numeric arguments move over successive
- sentences.
- 
-    Moving backward over a sentence places point just before the first
- character of the sentence; moving forward places point right after the
- punctuation that ends the sentence.  Neither one moves over the
- whitespace at the sentence boundary.
- 
-    Just as `C-a' and `C-e' have a kill command, `C-k', to go with them,
- so `M-a' and `M-e' have a corresponding kill command `M-k'
- (`kill-sentence') which kills from point to the end of the sentence.
- With minus one as an argument it kills back to the beginning of the
- sentence.  Larger arguments serve as a repeat count.  There is also a
- command, `C-x DEL' (`backward-kill-sentence'), for killing back to the
- beginning of a sentence.  This command is useful when you change your
- mind in the middle of composing text.
- 
-    The sentence commands assume that you follow the American typist's
- convention of putting two spaces at the end of a sentence; they consider
- a sentence to end wherever there is a `.', `?' or `!' followed by the
- end of a line or two spaces, with any number of `)', `]', `'', or `"'
- characters allowed in between.  A sentence also begins or ends wherever
- a paragraph begins or ends.
- 
-    The variable `sentence-end' controls recognition of the end of a
- sentence.  It is a regexp that matches the last few characters of a
- sentence, together with the whitespace following the sentence.  Its
- normal value is
- 
-      "[.?!][]\"')]*\\($\\|\t\\|  \\)[ \t\n]*"
- 
- This example is explained in the section on regexps.  *Note Regexps::.
- 
-    If you want to use just one space between sentences, you should set
- `sentence-end' to this value:
- 
-      "[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*"
- 
- You should also set the variable `sentence-end-double-space' to `nil'
- so that the fill commands expect and leave just one space at the end of
- a sentence.  Note that this makes it impossible to distinguish between
- periods that end sentences and those that indicate abbreviations.
- 
- 
- File: emacs,  Node: Paragraphs,  Next: Pages,  Prev: Sentences,  Up: Text
- 
- Paragraphs
- ==========
- 
-    The Emacs commands for manipulating paragraphs are also Meta keys.
- 
- `M-{'
-      Move back to previous paragraph beginning (`backward-paragraph').
- 
- `M-}'
-      Move forward to next paragraph end (`forward-paragraph').
- 
- `M-h'
-      Put point and mark around this or next paragraph
-      (`mark-paragraph').
- 
-    `M-{' moves to the beginning of the current or previous paragraph,
- while `M-}' moves to the end of the current or next paragraph.  Blank
- lines and text formatter command lines separate paragraphs and are not
- considered part of any paragraph.  Also, an indented line starts a new
- paragraph.
- 
-    In major modes for programs (as opposed to Text mode), paragraphs
- begin and end only at blank lines.  This makes the paragraph commands
- continue to be useful even though there are no paragraphs per se.
- 
-    When there is a fill prefix, then paragraphs are delimited by all
- lines which don't start with the fill prefix.  *Note Filling::.
- 
-    When you wish to operate on a paragraph, you can use the command
- `M-h' (`mark-paragraph') to set the region around it.  Thus, for
- example, `M-h C-w' kills the paragraph around or after point.  The
- `M-h' command puts point at the beginning and mark at the end of the
- paragraph point was in.  In Transient Mark mode, it activates the mark.
- If point is between paragraphs (in a run of blank lines, or at a
- boundary), the paragraph following point is surrounded by point and
- mark.  If there are blank lines preceding the first line of the
- paragraph, one of these blank lines is included in the region.
- 
-    The precise definition of a paragraph boundary is controlled by the
- variables `paragraph-separate' and `paragraph-start'.  The value of
- `paragraph-start' is a regexp that should match any line that either
- starts or separates paragraphs.  The value of `paragraph-separate' is
- another regexp that should match only lines that separate paragraphs
- without being part of any paragraph.  Lines that start a new paragraph
- and are contained in it must match only `paragraph-start', not
- `paragraph-separate'.  For example, normally `paragraph-start' is `"^[
- \t\n\f]"' and `paragraph-separate' is `"^[ \t\f]*$"'.
- 
-    Normally it is desirable for page boundaries to separate paragraphs.
- The default values of these variables recognize the usual separator for
- pages.
- 
- 
- File: emacs,  Node: Pages,  Next: Filling,  Prev: Paragraphs,  Up: Text
- 
- Pages
- =====
- 
-    Files are often thought of as divided into "pages" by the "formfeed"
- character (ASCII control-L, octal code 014).  When you print hardcopy
- for a file, this character forces a page break; thus, each page of the
- file goes on a separate page on paper.  Most Emacs commands treat the
- page-separator character just like any other character: you can insert
- it with `C-q C-l', and delete it with DEL.  Thus, you are free to
- paginate your file or not.  However, since pages are often meaningful
- divisions of the file, Emacs provides commands to move over them and
- operate on them.
- 
- `C-x ['
-      Move point to previous page boundary (`backward-page').
- 
- `C-x ]'
-      Move point to next page boundary (`forward-page').
- 
- `C-x C-p'
-      Put point and mark around this page (or another page)
-      (`mark-page').
- 
- `C-x l'
-      Count the lines in this page (`count-lines-page').
- 
-    The `C-x [' (`backward-page') command moves point to immediately
- after the previous page delimiter.  If point is already right after a
- page delimiter, it skips that one and stops at the previous one.  A
- numeric argument serves as a repeat count.  The `C-x ]' (`forward-page')
- command moves forward past the next page delimiter.
- 
-    The `C-x C-p' command (`mark-page') puts point at the beginning of
- the current page and the mark at the end.  The page delimiter at the
- end is included (the mark follows it).  The page delimiter at the front
- is excluded (point follows it).  `C-x C-p C-w' is a handy way to kill a
- page to move it elsewhere.  If you move to another page delimiter with
- `C-x [' and `C-x ]', then yank the killed page, all the pages will be
- properly delimited once again.  The reason `C-x C-p' includes only the
- following page delimiter in the region is to ensure that.
- 
-    A numeric argument to `C-x C-p' is used to specify which page to go
- to, relative to the current one.  Zero means the current page.  One
- means the next page, and -1 means the previous one.
- 
-    The `C-x l' command (`count-lines-page') is good for deciding where
- to break a page in two.  It prints in the echo area the total number of
- lines in the current page, and then divides it up into those preceding
- the current line and those following, as in
- 
-      Page has 96 (72+25) lines
- 
- Notice that the sum is off by one; this is correct if point is not at
- the beginning of a line.
- 
-    The variable `page-delimiter' controls where pages begin.  Its value
- is a regexp that matches the beginning of a line that separates pages.
- The normal value of this variable is `"^\f"', which matches a formfeed
- character at the beginning of a line.
- 
- 
- File: emacs,  Node: Filling,  Next: Case,  Prev: Pages,  Up: Text
- 
- Filling Text
- ============
- 
-    "Filling" text means breaking it up into lines that fit a specified
- width.  Emacs does filling in two ways.  In Auto Fill mode, inserting
- text with self-inserting characters also automatically fills it.  There
- are also explicit fill commands that you can use when editing text
- leaves it unfilled.  When you edit formatted text, you can specify a
- style of filling for each portion of the text (*note Formatted Text::.).
- 
- * Menu:
- 
- * Auto Fill::	  Auto Fill mode breaks long lines automatically.
- * Fill Commands:: Commands to refill paragraphs and center lines.
- * Fill Prefix::	  Filling when every line is indented or in a comment, etc.
- 
- 
- File: emacs,  Node: Auto Fill,  Next: Fill Commands,  Up: Filling
- 
- Auto Fill Mode
- --------------
- 
-    "Auto Fill" mode is a minor mode in which lines are broken
- automatically when they become too wide.  Breaking happens only when
- you type a SPC or RET.
- 
- `M-x auto-fill-mode'
-      Enable or disable Auto Fill mode.
- 
- `SPC'
- `RET'
-      In Auto Fill mode, break lines when appropriate.
- 
-    `M-x auto-fill-mode' turns Auto Fill mode on if it was off, or off
- if it was on.  With a positive numeric argument it always turns Auto
- Fill mode on, and with a negative argument always turns it off.  You can
- see when Auto Fill mode is in effect by the presence of the word `Fill'
- in the mode line, inside the parentheses.  Auto Fill mode is a minor
- mode which is enabled or disabled for each buffer individually.  *Note
- Minor Modes::.
- 
-    In Auto Fill mode, lines are broken automatically at spaces when
- they get longer than the desired width.  Line breaking and
- rearrangement takes place only when you type SPC or RET.  If you wish
- to insert a space or newline without permitting line-breaking, type
- `C-q SPC' or `C-q LFD' (recall that a newline is really a linefeed).
- Also, `C-o' inserts a newline without line breaking.
- 
-    Auto Fill mode works well with Lisp mode, because when it makes a new
- line in Lisp mode it indents that line with TAB.  If a line ending in a
- comment gets too long, the text of the comment is split into two
- comment lines.  Optionally new comment delimiters are inserted at the
- end of the first line and the beginning of the second so that each line
- is a separate comment; the variable `comment-multi-line' controls the
- choice (*note Comments::.).
- 
-    Auto Fill mode does not refill entire paragraphs; it can break lines
- but cannot merge lines.  So editing in the middle of a paragraph can
- result in a paragraph that is not correctly filled.  The easiest way to
- make the paragraph properly filled again is usually with the explicit
- fill commands.  *Note Fill Commands::.
- 
-    Many users like Auto Fill mode and want to use it in all text files.
- The section on init files says how to arrange this permanently for
- yourself.  *Note Init File::.
- 
- 
- File: emacs,  Node: Fill Commands,  Next: Fill Prefix,  Prev: Auto Fill,  Up: Filling
- 
- Explicit Fill Commands
- ----------------------
- 
- `M-q'
-      Fill current paragraph (`fill-paragraph').
- 
- `C-x f'
-      Set the fill column (`set-fill-column').
- 
- `M-x fill-region'
-      Fill each paragraph in the region (`fill-region').
- 
- `M-x fill-region-as-paragraph.'
-      Fill the region, considering it as one paragraph.
- 
- `M-s'
-      Center a line.
- 
-    To refill a paragraph, use the command `M-q' (`fill-paragraph').
- This operates on the paragraph that point is inside, or the one after
- point if point is between paragraphs.  Refilling works by removing all
- the line-breaks, then inserting new ones where necessary.
- 
-    To refill many paragraphs, use `M-x fill-region', which divides the
- region into paragraphs and fills each of them.
- 
-    `M-q' and `fill-region' use the same criteria as `M-h' for finding
- paragraph boundaries (*note Paragraphs::.).  For more control, you can
- use `M-x fill-region-as-paragraph', which refills everything between
- point and mark.  This command deletes any blank lines within the
- region, so separate blocks of text end up combined into one block.
- 
-    A numeric argument to `M-q' causes it to "justify" the text as well
- as filling it.  This means that extra spaces are inserted to make the
- right margin line up exactly at the fill column.  To remove the extra
- spaces, use `M-q' with no argument.  (Likewise for `fill-region'.)
- Another way to control justification, and choose other styles of
- filling, is with the `justification' text property; see *Note Format
- Justification::.
- 
-    When `adaptive-fill-mode' is non-`nil' (which is normally the case),
- if you use `fill-region-as-paragraph' on an indented paragraph and you
- don't have a fill prefix, it uses the indentation of the second line of
- the paragraph as the fill prefix.  The effect of adaptive filling is
- not noticeable in Text mode, because an indented line counts as a
- paragraph starter and thus each line of an indented paragraph is
- considered a paragraph of its own.  But you do notice the effect in
- Indented Text mode and some other major modes.
- 
-    The command `M-s' (`center-line') centers the current line within
- the current fill column.  With an argument N, it centers N lines
- individually and moves past them.
- 
-    The maximum line width for filling is in the variable `fill-column'.
- Altering the value of `fill-column' makes it local to the current
- buffer; until that time, the default value is in effect.  The default
- is initially 70.  *Note Locals::.  The easiest way to set `fill-column'
- is to use the command `C-x f' (`set-fill-column').  With no argument,
- it sets `fill-column' to the current horizontal position of point.
- With a numeric argument, it uses that as the new fill column.
- 
-    Emacs commands normally consider a period followed by two spaces or
- by a newline as the end of a sentence; a period followed by just one
- space indicates an abbreviation and not the end of a sentence.  To
- preserve the distinction between these two ways of using a period, the
- fill commands do not break a line after a period followed by just one
- space.
- 
-    If the variable `sentence-end-double-space' is `nil', the fill
- commands expect and leave just one space at the end of a sentence.
- Ordinarily this variable is `t', so the fill commands insist on two
- spaces for the end of a sentence, as explained above.  *Note
- Sentences::.
- 
- 
- File: emacs,  Node: Fill Prefix,  Prev: Fill Commands,  Up: Filling
- 
- The Fill Prefix
- ---------------
- 
-    To fill a paragraph in which each line starts with a special marker
- (which might be a few spaces, giving an indented paragraph), use the
- "fill prefix" feature.  The fill prefix is a string which Emacs expects
- every line to start with, and which is not included in filling.
- 
- `C-x .'
-      Set the fill prefix (`set-fill-prefix').
- 
- `M-q'
-      Fill a paragraph using current fill prefix (`fill-paragraph').
- 
- `M-x fill-individual-paragraphs'
-      Fill the region, considering each change of indentation as
-      starting a new paragraph.
- 
- `M-x fill-nonuniform-paragraphs'
-      Fill the region, considering only paragraph-separator lines as
-      starting a new paragraph.
- 
-    To specify a fill prefix, move to a line that starts with the desired
- prefix, put point at the end of the prefix, and give the command
- `C-x .' (`set-fill-prefix').  That's a period after the `C-x'.  To turn
- off the fill prefix, specify an empty prefix: type `C-x .' with point
- at the beginning of a line.
- 
-    When a fill prefix is in effect, the fill commands remove the fill
- prefix from each line before filling and insert it on each line after
- filling.  Auto Fill mode also inserts the fill prefix automatically when
- it makes a new line.  The `C-o' command inserts the fill prefix on new
- lines it creates, when you use it at the beginning of a line (*note
- Blank Lines::.).  Conversely, the command `M-^' deletes the prefix (if
- it occurs) after the newline that it deletes (*note Indentation::.).
- 
-    For example, if `fill-column' is 40 and you set the fill prefix to
- `;; ', then `M-q' in the following text
- 
-      ;; This is an
-      ;; example of a paragraph
-      ;; inside a Lisp-style comment.
- 
- produces this:
- 
-      ;; This is an example of a paragraph
-      ;; inside a Lisp-style comment.
- 
-    Lines that do not start with the fill prefix are considered to start
- paragraphs, both in `M-q' and the paragraph commands; this is gives
- good results for paragraphs with hanging indentation (every line
- indented except the first one).  Lines which are blank or indented once
- the prefix is removed also separate or start paragraphs; this is what
- you want if you are writing multi-paragraph comments with a comment
- delimiter on each line.
- 
-    You can use `M-x fill-individual-paragraphs' to set the fill prefix
- for each paragraph automatically.  This command divides the region into
- paragraphs, treating every change in the amount of indentation as the
- start of a new paragraph, and fills each of these paragraphs.  Thus,
- all the lines in one "paragraph" have the same amount of indentation.
- That indentation serves as the fill prefix for that paragraph.
- 
-    `M-x fill-nonuniform-paragraphs' is a similar command that divides
- the region into paragraphs in a different way.  It considers only
- paragraph-separating lines (as defined by `paragraph-separate') as
- starting a new paragraph.  Since this means that the lines of one
- paragraph may have different amounts of indentation, the fill prefix
- used is the smallest amount of indentation of any of the lines of the
- paragraph.  This gives good results with styles that indent a
- paragraph's first line more or less that the rest of the paragraph.
- 
-    The fill prefix is stored in the variable `fill-prefix'.  Its value
- is a string, or `nil' when there is no fill prefix.  This is a
- per-buffer variable; altering the variable affects only the current
- buffer, but there is a default value which you can change as well.
- *Note Locals::.
- 
-    The `indentation' text property provides another way to control the
- amount of indentation paragraphs receive.  *Note Format Indentation::.
- 
- 
- File: emacs,  Node: Case,  Next: Text Mode,  Prev: Filling,  Up: Text
- 
- Case Conversion Commands
- ========================
- 
-    Emacs has commands for converting either a single word or any
- arbitrary range of text to upper case or to lower case.
- 
- `M-l'
-      Convert following word to lower case (`downcase-word').
- 
- `M-u'
-      Convert following word to upper case (`upcase-word').
- 
- `M-c'
-      Capitalize the following word (`capitalize-word').
- 
- `C-x C-l'
-      Convert region to lower case (`downcase-region').
- 
- `C-x C-u'
-      Convert region to upper case (`upcase-region').
- 
-    The word conversion commands are the most useful.  `M-l'
- (`downcase-word') converts the word after point to lower case, moving
- past it.  Thus, repeating `M-l' converts successive words.  `M-u'
- (`upcase-word') converts to all capitals instead, while `M-c'
- (`capitalize-word') puts the first letter of the word into upper case
- and the rest into lower case.  All these commands convert several words
- at once if given an argument.  They are especially convenient for
- converting a large amount of text from all upper case to mixed case,
- because you can move through the text using `M-l', `M-u' or `M-c' on
- each word as appropriate, occasionally using `M-f' instead to skip a
- word.
- 
-    When given a negative argument, the word case conversion commands
- apply to the appropriate number of words before point, but do not move
- point.  This is convenient when you have just typed a word in the wrong
- case: you can give the case conversion command and continue typing.
- 
-    If a word case conversion command is given in the middle of a word,
- it applies only to the part of the word which follows point.  This is
- just like what `M-d' (`kill-word') does.  With a negative argument,
- case conversion applies only to the part of the word before point.
- 
-    The other case conversion commands are `C-x C-u' (`upcase-region')
- and `C-x C-l' (`downcase-region'), which convert everything between
- point and mark to the specified case.  Point and mark do not move.
- 
-    The region case conversion commands `upcase-region' and
- `downcase-region' are normally disabled.  This means that they ask for
- confirmation if you try to use them.  When you confirm, you may enable
- the command, which means it will not ask for confirmation again.  *Note
- Disabling::.
- 
- 
- File: emacs,  Node: Text Mode,  Next: Outline Mode,  Prev: Case,  Up: Text
- 
- Text Mode
- =========
- 
-    When you edit files of text in a human language, it's more convenient
- to use Text mode rather than Fundamental mode.  Invoke `M-x text-mode'
- to enter Text mode.  In Text mode, TAB runs the function
- `tab-to-tab-stop', which allows you to use arbitrary tab stops set with
- `M-x edit-tab-stops' (*note Tab Stops::.).  Features concerned with
- comments in programs are turned off in Text mode except when explicitly
- invoked.  The syntax table is changed so that periods are not
- considered part of a word, while apostrophes, backspaces and underlines
- are part of words.
- 
-    A similar variant mode is Indented Text mode, intended for editing
- text in which most lines are indented.  This mode defines TAB to run
- `indent-relative' (*note Indentation::.), and makes Auto Fill indent
- the lines it creates.  The result is that normally a line made by Auto
- Filling, or by LFD, is indented just like the previous line.  In
- Indented Text mode, only blank lines separate paragraphs--indented
- lines continue the current paragraph.  Use `M-x indented-text-mode' to
- select this mode.
- 
-    Text mode, and all the modes based on it, define `M-TAB' as the
- command `ispell-complete-word', which performs completion of the
- partial word in the buffer before point, using the spelling dictionary
- as the space of possible words.  *Note Spelling::.
- 
-    Entering Text mode or Indented Text mode runs the hook
- `text-mode-hook'.  Other major modes related to Text mode also run this
- hook, followed by hooks of their own; this includes Nroff mode, TeX
- mode, Outline mode and Mail mode.  Hook functions on `text-mode-hook'
- can look at the value of `major-mode' to see which of these modes is
- actually being entered.  *Note Hooks::.
- 
- * Menu:
- 
-   Emacs provides two other modes for editing text that is to be passed
- through a text formatter to produce fancy formatted printed output.
- 
- * Nroff Mode::	  The major mode for editing input to the formatter nroff.
- * TeX Mode::	  The major modes for editing input to the formatter TeX.
- 
-   Another mode is used for editing outlines.  It allows you to view the
- text at various levels of detail.  You can view either the outline
- headings alone or both headings and text; you can also hide some of the
- headings at lower levels from view to make the high level structure more
- visible.
- 
- * Outline Mode::  The major mode for editing outlines.
- 
- 
- File: emacs,  Node: Outline Mode,  Next: TeX Mode,  Prev: Text Mode,  Up: Text
- 
- Outline Mode
- ============
- 
-    Outline mode is a major mode much like Text mode but intended for
- editing outlines.  It allows you to make parts of the text temporarily
- invisible so that you can see the outline structure.  Type `M-x
- outline-mode' to switch to Outline mode as the major mode of the current
- buffer.
- 
-    When Outline mode makes a line invisible, the line does not appear on
- the screen.  The screen appears exactly as if the invisible line were
- deleted, except that an ellipsis (three periods in a row) appears at the
- end of the previous visible line (only one ellipsis no matter how many
- invisible lines follow).
- 
-    All editing commands treat the text of the invisible line as part of
- the previous visible line.  For example, `C-n' moves onto the next
- visible line.  Killing an entire visible line, including its
- terminating newline, really kills all the following invisible lines
- along with it; yanking it all back yanks the invisible lines and they
- remain invisible.
- 
-    Outline minor mode provides the same commands as the major mode,
- Outline mode, but you can use it in conjunction with other major modes.
- Type `M-x outline-minor-mode' to enable the Outline minor mode in the
- current buffer.  You can also specify this in the text of a file, with
- a file local variable of the form `mode: outline-minor' (*note File
- Variables::.).
- 
-    The major mode, Outline mode, provides special key bindings on the
- `C-c' prefix.  Outline minor mode provides similar bindings with `C-c
- @' as the prefix; this is to reduce the conflicts with the major mode's
- special commands.  (The variable `outline-minor-mode-prefix' controls
- the prefix used.)
- 
-    Entering Outline mode runs the hook `text-mode-hook' followed by the
- hook `outline-mode-hook' (*note Hooks::.).
- 
- * Menu:
- 
- * Format: Outline Format.	   What the text of an outline looks like.
- * Motion: Outline Motion.	   Special commands for moving through
-                                      outlines.
- * Visibility: Outline Visibility.  Commands to control what is visible.
- * Views: Outline Views.            Outlines and multiple views.
- 
- 
- File: emacs,  Node: Outline Format,  Next: Outline Motion,  Up: Outline Mode
- 
- Format of Outlines
- ------------------
- 
-    Outline mode assumes that the lines in the buffer are of two types:
- "heading lines" and "body lines".  A heading line represents a topic in
- the outline.  Heading lines start with one or more stars; the number of
- stars determines the depth of the heading in the outline structure.
- Thus, a heading line with one star is a major topic; all the heading
- lines with two stars between it and the next one-star heading are its
- subtopics; and so on.  Any line that is not a heading line is a body
- line.  Body lines belong with the preceding heading line.  Here is an
- example:
- 
-      * Food
-      
-      This is the body,
-      which says something about the topic of food.
-      
-      ** Delicious Food
-      
-      This is the body of the second-level header.
-      
-      ** Distasteful Food
-      
-      This could have
-      a body too, with
-      several lines.
-      
-      *** Dormitory Food
-      
-      * Shelter
-      
-      Another first-level topic with its header line.
- 
-    A heading line together with all following body lines is called
- collectively an "entry".  A heading line together with all following
- deeper heading lines and their body lines is called a "subtree".
- 
-    You can customize the criterion for distinguishing heading lines by
- setting the variable `outline-regexp'.  Any line whose beginning has a
- match for this regexp is considered a heading line.  Matches that start
- within a line (not at the left margin) do not count.  The length of the
- matching text determines the level of the heading; longer matches make
- a more deeply nested level.  Thus, for example, if a text formatter has
- commands `@chapter', `@section' and `@subsection' to divide the
- document into chapters and sections, you could make those lines count
- as heading lines by setting `outline-regexp' to
- `"@chap\\|@\\(sub\\)*section"'.  Note the trick: the two words
- `chapter' and `section' are equally long, but by defining the regexp to
- match only `chap' we ensure that the length of the text matched on a
- chapter heading is shorter, so that Outline mode will know that
- sections are contained in chapters.  This works as long as no other
- command starts with `@chap'.
- 
-    It is possible to change the rule for calculating the level of a
- heading line by setting the variable `outline-level'.  The value of
- `outline-level' should be a function that takes no arguments and
- returns the level of the current heading.  Some major modes such as C,
- Nroff, and Emacs Lisp mode set this variable in order to work with
- Outline minor mode.
- 
-    Outline mode makes a line invisible by changing the newline before it
- into an ASCII control-M (code 015).  Most editing commands that work on
- lines treat an invisible line as part of the previous line because,
- strictly speaking, it *is* part of that line, since there is no longer a
- newline in between.  When you save the file in Outline mode, control-M
- characters are saved as newlines, so the invisible lines become ordinary
- lines in the file.  But saving does not change the visibility status of
- a line inside Emacs.
- 
- 
- File: emacs,  Node: Outline Motion,  Next: Outline Visibility,  Prev: Outline Format,  Up: Outline Mode
- 
- Outline Motion Commands
- -----------------------
- 
-    Outline mode provides special motion commands that move backward and
- forward to heading lines.
- 
- `C-c C-n'
-      Move point to the next visible heading line
-      (`outline-next-visible-heading').
- 
- `C-c C-p'
-      Move point to the previous visible heading line
-      (`outline-previous-visible-heading').
- 
- `C-c C-f'
-      Move point to the next visible heading line at the same level as
-      the one point is on (`outline-forward-same-level').
- 
- `C-c C-b'
-      Move point to the previous visible heading line at the same level
-      (`outline-backward-same-level').
- 
- `C-c C-u'
-      Move point up to a lower-level (more inclusive) visible heading
-      line (`outline-up-heading').
- 
-    `C-c C-n' (`next-visible-heading') moves down to the next heading
- line.  `C-c C-p' (`previous-visible-heading') moves similarly backward.
- Both accept numeric arguments as repeat counts.  The names emphasize
- that invisible headings are skipped, but this is not really a special
- feature.  All editing commands that look for lines ignore the invisible
- lines automatically.
- 
-    More powerful motion commands understand the level structure of
- headings.  `C-c C-f' (`outline-forward-same-level') and `C-c C-b'
- (`outline-backward-same-level') move from one heading line to another
- visible heading at the same depth in the outline.  `C-c C-u'
- (`outline-up-heading') moves backward to another heading that is less
- deeply nested.
- 
--- 0 ----
Index: emacs/info/forms
diff -c emacs/info/forms:1.1.1.2 emacs/info/forms:removed
*** emacs/info/forms:1.1.1.2	Mon Jul 22 01:52:43 1996
--- emacs/info/forms	Fri Aug  2 20:18:18 1996
***************
*** 1,833 ****
- This is Info file ../info/forms, produced by Makeinfo-1.55 from the
- input file forms.texi.
- 
-    This file documents Forms mode, a form-editing major mode for GNU
- Emacs.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
- 
- File: forms,  Node: Top,  Next: Forms Example,  Prev: (DIR),  Up: (DIR)
- 
- Forms Mode
- **********
- 
-    Forms mode is an Emacs major mode for working with simple textual
- data bases in a forms-oriented manner.  In Forms mode, the information
- in these files is presented in an Emacs window in a user-defined format,
- one record at a time.  The user can view records or modify their
- contents.
- 
-    Forms mode is not a simple major mode, but requires two files to do
- its job: a control file and a data file.  The data file holds the
- actual data to be presented.  The control file describes how to present
- it.
- 
- * Menu:
- 
- * Forms Example::               An example: editing the password data base.
- * Entering and Exiting Forms Mode::
-                                 How to visit a file in Forms mode.
- * Forms Commands::              Special commands to use while in Forms mode.
- * Data File Format::            How to format the data file.
- * Control File Format::         How to control forms mode.
- * Format Description::          How to define the forms layout.
- * Modifying Forms Contents::    How to modify.
- * Miscellaneous::               Forms mode messages and other remarks.
- * Error Messages::              List of error messages forms mode can produce.
- * Long Example::                A more complex control file example.
- * Credits::                     Thanks everyone.
- * Index::                       Index to this manual.
- 
- 
- File: forms,  Node: Forms Example,  Next: Entering and Exiting Forms Mode,  Prev: Top,  Up: Top
- 
- Forms Example
- *************
- 
-    Let's illustrate Forms mode with an example.  Suppose you are
- looking at the `/etc/passwd' file, and the screen looks like this:
- 
-      ====== /etc/passwd ======
-      
-      User : root   Uid: 0   Gid: 1
-      
-      Name : Super User
-      
-      Home : /
-      
-      Shell: /bin/sh
- 
-    As you can see, the familiar fields from the entry for the super user
- are all there, but instead of being colon-separated on one single line,
- they make up a forms.
- 
-    The contents of the forms consist of the contents of the fields of
- the record (e.g. `root', `0', `1', `Super User') interspersed with
- normal text (e.g `User : ', `Uid: ').
- 
-    If you modify the contents of the fields, Forms mode will analyze
- your changes and update the file appropriately.  You cannot modify the
- interspersed explanatory text (unless you go to some trouble about it),
- because that is marked read-only (*note Text Properties: (elisp)Text
- Properties.).
- 
-    The Forms mode control file specifies the relationship between the
- format of `/etc/passwd' and what appears on the screen in Forms mode.
- *Note Control File Format::.
- 
- 
- File: forms,  Node: Entering and Exiting Forms Mode,  Next: Forms Commands,  Prev: Forms Example,  Up: Top
- 
- Entering and Exiting Forms Mode
- *******************************
- 
- `M-x forms-find-file RET CONTROL-FILE RET'
-      Visit a database using Forms mode.  Specify the name of the
-      *control file*, not the data file!
- 
- `M-x forms-find-file-other-window RET CONTROL-FILE RET'
-      Similar, but displays the file in another window.
- 
-    The command `forms-find-file' evaluates the file CONTROL-FILE, and
- also visits it in Forms mode.  What you see in its buffer is not the
- contents of this file, but rather a single record of the corresponding
- data file that is visited in its own buffer.  So there are two buffers
- involved in Forms mode: the "forms buffer" that is initially used to
- visit the control file and that shows the records being browsed, and
- the "data buffer" that holds the data file being visited.  The latter
- buffer is normally not visible.
- 
-    Initially, the first record is displayed in the forms buffer.  The
- mode line displays the major mode name `Forms', followed by the minor
- mode `View' if the data base is read-only.  The number of the current
- record (N) and the total number of records in the file(T) are shown in
- the mode line as `N/T'.  For example:
- 
-      --%%-Emacs: passwd-demo          (Forms View 1/54)----All-------
- 
-    If the buffer is not read-only, you may change the buffer to modify
- the fields in the record.  When you move to a different record, the
- contents of the buffer are parsed using the specifications in
- `forms-format-list', and the data file is updated.  If the record has
- fields that aren't included in the display, they are not changed.
- 
-    Entering Forms mode runs the normal hook `forms-mode-hooks' to
- perform user-defined customization.
- 
-    To save any modified data, you can use `C-x C-s'
- (`forms-save-buffer').  This does not save the forms buffer (which would
- be rather useless), but instead saves the buffer visiting the data file.
- 
-    To terminate Forms mode, you can use `C-x C-s' (`forms-save-buffer')
- and then kill the forms buffer.  However, the data buffer will still
- remain.  If this is not desired, you have to kill this buffer too.
- 
- 
- File: forms,  Node: Forms Commands,  Next: Data File Format,  Prev: Entering and Exiting Forms Mode,  Up: Top
- 
- Forms Commands
- **************
- 
-    The commands of Forms mode belong to the `C-c' prefix, with one
- exception: TAB, which moves to the next field.  Forms mode uses
- different key maps for normal mode and read-only mode.  In read-only
- Forms mode, you can access most of the commands without the `C-c'
- prefix, but you must type ordinary letters instead of control
- characters; for example, type `n' instead of `C-c C-n'.
- 
-    If your Emacs has been built with X-toolkit support, Forms mode will
- provide its own menu with a number of Forms mode commands.
- 
- `C-c C-n'
-      Show the next record (`forms-next-record').  With a numeric
-      argument N, show the Nth next record.
- 
- `C-c C-p'
-      Show the previous record (`forms-prev-record').  With a numeric
-      argument N, show the Nth previous record.
- 
- `C-c C-l'
-      Jump to a record by number (`forms-jump-record').   Specify the
-      record number with a numeric argument.
- 
- `C-c <'
-      Jump to the first record (`forms-first-record').
- 
- `C-c >'
-      Jump to the last record (`forms-last-record').  This command also
-      recalculates the number of records in the data file.
- 
- `TAB'
- `C-c TAB'
-      Jump to the next field in the current record (`forms-next-field').
-      With a numeric argument N, jump forward N fields.  If this command
-      would move past the last field, it wraps around to the first field.
- 
- `C-c C-q'
-      Toggles read-only mode (`forms-toggle-read-only').  In read-only
-      Forms mode, you cannot edit the fields; most Forms mode commands
-      can be accessed without the prefix `C-c' if you use the normal
-      letter instead (for example, type `n' instead of `C-c C-n').  In
-      edit mode, you can edit the fields and thus change the contents of
-      the data base; you must begin Forms mode commands with `C-c'.
-      Switching to edit mode is allowed only if you have write access to
-      the data file.
- 
- `C-c C-o'
-      Create a new record and insert it before the current record
-      (`forms-insert-record').  It starts out with empty (or default)
-      contents for its fields; you can then edit the fields.  With a
-      numeric argument, the new record is created *after* the current
-      one.  See also `forms-modified-record-filter' in *Note Modifying
-      Forms Contents::.
- 
- `C-c C-k'
-      Delete the current record (`forms-delete-record').  You are
-      prompted for confirmation before the record is deleted unless a
-      numeric argument has been provided.
- 
- `C-c C-s REGEXP RET'
-      Search forward for REGEXP in all records following this one
-      (`forms-search-forward').  If found, this record is shown.  If you
-      give an empty argument, the previous regexp is used again.
- 
- `C-c C-s REGEXP RET'
-      Search backward for REGEXP in all records following this one
-      (`forms-search-backward').  If found, this record is shown.  If
-      you give an empty argument, the previous regexp is used again.
- 
- `M-x forms-prev-field'
-      Similar to `forms-next-field' but moves backwards.
- 
- `M-x forms-save-buffer'
- `C-x C-s'
-      Forms mode replacement for `save-buffer'. When executed in the
-      forms buffer it will save the contents of the (modified) data
-      buffer instead. In Forms mode this function will be bound to `C-x
-      C-s'.
- 
- `M-x forms-print'
-      This command can be used to make a formatted print of the contents
-      of the data file.
- 
-    In addition the command `M-x revert-buffer' is useful in Forms mode
- just as in other modes.
- 
-    The following function key definitions are set up in Forms mode
- (whether read-only or not):
- 
- `next'
-      forms-next-record
- 
- `prior'
-      forms-prev-record
- 
- `begin'
-      forms-first-record
- 
- `end'
-      forms-last-record
- 
- `S-Tab'
-      forms-prev-field
- 
- 
- File: forms,  Node: Data File Format,  Next: Control File Format,  Prev: Forms Commands,  Up: Top
- 
- Data File Format
- ****************
- 
-    Files for use with Forms mode are very simple--each "record"
- (usually one line) forms the contents of one form.  Each record consists
- of a number of "fields", which are separated by the value of the string
- `forms-field-sep', which is `"\t"' (a Tab) by default.
- 
-    If the format of the data file is not suitable enough you can define
- the filter functions `forms-read-file-filter' and
- `forms-write-file-filter'. `forms-read-file-filter' is called when the
- data file is read from disk into the data buffer. It operates on the
- data buffer, ignoring read-only protections. When the data file is
- saved to disk `forms-write-file-filter' is called to cancel the effects
- of `forms-read-file-filter'. After being saved,
- `forms-read-file-filter' is called again to prepare the data buffer for
- further processing.
- 
-    Fields may contain text which shows up in the forms in multiple
- lines.  These lines are separated in the field using a "pseudo-newline"
- character which is defined by the value of the string
- `forms-multi-line'.  Its default value is `"\^k"' (a Control-K
- character).  If it is set to `nil', multiple line fields are prohibited.
- 
-    If the data file does not exist, it is automatically created.
- 
- 
- File: forms,  Node: Control File Format,  Next: Format Description,  Prev: Data File Format,  Up: Top
- 
- Control File Format
- *******************
- 
-    The Forms mode "control file" serves two purposes.  First, it names
- the data file to use, and defines its format and properties.  Second,
- the Emacs buffer it occupies is used by Forms mode to display the forms.
- 
-    The contents of the control file are evaluated as a Lisp program.  It
- should set the following Lisp variables to suitable values:
- 
- `forms-file'
-      This variable specifies the name of the data file.  Example:
- 
-           (setq forms-file "my/data-file")
- 
-      If the control file doesn't set `forms-file', Forms mode reports
-      an error.
- 
- `forms-format-list'
-      This variable describes the way the fields of the record are
-      formatted on the screen.  For details, see *Note Format
-      Description::.
- 
- `forms-number-of-fields'
-      This variable holds the number of fields in each record of the data
-      file.  Example:
- 
-           (setq forms-number-of-fields 10)
- 
-    If the control file does not set `forms-format-list' a default
- format is used.  In this situation, Forms mode will deduce the number of
- fields from the data file providing this file exists and
- `forms-number-of-records' has not been set in the control file.
- 
-    The control file can optionally set the following additional Forms
- mode variables.  Most of them have default values that are good for most
- applications.
- 
- `forms-field-sep'
-      This variable may be used to designate the string which separates
-      the fields in the records of the data file.  If not set, it
-      defaults to the string `"\t"' (a Tab character).  Example:
- 
-           (setq forms-field-sep "\t")
- 
- `forms-read-only'
-      If the value is non-`nil', the data file is treated read-only.
-      (Forms mode also treats the data file as read-only if you don't
-      have access to write it.)  Example:
- 
-           (set forms-read-only t)
- 
- `forms-multi-line'
-      This variable specifies the "pseudo newline" separator that allows
-      multi-line fields.  This separator goes between the "lines" within
-      a field--thus, the field doesn't really contain multiple lines,
-      but it appears that way when displayed in Forms mode.  If the
-      value is `nil', multi-line text fields are prohibited.  The pseudo
-      newline must not be a character contained in `forms-field-sep'.
- 
-      The default value is `"\^k"', the character Control-K.  Example:
- 
-           (setq forms-multi-line "\^k")
- 
- `forms-read-file-filter'
-      This variable holds the name of a function to be called after the
-      data file has been read in. This can be used to transform the
-      contents of the data file into a format more suitable for forms
-      processing.  If it is `nil', no function is called.
- 
- `forms-write-file-filter'
-      This variable holds the name of a function to be called before
-      writing out the contents of the data file.  This can be used to
-      undo the effects of `forms-read-file-filter'.  If it is `nil', no
-      function is called.
- 
- `forms-new-record-filter'
-      This variable holds a function to be called whenever a new record
-      is created to supply default values for fields.  If it is `nil',
-      no function is called.  *Note Modifying Forms Contents::, for
-      details.
- 
- `forms-modified-record-filter'
-      This variable holds a function to be called whenever a record is
-      modified, just before updating the Forms data file.  If it is
-      `nil', no function is called.  *Note Modifying Forms Contents::,
-      for details.
- 
- 
- File: forms,  Node: Format Description,  Next: Modifying Forms Contents,  Prev: Control File Format,  Up: Top
- 
- The Format Description
- **********************
- 
-    The variable `forms-format-list' specifies the format of the data in
- the data file, and how to convert the data for display in Forms mode.
- Its value must be a list of Forms mode "formatting elements", each of
- which can be a string, a number, a Lisp list, or a Lisp symbol that
- evaluates to one of those.  The formatting elements are processed in the
- order they appear in the list.
- 
- STRING
-      A string formatting element is inserted in the forms "as is," as
-      text that the user cannot alter.
- 
- NUMBER
-      A number element selects a field of the record.  The contents of
-      this field are inserted in the display at this point.  Field
-      numbers count starting from 1 (one).
- 
- LIST
-      A formatting element that is a list specifies a function call.
-      This function is called every time a record is displayed, and its
-      result, which must be a string, is inserted in the display text.
-      The function should do nothing but returning a string.
- 
-      The function you call can access the fields of the record as a
-      list in the variable `forms-fields'.
- 
- SYMBOL
-      A symbol used as a formatting element should evaluate to a string,
-      number, or list; the value is interpreted as a formatting element,
-      as described above.
- 
-    If a record does not contain the number of fields as specified in
- `forms-number-of-fields', a warning message will be printed.  Excess
- fields are ignored, missing fields are set to empty.
- 
-    The control file which displays `/etc/passwd' file as demonstrated
- in the beginning of this manual might look as follows:
- 
-      ;; This demo visits `/etc/passwd'.
-      
-      (setq forms-file "/etc/passwd")
-      (setq forms-number-of-fields 7)
-      (setq forms-read-only t)                 ; to make sure
-      (setq forms-field-sep ":")
-      ;; Don't allow multi-line fields.
-      (setq forms-multi-line nil)
-      
-      (setq forms-format-list
-            (list
-             "====== /etc/passwd ======\n\n"
-             "User : "    1
-             "   Uid: "   3
-             "   Gid: "   4
-             "\n\n"
-             "Name : "    5
-             "\n\n"
-             "Home : "    6
-             "\n\n"
-             "Shell: "    7
-             "\n"))
- 
-    When you construct the value of  `forms-format-list', you should
- usually either quote the whole value, like this,
- 
-      (setq forms-format-list
-           '(
-             "====== " forms-file " ======\n\n"
-             "User : "    1
-             (make-string 20 ?-)
-             ...
-            ))
- 
- or quote the elements which are lists, like this:
- 
-      (setq forms-format-list
-            (list
-             "====== " forms-file " ======\n\n"
-             "User : "    1
-             '(make-string 20 ?-)
-             ...
-            ))
- 
-    Forms mode validates the contents of `forms-format-list' when you
- visit a database.  If there are errors, processing is aborted with an
- error message which includes a descriptive text.  *Note Error
- Messages::, for a detailed list of error messages.
- 
-    If no `forms-format-list' is specified, Forms mode will supply a
- default format list.  This list contains the name of the file being
- visited, and a simple label for each field indicating the field number.
- 
- 
- File: forms,  Node: Modifying Forms Contents,  Next: Miscellaneous,  Prev: Format Description,  Up: Top
- 
- Modifying The Forms Contents
- ****************************
- 
-    If `forms-read-only' is `nil', the user can modify the fields and
- records of the database.
- 
-    All normal editing commands are available for editing the contents
- of the displayed record.  You cannot delete or modify the fixed,
- explanatory text that comes from string formatting elements, but you
- can modify the actual field contents.
- 
-    If the variable `forms-modified-record-filter' is non-`nil', it is
- called as a function before the new data is written to the data file.
- The function receives one argument, a vector that contains the contents
- of the fields of the record.
- 
-    The function can refer to fields with `aref' and modify them with
- `aset'.  The first field has number 1 (one); thus, element 0 of the
- vector is not used.  The function should return the same vector it was
- passed; the (possibly modified) contents of the vector determine what is
- actually written in the file.  Here is an example:
- 
-      (defun my-modified-record-filter (record)
-        ;; Modify second field.
-        (aset record 2 (current-time-string))
-        ;; Return the field vector.
-        record)
-      
-      (setq forms-modified-record-filter 'my-modified-record-filter)
- 
-    If the variable `forms-new-record-filter' is non-`nil', its value is
- a function to be called to fill in default values for the fields of a
- new record.  The function is passed a vector of empty strings, one for
- each field; it should return the same vector, with the desired field
- values stored in it.  Fields are numbered starting from 1 (one).
- Example:
- 
-      (defun my-new-record-filter (fields)
-        (aset fields 5 (login-name))
-        (aset fields 1 (current-time-string))
-        fields)
-      
-      (setq forms-new-record-filter 'my-new-record-filter)
- 
- 
- File: forms,  Node: Miscellaneous,  Next: Error Messages,  Prev: Modifying Forms Contents,  Up: Top
- 
- Miscellaneous
- *************
- 
-    The global variable `forms-version' holds the version information of
- the Forms mode software.
- 
-    It is very convenient to use symbolic names for the fields in a
- record.  The function `forms-enumerate' provides an elegant means to
- define a series of variables whose values are consecutive integers.  The
- function returns the highest number used, so it can be used to set
- `forms-number-of-fields' also.  For example:
- 
-      (setq forms-number-of-fields
-            (forms-enumerate
-             '(field1 field2 field3 ...)))
- 
-    This sets `field1' to 1, `field2' to 2, and so on.
- 
-    Care has been taken to keep the Forms mode variables buffer-local,
- so it is possible to visit multiple files in Forms mode simultaneously,
- even if they have different properties.
- 
-    If you have visited the control file in normal fashion with
- `find-file' or a like command, you can switch to Forms mode with the
- command `M-x forms-mode'.  If you put `-*- forms -*-' in the first line
- of the control file, then visiting it enables Forms mode automatically.
- But this makes it hard to edit the control file itself, so you'd
- better think twice before using this.
- 
-    The default format for the data file, using `"\t"' to separate
- fields and `"\^k"' to separate lines within a field, matches the file
- format of some popular database programs, e.g. FileMaker.  So
- `forms-mode' can decrease the need to use proprietary software.
- 
- 
- File: forms,  Node: Error Messages,  Next: Long Example,  Prev: Miscellaneous,  Up: Top
- 
- Error Messages
- **************
- 
-    This section describes all error messages which can be generated by
- forms mode.  Error messages that result from parsing the control file
- all start with the text `Forms control file error'.  Messages generated
- while analyzing the definition of `forms-format-list' start with `Forms
- format error'.
- 
- `Forms control file error: 'forms-file' has not been set'
-      The variable `forms-file' was not set by the control file.
- 
- `Forms control file error: 'forms-number-of-fields' has not been set'
-      The variable `forms-number-of-fields' was not set by the control
-      file.
- 
- `Forms control file error: 'forms-number-of-fields' must be a number > 0'
-      The variable `forms-number-of-fields' did not contain a positive
-      number.
- 
- `Forms control file error: 'forms-field-sep' is not a string'
- `Forms control file error: 'forms-multi-line' must be nil or a one-character string'
-      The variable `forms-multi-line' was set to something other than
-      `nil' or a single-character string.
- 
- `Forms control file error: 'forms-multi-line' is equal to 'forms-field-sep''
-      The variable `forms-multi-line' may not be equal to
-      `forms-field-sep' for this would make it impossible to distinguish
-      fields and the lines in the fields.
- 
- `Forms control file error: 'forms-new-record-filter' is not a function'
- `Forms control file error: 'forms-modified-record-filter' is not a function'
-      The variable has been set to something else than a function.
- 
- `Forms control file error: 'forms-format-list' is not a list'
-      The variable `forms-format-list' was not set to a Lisp list by the
-      control file.
- 
- `Forms format error: field number XX out of range 1..NN'
-      A field number was supplied in `forms-format-list' with a value of
-      XX, which was not greater than zero and smaller than or equal to
-      the number of fields in the forms, NN.
- 
- `Forms format error:  not a function FUN'
-      The first element of a list which is an element of
-      `forms-format-list' was not a valid Lisp function.
- 
- `Forms format error:  invalid element XX'
-      A list element was supplied in `forms-format-list' which was not a
-      string, number or list.
- 
- `Warning: this record has XX fields instead of YY'
-      The number of fields in this record in the data file did not match
-      `forms-number-of-fields'.  Missing fields will be made empty.
- 
- `Multi-line fields in this record - update refused!'
-      The current record contains newline characters, hence can not be
-      written back to the data file, for it would corrupt it.  Probably
-      you inserted a newline in a field, while `forms-multi-line' was
-      `nil'.
- 
- `Field separator occurs in record - update refused!'
-      The current record contains the field separator string inside one
-      of the fields. It can not be written back to the data file, for it
-      would corrupt it. Probably you inserted the field separator string
-      in a field.
- 
- `Record number XX out of range 1..YY'
-      A jump was made to non-existing record XX.  YY denotes the number
-      of records in the file.
- 
- `Stuck at record XX'
-      An internal error prevented a specific record from being retrieved.
- 
- `No write access to `"'FILE`"''
-      An attempt was made to enable edit mode on a file that has been
-      write protected.
- 
- ``"'REGEXP`"' not found'
-      The REGEXP could not be found in the data file, starting at the
-      current record location.
- 
- `Warning: number of records changed to NN'
-      Forms mode's idea of the number of records has been adjusted to the
-      number of records actually present in the data file.
- 
- `Problem saving buffers?'
-      An error occurred while saving the data file buffer. Most likely,
-      Emacs did ask to confirm deleting the buffer because it had been
-      modified, and you said `no'.
- 
- 
- File: forms,  Node: Long Example,  Next: Credits,  Prev: Error Messages,  Up: Top
- 
- Long Example
- ************
- 
-    The following example exploits most of the features of Forms mode.
- This example is included in the distribution as file `forms-d2.el'.
- 
-      ;; demo2 -- demo forms-mode	-*- emacs-lisp -*-
-      
-      ;; SCCS Status     : demo2	1.1.2
-      ;; Author          : Johan Vromans
-      ;; Created On      : 1989
-      ;; Last Modified By: Johan Vromans
-      ;; Last Modified On: Mon Jul  1 13:56:31 1991
-      ;; Update Count    : 2
-      ;; Status          : OK
-      ;;
-      ;; This sample forms exploit most of the features of forms mode.
-      
-      ;; Set the name of the data file.
-      (setq forms-file "forms-d2.dat")
-      
-      ;; Use `forms-enumerate' to set field names and number thereof.
-      (setq forms-number-of-fields
-            (forms-enumerate
-             '(arch-newsgroup			; 1
-      	 arch-volume			; 2
-      	 arch-issue			; and ...
-      	 arch-article			; ... so
-      	 arch-shortname			; ... ... on
-      	 arch-parts
-      	 arch-from
-      	 arch-longname
-      	 arch-keywords
-      	 arch-date
-      	 arch-remarks)))
-      
-      ;; The following functions are used by this form for layout purposes.
-      ;;
-      (defun arch-tocol (target &optional fill)
-        "Produces a string to skip to column TARGET.
-      Prepends newline if needed.
-      The optional FILL should be a character, used to fill to the column."
-        (if (null fill)
-            (setq fill ? ))
-        (if (< target (current-column))
-            (concat "\n" (make-string target fill))
-          (make-string (- target (current-column)) fill)))
-      ;;
-      (defun arch-rj (target field &optional fill)
-        "Produces a string to skip to column TARGET\
-       minus the width of field FIELD.
-      Prepends newline if needed.
-      The optional FILL should be a character,
-      used to fill to the column."
-        (arch-tocol (- target (length (nth field forms-fields))) fill))
-      
-      ;; Record filters.
-      ;;
-      (defun new-record-filter (the-record)
-        "Form a new record with some defaults."
-        (aset the-record arch-from (user-full-name))
-        (aset the-record arch-date (current-time-string))
-        the-record)				; return it
-      (setq forms-new-record-filter 'new-record-filter)
-      
-      ;; The format list.
-      (setq forms-format-list
-           (list
-             "====== Public Domain Software Archive ======\n\n"
-             arch-shortname
-             " - "			arch-longname
-             "\n\n"
-             "Article: "		arch-newsgroup
-             "/"			arch-article
-             " "
-             '(arch-tocol 40)
-             "Issue: "		arch-issue
-             " "
-             '(arch-rj 73 10)
-             "Date: "			arch-date
-             "\n\n"
-             "Submitted by: "		arch-from
-             "\n"
-             '(arch-tocol 79 ?-)
-             "\n"
-             "Keywords: "		arch-keywords
-             "\n\n"
-             "Parts: "		arch-parts
-             "\n\n====== Remarks ======\n\n"
-             arch-remarks
-           ))
-      
-      ;; That's all, folks!
- 
- 
- File: forms,  Node: Credits,  Next: Index,  Prev: Long Example,  Up: Top
- 
- Credits
- *******
- 
-    Bug fixes and other useful suggestions were supplied by Harald
- Hanche-Olsen (`hanche@imf.unit.no'), `cwitty@portia.stanford.edu',
- Jonathan I. Kamens, Per Cederqvist  (`ceder@signum.se'), Michael Lipka
- (`lipka@lip.hanse.de'), Andy Piper (`ajp@eng.cam.ac.uk'), Frederic
- Pierresteguy  (`F.Pierresteguy@frcl.bull.fr'), Ignatios Souvatzis and
- Richard Stallman (`rms@gnu.ai.mit.edu').
- 
-    This documentation was slightly inspired by the documentation of
- "rolo mode" by Paul Davis at Schlumberger Cambridge Research
- (`davis%scrsu1%sdr.slb.com@relay.cs.net').
- 
-    None of this would have been possible without GNU Emacs of the Free
- Software Foundation.  Thanks, Richard!
- 
- 
- File: forms,  Node: Index,  Prev: Credits,  Up: Top
- 
- Index
- *****
- 
- * Menu:
- 
- * TAB:                                  Forms Commands.
- * begin:                                Forms Commands.
- * C-c <:                                Forms Commands.
- * C-c >:                                Forms Commands.
- * C-c TAB:                              Forms Commands.
- * C-c C-k:                              Forms Commands.
- * C-c C-l:                              Forms Commands.
- * C-c C-n:                              Forms Commands.
- * C-c C-o:                              Forms Commands.
- * C-c C-p:                              Forms Commands.
- * C-c C-q:                              Forms Commands.
- * C-c C-s REGEXP RET:                   Forms Commands.
- * C-c C-s REGEXP RET:                   Forms Commands.
- * C-x C-s:                              Forms Commands.
- * control file:                         Control File Format.
- * end:                                  Forms Commands.
- * field:                                Data File Format.
- * forms-delete-record:                  Forms Commands.
- * forms-enumerate:                      Miscellaneous.
- * forms-field-sep:                      Control File Format.
- * forms-field-sep:                      Data File Format.
- * forms-fields:                         Format Description.
- * forms-file:                           Control File Format.
- * forms-find-file:                      Entering and Exiting Forms Mode.
- * forms-find-file-other-window:         Entering and Exiting Forms Mode.
- * forms-first-record:                   Forms Commands.
- * forms-format-list:                    Format Description.
- * forms-format-list:                    Control File Format.
- * forms-insert-record:                  Forms Commands.
- * forms-jump-record:                    Forms Commands.
- * forms-last-record:                    Forms Commands.
- * forms-mode:                           Miscellaneous.
- * forms-mode-hooks:                     Entering and Exiting Forms Mode.
- * forms-modified-record-filter:         Control File Format.
- * forms-multi-line:                     Data File Format.
- * forms-multi-line:                     Control File Format.
- * forms-new-record-filter:              Control File Format.
- * forms-next-field:                     Forms Commands.
- * forms-next-record:                    Forms Commands.
- * forms-number-of-fields:               Control File Format.
- * forms-prev-field:                     Forms Commands.
- * forms-prev-field:                     Forms Commands.
- * forms-prev-record:                    Forms Commands.
- * forms-print:                          Forms Commands.
- * forms-read-file-filter:               Control File Format.
- * forms-read-file-filter:               Data File Format.
- * forms-read-only:                      Control File Format.
- * forms-save-buffer:                    Forms Commands.
- * forms-search-backward:                Forms Commands.
- * forms-search-forward:                 Forms Commands.
- * forms-toggle-read-only:               Forms Commands.
- * forms-version:                        Miscellaneous.
- * forms-write-file-filter:              Control File Format.
- * forms-write-file-filter:              Data File Format.
- * next:                                 Forms Commands.
- * prior:                                Forms Commands.
- * pseudo-newline:                       Data File Format.
- * record:                               Data File Format.
- * S-Tab:                                Forms Commands.
- 
- 
- 
- Tag Table:
- Node: Top335
- Node: Forms Example1755
- Node: Entering and Exiting Forms Mode2974
- Node: Forms Commands5172
- Node: Data File Format8962
- Node: Control File Format10301
- Node: Format Description13856
- Node: Modifying Forms Contents17198
- Node: Miscellaneous19085
- Node: Error Messages20623
- Node: Long Example24511
- Node: Credits27583
- Node: Index28343
- 
- End Tag Table
--- 0 ----
Index: emacs/info/gnus
diff -c emacs/info/gnus:1.1.1.2 emacs/info/gnus:removed
*** emacs/info/gnus:1.1.1.2	Mon Jul 22 01:52:44 1996
--- emacs/info/gnus	Fri Aug  2 20:18:38 1996
***************
*** 1,77 ****
- This is Info file ../info/gnus, produced by Makeinfo-1.55 from the
- input file gnus.texi.
- 
-    This file documents GNUS, the GNU Emacs newsreader.
- 
-    Copyright (C) 1989, 1990, 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the entire resulting derived work is distributed under the terms
- of a permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions.
- 
- 
- Indirect:
- gnus-1: 783
- gnus-2: 50523
- gnus-3: 94488
- 
- Tag Table:
- (Indirect)
- Node: Top783
- Node: Starting Up1458
- Node: Getting Started1823
- Node: Finding the News2109
- Node: Buffers of GNUS4231
- Node: Newsgroup Buffer5069
- Node: Summary Buffer6233
- Node: Newsgroup Commands7369
- Node: Browsing Newsgroups8128
- Node: Selecting a Newsgroup9819
- Node: Maintaining Subscriptions11094
- Node: Exiting GNUS15393
- Node: Other Newsgroup Commands16444
- Node: Summary Commands16993
- Node: Reading Articles18204
- Node: Summary Motion19192
- Node: Reading an Article19999
- Node: Scrolling22571
- Node: Moving Among Articles23571
- Node: Marking Articles25680
- Node: Thread-based Reading28534
- Node: Digest Articles30946
- Node: Searching Articles32775
- Node: Referencing Articles34424
- Node: Saving Articles35377
- Node: Sorting Headers36630
- Node: Posting Articles37831
- Node: Forward and Reply40138
- Node: Exiting Newsgroup41066
- Node: Article Commands42201
- Node: Startup File43604
- Node: Kill File44724
- Node: Making a Kill File45531
- Node: Editing Kill Files48311
- Node: Kill File Example50004
- Node: Names of Kill Files50523
- Node: Background Kills51218
- Node: Advanced Kills51846
- Node: Customization54018
- Node: Variables54605
- Node: NNTP Variables76125
- Node: Spool Variables77745
- Node: Directory Variables79191
- Node: Hooks80027
- Node: Troubleshooting91308
- Node: Reporting Bugs92232
- Node: Index94488
- 
- End Tag Table
--- 0 ----
Index: emacs/info/gnus-1
diff -c emacs/info/gnus-1:1.1.1.2 emacs/info/gnus-1:removed
*** emacs/info/gnus-1:1.1.1.2	Mon Jul 22 01:52:46 1996
--- emacs/info/gnus-1	Fri Aug  2 20:18:41 1996
***************
*** 1,1402 ****
- This is Info file ../info/gnus, produced by Makeinfo-1.55 from the
- input file gnus.texi.
- 
-    This file documents GNUS, the GNU Emacs newsreader.
- 
-    Copyright (C) 1989, 1990, 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the entire resulting derived work is distributed under the terms
- of a permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions.
- 
- 
- File: gnus,  Node: Top,  Next: Starting Up,  Prev: (DIR),  Up: (DIR)
- 
- The GNUS News Reader
- ********************
- 
-    You can read netnews within Emacs using the GNUS package.  GNUS uses
- the NNTP protocol to communicate with a news server, which is a
- repository of news articles.  This need not be the same computer you
- are logged in on.
- 
-    While the author of GNUS recommends pronouncing it as "news", we
- recommend pronouncing it as "gnoose", to avoid confusion.
- 
- * Menu:
- 
- * Starting Up::
- * Buffers of GNUS::
- * Newsgroup Commands::
- * Summary Commands::
- * Article Commands::
- * Startup File::
- * Kill File::
- * Troubleshooting::
- * Customization::
- * Reporting Bugs::
- * Index::
- 
- 
- File: gnus,  Node: Starting Up,  Next: Buffers of GNUS,  Prev: Top,  Up: Top
- 
- Starting GNUS
- *************
- 
-    This chapter describes how to get started GNUS, how to use a local
- news spool directly, and how to read private directory.
- 
- * Menu:
- 
- * Getting Started::     How to get started GNUS.
- * Finding the News::    Configuring how GNUS gets access to the news.
- 
- 
- File: gnus,  Node: Getting Started,  Next: Finding the News,  Up: Starting Up
- 
- Getting Started GNUS
- ====================
- 
-    To start GNUS, type `M-x gnus'.
- 
- `M-x gnus'
-      Run GNUS using the default NNTP server.
- 
- `C-u M-x gnus'
-      Run GNUS without using the default NNTP server.
- 
- 
- File: gnus,  Node: Finding the News,  Prev: Getting Started,  Up: Starting Up
- 
- Telling GNUS Where To Find the News
- ===================================
- 
-    Somehow or other, GNUS has to know how to find the current netnews.
- Usually this means it has to know the hostname of the NNTP server.
- 
-    There are several ways that GNUS can get this information.  Most
- often, it comes from the environment variable `NNTPSERVER'.  You can
- specify a default when you install Emacs by setting the variable
- `gnus-nntp-server' in the `site-init.el' file.  If neither this default
- nor the environment variable is defined, then GNUS reads the server
- name using the minibuffer when you start it.
- 
-    You can override the default by specifying a numeric argument for the
- `gnus' command.  Then it always reads the hostname to use.
- 
-    GNUS can also bypass NNTP and read the news directly from the file
- system.  This reduces the overhead, but the features for retrieving by
- their message IDs may fail to work (*note Spool Variables::.).  To do
- this, set the variable `gnus-nntp-service' to `nil'.
- 
-    You can also specify a subdirectory of your home directory to use as
- the current news spool.  To do this, specify a colon and the
- subdirectory name as the NNTP server "machine name".  For example,
- `:Mail' says to use the directory `~/Mail' as the news spool.  This
- makes it possible to read mail stored in MH folders or articles saved
- by GNUS.  The files in the directory with numeric names are considered
- news articles, and the other files in the directory are ignored.
- 
-    A server specific startup file for each directory must exist before
- you start GNUS.  For example, a startup file for the directory `~/Mail'
- should be a file named `.newsrc-:Mail'.  *Note Startup File::, for more
- information on the server specific startup file.
- 
-    Each news server has its own "active file" which lists the numbers
- of the active articles in each newsgroup.  Reading this file from the
- server is among the first things GNUS does when it starts.  Commands
- such as `g' that report additional newly-arrived articles work by
- rereading the active file.
- 
- 
- File: gnus,  Node: Buffers of GNUS,  Next: Newsgroup Commands,  Prev: Starting Up,  Up: Top
- 
- Buffers Used by GNUS
- ********************
- 
-    GNUS uses three Emacs buffers: the Newsgroup buffer, the Summary
- buffer, and the Article buffer.  Each has its own particular purpose
- and its own major mode.  GNUS often displays all three buffers at the
- same time, with a configuration you can customize by setting the
- variable `gnus-window-configuration'.
- 
-    The "Article buffer" is where GNUS displays the text of an article.
- Its major mode is always "Article Mode".  Users rarely select this
- buffer because you can read the text while keeping the Summary buffer
- selected.
- 
- * Menu:
- 
- * Newsgroup Buffer::  A buffer for listing newsgroups.
- * Summary Buffer::    A buffer for listing subjects and other important
-                         headers.
- 
- 
- File: gnus,  Node: Newsgroup Buffer,  Next: Summary Buffer,  Up: Buffers of GNUS
- 
- Newsgroup Buffer
- ================
- 
-    "Newsgroup buffer" contains a list of newsgroups.  Its major mode is
- "Group Mode".  This is the first buffer that GNUS displays when it
- starts up.
- 
-    Normally the list contains only the newsgroups which you subscribe to
- and which contain unread articles.  It is normally empty if there is no
- such newsgroups.  When you start GNUS, it displays the message `No news
- is good news.' in the echo area.
- 
-    The format of the Newsgroup buffer looks like this:
- 
-      SM  NUMBER: NEWSGROUP
- 
- S
-      A character indicating whether the newsgroup is subscribed to.  `U'
-      means you subscribe to the newsgroup; ` ' means that you don't.
-      You can change your subscriptions using commands available in Group
-      mode.
- 
- M
-      A character indicating whether there are newly arrived and unread
-      articles in the newsgroup.  `*' means there are no newly arrived
-      articles in the newsgroup.  ` ' means there are newly arrived
-      articles.
- 
- NUMBER
-      The number of unread articles in the newsgroup.
- 
- NEWSGROUP
-      The name of the newsgroup.
- 
- 
- File: gnus,  Node: Summary Buffer,  Prev: Newsgroup Buffer,  Up: Buffers of GNUS
- 
- Summary Buffer
- ==============
- 
-    The "Summary buffer" displays a summary of articles in a single
- newsgroup, including their subjects, their numbers, and who posted
- them.  Its major mode is Summary mode.  GNUS creates a Summary buffer
- for a newsgroup when you select the group in the Newsgroup buffer.
- 
-    A Summary buffer contains a line for each article.  Each line looks
- like this:
- 
-      S NUMBER:C[LINES:AUTHOR] SUBJECT
- 
-    Here is what the fields mean:
- 
- S
-      The status code for this article.  ` ' means the article is newly
-      arrived and never read.  `D' means you read the article already.
-      `-' means you read it but marked it as saved.
- 
- NUMBER
-      The number assigned to the article.
- 
- C
-      A character indicating which article is currently selected.  `+' is
-      placed on the current article.
- 
- LINES
-      The number of lines of the article body.
- 
- AUTHOR
-      The mail address of the author of the article.
- 
- SUBJECT
-      The subject of the article.
- 
-    You can customize the format by setting the variable
- `gnus-optional-headers'.
- 
- 
- File: gnus,  Node: Newsgroup Commands,  Next: Summary Commands,  Prev: Buffers of GNUS,  Up: Top
- 
- Newsgroup Commands
- ******************
- 
-    The Newsgroup buffer normally lists the newsgroups which you
- subscribe to and which contain unread articles.  But not always--some
- of the things you can do display additional newsgroups.  The commands
- available in this buffer are mostly concerned with subscribing and
- unsubscribing.
- 
- * Menu:
- 
- * Browsing Newsgroups::         Moving around in the Newsgroup buffer.
- * Selecting a Newsgroup::       Selecting a newsgroup to read articles.
- * Maintaining Subscriptions::   Subscribing and unsubscribing, etc.
- * Exiting GNUS::                How to exit GNUS.
- * Other Newsgroup Commands::    Other miscellaneous commands.
- 
- 
- File: gnus,  Node: Browsing Newsgroups,  Next: Selecting a Newsgroup,  Up: Newsgroup Commands
- 
- Browsing Newsgroups
- ===================
- 
-    Most of the newsgroup commands operate on the group described by the
- current line.  To use them, you need to move the cursor to the group you
- want to act on.  You can use ordinary Emacs motion commands, or these
- special commands:
- 
- `n'
-      Move point to the next newsgroup containing unread articles
-      (`gnus-group-next-unread-group').
- 
- `p'
- `DEL'
-      Move point to the previous newsgroup containing unread articles
-      (`gnus-group-prev-unread-group').
- 
- `C-n'
-      Move point to the next newsgroup (`gnus-group-next-group').
- 
- `C-p'
-      Move point to the previous newsgroup (`gnus-group-prev-group').
- 
- `j NEWSGROUP RET'
-      Move point to the NEWSGROUP specified by name
-      (`gnus-group-jump-to-group').
- 
- `<'
-      Move point to the beginning of the buffer (`beginning-of-buffer').
- 
- `>'
-      Move point to the end of the buffer (`end-of-buffer').
- 
- `r'
-      Restrict visible newsgroups to the current region specified by
-      point and the mark (`gnus-group-restrict-groups').
- 
-    The command `j' (`gnus-group-jump-to-group') reads a newsgroup name
- interactively, and moves point to it.  If there is no such newsgroup in
- the buffer, a line for the newsgroup is inserted at the beginning of
- the buffer.
- 
-    The command `r' (`gnus-group-restrict-groups') restricts visibility
- in the Newsgroup buffer to the region specified by point and mark.  It
- is not quite the same as `C-x n'; it includes all of the line that the
- region starts in, and all of the line that the region ends in.  Type
- `C-x w' (`widen') to widen visibility to the whole buffer.
- 
- 
- File: gnus,  Node: Selecting a Newsgroup,  Next: Maintaining Subscriptions,  Prev: Browsing Newsgroups,  Up: Newsgroup Commands
- 
- Selecting a Newsgroup
- =====================
- 
-    To start reading the articles in a newsgroup, move to that newsgroup
- in the Newsgroup buffer and type `SPC' (`gnus-group-read-group') or `='
- (`gnus-group-select-group').
- 
- `SPC'
-      Select the newsgroup at point, and then select the first unread
-      article automatically (`gnus-group-read-group').
- 
- `='
-      Select the newsgroup at point (`gnus-group-select-group').
- 
-    Normally, when you select a newsgroup, GNUS prepares to read only the
- unread articles (including saved articles).  If the newsgroup has no
- unread articles and you select it anyway, GNUS prepares to read all the
- articles.  You can force GNUS to include all the articles by giving a
- numeric argument to the commands `SPC' and `=' (`gnus-group-read-group'
- and `gnus-group-select-group').
- 
-    If the number of articles being selected is larger than the variable
- `gnus-large-newsgroup', GNUS prompts for the number of articles to
- prepare.  If your answer N is positive, GNUS prepares the last N
- articles.  If N is negative, GNUS prepares the first -N articles.  If
- you answer with the empty string, GNUS prepares all articles.
- 
- 
- File: gnus,  Node: Maintaining Subscriptions,  Next: Exiting GNUS,  Prev: Selecting a Newsgroup,  Up: Newsgroup Commands
- 
- Maintaining Subscriptions
- =========================
- 
-    This section explains how to subscribe and unsubscribe, as well as
- other related activities.  Most of the commands operate on the newsgroup
- listed on the current line.
- 
- `c'
-      Mark all newly arrived articles in the newsgroup as read, but don't
-      alter articles explicitly marked as saved (`gnus-group-catchup').
- 
- `C'
-      Mark all articles in the newsgroup  as read
-      (`gnus-group-catchup-all').
- 
- `l'
-      Show only the newsgroups which you now subscribe to and which now
-      contain unread and saved articles (`gnus-group-list-groups').
- 
- `L'
-      Show all newsgroups available on your news server
-      (`gnus-group-list-all-groups').
- 
- `u'
-      Unsubscribe from (or subscribe to) the newsgroup
-      (`gnus-group-unsubscribe-current-group').
- 
- `U NEWSGROUP RET'
-      Unsubscribe from (or subscribe to) the newsgroup named NEWSGROUP
-      (`gnus-group-unsubscribe-group').
- 
- `C-k'
-      Kill the newsgroup line that point is in (`gnus-group-kill-group').
- 
- `C-w'
-      Kill newsgroups in current region (excluding current line)
-      (`gnus-group-kill-region').
- 
- `C-y'
-      Yank the last newsgroup killed (`gnus-group-yank-group').  It is
-      inserted just before the current line.  Successive uses of `C-y'
-      yank earlier kills, in last-in first-out order.
- 
- `C-x C-t'
-      Exchange current newsgroup and previous newsgroup.
-      (`gnus-group-transpose-groups').
- 
- `M-x gnus-list-killed-groups'
- `C-c C-l'
-      Display a list of the newsgroups you have killed.  This is so you
-      can copy them back into the startup file.
- 
- `b'
-      Delete bogus newsgroups (`gnus-group-check-bogus-groups').
- 
- `g'
-      Get newly arrived articles for all groups
-      (`gnus-group-get-new-news').
- 
-    The commands `c' and `C' (`gnus-group-catchup' and
- `gnus-group-catchup-all') mark all or most of the articles in a
- newsgroup as read.  They are useful if you have been away from news
- reading for a while, and you don't want to slog through the backlog of
- old postings.  These commands do not take account of the cross-reference
- information in the `Xref:' field, while the `c' command in Summary Mode
- does.
- 
-    Only subscribed newsgroups containing unread and saved articles are
- usually displayed in the Newsgroup buffer.  Type `L'
- (`gnus-group-list-all-groups') to show all newsgroups which are
- currently active.  Use `l' (`gnus-group-list-groups') to go back to the
- usual contents--only groups which have news for you to read.
- 
-    The command `U' (`gnus-group-unsubscribe-group') reads a newsgroup
- name interactively, and toggles its subscription flag.  This is the
- usual way to subscribe to new groups.  (You can also type `L' and then
- use `u' on the groups you want to read.)  You can also arrange to
- subscribe automatically to some or all newly created newsgroups using
- the options line in your startup file, `~/.newsrc'.  *Note Startup
- File::, for more information.
- 
-    The command `C-k' (`gnus-group-kill-group') kills a newsgroup from
- both the Newsgroup buffer and the raw startup file.  If you change your
- mind, type `C-y' (`gnus-group-yank-group'); this yanks the last
- newsgroup killed with the `C-k' command.
- 
-    The command `C-c C-l' (`gnus-list-killed-groups') pops up a buffer
- listing the newsgroups you have killed.  You can yank any of these
- newsgroups by moving point to the entry for the newsgroup you want, and
- then typing `y' or `C-y' (`gnus-browse-killed-yank').  So a convenient
- way to change the order of newsgroups is to kill some of them, then go
- to the list of killed groups and yank them in the order you want.
- 
-    You are not limited to yanking only the groups that you killed in the
- current GNUS session.  All the groups you have ever killed are
- remembered in the quick startup file, and you can restore them any time
- unless you lose the file.
- 
-    A "bogus newsgroup" is one not in the list of active newsgroups in
- the active file.  Type `b' (`gnus-group-check-bogus-groups') to delete
- all the bogus newsgroups that you subscribe to.  Bogus newsgroups that
- you have unsubscribed or killed are deleted also.
- 
-    The `g' command rereads the active file to get updated lists of
- articles available to be read.
- 
- 
- File: gnus,  Node: Exiting GNUS,  Next: Other Newsgroup Commands,  Prev: Maintaining Subscriptions,  Up: Newsgroup Commands
- 
- Exiting GNUS
- ============
- 
- `z'
-      Suspend the current GNUS session (`gnus-group-suspend').
- 
- `q'
-      Update the startup file `.newsrc', and then exit GNUS
-      (`gnus-group-exit').
- 
- `Q'
-      Exit GNUS without updating the startup file `.newsrc'
-      (`gnus-group-quit').
- 
-    Suspending GNUS with `z' (`gnus-group-suspend') kills all GNUS
- buffers except for the Newsgroup buffer.  To resume again, switch to
- the Newsgroup buffer and type `g' (`gnus-group-get-new-news') to get
- newly arrived articles.  It is a good idea to update the startup file
- (*note Startup File::.) before suspending GNUS.
- 
-    If you want to forget what you read this GNUS session, exit GNUS by
- the command `Q' (`gnus-group-quit').  Otherwise, exit by the command
- `q' (`gnus-group-exit') to update the startup file.
- 
-    The hook `gnus-exit-gnus-hook' is called when exiting GNUS, and the
- hook `gnus-suspend-gnus-hook' is called when suspending GNUS.
- 
- 
- File: gnus,  Node: Other Newsgroup Commands,  Prev: Exiting GNUS,  Up: Newsgroup Commands
- 
- Miscellaneous Commands
- ======================
- 
-    Other miscellaneous Group mode commands are described here.
- 
- `a'
-      Compose a new article (`gnus-group-post-news').  *Note Posting
-      Articles::, for more information.
- 
- `M-k'
-      Edit a local kill file (`gnus-group-edit-local-kill').  *Note Kill
-      File::, for more information.
- 
- `M-K'
-      Edit your global kill file (`gnus-group-edit-global-kill').  *Note
-      Kill File::, for more information.
- 
- 
- File: gnus,  Node: Summary Commands,  Next: Article Commands,  Prev: Newsgroup Commands,  Up: Top
- 
- Summary Commands
- ****************
- 
-    The Summary buffer shows you a summary of the contents of a single
- newsgroup, with one line for each article.  You can move around in the
- Summary buffer, giving commands to view articles, save them, reply to
- them, and so on.  When you view an article, its text appears in a
- separate buffer, but the Summary buffer remains current.  In fact,
- there is hardly ever a reason to select the Article buffer; you can do
- almost all news reading tasks while staying in the Summary buffer.
- 
- * Menu:
- 
- * Reading Articles::            How to read articles.
- * Searching Articles::          Searching for articles.
- * Referencing Articles::        Referencing parent articles.
- * Saving Articles::             Saving articles in your favorite format.
- * Sorting Headers::             Sorting the Summary buffer.
- * Posting Articles::            How to post a new article or followup article.
- * Forward and Reply::           How to mail a reply to a message,
-                                   or forward the message by mail.
- * Exiting Newsgroup::           How to exit the current newsgroup.
- 
- 
- File: gnus,  Node: Reading Articles,  Next: Searching Articles,  Up: Summary Commands
- 
- Reading Articles
- ================
- 
-    The most basic command for reading articles is SPC
- (`gnus-summary-next-page').  When you are viewing the middle of a
- article, SPC scrolls the article forward.  When you get to the end of
- an article, SPC advances to the next article.  You can read all the
- unread articles straight through using just SPC.
- 
-    Naturally, though, there are plenty of more advanced features
- available.
- 
- * Menu:
- 
- * Summary Motion::              Special cursor motion commands for Summary.
- * Reading an Article::          Commands for viewing an article differently.
- * Scrolling::                   Browsing through a message.
- * Moving Among Articles::       Selecting articles.
- * Marking Articles::            Marking articles as (un)read.
- 
- * Thread-based Reading::        Reading articles based on conversation threads.
- * Digest Articles::             How to read digest articles.
- 
- 
- File: gnus,  Node: Summary Motion,  Next: Reading an Article,  Up: Reading Articles
- 
- Cursor Motion in the Summary Buffer
- -----------------------------------
- 
-    For moving around in the Summary buffer, you can use these special
- commands as well as the usual cursor motion commands.
- 
- `C-n'
-      Move point to the next header (`gnus-summary-next-subject').
- 
- `C-p'
-      Move point to the previous header (`gnus-summary-prev-subject').
- 
- `M-n'
-      Move point to the next header, skipping marked articles
-      (`gnus-summary-next-unread-subject').
- 
- `M-p'
-      Move point to the previous header, skipping marked articles
-      (`gnus-summary-prev-unread-subject').
- 
- `j NUMBER RET'
-      Move point to the line describing an article specified by number
-      with a numeric argument (`gnus-summary-goto-subject').
- 
- 
- File: gnus,  Node: Reading an Article,  Next: Scrolling,  Prev: Summary Motion,  Up: Reading Articles
- 
- Commands to Read Articles
- -------------------------
- 
- `SPC'
-      SPC in the Summary buffer scrolls the Article buffer to the next
-      screenful or to the next article (`gnus-summary-next-page')
- 
- `g'
-      Select the article on the current line
-      (`gnus-summary-show-article').  This command always rereads the
-      article text from the server even if the same article is already
-      selected.
- 
- `='
-      Expand the Summary buffer's window to occupy all the screen space
-      that GNUS is now using (`gnus-summary-expand-window').
- 
- `C-t'
-      Toggle truncation of lines in the Summary buffer
-      (`gnus-summary-toggle-truncation').
- 
- `w'
-      Stop page breaking of article buffer
-      (`gnus-summary-stop-page-breaking').
- 
- `t'
-      Show all headers of the current article if pruned header currently
-      shown, or vice versa (`gnus-summary-toggle-header').
- 
- `M-t'
-      Toggle MIME processing (`gnus-summary-toggle-mime').
- 
- `C-c C-r'
-      Caesar rotate letters by 13 places and Japanese characters by 47
-      places (`gnus-summary-caesar-message').
- 
-    The command `=' (`gnus-summary-expand-window') expands the Summary
- window by deleting the Article window.  Use it when you want to
- concentrate on the Summary buffer.  This command is different from `C-x
- 1' when more than two windows exist.
- 
-    The command `C-c C-r' (`gnus-summary-caesar-message') rotates all
- letters in the body of the current article by 13/47 places.  (This
- encoding is often called "rot 13".)  To undo this operation, run it a
- second time.
- 
-    If an article contains multiple pages, GNUS normally displays just
- one page at a time.  To advance to the next page of an article, simply
- type SPC.  It advances to the next page whenever the end of a page is
- on the screen.
- 
-    The command `w' (`gnus-summary-stop-page-breaking') temporarily
- suspends page breaking; it makes the entire current article visible.
- You can turn off page breaking all the time by setting the variable
- `gnus-break-pages' to `nil'.
- 
-    Page boundaries are defined by the variable `gnus-page-delimiter',
- whose value is a regular expression.  The default is to match a
- formfeed character at the beginning of a line.
- 
-    GNUS normally hides many uninteresting header fields when it displays
- an article.  (The variable `gnus-ignored-headers' controls which fields
- are ignored.)  If you want to see the whole header, type `t'
- (`gnus-summary-toggle-header').  Use `t' a second time to hide the
- uninteresting header fields again.
- 
- 
- File: gnus,  Node: Scrolling,  Next: Moving Among Articles,  Prev: Reading an Article,  Up: Reading Articles
- 
- Scrolling Within an Article
- ---------------------------
- 
-    This section describes the commands you can type in the Summary
- buffer to scroll the Article buffer.  (If you want to scroll the
- Summary buffer, you can use the usual Emacs scrolling commands.)
- 
- `SPC'
-      Scroll to the next page of the current article
-      (`gnus-summary-next-page').  Select it first if no article is
-      selected yet.  Select the next unread article automatically at the
-      end of the message.
- 
- `DEL'
-      Scroll the current article backward (`gnus-summary-prev-page').
- 
- `RET'
-      Scroll the current article one (or N) lines forward
-      (`gnus-summary-scroll-up').  A negative argument scrolls backward.
- 
- `<'
-      Move point to the beginning of the current article
-      (`gnus-summary-beginning-of-article').
- 
- `>'
-      Move point to the end of the current article
-      (`gnus-summary-end-of-article').
- 
- 
- File: gnus,  Node: Moving Among Articles,  Next: Marking Articles,  Prev: Scrolling,  Up: Reading Articles
- 
- Moving Among Articles
- ---------------------
- 
-    These commands move point in the Summary buffer to a different line
- and display that line's article.
- 
- `n'
-      Read the next article, skipping marked articles
-      (`gnus-summary-next-unread-article').
- 
- `p'
-      Read the previous article, skipping marked articles
-      (`gnus-summary-prev-unread-article').
- 
- `N'
-      Read the next article (`gnus-summary-next-article').
- 
- `P'
-      Read the previous article (`gnus-summary-prev-article').
- 
- `C-M-n'
-      Read the next article with the same subject as the current article
-      (`gnus-summary-next-same-subject').
- 
- `C-M-p'
-      Read the previous article with the same subject as the current
-      article (`gnus-summary-prev-same-subject').
- 
- `.'
-      Read the first unread article
-      (`gnus-summary-first-unread-article').
- 
- `l'
-      Read the article selected last (`gnus-summary-goto-last-article').
- 
-    If the variable `gnus-auto-select-same' is non-`nil', the commands
- `n' and `p' (`gnus-summary-next-unread-article' and
- `gnus-summary-prev-unread-article') skip articles until they come to
- another article with the same subject.  If you are used to reading news
- with `rn -S', set the variable to non-`nil' to get familiar behavior.
- 
-    If the variable `gnus-auto-extend-newsgroup' is non-`nil', the
- commands `N' and `P' (`gnus-summary-next-article' and
- `gnus-summary-prev-article') extend visible articles to forward and
- backward if possible.  The Summary buffer normally displays just a
- subset of the extant articles; extending the buffer means that if you
- try to move forward from the last article shown, it looks for later
- articles that are not shown, and puts them into the buffer so you can
- move to them.
- 
-    The variable `gnus-auto-select-next' defines the behavior of GNUS
- when there is no unread article in the current newsgroup and a command
- selecting the next unread article is executed.  If the variable is
- non-`nil', the next newsgroup containing unread articles is selected
- automatically.
- 
- 
- File: gnus,  Node: Marking Articles,  Next: Thread-based Reading,  Prev: Moving Among Articles,  Up: Reading Articles
- 
- Marking Articles
- ----------------
- 
-    GNUS uses single-character marks to indicate the status of an
- article.
- 
- ` ' (a space)
-      A newly arrived article.
- 
- `-'
-      An article marked as saved.
- 
- anything else
-      An article marked as read.
- 
- Both newly arrived articles and saved articles are considered "unread".
- 
-    The status is displayed at the beginning of each line of the Summary
- buffer.  Here are some commands for changing these marks:
- 
- `d'
-      Mark this line's article as read, then move point to the following
-      line (`gnus-summary-mark-as-read-forward').  This and the
-      following similar commands do not select an article; they only
-      move point in the Summary buffer.
- 
- `u'
-      Mark this line's article as saved, then move point to the
-      following line (`gnus-summary-mark-as-unread-forward').
- 
- `M-u'
-      Clear marks on this line's article, then move point to the next
-      line (`gnus-summary-clear-mark-forward').  This sets the status to
-      "newly arrived".
- 
- `D'
- `U'
- `M-U'
-      Analogous to `d', `u' and `M-u', except that they move backwards
-      instead of forwards in the Summary buffer.
- 
- `k'
-      Mark as read all articles with the same subject as the current
-      article, then select the next unread article
-      (`gnus-summary-kill-same-subject-and-select').  Use this when you
-      decide a certain discussion is not interesting.
- 
- `C-k'
-      Mark as read all articles with the same subject as the current
-      article (`gnus-summary-kill-same-subject').
- 
- `c'
-      Mark all newly arrived articles as read; then exit the current
-      newsgroup (`gnus-summary-catchup-and-exit').  This does not change
-      the status of articles that are saved.
- 
- `M-x gnus-summary-catchup-all-and-exit'
-      Mark all articles (including saved articles) as read, and then
-      exit the current newsgroup.
- 
- `M-x gnus-summary-catchup'
-      Mark all newly arrived articles as read, but don't alter saved
-      articles.
- 
- `M-x gnus-summary-catchup-all'
-      Mark all articles as read.
- 
- `x'
-      Delete summary lines for articles marked as read
-      (`gnus-summary-delete-marked-as-read').
- 
- `X MARKS RET'
-      Delete headers marked with any of MARKS
-      (`gnus-summary-delete-marked-with').
- 
-    You can make it easier to see the remaining unread articles in the
- Summary buffer by deleting the lines describing the already read
- articles.  To do this, use the command `x'
- (`gnus-summary-delete-marked-as-read').  The command `X'
- (`gnus-summary-delete-marked-with') deletes headers which have certain
- specified marks.  Thus, `X D - RET' deletes all articles marked with
- `D' or `-'--which is to say, all read and saved articles.  (There are
- no spaces in that command; we inserted spaces for clarity when showing
- it here.)
- 
- 
- File: gnus,  Node: Thread-based Reading,  Next: Digest Articles,  Prev: Marking Articles,  Up: Reading Articles
- 
- Reading Based on Conversation Threads
- -------------------------------------
- 
-    A "thread" is defined as a set of articles related by
- cross-reference.  These references make use of header fields
- `References:' and `In-Reply-To:', which cite the message ID of another
- article.
- 
-    Conversations in a newsgroup usually contain several threads under a
- single subject.  This makes it difficult to know which article follows
- which without reading references directly.  You can use the thread-based
- commands to do this automatically.  You can follow threads of
- conversation, mark entire threads as read, and go up and down thread
- trees.
- 
-    The command `M-C-t' (`gnus-summary-toggle-threads') toggles showing
- conversation threads in Summary mode.  If it is turned on, Summary
- buffer is displayed in a tree structured form which shows the thread
- structure.
- 
- `C-M-t'
-      Toggle thread-based reading (`gnus-summary-toggle-threads').
- 
- `C-M-s'
-      Show the thread subtree of the current line
-      (`gnus-summary-show-thread').
- 
- `M-x gnus-summary-show-all-threads'
-      Show all thread subtrees.
- 
- `C-M-h'
-      Hide the thread subtrees of the current line
-      (`gnus-summary-hide-thread').
- 
- `M-x gnus-summary-hide-all-threads'
-      Hide all thread subtrees.
- 
- `C-M-f'
-      Go to the next thread at the same level
-      (`gnus-summary-next-thread').
- 
- `C-M-b'
-      Go to the previous thread at the same level
-      (`gnus-summary-prev-thread').
- 
- `C-M-d'
-      Go down to next thread subordinate to the current line.
-      (`gnus-summary-down-thread').
- 
- `C-M-u'
-      Go up to the parent thread of the current line
-      (`gnus-summary-up-thread').
- 
- `C-M-k'
-      Mark all articles under current thread as read
-      (`gnus-summary-kill-thread').
- 
-    Thread subtrees can be hidden by using the command `C-M-h'
- (`gnus-summary-hide-thread'), and the hidden subtrees can be shown by
- using the command `C-M-s' (`gnus-summary-show-thread').
- 
-    If the variable `gnus-thread-hide-killed' is non-`nil', thread
- subtrees killed by the command `C-M-k' (`gnus-summary-kill-thread') are
- hidden automatically.
- 
-    If you want to hide thread subtrees initially, set the variable
- `gnus-thread-hide-subtree' to non-`nil'.
- 
-    If you want to enable thread-based reading automatically, set the
- variable `gnus-show-threads' to non-`nil'.
- 
- 
- File: gnus,  Node: Digest Articles,  Prev: Thread-based Reading,  Up: Reading Articles
- 
- Reading Digest Articles
- -----------------------
- 
-    "Digest article" is a message containing many messages in "digest"
- format.  Since a digest article contains many messages in one article,
- it is a little bit difficult to read it on a per message basis.  The
- following commands make it easier to read each message in a digest.
- 
- `C-c C-n'
-      Scroll to the next digest message of the current article
-      (`gnus-summary-next-digest').
- 
- `C-c C-p'
-      Scroll to the previous digest message of the current article
-      (`gnus-summary-prev-digest').
- 
- `C-d'
-      Read the current digest article using Rmail
-      (`gnus-summary-rmail-digest').
- 
-    The commands `C-c C-n' and `C-c C-p' (`gnus-summary-next-digest' and
- `gnus-summary-prev-digest') scroll a digest article to the next and
- previous digested message, respectively.  The variable
- `gnus-digest-separator' specifies a regexp which separates digested
- messages.
- 
-    The command `C-d' (`gnus-summary-rmail-digest') runs Rmail on a
- digest article and makes it possible to read messages not in digest
- form using Rmail Mode.  *Note Rmail: (emacs)Rmail, for more information
- on Rmail Mode.  Use the hook `gnus-select-article-hook' to run Rmail on
- digest articles automatically.
- 
-    Some newsgroups use a digest format that cannot be read using Rmail.
- In this case, `C-d' displays `Article is not a digest' in the echo
- area.  It is, however, possible to read these incomplete digest
- articles by modifying the message headers or bodies appropriately using
- the hook `gnus-select-digest-hook'.  *Note Hooks::, to modify
- incomplete digest articles.
- 
-    If the variable `gnus-digest-show-summary' is non-`nil', a summary
- of the digest article is also displayed automatically when Rmail is
- invoked.
- 
- 
- File: gnus,  Node: Searching Articles,  Next: Referencing Articles,  Prev: Reading Articles,  Up: Summary Commands
- 
- Searching Articles
- ==================
- 
- `s'
-      Do incremental search on the current article
-      (`gnus-summary-isearch-article').
- 
- `M-s REGEXP RET'
-      Search for articles containing a match for REGEXP forward
-      (`gnus-summary-search-article-forward').  If REGEXP is empty, the
-      last regexp used is used again.
- 
- `M-r REGEXP RET'
-      Search for articles containing a match for REGEXP backward
-      (`gnus-summary-search-article-backward').  If REGEXP is empty, the
-      last regexp used is used again.
- 
- `& FIELD RET REGEXP RET COMMAND RET'
-      Execute COMMAND on articles containing a match for REGEXP in FIELD
-      of the headers (`gnus-summary-execute-command').  If FIELD is
-      empty, the entire article is searched for.
- 
-    The command `s' (`gnus-summary-isearch-article') does an incremental
- search on the current article.  This is like switching to the Article
- buffer and typing `C-s' except that the Summary buffer remains
- selected.  The command `M-s' (`gnus-summary-search-article-forward')
- searches for articles containing a match for regexp.  The search starts
- from the current point of the current article.  To search backwards,
- use the command `M-r' (`gnus-summary-search-article-backward').
- 
-    The command `&' (`gnus-summary-execute-command') interactively reads
- a header field name, a regular expression, and a valid key sequence.
- It then searches for all articles in which that regular expression
- matches the contents of the specified header field.  It executes the
- key sequence in each such message.
- 
- 
- File: gnus,  Node: Referencing Articles,  Next: Saving Articles,  Prev: Searching Articles,  Up: Summary Commands
- 
- Referencing Articles
- ====================
- 
- `^'
-      Refer to parent of the current article in terms of the `References'
-      field (`gnus-summary-refer-parent-article').  With a numeric
-      argument, go back to the child.
- 
- `M-^ MESSAGE-ID RET'
-      Refer to the article by using the MESSAGE-ID
-      (`gnus-summary-refer-article').
- 
-    The command `^' (`gnus-summary-refer-parent-article') refers to
- parent article of the current article.  You can go back to the child
- article with `C-u ^'.
- 
-    `^' and `M-^' select a new article without moving point in the
- Summary buffer.  As a consequence, you can use `g' to go back to the
- article in which you started the last sequence of `^' and `M-^'
- commands.
- 
-    You can use the `r' command in Article mode to follow a reference
- contained in the text of an article.  *Note Article Commands::.
- 
- 
- File: gnus,  Node: Saving Articles,  Next: Sorting Headers,  Prev: Referencing Articles,  Up: Summary Commands
- 
- Saving Articles
- ===============
- 
-    GNUS supports four different formats for saving articles: Rmail
- format, Unix mailbox format, MH folder, and article format.
- 
- `o'
-      Save the current article in Rmail format
-      (`gnus-summary-save-article').
- 
- `C-o'
-      Save the current article in Unix mail file format
-      (`gnus-summary-save-in-mail').
- 
- `| COMMAND RET'
-      Send contents of the current article through a pipe to a subprocess
-      running COMMAND (`gnus-summary-pipe-output').
- 
-    The variable `gnus-default-article-saver' controls the formats used
- by the `o' command.  By default, it uses Rmail format.  If you set the
- variable to `gnus-summary-save-in-folder', `o' uses MH format.  If you
- set it to `gnus-summary-save-in-file', `o' saves the article text
- verbatim.  The default value is `gnus-summary-save-in-rmail'.  (All
- three of these values are commands that you can bind to other keys.)
- 
-    The variable `gnus-article-save-directory' specifies the default
- directory for saving articles.  If you don't set this variable
- explicitly, it is initialized from the `SAVEDIR' environment variable,
- or, as a last resort, `~/News'.
- 
- 
- File: gnus,  Node: Sorting Headers,  Next: Posting Articles,  Prev: Saving Articles,  Up: Summary Commands
- 
- Sorting Headers
- ===============
- 
-    GNUS can sort the Summary buffer by number, subject, date, or author
- of articles.
- 
- `C-c C-s C-n'
-      Sort the headers by number (`gnus-summary-sort-by-number').
- 
- `C-c C-s C-s'
-      Sort the headers by subject (`gnus-summary-sort-by-subject').
- 
- `C-c C-s C-d'
-      Sort the headers by date (`gnus-summary-sort-by-date').
- 
- `C-c C-s C-a'
-      Sort the headers by author (`gnus-summary-sort-by-author').
- 
-    Sorting is "stable", which means that it does not disturb the
- relative order of articles whose sort keys are equal.  So you can sort
- on multiple keys by using several sort commands in a row; the last sort
- command specifies the most powerful sort key.  Thus, `C-c C-s C-a C-c
- C-s C-d C-c C-s C-n' sorts by author, and sorts the messages for each
- author by date, and any messages with the same author and date are
- sorted by number.
- 
-    To sort in reverse order, give a numeric argument to the sort
- commands.    It is also possible to sort the headers automatically when
- a newsgroup is selected using the hook `gnus-select-group-hook' (*note
- Hooks::.).
- 
- 
- File: gnus,  Node: Posting Articles,  Next: Forward and Reply,  Prev: Sorting Headers,  Up: Summary Commands
- 
- Posting Articles
- ================
- 
- `a'
-      Compose a new article (`gnus-summary-post-news').
- 
- `f'
-      Compose a followup to the current article
-      (`gnus-summary-followup').
- 
- `F'
-      Compose a followup, and insert the original article right away
-      (`gnus-summary-followup-with-original').
- 
- `C'
-      Cancel the current article you posted
-      (`gnus-summary-cancel-article').
- 
-    Type `a' (`gnus-summary-post-news') to post a new article.  If the
- variable `gnus-interactive-post' is non-`nil', this command reads the
- newsgroup, subject, and distribution interactively.  The command `f'
- (`gnus-summary-followup') fills these values in automatically from
- those of the selected article; thus, the article you post will be a
- "followup" to the selected article.
- 
-    Type `C-c C-y' (`news-reply-yank-original') to include the original
- article in the text of the followup.  Unless the original article is
- quite short, you should edit it to keep only the particular sentences
- you are directly responding to.
- 
-    The command `F' (`gnus-summary-followup-with-original') yanks the
- original article automatically.  If you want to followup to several
- articles in a single article and want to include them in it, type `F'
- for each of them.  You will be asked if a text being edited should be
- erased.  You should answer `n' to the question.
- 
-    If the variable `gnus-novice-user' is non-`nil', your confirmations
- will be required for composing a new article.
- 
-    The major mode for composing a new article is "News Mode" which is
- borrowed from `rnewspost.el'.  Type `C-h m' (`describe-mode') to get
- more help on News Mode.
- 
-    Suppose you post an article and then later realize that you made a
- horrible mistake.  You really do not want anyone to see your article.
- You want the article to be removed from any machines that it may have
- reached.  The command `C' (`gnus-summary-cancel-article') is intended
- to do this.  First select the offending article as current, then type
- `C'.
- 
-    The variable `user-mail-address' specifies what GNUS should use as
- your mailing address.  Its value is a string.  If Emacs doesn't get
- this right on its own, you can specify the address to use by setting
- this variable.
- 
- 
- File: gnus,  Node: Forward and Reply,  Next: Exiting Newsgroup,  Prev: Posting Articles,  Up: Summary Commands
- 
- Forwarding Messages and Replying To Them
- ========================================
- 
- `r'
-      Reply to the author of the current article (`gnus-summary-reply').
- 
- `R'
-      Reply to the author of the current article with the original
-      article (`gnus-summary-reply-with-original').
- 
- `C-c C-f'
-      Forward current message to someone else.
-      (`gnus-summary-mail-forward').
- 
- `m'
-      Compose a mail message in other window
-      (`gnus-summary-mail-other-window').
- 
-    Use the command `r' (`gnus-summary-reply') to mail a reply to the
- author of the article.  Type `C-c C-y' to yank the text of the article
- you are replying to.  The command `R'
- (`gnus-summary-reply-with-original') yanks the original article
- automatically.
- 
-    *Note Mail Mode: (emacs)Mail Mode, for information on how to finish
- sending the reply.
- 
- 
- File: gnus,  Node: Exiting Newsgroup,  Prev: Forward and Reply,  Up: Summary Commands
- 
- Exiting the Current Newsgroup
- =============================
- 
-    "Exiting" a newsgroup means going back to the Newsgroup buffer and
- (normally) saving the changes you have made in the status of articles.
- 
- `q'
-      Exit the current newsgroup, and return to Group Mode
-      (`gnus-summary-exit').  This updates the startup file to indicate
-      the changes in article status in this newsgroup.
- 
- `Q'
-      Exit the current newsgroup without saving information about article
-      status (`gnus-summary-quit').  The effect is to cancel all the
-      status changes that took place while you were reading this
-      newsgroup.
- 
- `C-x C-s'
-      Save the article status changes, but keep the newsgroup selected
-      (`gnus-summary-reselect-current-group').
- 
-    The command `C-x C-s' (`gnus-summary-reselect-current-group')
- selects the current newsgroup again after temporary exiting the
- newsgroup.  If no articles remain unread, all articles in the newsgroup
- will be selected.  A numeric argument to the command means to select all
- articles in the newsgroup.
- 
- 
- File: gnus,  Node: Article Commands,  Next: Startup File,  Prev: Summary Commands,  Up: Top
- 
- Article Commands
- ****************
- 
-    GNUS displays one article at a time, in a buffer called the Article
- buffer.  When you select an article, GNUS puts the Article buffer on the
- screen and displays the article there.
- 
-    If the Article buffer is not visible, it appears on the screen
- whenever you select an article for display.  You can specify the height
- of the Article buffer as a fraction of the screen height by setting the
- variable `gnus-window-configuration'.
- 
-    The Article buffer has a special major mode, Article mode.  It
- provides these commands:
- 
- `SPC'
-      Scroll this window forward (`gnus-article-next-page').
- 
- `DEL'
-      Scroll this window backward (`gnus-article-prev-page').
- 
- `r'
-      Select another article by following a cross reference
-      (`gnus-article-refer-article').  A cross reference is specified by
-      a Message-ID included in the text of the article.  Move point to a
-      message ID before using this command.
- 
- `o'
-      Return to the previous article from the referenced article
-      (`gnus-article-pop-article').
- 
- `h'
-      Reconfigure Emacs windows to show the Summary buffer above the
-      Article buffer and select the Summary buffer
-      (`gnus-article-show-summary').  The occasion to use this is when
-      you have been editing a message to send or article to post.
- 
- 
- File: gnus,  Node: Startup File,  Next: Kill File,  Prev: Article Commands,  Up: Top
- 
- The Startup File
- ****************
- 
-    Each user who reads news has a file called the "startup file" which
- records which groups he or she subscribes to and which articles have
- been read.
- 
-    GNUS actually uses two startup files that contain the same
- information.  The "raw" startup file, named `~/.newsrc', is the master
- copy of the information; this is the same file that other news readers
- use, and it is kept in the standard format.  The "quick" startup file
- contains the same information in a format convenient for Lisp to read.
- GNUS automatically updates the quick startup file from the raw startup
- file whenever the latter is newer; but normally it saves time by reading
- only the quick startup file.
- 
-    These commands in Group mode operate on the startup files:
- 
- `R'
-      Restart GNUS, using the raw startup file instead of the quick one,
-      and get newly arrived articles (`gnus-group-restart').
- 
- `s'
-      Update both startup files based on changes you have made in the
-      Newsgroups buffer (`gnus-group-force-update').
- 
- 
- File: gnus,  Node: Kill File,  Next: Troubleshooting,  Prev: Startup File,  Up: Top
- 
- Kill File
- *********
- 
-    A "kill" file contains lisp expressions to be applied to a selected
- newsgroup.  The purpose is to mark articles as read on the basis of
- some set of regexps.
- 
-    There are two kinds of kill files, global and local.  A global kill
- file is applied to every newsgroup, and a local kill file to a specified
- newsgroup.
- 
- * Menu:
- 
- * Making a Kill File::          How to make a kill file.
- * Editing Kill Files::          How to edit kill files.
- * Kill File Example::           A real example of a kill file.
- * Names of Kill Files::         Where kill files are kept in the file system.
- * Background Kills::            Background kill processing.
- * Advanced Kills::              Advanced kill processing.
- 
- 
- File: gnus,  Node: Making a Kill File,  Next: Editing Kill Files,  Up: Kill File
- 
- Making a Kill File
- ==================
- 
-    A kill file is simply a file of Lisp code that is loaded (i.e.,
- evaluated) while the Summary buffer is current.  In order to work
- properly, the contents of the file must be designed to interact properly
- with GNUS.  To make it easier to write a valid kill file, GNUS provides
- a general function which does the things users typically want to do in a
- kill file.
- 
-      (gnus-kill FIELD REGEXP &optional COMMAND ALL)
- 
- The `gnus-kill' function performs an action on each article that
- matches a specified condition.
- 
-    The two required arguments specify the condition.  The argument
- FIELD specifies a portion of an article; it is either the name of a
- header field to search, or `""', which says to search the entire
- article body.  The argument REGEXP says what to search for.  The
- condition is this: an article is eligible if the specified portion of
- the article contains a match for REGEXP.
- 
-    The argument COMMAND says what to do when an article fits the
- condition.  It is either a valid key sequence in Summary mode, or a Lisp
- expression which is a list, or `nil'.  A key sequence stands for its
- command definition in Summary mode; it means to execute that command.
- A Lisp expression means to evaluate that expression.  `nil' says to
- mark the article with the character `X'.
- 
-    If ALL is omitted or `nil', `gnus-kill' checks only newly arrived
- articles for meeting the condition.  If ALL is non-`nil', it checks all
- articles.
- 
-    Here as an example is how to mark all articles whose subjects contain
- the string `AI':
- 
-      (gnus-kill "Subject" "AI")
- 
-    If you want to mark articles with `D' instead of `X', you can use
- the following expression, which works by executing the `d' command.
- 
-      (gnus-kill "Subject" "AI" "d")
- 
-    The usual aim of a kill file is to delete certain articles.  The way
- to do this is to mark them with `X' and then call `gnus-expunge', like
- this:
- 
-      (gnus-expunge "X")
- 
-    `gnus-expunge' takes one argument, a string containing a number of
- mark characters, and deletes all the lines that are marked with any of
- those characters.
- 
-    It works to use `gnus-expunge' for the marker `D', but you may not
- like what it does, because this prevents you from ever rereading an
- article marked as read in a previous session.  That's why the default
- marker for `gnus-kill' is `X' rather than `D'.
- 
-    Searching in the Summary buffer normally ignores case; this includes
- the searching inside of `gnus-kill'.  If you do not want to ignore the
- case, set the variable `case-fold-search' to `nil'.
- 
-    After GNUS has finished applying the appropriate kill files, if the
- newsgroup has no articles left, GNUS exits that newsgroup right away.
- 
- 
- File: gnus,  Node: Editing Kill Files,  Next: Kill File Example,  Prev: Making a Kill File,  Up: Kill File
- 
- Editing Kill Files
- ==================
- 
-    You can use these GNUS commands to find a kill file for editing:
- 
- `M-k'
-      Edit a local KILL file applied to the current newsgroup
-      (`gnus-summary-edit-local-kill').
- 
- `M-K'
-      Edit a global KILL file applied to all newsgroups
-      (`gnus-summary-edit-global-kill').
- 
- The same key sequences (`M-k' and `M-K') are available in Group mode
- also, but the commands that implement them are
- `gnus-group-edit-local-kill' and `gnus-group-edit-global-kill'.
- 
-    The major mode of these buffers is Kill-File mode, which is like
- Emacs Lisp mode but with the following additional commands:
- 
- `C-c C-k C-s'
-      Insert a template of a kill command on subject
-      (`gnus-kill-file-kill-by-subject').
- 
- `C-c C-k C-a'
-      Insert a template of a kill command on author
-      (`gnus-kill-file-kill-by-author').
- 
- `C-c C-a'
-      Evaluate the whole current buffer, but do so with the Summary
-      buffer current (`gnus-kill-file-apply-buffer').  This is a
-      convenient way to try out a kill file you have been editing.
- 
- `C-c C-e'
-      Evaluate the sexp before point in current buffer, but do so with
-      the Summary buffer current (`gnus-kill-file-apply-last-sexp').
- 
- `C-c C-c'
-      Save the kill file and then return to the previous buffer
-      (`gnus-kill-file-exit').
- 
-    The effects of `C-c C-k C-s' and `C-c C-k C-a' depend on how you
- began editing the kill file.  If you gave the command `M-k' or `M-K'
- while in the Summary buffer, then the article that was current at that
- time supplies the string to search for, from its own subject or author.
- 
- 
- File: gnus,  Node: Kill File Example,  Next: Names of Kill Files,  Prev: Editing Kill Files,  Up: Kill File
- 
- Example of a Kill File
- ======================
- 
-    This is a real example of a local kill file for newsgroup `control'.
- 
-      ;; Apply to the newsgroup `control' if the NNTP server is flab.
-      (if (string-equal gnus-nntp-server "flab")
-          (progn
-            (gnus-kill "Subject" "ihave flab\\|sendme")
-            (gnus-kill "Subject" "cancel\\|newgroup\\|rmgroup" "d")
-            (gnus-expunge "X")))
- 
--- 0 ----
Index: emacs/info/gnus-2
diff -c emacs/info/gnus-2:1.1.1.2 emacs/info/gnus-2:removed
*** emacs/info/gnus-2:1.1.1.2	Mon Jul 22 01:52:48 1996
--- emacs/info/gnus-2	Fri Aug  2 20:19:26 1996
***************
*** 1,1061 ****
- This is Info file ../info/gnus, produced by Makeinfo-1.55 from the
- input file gnus.texi.
- 
-    This file documents GNUS, the GNU Emacs newsreader.
- 
-    Copyright (C) 1989, 1990, 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the entire resulting derived work is distributed under the terms
- of a permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions.
- 
- 
- File: gnus,  Node: Names of Kill Files,  Next: Background Kills,  Prev: Kill File Example,  Up: Kill File
- 
- Names of Kill Files
- ===================
- 
-    Kill files are kept in the directory specified by the variable
- `gnus-kill-files-directory'; its default value is `~/News'.  The
- variable `gnus-kill-file-name' specifies the global kill file's name
- within that directory; the default is `KILL'.
- 
-    The name of a local kill file is based on the newsgroup's name.  If
- the variable `gnus-use-long-file-name' is non-`nil', then the file name
- is `NEWSGROUP.KILL'.  Otherwise, it is `NEWS/GROUP/KILL', where the
- subdirectory name is made from the newsgroup name by changing all
- periods to slashes.
- 
- 
- File: gnus,  Node: Background Kills,  Next: Advanced Kills,  Prev: Names of Kill Files,  Up: Kill File
- 
- Background Kill Processing
- ==========================
- 
-    Kill processing can take a long time.  If you don't want to wait for
- it, try background kill processing using the following shell command:
- 
-      emacs -batch -l gnus -f gnus-batch-kill NEWSGROUPS...
- 
- where NEWSGROUPS are newsgroup names separated by whitespace.  `!'
- preceding a newsgroup name means negation, and `all' specifies all
- newsgroups not yet decided.  These interpretations are the same as the
- options line of the startup file (*note Startup File::.).
- 
- 
- File: gnus,  Node: Advanced Kills,  Prev: Background Kills,  Up: Kill File
- 
- Advanced Kill Processing
- ========================
- 
-    Internally, applying kills means to run the hook
- `gnus-apply-kill-hook'.  It is called after the Summary buffer is
- prepared for a selected newsgroup.  The default hook is the function
- `gnus-apply-kill-file' which loads a global kill file and a local kill
- file in this order.  A different style of the kill processing can be
- implemented by customizing this hook.
- 
-    For example, if you don't have a global kill file, you can use the
- following hook which applies only a local kill file.  This change can
- save the time for checking the existence of a global kill file.
- 
-      ;; Get rid of the default hook.
-      (setq gnus-apply-kill-hook nil)
-      (add-hook 'gnus-apply-kill-hook
-        '(lambda ()
-           ;; Apply a local kill file.
-           (load (gnus-newsgroup-kill-file gnus-newsgroup-name) t nil t)))
- 
- (As usual, you can put as many functions as you wish into this hook.
- What is not usual is the fact that the hook is not initially empty.
- Therefore, if you don't want the default hook value, you must set the
- hook variable to `nil'.)
- 
-    In contrast, the following example enables only a global kill file.
- 
-      ;; Get rid of the default hook.
-      (setq gnus-apply-kill-hook nil)
-      (add-hook 'gnus-apply-kill-hook
-        '(lambda ()
-           ;; Apply a global kill file.
-           (load (gnus-newsgroup-kill-file nil) t nil t)))
- 
-    Here is an advanced example that drastically reduces the time for
- applying kill files.  This hook does the kill processing directly
- without loading the kill files.
- 
-      ;; Get rid of the default hook.
-      (setq gnus-apply-kill-hook nil)
-      (add-hook 'gnus-apply-kill-hook
-        '(lambda ()
-           ;; Apply to the newsgroup `control'
-           ;; if the NNTP server is flab.
-           (and (string-equal gnus-nntp-server "flab")
-                (string-equal gnus-newsgroup-name "control")
-                (progn
-                  (gnus-kill "Subject" "ihave flab\\|sendme")
-                  (gnus-kill "Subject" "cancel\\|newgroup\\|rmgroup" "d")
-                  (gnus-expunge "X")))))
- 
- 
- File: gnus,  Node: Customization,  Next: Reporting Bugs,  Prev: Troubleshooting,  Up: Top
- 
- Customizing GNUS
- ****************
- 
-    Appendix A describes the variables and hooks for simple customization
- and the variables for localization.
- 
- * Menu:
- 
- * Variables::           Variables for customizing GNUS.
- 
- * NNTP Variables::      Variables for localizing NNTP environment.
- * Spool Variables::     Variables for localizing news spool environment.
- * Directory Variables:: Variables for localizing private directory environment.
- 
- * Hooks::               Function hooks for customizing GNUS.
- 
- 
- File: gnus,  Node: Variables,  Next: NNTP Variables,  Up: Customization
- 
- Common Variables
- ================
- 
- `gnus-nntp-server'
-      Specifies the name of the host running the NNTP server.  The
-      variable is initialized from the `NNTPSERVER' environment
-      variable.  If the server name is preceded by a colon such as
-      `:Mail', the user's private directory `~/Mail' is used as a news
-      spool.  *Note Finding the News::, for more information.
- 
- `gnus-nntp-service'
-      Specifies a service name of NNTP, usually a string `"nntp"'.  In a
-      few instances, it must be the number `119'.  To use a local news
-      spool of your machine rather than NNTP, set the variable to `nil'.
-      *Note Finding the News::, for more information.
- 
- `gnus-local-domain'
-      Specifies the domain which is the domain part of your mail address
-      excluding the local host name of your machine.  The environment
-      variable `DOMAINNAME' is used instead if defined.  If the function
-      `system-name' returns the full Internet name, there is no need to
-      define the domain.
- 
- `gnus-local-organization'
-      Specifies the organization you belong to.  The environment variable
-      `ORGANIZATION' is used instead if defined.  If the value begins
-      with a slash, it is taken as the name of a file whose contents are
-      read for the value.
- 
- `gnus-local-timezone'
-      Specifies the local time zone you belong to.  The value can be
-      either a time zone name such as `"JST"' or a difference in hour
-      from GMT such as `+0900'.  If the variable is non-`nil', a general
-      time zone handling package `timezone.el' is used to generate a
-      valid date for `Date:' field in terms of RFC822.  Otherwise, if it
-      is nil, GNUS generate a date ignoring the local time zone.  If you
-      are using Bnews, it is okay since `inews' will rewrite the invalid
-      date.  However, if you are using Cnews or INN, you must set the
-      variable to the correct time zone or remove `Date' from the
-      variable `gnus-required-headers' since their `inews' do not
-      rewrite the wrong `Date:' field.
- 
-      If you want to display the time of articles in your local time
-      zone, call the function `gnus-gmt-to-local' from the hook
-      `gnus-article-prepare-hook'.
- 
- `gnus-local-distributions'
-      Specifies a list of distributions.  The head of the list is used as
-      default.  Each element of the list must be a string.  If
-      distributions file is available, its content is also used as
-      distributions.
- 
- `gnus-use-generic-from'
-      Non-`nil' means the local host name of your machine will not appear
-      in the `From:' field of article headers.  If the variable is a
-      string, it is used as your domain instead of the definition by the
-      variable `gnus-local-domain' or the environment variable
-      `DOMAINNAME'.
- 
- `gnus-use-generic-path'
-      Non-`nil' means the NNTP server name will not appear in the
-      `Path:' field of article headers.  If the variable is a string, it
-      is used in the `Path:' field as the NNTP server name instead of the
-      definition by the variable `gnus-nntp-server'.
- 
- `gnus-ignored-newsgroups'
-      Specify a regular expression used to ignore uninterested
-      newsgroups in the active file.  Any lines in the active file
-      matching this regular expression are removed from the newsgroup
-      list before anything else is done to it, thus making them
-      effectively invisible.  There is no way to know what newsgroups
-      there are if they are ignored.
- 
- `gnus-ignored-headers'
-      Specifies header fields which should be ignored in an article.
- 
- `gnus-required-headers'
-      Specifies header fields which should be included in an article you
-      will post.  RFC977 and RFC1036 require From, Date, Newsgroups,
-      Subject, Message-ID and Path fields.  Organization, Distribution
-      and Lines are optional.  If you want GNUS not to generate some
-      fields, remove them from the variable.  If news system is Cnews,
-      you may have to remove Date and to add Lines.
- 
- `gnus-startup-file'
-      Specifies a startup file of the Bnews system, usually `.newsrc'.
-      If there is a file named `.newsrc-SERVER', it is used instead when
-      talking to SERVER.  *Note Startup File::, for more information.
- 
- `gnus-signature-file'
-      Specifies a signature file of the Bnews system, usually
-      `.signature'.  The signature file is processed by the function
-      `gnus-inews-insert-signature' called from the hook
-      `gnus-prepare-article-hook' by default.  If there is a file named
-      `.signature-DISTRIBUTION', it is used instead when the
-      distribution of the article is DISTRIBUTION.  Set the variable to
-      `nil' to prevent appending the signature file automatically.
- 
- `gnus-use-cross-reference'
-      Specifies what to do with cross references (`Xref:' field).  If it
-      is `nil', cross references are ignored.  If it is `t', articles in
-      subscribed newsgroups are only marked as read.  Otherwise, if it
-      is not `nil' nor `t', articles in all newsgroups are marked as
-      read.
- 
- `gnus-use-followup-to'
-      Specifies what to do with `Followup-To:' field.  If it is `nil',
-      its value is ignored.  If it is non-`nil', its value is used as
-      followup newsgroups.  Especially, if it is `t' and you are going
-      to followup to an article in which `poster' is specified, your
-      confirmation is required.
- 
- `gnus-use-full-window'
-      Non-`nil' means to take up the entire screen of Emacs.  If the
-      variable is `nil', the windows used by GNUS will be restricted to
-      the bounds of the original window.  This is very useful if you
-      want to read articles while you do other work in other windows.
- 
- `gnus-window-configuration'
-      Specifies the configuration of the Group Mode window, the Summary
-      Mode window, and the Article Mode window.  The window
-      configuration can be specified for each action of GNUS (e.g.
-      selecting a newsgroup or selecting an article).  This is quite
-      useful if you are using a slow terminal since the update of Emacs
-      windows can be minimized by displaying these three windows same
-      time.
- 
-      The variable must be a list of `(ACTION (G S A))', where ACTION is
-      an action being performed, and G, S, and A are the relative
-      heights of the Group Mode window, the Summary Mode window, and the
-      Article Mode window, respectively.  ACTION is `summary',
-      `newsgroups', or `article'.
- 
-      The following example is the default window configuration:
- 
-           (setq gnus-window-configuration
-                 '((summary        (0 1 0))
-                   (newsgroups     (1 0 0))
-                   (article        (0 3 10))))
- 
-      The following is an example of yet another two windows mode.
-      Article buffer is always displayed on a screen.  This is useful on
-      a slow terminal.
- 
-           (setq gnus-window-configuration
-                 '((summary        (0 1 0))
-                   (newsgroups     (1 0 3))
-                   (article        (0 1 3))))
- 
-      The following is an example of three windows mode.  Three buffers
-      are always displayed on a screen.  This is also useful on a slow
-      terminal.
- 
-           (setq gnus-window-configuration
-                 '((summary        (1 4 0))
-                   (newsgroups     (1 1 3))
-                   (article        (1 1 3))))
- 
- `gnus-large-newsgroup'
-      Specifies the number of the articles which indicates a large
-      newsgroup.  If the number of articles in a newsgroup is greater
-      than this value, the number of articles to be selected is asked
-      for.  If the given value N is positive, the last N articles are
-      selected.  If N is negative, the first N articles are selected.
-      An empty string means to select all articles.
- 
- `gnus-author-copy'
-      Specifies a file name saving a copy of an article posted using
-      `FCC:' field.  The variable is initialized from the `AUTHORCOPY'
-      environment variable.  The specified file name is inserted in
-      `FCC:' field, so you have a chance to change the file name or
-      disable saving a copy by editing this field.
- 
-      The `FCC:' field is processed by the function `gnus-inews-do-fcc'
-      called from the hook `gnus-inews-article-hook' by default.  Unless
-      the first character of the field is ``|'', the article is saved to
-      the specified file using the function specified by the variable
-      `gnus-author-copy-saver'.  The default function `rmail-output'
-      saves in Unix mailbox format.  Instead, if the first character is
-      ``|'', the contents of the article is send to a program specified
-      by the rest of the value.  For example, articles can be saved in
-      an MH folder by the following:
- 
-           (setq gnus-author-copy
-                 "|/usr/local/lib/mh/rcvstore +Article")
- 
- `gnus-author-copy-saver'
-      Specifies a function to save an author copy to.  The function is
-      called with a file name to save a copy to.  The default function
-      `rmail-output' saves in Unix mailbox format.
- 
- `gnus-use-long-file-name'
-      Non-`nil' means that a newsgroup name is used as a default file
-      name to save articles to.  If it is `nil', the directory form of a
-      newsgroup name is used instead.  It is set to nil by default if the
-      variable `system-type' is either `usg-unix-v' or `xenix'.
- 
- `gnus-mail-save-name'
- `gnus-rmail-save-name'
- `gnus-folder-save-name'
- `gnus-file-save-name'
-      Specifies a function generating a file name to save articles to.
-      The function is called with NEWSGROUP, HEADERS, and optional
-      LAST-NAME.  NEWSGROUP is a string representing the current
-      newsgroup name.  HEADERS is a vector containing headers of the
-      current article.  Macros and functions accessing contents of the
-      HEADERS are defined as `nntp-header-FIELD' and
-      `gnus-header-FIELD', respectively.  The following functions are
-      provided as file name generators by default:
- 
-     `gnus-numeric-save-name'
-           Return a file name like `NEWS.GROUP/NUMBER' or
-           `NEWS/GROUP/NUMBER' according to the variable
-           `gnus-use-long-file-name'.
- 
-     `gnus-Numeric-save-name'
-           Return a file name like `NEWS.GROUP/NUMBER' or
-           `NEWS/GROUP/NUMBER' according to the variable
-           `gnus-use-long-file-name'.
- 
-     `gnus-plain-save-name'
-           Return a file name like `NEWS.GROUP' or `NEWS/GROUP/news'
-           according to the variable `gnus-use-long-file-name'.
- 
-     `gnus-Plain-save-name'
-           Return a file name like `NEWS.GROUP' or `NEWS/GROUP/news'
-           according to the variable `gnus-use-long-file-name'.
- 
-     `gnus-folder-save-name'
-           Return a folder name like `+NEWS.GROUP' or `+NEWS/GROUP'
-           according to the variable `gnus-use-long-file-name'.
- 
-     `gnus-Folder-save-name'
-           Return a folder name like `+NEWS.GROUP' or `+NEWS/GROUP'
-           according to the variable `gnus-use-long-file-name'.
- 
- `gnus-default-article-saver'
-      Specifies a function to save articles in your favorite format
-      using the command `gnus-summary-save-article'.  The function must
-      be interactively funcallable.  In other words, it must be an Emacs
-      command.  The functions currently provided are as follows:
- 
-     `gnus-summary-save-in-mail'
-           Save articles in Unix mailbox format.
- 
-     `gnus-summary-save-in-rmail'
-           Save articles in Rmail format.
- 
-     `gnus-summary-save-in-folder'
-           Save articles in an MH folder.
- 
-     `gnus-summary-save-in-file'
-           Save articles in article format.
- 
- `gnus-article-save-directory'
-      Specifies a directory name to save articles in using the commands
-      `gnus-summary-save-in-mail', `gnus-summary-save-in-rmail', and
-      `gnus-summary-save-in-file'.  The variable is initialized from the
-      `SAVEDIR' environment variable.  Its default value is `~/News'.
- 
- `gnus-kill-files-directory'
-      Specifies a directory name to save KILL files in using the commands
-      `gnus-edit-global-kill', and `gnus-edit-local-kill'.  The variable
-      is initialized from the `SAVEDIR' environment variable.  Its
-      default value is `~/News'.
- 
- `gnus-kill-file-name'
-      Specifies a file name of kill file (*note Kill File::.).  Its
-      default value is `KILL'.
- 
- `gnus-novice-user'
-      Non-`nil' means you are a novice to USENET.  If it is non-`nil',
-      verbose messages may be displayed or your confirmations may be
-      required.
- 
- `gnus-interactive-catchup'
-      Non-`nil' means that your confirmation is required when catching up
-      a newsgroup in Group mode.
- 
- `gnus-interactive-post'
-      Non-`nil' means that newsgroup, subject, and distribution are asked
-      for interactively when composing a new article.
- 
- `gnus-interactive-exit'
-      Non-`nil' means that your confirmation is required when exiting
-      GNUS.
- 
- `gnus-user-login-name'
-      Specifies your login name.  The login name is got from the
-      `LOGNAME' and `USER' environment variables and the function
-      `user-login-name', if undefined.
- 
- `gnus-user-full-name'
-      Specifies your full name.  The full name is got from the `NAME'
-      environment variable and the function `user-full-name', if
-      undefined.
- 
- `gnus-show-all-headers'
-      Non-`nil' means all headers of an article are shown.
- 
- `gnus-save-all-headers'
-      Non-`nil' means all headers of an article are saved in a file.
- 
- `gnus-show-mime'
-      Non-`nil' means process a MIME message.  The message is processed
-      by the function specified by the variable `gnus-show-mime-method'.
- 
- `gnus-show-threads'
-      Non-`nil' means conversation threads are displayed in a tree
-      structured form according to references in Summary Mode.
- 
- `gnus-thread-hide-subject'
-      Non-`nil' means subjects of lower level threads are hidden if the
-      thread-based reading is turned on.
- 
- `gnus-thread-hide-subtree'
-      Non-`nil' means thread subtrees are hidden initially.  If thread
-      subtrees are hidden, you have to run the command
-      `gnus-summary-show-thread' by hand or by using
-      `gnus-select-article-hook' to show them.
- 
- `gnus-thread-hide-killed'
-      Non-`nil' means killed thread subtrees are hidden automatically.
- 
- `gnus-thread-ignore-subject'
-      Non-`nil' means subject differences are ignored but only references
-      are taken into account in constructing threads trees.  If it is
-      non-`nil' and thread subtrees are hidden, some commands that work
-      with subjects may not work properly.
- 
- `gnus-thread-indent-level'
-      Specifies indentation level of thread subtrees.
- 
- `gnus-auto-extend-newsgroup'
-      Non-`nil' means visible articles are automatically extended to
-      forward and backward if possible when the commands `N' and `P'
-      (`gnus-summary-next-article' and `gnus-summary-prev-article') are
-      executed in Summary Mode.
- 
- `gnus-auto-select-first'
-      Non-`nil' means the first unread article is selected automatically
-      when a newsgroup is selected.  If you'd like to prevent automatic
-      selection of the first unread article in some newsgroups, set the
-      variable to `nil' in the hook `gnus-select-group-hook' or
-      `gnus-apply-kill-hook' (*note Hooks::.).
- 
- `gnus-auto-select-next'
-      Non-`nil' means the next newsgroup is selected automatically at the
-      end of the newsgroup.  If the value is `t' and the next newsgroup
-      is empty (no unread articles), GNUS will exit Summary Mode and go
-      back to Group Mode.  If the value is neither `nil' nor `t', GNUS
-      won't exit Summary Mode but will select the following unread
-      newsgroup.  If the value is `quietly', the next unread newsgroup
-      will be selected without any confirmations.
- 
- `gnus-auto-select-same'
-      Non-`nil' means an article with the same subject as the current
-      article is selected automatically like `rn -S'.
- 
- `gnus-auto-center-summary'
-      Non-`nil' means that the cursor is always kept centered in the
-      Summary Mode window.
- 
- `gnus-auto-mail-to-author'
-      Non-`nil' means that inserts `To:' field which is filled with the
-      author of the article when followuping.  Mail is sent using the
-      function specified by the variable `gnus-mail-send-method'.
- 
- `gnus-break-pages'
-      Non-`nil' means an article is broken into pages at page delimiters.
-      The page delimiter is specified by the variable
-      `gnus-page-delimiter'.  This may not work with some versions of GNU
-      Emacs earlier than version 18.50.
- 
- `gnus-page-delimiter'
-      Specifies regexp describing line-beginnings that separate pages of
-      articles.  Its default value is `"^\^L"'.
- 
- `gnus-digest-show-summary'
-      Non-`nil' means that a summary of digest messages is shown when
-      reading a digest article using the command
-      `gnus-summary-rmail-digest'.
- 
- `gnus-digest-separator'
-      Specifies a regexp which separates messages in a digest article.
-      Changes to this variable only affect the commands
-      `gnus-summary-next-digest' and `gnus-summary-prev-digest', but not
-      the command `gnus-summary-rmail-digest'.
- 
- `gnus-optional-headers'
-      Specifies a function which generates an optional string displayed
-      in the Summary buffer.  The function is called with an article
-      HEADERS, and must return a string excluding `[' and `]'.  HEADERS
-      is a vector containing headers of the current article.  Macros and
-      functions accessing contents of the HEADERS are defined as
-      `nntp-header-FIELD' and `gnus-header-FIELD', respectively.
- 
-      GNUS provides two functions as follows:
- 
-     `gnus-optional-lines-and-from'
-           Return a string like "NNN:AUTHOR", where NNN is the number of
-           lines in an article and AUTHOR is the name of the author.
- 
-     `gnus-optional-lines'
-           Return a string like "NNN", where NNN is the number of lines
-           in an article.
- 
-      *Note Hooks::, to change optional headers according to selected
-      newsgroups.
- 
- `gnus-show-mime-method'
-      Specifies a function to process a MIME message in current buffer.
-      The function `metamail-buffer' which process the buffer through
-      `metamail' is called by default.
- 
- `gnus-mail-reply-method'
-      Specifies a function to begin composing reply mail messages.  The
-      function will be called with an optional argument which means yank
-      original article automatically if non-`nil'.  To use Mail Mode, set
-      the variable to `gnus-mail-reply-using-mail'.  To use mh-e letter
-      Mode, set the variable to `gnus-mail-reply-using-mhe'.
- 
- `gnus-mail-forward-method'
-      Specifies a function to forward the current message to another
-      user.  To use Mail Mode, set the variable to
-      `gnus-mail-forward-using-mail'.  To use mh-e letter Mode, set the
-      variable to `gnus-mail-forward-using-mhe'.
- 
- `gnus-mail-other-window-method'
-      Specifies a function to begin composing mail messages in other
-      window.  To use Mail Mode, set the variable to
-      `gnus-mail-other-window-using-mail'.  To use mh-e letter Mode, set
-      the variable to `gnus-mail-other-window-using-mhe'.
- 
- `gnus-mail-send-method'
-      Specifies a function to mail a message too which is being posted
-      as an article.  The message must have `To:' or `Cc:' field.  The
-      value of the variable `send-mail-function' is the default function
-      which uses sendmail mail program.
- 
- `gnus-subscribe-newsgroup-method'
-      Specifies a function called with a newsgroup name when a new
-      newsgroup is found.  GNUS provides the following three functions:
- 
-     `gnus-subscribe-randomly'
-           Inserts a new newsgroup at the beginning of newsgroups.  Thus,
-           newsgroups are in random order.
- 
-     `gnus-subscribe-alphabetically'
-           Inserts a new newsgroup in strict alphabetic order.
- 
-     `gnus-subscribe-hierarchically'
-           Inserts a new newsgroup in hierarchical newsgroup order.
- 
-     `gnus-subscribe-interactively'
-           Asks for your decision about a new newsgroup subscription,
-           and inserts it in hierarchical newsgroup order if it is
-           subscribed.  Unless, it is killed.
- 
-      The following two definitions illustrate how to write your favorite
-      subscribing method.  The following definition (is the definition
-      of the function gnus-subscribe-randomly) adds new newsgroup at the
-      beginning of newsgroups:
- 
-           (setq gnus-subscribe-newsgroup-method
-                 '(lambda (newsgroup)
-                    (gnus-subscribe-newsgroup newsgroup
-                                              (car (car gnus-newsrc-assoc)))))
- 
-      Instead, if you want to add new newsgroup at the end of
-      newsgroups, use the following:
- 
-           (setq gnus-subscribe-newsgroup-method
-                 '(lambda (newsgroup)
-                    (gnus-subscribe-newsgroup newsgroup nil)))
- 
-      If you want to prevent adding new newsgroups automatically and
-      want to subscribe them later using the command `U'
-      (`gnus-group-unsubscribe-group') in the Newsgroup buffer, use the
-      following:
- 
-           (setq gnus-subscribe-newsgroup-method
-                 '(lambda (newsgroup) nil))        ;Do nothing.
- 
-      The following final example must be the most useful for you who
-      want not to add new newsgroups automatically.  This definition
-      subscribes a new newsgroup first, and then kills it.  The killed
-      newsgroups can be added to the subscription list interactively
-      using Browse-Killed Mode (*note Maintaining Subscriptions::.).
- 
-           (setq gnus-subscribe-newsgroup-method
-                 '(lambda (newsgroup)
-                    (gnus-subscribe-newsgroup newsgroup)
-                    (gnus-kill-newsgroup newsgroup)))
- 
- 
- File: gnus,  Node: NNTP Variables,  Next: Spool Variables,  Prev: Variables,  Up: Customization
- 
- NNTP Specific Variables
- =======================
- 
- `nntp-buggy-select'
-      Non-`nil' means the select routine of your operating system is
-      buggy.  GNUS may hang up while waiting for NNTP server responses.
-      The problem may be solved by setting the variable to `t'.
- 
- `nntp-maximum-request'
-      Specifies the maximum number of requests to be sent to the NNTP
-      server at one time.  GNUS may hang up while retrieving headers of
-      a large newsgroup because sending many requests to the NNTP server
-      without reading replies to them causes deadlock.  In this case,
-      set the variable to a lower number.
- 
- `nntp-large-newsgroup'
-      Specifies the number of articles which indicates a large
-      newsgroup.  If the number of articles is greater than the value,
-      verbose messages will be shown to indicate the current status.
- 
- `nntp-debug-read'
-      Non-`nil' means display dots "..." every 10000 bytes of a message
-      being received.  If it is a number, dots are displayed per the
-      number.  Set the variable to `nil' if you are annoyed about
-      verbose messages while reading news from slow terminal.
- 
- `tcp-program-name'
-      This variable specifies the name of the program which establishes
-      communications between Emacs and the NNTP server.  Its default
-      value is `"tcp"'.  (the program `tcp' comes with GNU Emacs.)  This
-      variable is relevant only if you load the library `tcp.el', which
-      you should do only if your Emacs does not have the function
-      `open-network-stream'.
- 
- 
- File: gnus,  Node: Spool Variables,  Next: Directory Variables,  Prev: NNTP Variables,  Up: Customization
- 
- Local News Spool Specific Variables
- ===================================
- 
- `nnspool-inews-program'
-      Specifies a program to post news.  This is default to the variable
-      `news-inews-program' which is default to `inews'.
- 
- `nnspool-inews-switches'
-      Specifies switches for the function `nnspool-request-post' to pass
-      to the command `inews' for posting news.  Its default value is
-      `("-h")'.
- 
- `nnspool-spool-directory'
-      Specifies a directory of a local news spool.  This is default to
-      the variable `news-path' which is default to `/usr/spool/news'.
- 
- `nnspool-active-file'
-      Specifies an active file of the system for a local news spool.  Its
-      default value is `/usr/lib/news/active'.
- 
- `nnspool-newsgroups-file'
-      Specifies an newsgroups file of the system for a local news spool.
-      Its default value is `/usr/lib/news/newsgroups'.
- 
- `nnspool-distributions-file'
-      Specifies an distributions file of the system for a local news
-      spool.  Its default value is `/usr/lib/news/distributions'.
- 
- `nnspool-history-file'
-      Specifies a history file of the system for a local news spool.  Its
-      default value is `/usr/lib/news/history'.  Some machines may not
-      have this file.  In this case, commands to refer to articles by
-      Message-IDs will not work at all (*note Referencing Articles::.).
- 
- 
- File: gnus,  Node: Directory Variables,  Next: Hooks,  Prev: Spool Variables,  Up: Customization
- 
- Private Directory Specific Variables
- ====================================
- 
- `mhspool-list-folders-method'
-      Specifies a function to fill the current buffer with file and
-      directory names for a given directory name.  The output format
-      must be the same as that of the Unix command `ls -R1'.  Two
-      functions `mhspool-list-folders-using-ls' and
-      `mhspool-list-folders-using-sh' are provided now.
- 
- `mhspool-list-directory-switches'
-      Specifies switches for the function `mhspool-list-folders-using-ls'
-      to pass to the command `ls' for getting file listings in a private
-      directory.  There should be one entry for each line.  Its default
-      value is `("-R")'.  Some machines may require the `("-R1")' switch.
- 
- 
- File: gnus,  Node: Hooks,  Prev: Directory Variables,  Up: Customization
- 
- Function Hooks
- ==============
- 
- `gnus-group-mode-hook'
-      Called with no arguments after initializing Group Mode if its
-      value is non-`nil'.  This hook is intended to customize Group Mode
-      only once.  It is possible to define or change the NNTP server as
-      you like in this hook since the hook is called before GNUS is
-      connected to an NNTP server.
- 
- `gnus-summary-mode-hook'
-      Called with no arguments after initializing Summary Mode if its
-      value is non-`nil'.  This hook is intended to customize Summary
-      Mode only once.  All sorts of searches in Summary Mode normally
-      ignore the case of the text they are searching through.  If you do
-      not want to ignore the case, set the variable `case-fold-search'
-      to `nil' in this hook.
- 
-      The following example shows how to assign the functions
-      `gnus-summary-next-group' and `gnus-summary-prev-group' to keys in
-      Summary Mode.
- 
-           (setq gnus-summary-mode-hook
-                 '(lambda ()
-                    (local-set-key "\C-cn" 'gnus-summary-next-group)
-                    (local-set-key "\C-cp" 'gnus-summary-prev-group)))
- 
- `gnus-article-mode-hook'
-      Called with no arguments after initializing Article Mode if its
-      value is non-`nil'.  This hook is intended to customize Article
-      Mode only once.
- 
- `gnus-kill-file-mode-hook'
-      Called with no arguments after initializing Kill-File Mode if its
-      value is non-`nil'.
- 
- `gnus-browse-killed-mode-hook'
-      Called with no arguments after initializing Browse-Killed Mode if
-      its value is non-`nil'.
- 
- `gnus-open-server-hook'
-      Called with no arguments just before opening a connection to NNTP
-      server if its value is non-`nil'.
- 
- `gnus-startup-hook'
-      Called with no arguments after an NNTP server is successfully
-      connected to if its value is non-`nil'.  It is possible to change
-      the behavior of GNUS according to the server.
- 
- `gnus-group-prepare-hook'
-      Called with no arguments after a list of newsgroups is prepared in
-      the Newsgroup buffer.  This hook is intended to modify the buffer.
- 
- `gnus-summary-prepare-hook'
-      Called with no arguments after list of subjects is prepared in the
-      Summary buffer.  This hook is intended to modify the buffer.
- 
- `gnus-article-prepare-hook'
-      Called with no arguments after an article is prepared in the
-      Article buffer.  This hook is intended to modify the buffer.  For
-      example, kanji code conversion or un-ROT13/47-ing can be done in
-      this hook.
- 
- `gnus-select-group-hook'
-      Called with no arguments when a newsgroup is selected.  This hook
-      is intended to change the behavior of GNUS according to the
-      selected newsgroup.
- 
-      The following is an example of sorting the headers listed in the
-      Summary buffer by date and then by subject.  Preceding `Re:' of
-      subjects is ignored while comparing subjects.
- 
-           (setq gnus-select-group-hook
-                 '(lambda ()
-                    ;; First of all, sort by date.
-                    (gnus-keysort-headers
-                     (function string-lessp)
-                     (function
-                      (lambda (a)
-                        (gnus-sortable-date (gnus-header-date a)))))
-                    ;; Then sort by subject ignoring `Re:'.
-                    (gnus-keysort-headers
-                     (function string-lessp)
-                     (function
-                      (lambda (a)
-                        (if case-fold-search
-                            (downcase (gnus-simplify-subject (gnus-header-subject a) t))
-                          (gnus-simplify-subject (gnus-header-subject a) t)))))
-                   ))
- 
-      The following is an example of simplifying subjects like the
-      `gnus-summary-next-same-subject' command does:
- 
-           (setq gnus-select-group-hook
-                 '(lambda ()
-                    (mapcar (function
-                             (lambda (header)
-                               (nntp-set-header-subject
-                                header
-                                (gnus-simplify-subject
-                                 (gnus-header-subject header) 're-only))))
-                            gnus-newsgroup-headers)))
- 
-      In some newsgroups, author names are meaningless.  It is possible
-      to prevent listing author names in the Summary buffer as follows:
- 
-           (setq gnus-select-group-hook
-                 '(lambda ()
-                    (cond ((string-equal "comp.sources.unix"
-                                         gnus-newsgroup-name)
-                           (setq gnus-optional-headers
-                                 (function gnus-optional-lines)))
-                          (t
-                           (setq gnus-optional-headers
-                                 (function
-                                    gnus-optional-lines-and-from))))))
- 
- `gnus-select-article-hook'
-      Called with no arguments when an article is selected if its value
-      is non-`nil'.
- 
-      The default hook definition shows conversation thread subtrees of
-      the selected article automatically as follows:
- 
-           (setq gnus-select-article-hook
-                 '(lambda ()
-                    (gnus-summary-show-thread)))
- 
-      It is possible to run Rmail on a digest article automatically as
-      follows:
- 
-           (setq gnus-select-article-hook
-                 '(lambda ()
-                    (gnus-summary-show-thread)
-                    (cond ((string-equal "comp.sys.sun"
-                                         gnus-newsgroup-name)
-                           (gnus-summary-rmail-digest))
-                          ((and (string-equal "comp.text"
-                                              gnus-newsgroup-name)
-                                (string-match "^TeXhax Digest"
-                                              (gnus-header-subject
-                                                 gnus-current-headers)))
-                           (gnus-summary-rmail-digest)
-                           ))))
- 
- `gnus-select-digest-hook'
-      Called with no arguments when reading digest messages using Rmail
-      if its value is non-`nil'.  This hook is intended to modify an
-      article so that Rmail can work with it.  *Note Digest Articles::,
-      for more information on digest articles.
- 
-      The following example is the default hook definition to modify
-      incomplete digest articles:
- 
-           (setq gnus-select-digest-hook
-                 '(lambda ()
-                    ;; Reply-To: is required by
-                    ;; `undigestify-rmail-message'.
-                    (or (mail-position-on-field "Reply-to" t)
-                        (progn
-                          (mail-position-on-field "Reply-to")
-                          (insert (gnus-fetch-field "From"))))))
- 
- `gnus-rmail-digest-hook'
-      Called with no arguments when reading digest messages using Rmail
-      if its value is non-`nil'.  This hook is intended to customize
-      Rmail Mode for reading digest articles.
- 
- `gnus-apply-kill-hook'
-      Called with no arguments when a newsgroup is selected and the
-      Summary buffer is prepared if its value is non-`nil'.  This hook
-      is intended to apply kill files to the selected newsgroup.  It is
-      set to the function `gnus-apply-kill-file' by default.
- 
-      Since a general kill file is too heavy to use only for a few
-      newsgroups, a lighter hook function is recommended.  For example,
-      if you'd like to apply kills to articles which contain the string
-      `rmgroup' in subject in newsgroup `control', you can use the
-      following hook:
- 
-           (setq gnus-apply-kill-hook
-                 '(lambda ()
-                    (cond ((string-match "control" gnus-newsgroup-name)
-                           (gnus-kill "Subject" "rmgroup")
-                           (gnus-expunge "X")))))
- 
-      *Note Kill File::, for more information on kill files.
- 
- `gnus-mark-article-hook'
-      Called with no arguments when an article is selected for the first
-      time if its value is non-`nil'.  The hook is intended to mark an
-      article as read (or saved) automatically when it is selected.
- 
-      The following example is the default definition of the hook:
- 
-           (setq gnus-mark-article-hook
-                 '(lambda ()
-                    ;; Mark the selected article as read.
-                    (or (memq gnus-current-article gnus-newsgroup-marked)
-                        (gnus-summary-mark-as-read gnus-current-article))
-                    ;; Put "+" on the current subject.
-                    (gnus-summary-set-current-mark "+")
-                    ))
- 
-      It is possible to mark as saved (`-') instead when an article is
-      selected as follows:
- 
-           (setq gnus-mark-article-hook
-                 '(lambda ()
-                    ;; Mark the selected article as saved.
-                    (gnus-summary-mark-as-unread gnus-current-article)
-                    ;; Put "+" on the current subject.
-                    (gnus-summary-set-current-mark "+")
-                    ))
- 
- `gnus-prepare-article-hook'
-      Called with no arguments after preparing message body, but before
-      preparing header fields which is automatically generated if its
-      value is non-`nil'.  Text changes made by this hook does not
-      affect on the editing text.  The default hook inserts a signature
-      file by calling the function `gnus-inews-insert-signature'.
- 
- `gnus-inews-article-hook'
-      Called with no arguments before posting an article if its value is
-      non-`nil'.  This hook is called just before sending an article to
-      the NNTP server or calling the `inews' program.  Text changes made
-      by this hook does not affect on the editing text.  It is no
-      recommended to alter the number of lines of the article since
-      `Lines:' field may be already there.  The default hook does FCC
-      (save an article to the specified file) by calling the function
-      `gnus-inews-do-fcc'.
- 
- `gnus-exit-group-hook'
-      Called with no arguments when exiting the current newsgroup if its
-      value is non-`nil'.  If your machine is so slow that exiting from
-      Summary Mode takes a long time, you can inhibit marking articles
-      as read by using cross-reference information in the `Xref:' field
-      by setting the variable `gnus-newsgroup-headers' to `nil' in this
-      hook.
- 
- `gnus-exit-gnus-hook'
-      Called with no arguments when exiting GNUS if its value is
-      non-`nil'.  If you want to clear out Emacs buffers which were
-      created by GNUS and remain afterwards, you can use this hook.
- 
-      The following example shows how to kill a buffer which was used for
-      posting news.
- 
-           (setq gnus-exit-gnus-hook
-                 '(lambda ()
-                    ;; Kill a buffer used for posting news.
-                    (and (get-buffer "*post-news*")
-                         (kill-buffer "*post-news*"))))
- 
- `gnus-suspend-gnus-hook'
-      Called with no arguments when suspending GNUS if its value is
-      non-`nil'.  The purpose is the same as the hook
-      `gnus-exit-gnus-hook'.
- 
- `gnus-save-newsrc-hook'
-      Called with no arguments before saving the startup file `.newsrc'
-      if its value is non-`nil'.  This hook is intended to change the way
-      of backing up the startup file.
- 
- 
- File: gnus,  Node: Troubleshooting,  Next: Customization,  Prev: Kill File,  Up: Top
- 
- Troubleshooting GNUS
- ********************
- 
-    Emacs may hang up while waiting for NNTP server responses.  This may
- be caused by a buggy select routine of your operating system.  If so,
- the problem may be solved by loading the source code for the library
- `nntp.el' instead of running the byte-compiled version.  If you still
- have problems with it, set the variable `nntp-buggy-select' to `t'.
- 
-    Emacs may hang up while retrieving headers of a large newsgroup.  The
- reason is that too many requests have been sent to the NNTP server
- without reading replies to them.  This causes a deadlock of Emacs and
- the server.  In this case, the number of requests sent to the server at
- one time must be reduced.  Set the variable `nntp-maximum-request' to a
- lower value than the default.  The optimal value depends on your
- computing environment.
- 
- 
- File: gnus,  Node: Reporting Bugs,  Next: Index,  Prev: Customization,  Up: Top
- 
- Reporting Bugs
- **************
- 
- Mailing Lists and USENET Newsgroup
- ==================================
- 
-    There are two mailing lists and one USENET newsgroup for discussing
- GNUS related topics.  These are intended for exchanging useful
- information about GNUS, such as bug reports, useful hooks, and
- extensions of GNUS.  If you have any questions or problems, feel free to
- ask about them.  Suggestions are also welcome.
- 
- `gnu.emacs.gnus'
-      This is a USENET newsgroup under the gnu.all hierarchy which is
-      concerned with the GNU Project of the Free Software Foundation.
- 
- `info-gnus-english@tut.cis.ohio-state.edu'
-      This is an Internet mailing list which is gated bi-directionally
-      with the gnu.emacs.gnus newsgroup.  English is the official
-      language of the list.  Please send subscription requests to:
- 
-           info-gnus-english-request@tut.cis.ohio-state.edu
- 
- `info-gnus@flab.Fujitsu.CO.JP'
-      This is a JUNET mailing list.  Messages of info-gnus-english and
-      gnu.emacs.gnus are forwarded to this list.  English and Japanese
-      are the official languages of the list.  Please send subscription
-      requests to:
- 
-           info-gnus-request@flab.Fujitsu.CO.JP
- 
-    The major difference between info-gnus-english/gnu.emacs.gnus and
- info-gnus is the official language.  There is no need to subscribe to
- info-gnus if you cannot read messages written in Japanese since most
- discussions and important announcements will be sent to
- info-gnus-english.
- 
- How to Report a Bug
- ===================
- 
-    If you find a bug, it is important to report it and to report it in a
- way which is useful.  If it is a bug of a lisp program, what is the most
- useful is an exact backtrace information of the lisp program together
- with the version number of GNUS that you are using.
- 
-    To make the backtrace information, you must set the Emacs variable
- `debug-on-error' to `t' before the error happens.  A backtrace obtained
- from a byte-compiled lisp program is not usually understandable.  To
- make a human readable backtrace, load the source program which is not
- byte-compiled yet and then produce the error.
- 
-    *note Reporting Bugs: (emacs)Bugs, for more information.
- 
--- 0 ----
Index: emacs/info/gnus-3
diff -c emacs/info/gnus-3:1.1.1.2 emacs/info/gnus-3:removed
*** emacs/info/gnus-3:1.1.1.2	Mon Jul 22 01:52:50 1996
--- emacs/info/gnus-3	Fri Aug  2 20:19:59 1996
***************
*** 1,833 ****
- This is Info file ../info/gnus, produced by Makeinfo-1.55 from the
- input file gnus.texi.
- 
-    This file documents GNUS, the GNU Emacs newsreader.
- 
-    Copyright (C) 1989, 1990, 1993 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the entire resulting derived work is distributed under the terms
- of a permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions.
- 
- 
- File: gnus,  Node: Index,  Prev: Reporting Bugs,  Up: Top
- 
- Index
- *****
- 
- * Menu:
- 
- * & (Summary Mode):                     Searching Articles.
- * & (Summary Mode):                     Searching Articles.
- * . (Summary Mode):                     Moving Among Articles.
- * .newsrc:                              Startup File.
- * .newsrc:                              Variables.
- * .signature:                           Variables.
- * /usr/lib/news/active:                 Spool Variables.
- * /usr/lib/news/distributions:          Spool Variables.
- * /usr/lib/news/history:                Spool Variables.
- * /usr/lib/news/newsgroups:             Spool Variables.
- * < (Group Mode):                       Browsing Newsgroups.
- * < (Summary Mode):                     Scrolling.
- * = (Group Mode):                       Selecting a Newsgroup.
- * = (Group Mode):                       Selecting a Newsgroup.
- * = (Group Mode):                       Selecting a Newsgroup.
- * = (Summary Mode):                     Reading an Article.
- * = (Summary Mode):                     Reading an Article.
- * > (Group Mode):                       Browsing Newsgroups.
- * > (Summary Mode):                     Scrolling.
- * SAVEDIR environment variable:         Saving Articles.
- * a (Group Mode):                       Other Newsgroup Commands.
- * a (Summary Mode):                     Posting Articles.
- * a (Summary Mode):                     Posting Articles.
- * active file:                          Finding the News.
- * active file:                          Spool Variables.
- * active file:                          Maintaining Subscriptions.
- * active file:                          Maintaining Subscriptions.
- * add newsgroups:                       Maintaining Subscriptions.
- * add newsgroups:                       Variables.
- * Article buffer:                       Buffers of GNUS.
- * Article mode:                         Buffers of GNUS.
- * article status:                       Marking Articles.
- * AUTHORCOPY:                           Variables.
- * b (Group Mode):                       Maintaining Subscriptions.
- * batch kill processing:                Background Kills.
- * Bnews:                                Variables.
- * Bnews:                                Variables.
- * bogus newsgroups:                     Maintaining Subscriptions.
- * break into pages:                     Variables.
- * break into pages:                     Variables.
- * break into pages (GNUS):              Reading an Article.
- * buffers of GNUS:                      Buffers of GNUS.
- * bug report:                           Reporting Bugs.
- * c (Group Mode):                       Maintaining Subscriptions.
- * C (Group Mode):                       Maintaining Subscriptions.
- * c (Summary Mode):                     Marking Articles.
- * C (Summary Mode):                     Posting Articles.
- * C (Summary Mode):                     Posting Articles.
- * C-c C-a (Kill-File Mode):             Editing Kill Files.
- * C-c C-c (Kill-File Mode):             Editing Kill Files.
- * C-c C-e (Kill-File Mode):             Editing Kill Files.
- * C-c C-f (Summary Mode):               Forward and Reply.
- * C-c C-k C-a (Kill-File Mode):         Editing Kill Files.
- * C-c C-k C-a (Kill-File Mode):         Editing Kill Files.
- * C-c C-k C-s (Kill-File Mode):         Editing Kill Files.
- * C-c C-k C-s (Kill-File Mode):         Editing Kill Files.
- * C-c C-l (Group Mode):                 Maintaining Subscriptions.
- * C-c C-n (Summary Mode):               Digest Articles.
- * C-c C-n (Summary Mode):               Digest Articles.
- * C-c C-p (Summary Mode):               Digest Articles.
- * C-c C-p (Summary Mode):               Digest Articles.
- * C-c C-r (Summary Mode):               Reading an Article.
- * C-c C-r (Summary Mode):               Reading an Article.
- * C-c C-s C-a (Summary Mode):           Sorting Headers.
- * C-c C-s C-d (Summary Mode):           Sorting Headers.
- * C-c C-s C-n (Summary Mode):           Sorting Headers.
- * C-c C-s C-s (Summary Mode):           Sorting Headers.
- * C-c C-y (News Mode):                  Posting Articles.
- * C-d (Summary Mode):                   Digest Articles.
- * C-d (Summary Mode):                   Digest Articles.
- * C-h m:                                Posting Articles.
- * C-k (Group Mode):                     Maintaining Subscriptions.
- * C-k (Summary Mode):                   Marking Articles.
- * C-M-b (Summary Mode):                 Thread-based Reading.
- * C-M-d (Summary Mode):                 Thread-based Reading.
- * C-M-f (Summary Mode):                 Thread-based Reading.
- * C-M-h (Summary Mode):                 Thread-based Reading.
- * C-M-h (Summary Mode):                 Thread-based Reading.
- * C-M-k (Summary Mode):                 Thread-based Reading.
- * C-M-k (Summary Mode):                 Thread-based Reading.
- * C-M-n (Summary Mode):                 Moving Among Articles.
- * C-M-p (Summary Mode):                 Moving Among Articles.
- * C-M-s (Summary Mode):                 Thread-based Reading.
- * C-M-s (Summary Mode):                 Thread-based Reading.
- * C-M-t (Summary Mode):                 Thread-based Reading.
- * C-M-u (Summary Mode):                 Thread-based Reading.
- * C-n (Group Mode):                     Browsing Newsgroups.
- * C-n (Summary Mode):                   Summary Motion.
- * C-o (Summary Mode):                   Saving Articles.
- * C-p (Group Mode):                     Browsing Newsgroups.
- * C-p (Summary Mode):                   Summary Motion.
- * C-t (Summary Mode):                   Reading an Article.
- * C-u M-x gnus:                         Getting Started.
- * C-w (Group Mode):                     Maintaining Subscriptions.
- * C-x C-s (Summary Mode):               Exiting Newsgroup.
- * C-x C-s (Summary Mode):               Exiting Newsgroup.
- * C-x C-t (Group Mode):                 Maintaining Subscriptions.
- * C-x w:                                Browsing Newsgroups.
- * C-y (Group Mode):                     Maintaining Subscriptions.
- * caesar messages:                      Reading an Article.
- * caesar messages:                      Reading an Article.
- * cancel article:                       Posting Articles.
- * cancel article:                       Posting Articles.
- * cancel article:                       Posting Articles.
- * catch up:                             Marking Articles.
- * catch up:                             Marking Articles.
- * catch up:                             Maintaining Subscriptions.
- * catch up:                             Marking Articles.
- * catch up:                             Marking Articles.
- * change the order of newsgroups:       Maintaining Subscriptions.
- * Cnews:                                Variables.
- * Cnews:                                Variables.
- * configure windows:                    Variables.
- * configure windows:                    Buffers of GNUS.
- * conversation threads:                 Variables.
- * conversation threads:                 Variables.
- * conversation threads:                 Variables.
- * conversation threads:                 Variables.
- * conversation threads:                 Variables.
- * conversation threads:                 Variables.
- * cross-references:                     Maintaining Subscriptions.
- * cross-references:                     Variables.
- * D (Summary Mode):                     Marking Articles.
- * d (Summary Mode):                     Marking Articles.
- * Date field:                           Variables.
- * debug NNTP communication:             NNTP Variables.
- * DEL (Article Mode):                   Article Commands.
- * DEL (Group Mode):                     Browsing Newsgroups.
- * DEL (Summary Mode):                   Scrolling.
- * delete newsgroups:                    Maintaining Subscriptions.
- * describe-mode:                        Posting Articles.
- * digest articles:                      Digest Articles.
- * digest separator:                     Variables.
- * digest separator:                     Digest Articles.
- * digest summary:                       Digest Articles.
- * digest summary:                       Variables.
- * distributions:                        Variables.
- * distributions file:                   Spool Variables.
- * domain:                               Variables.
- * DOMAINNAME:                           Variables.
- * DOMAINNAME:                           Variables.
- * edit global KILL file:                Editing Kill Files.
- * edit kill file:                       Other Newsgroup Commands.
- * edit local KILL file:                 Editing Kill Files.
- * encrypted articles:                   Reading an Article.
- * encrypted articles:                   Reading an Article.
- * entire screen:                        Variables.
- * f (Summary Mode):                     Posting Articles.
- * F (Summary Mode):                     Posting Articles.
- * F (Summary Mode):                     Posting Articles.
- * f (Summary Mode):                     Posting Articles.
- * followup to article:                  Posting Articles.
- * followup to article:                  Variables.
- * Followup-To field:                    Variables.
- * forward article:                      Variables.
- * From field:                           Variables.
- * full name of user:                    Variables.
- * full window:                          Variables.
- * g (Group Mode):                       Maintaining Subscriptions.
- * g (Group Mode):                       Maintaining Subscriptions.
- * g (Summary Mode):                     Reading an Article.
- * GENERICFROM:                          Variables.
- * GENERICPATH:                          Variables.
- * global kill file:                     Kill File.
- * gnu.emacs.gnus:                       Reporting Bugs.
- * gnus:                                 Getting Started.
- * GNUS buffers:                         Buffers of GNUS.
- * GNUS major modes:                     Buffers of GNUS.
- * GNUS windows:                         Buffers of GNUS.
- * gnus-apply-kill-file:                 Advanced Kills.
- * gnus-apply-kill-hook:                 Hooks.
- * gnus-apply-kill-hook:                 Advanced Kills.
- * gnus-article-mode-hook:               Hooks.
- * gnus-article-next-page:               Article Commands.
- * gnus-article-pop-article:             Article Commands.
- * gnus-article-prepare-hook:            Variables.
- * gnus-article-prepare-hook:            Hooks.
- * gnus-article-prev-page:               Article Commands.
- * gnus-article-refer-article:           Article Commands.
- * gnus-article-save-directory:          Variables.
- * gnus-article-save-directory:          Saving Articles.
- * gnus-article-show-summary:            Article Commands.
- * gnus-author-copy:                     Variables.
- * gnus-author-copy-saver:               Variables.
- * gnus-author-copy-saver:               Variables.
- * gnus-auto-center-summary:             Variables.
- * gnus-auto-extend-newsgroup:           Variables.
- * gnus-auto-extend-newsgroup:           Moving Among Articles.
- * gnus-auto-mail-to-author:             Variables.
- * gnus-auto-select-first:               Variables.
- * gnus-auto-select-next:                Moving Among Articles.
- * gnus-auto-select-next:                Variables.
- * gnus-auto-select-same:                Variables.
- * gnus-auto-select-same:                Moving Among Articles.
- * gnus-batch-kill:                      Background Kills.
- * gnus-break-pages:                     Variables.
- * gnus-break-pages:                     Reading an Article.
- * gnus-browse-killed-mode-hook:         Hooks.
- * gnus-current-article:                 Hooks.
- * gnus-current-headers:                 Hooks.
- * gnus-date-lessp:                      Hooks.
- * gnus-default-article-saver:           Variables.
- * gnus-digest-separator:                Digest Articles.
- * gnus-digest-separator:                Variables.
- * gnus-digest-show-summary:             Variables.
- * gnus-digest-show-summary:             Digest Articles.
- * gnus-edit-global-kill:                Variables.
- * gnus-edit-local-kill:                 Variables.
- * gnus-exit-gnus-hook:                  Hooks.
- * gnus-exit-gnus-hook:                  Exiting GNUS.
- * gnus-exit-group-hook:                 Hooks.
- * gnus-expunge:                         Making a Kill File.
- * gnus-expunge:                         Kill File Example.
- * gnus-fetch-field:                     Hooks.
- * gnus-file-save-name:                  Variables.
- * gnus-folder-save-name:                Variables.
- * gnus-folder-save-name:                Variables.
- * gnus-Folder-save-name:                Variables.
- * gnus-gmt-to-local:                    Variables.
- * gnus-group-catchup:                   Maintaining Subscriptions.
- * gnus-group-catchup-all:               Maintaining Subscriptions.
- * gnus-group-check-bogus-groups:        Maintaining Subscriptions.
- * gnus-group-edit-global-kill:          Other Newsgroup Commands.
- * gnus-group-edit-local-kill:           Other Newsgroup Commands.
- * gnus-group-exit:                      Exiting GNUS.
- * gnus-group-exit:                      Exiting GNUS.
- * gnus-group-force-update:              Startup File.
- * gnus-group-get-new-news:              Maintaining Subscriptions.
- * gnus-group-get-new-news:              Maintaining Subscriptions.
- * gnus-group-jump-to-group:             Browsing Newsgroups.
- * gnus-group-jump-to-group:             Browsing Newsgroups.
- * gnus-group-kill-group:                Maintaining Subscriptions.
- * gnus-group-kill-region:               Maintaining Subscriptions.
- * gnus-group-list-all-groups:           Maintaining Subscriptions.
- * gnus-group-list-groups:               Maintaining Subscriptions.
- * gnus-group-mode-hook:                 Hooks.
- * gnus-group-next-group:                Browsing Newsgroups.
- * gnus-group-next-unread-group:         Browsing Newsgroups.
- * gnus-group-post-news:                 Other Newsgroup Commands.
- * gnus-group-prepare-hook:              Hooks.
- * gnus-group-prev-group:                Browsing Newsgroups.
- * gnus-group-prev-unread-group:         Browsing Newsgroups.
- * gnus-group-quit:                      Exiting GNUS.
- * gnus-group-quit:                      Exiting GNUS.
- * gnus-group-read-group:                Selecting a Newsgroup.
- * gnus-group-read-group:                Selecting a Newsgroup.
- * gnus-group-read-group:                Selecting a Newsgroup.
- * gnus-group-restart:                   Startup File.
- * gnus-group-restrict-groups:           Browsing Newsgroups.
- * gnus-group-restrict-groups:           Browsing Newsgroups.
- * gnus-group-select-group:              Selecting a Newsgroup.
- * gnus-group-select-group:              Selecting a Newsgroup.
- * gnus-group-select-group:              Selecting a Newsgroup.
- * gnus-group-suspend:                   Exiting GNUS.
- * gnus-group-suspend:                   Exiting GNUS.
- * gnus-group-transpose-groups:          Maintaining Subscriptions.
- * gnus-group-unsubscribe-current-group: Maintaining Subscriptions.
- * gnus-group-unsubscribe-group:         Maintaining Subscriptions.
- * gnus-group-unsubscribe-group:         Variables.
- * gnus-group-yank-group:                Maintaining Subscriptions.
- * gnus-header-FIELD:                    Variables.
- * gnus-header-FIELD:                    Variables.
- * gnus-header-date:                     Hooks.
- * gnus-header-subject:                  Hooks.
- * gnus-ignored-headers:                 Reading an Article.
- * gnus-ignored-headers:                 Variables.
- * gnus-ignored-newsgroups:              Variables.
- * gnus-inews-article-hook:              Variables.
- * gnus-inews-article-hook:              Hooks.
- * gnus-inews-do-fcc:                    Hooks.
- * gnus-inews-do-fcc:                    Variables.
- * gnus-inews-insert-signature:          Variables.
- * gnus-inews-insert-signature:          Hooks.
- * gnus-interactive-catchup:             Variables.
- * gnus-interactive-exit:                Variables.
- * gnus-interactive-post:                Variables.
- * gnus-interactive-post:                Posting Articles.
- * gnus-kill:                            Making a Kill File.
- * gnus-kill:                            Hooks.
- * gnus-kill-file-apply-buffer:          Editing Kill Files.
- * gnus-kill-file-apply-last-sexp:       Editing Kill Files.
- * gnus-kill-file-exit:                  Editing Kill Files.
- * gnus-kill-file-kill-by-author:        Editing Kill Files.
- * gnus-kill-file-kill-by-author:        Editing Kill Files.
- * gnus-kill-file-kill-by-subject:       Editing Kill Files.
- * gnus-kill-file-kill-by-subject:       Editing Kill Files.
- * gnus-kill-file-mode-hook:             Hooks.
- * gnus-kill-file-name:                  Names of Kill Files.
- * gnus-kill-file-name:                  Variables.
- * gnus-kill-files-directory:            Variables.
- * gnus-kill-files-directory:            Names of Kill Files.
- * gnus-kill-newsgroup:                  Variables.
- * gnus-large-newsgroup:                 Variables.
- * gnus-large-newsgroup:                 Selecting a Newsgroup.
- * gnus-list-killed-groups:              Maintaining Subscriptions.
- * gnus-local-distributions:             Variables.
- * gnus-local-domain:                    Variables.
- * gnus-local-domain:                    Variables.
- * gnus-local-organization:              Variables.
- * gnus-local-timezone:                  Variables.
- * gnus-mail-forward-method:             Variables.
- * gnus-mail-forward-using-mail:         Variables.
- * gnus-mail-forward-using-mhe:          Variables.
- * gnus-mail-other-window-method:        Variables.
- * gnus-mail-other-window-using-mail:    Variables.
- * gnus-mail-other-window-using-mhe:     Variables.
- * gnus-mail-reply-method:               Variables.
- * gnus-mail-reply-using-mail:           Variables.
- * gnus-mail-reply-using-mhe:            Variables.
- * gnus-mail-save-name:                  Variables.
- * gnus-mail-send-method:                Variables.
- * gnus-mail-send-method:                Variables.
- * gnus-mark-article-hook:               Hooks.
- * gnus-newsgroup-headers:               Hooks.
- * gnus-newsgroup-headers:               Hooks.
- * gnus-newsgroup-kill-file:             Advanced Kills.
- * gnus-newsgroup-marked:                Hooks.
- * gnus-newsgroup-name:                  Advanced Kills.
- * gnus-newsgroup-name:                  Advanced Kills.
- * gnus-newsgroup-name:                  Hooks.
- * gnus-newsgroup-name:                  Hooks.
- * gnus-newsgroup-name:                  Hooks.
- * gnus-newsrc-assoc:                    Variables.
- * gnus-nntp-server:                     Kill File Example.
- * gnus-nntp-server:                     Variables.
- * gnus-nntp-server:                     Advanced Kills.
- * gnus-nntp-service:                    Variables.
- * gnus-novice-user:                     Variables.
- * gnus-novice-user:                     Posting Articles.
- * gnus-Numeric-save-name:               Variables.
- * gnus-numeric-save-name:               Variables.
- * gnus-open-server-hook:                Hooks.
- * gnus-optional-headers:                Summary Buffer.
- * gnus-optional-headers:                Hooks.
- * gnus-optional-headers:                Variables.
- * gnus-optional-lines:                  Variables.
- * gnus-optional-lines:                  Hooks.
- * gnus-optional-lines-and-from:         Variables.
- * gnus-optional-lines-and-from:         Hooks.
- * gnus-page-delimiter:                  Variables.
- * gnus-page-delimiter:                  Reading an Article.
- * gnus-page-delimiter:                  Variables.
- * gnus-Plain-save-name:                 Variables.
- * gnus-plain-save-name:                 Variables.
- * gnus-prepare-article-hook:            Hooks.
- * gnus-prepare-article-hook:            Variables.
- * gnus-required-headers:                Variables.
- * gnus-required-headers:                Variables.
- * gnus-rmail-digest-hook:               Hooks.
- * gnus-rmail-save-name:                 Variables.
- * gnus-save-all-headers:                Variables.
- * gnus-save-newsrc-hook:                Hooks.
- * gnus-select-article-hook:             Digest Articles.
- * gnus-select-article-hook:             Hooks.
- * gnus-select-digest-hook:              Hooks.
- * gnus-select-digest-hook:              Digest Articles.
- * gnus-select-group-hook:               Hooks.
- * gnus-select-group-hook:               Sorting Headers.
- * gnus-show-all-headers:                Variables.
- * gnus-show-mime:                       Variables.
- * gnus-show-mime-method:                Variables.
- * gnus-show-mime-method:                Variables.
- * gnus-show-threads:                    Thread-based Reading.
- * gnus-show-threads:                    Variables.
- * gnus-signature-file:                  Variables.
- * gnus-simplify-subject:                Hooks.
- * gnus-sort-headers:                    Hooks.
- * gnus-startup-file:                    Variables.
- * gnus-startup-hook:                    Hooks.
- * gnus-string-lessp:                    Hooks.
- * gnus-subscribe-alphabetically:        Variables.
- * gnus-subscribe-hierarchically:        Variables.
- * gnus-subscribe-interactively:         Variables.
- * gnus-subscribe-newsgroup:             Variables.
- * gnus-subscribe-newsgroup:             Variables.
- * gnus-subscribe-newsgroup:             Variables.
- * gnus-subscribe-newsgroup-method:      Variables.
- * gnus-subscribe-randomly:              Variables.
- * gnus-summary-beginning-of-article:    Scrolling.
- * gnus-summary-caesar-message:          Reading an Article.
- * gnus-summary-caesar-message:          Reading an Article.
- * gnus-summary-cancel-article:          Posting Articles.
- * gnus-summary-cancel-article:          Posting Articles.
- * gnus-summary-catchup:                 Marking Articles.
- * gnus-summary-catchup-all:             Marking Articles.
- * gnus-summary-catchup-all-and-exit:    Marking Articles.
- * gnus-summary-catchup-and-exit:        Marking Articles.
- * gnus-summary-clear-mark-forward:      Marking Articles.
- * gnus-summary-delete-marked-as-read:   Marking Articles.
- * gnus-summary-delete-marked-as-read:   Marking Articles.
- * gnus-summary-delete-marked-with:      Marking Articles.
- * gnus-summary-delete-marked-with:      Marking Articles.
- * gnus-summary-down-thread:             Thread-based Reading.
- * gnus-summary-edit-global-kill:        Editing Kill Files.
- * gnus-summary-edit-local-kill:         Editing Kill Files.
- * gnus-summary-end-of-article:          Scrolling.
- * gnus-summary-execute-command:         Searching Articles.
- * gnus-summary-execute-command:         Searching Articles.
- * gnus-summary-exit:                    Exiting Newsgroup.
- * gnus-summary-expand-window:           Reading an Article.
- * gnus-summary-expand-window:           Reading an Article.
- * gnus-summary-first-unread-article:    Moving Among Articles.
- * gnus-summary-followup:                Posting Articles.
- * gnus-summary-followup:                Posting Articles.
- * gnus-summary-followup-with-original:  Posting Articles.
- * gnus-summary-followup-with-original:  Posting Articles.
- * gnus-summary-goto-last-article:       Moving Among Articles.
- * gnus-summary-goto-subject:            Summary Motion.
- * gnus-summary-hide-all-threads:        Thread-based Reading.
- * gnus-summary-hide-thread:             Thread-based Reading.
- * gnus-summary-hide-thread:             Thread-based Reading.
- * gnus-summary-isearch-article:         Searching Articles.
- * gnus-summary-isearch-article:         Searching Articles.
- * gnus-summary-kill-same-subject:       Marking Articles.
- * gnus-summary-kill-same-subject-and-select: Marking Articles.
- * gnus-summary-kill-thread:             Thread-based Reading.
- * gnus-summary-kill-thread:             Thread-based Reading.
- * gnus-summary-mail-forward:            Forward and Reply.
- * gnus-summary-mail-other-window:       Forward and Reply.
- * gnus-summary-mark-as-read:            Hooks.
- * gnus-summary-mark-as-read-forward:    Marking Articles.
- * gnus-summary-mark-as-unread:          Hooks.
- * gnus-summary-mark-as-unread-forward:  Marking Articles.
- * gnus-summary-mode-hook:               Hooks.
- * gnus-summary-next-article:            Moving Among Articles.
- * gnus-summary-next-article:            Moving Among Articles.
- * gnus-summary-next-digest:             Digest Articles.
- * gnus-summary-next-digest:             Variables.
- * gnus-summary-next-digest:             Digest Articles.
- * gnus-summary-next-page:               Reading an Article.
- * gnus-summary-next-page:               Scrolling.
- * gnus-summary-next-page:               Reading Articles.
- * gnus-summary-next-same-subject:       Moving Among Articles.
- * gnus-summary-next-subject:            Summary Motion.
- * gnus-summary-next-thread:             Thread-based Reading.
- * gnus-summary-next-unread-article:     Moving Among Articles.
- * gnus-summary-next-unread-article:     Moving Among Articles.
- * gnus-summary-next-unread-subject:     Summary Motion.
- * gnus-summary-pipe-output:             Saving Articles.
- * gnus-summary-post-news:               Posting Articles.
- * gnus-summary-post-news:               Posting Articles.
- * gnus-summary-prepare-hook:            Hooks.
- * gnus-summary-prev-article:            Moving Among Articles.
- * gnus-summary-prev-article:            Moving Among Articles.
- * gnus-summary-prev-digest:             Variables.
- * gnus-summary-prev-digest:             Digest Articles.
- * gnus-summary-prev-digest:             Digest Articles.
- * gnus-summary-prev-page:               Scrolling.
- * gnus-summary-prev-same-subject:       Moving Among Articles.
- * gnus-summary-prev-subject:            Summary Motion.
- * gnus-summary-prev-thread:             Thread-based Reading.
- * gnus-summary-prev-unread-article:     Moving Among Articles.
- * gnus-summary-prev-unread-article:     Moving Among Articles.
- * gnus-summary-prev-unread-subject:     Summary Motion.
- * gnus-summary-quit:                    Exiting Newsgroup.
- * gnus-summary-refer-article:           Referencing Articles.
- * gnus-summary-refer-parent-article:    Referencing Articles.
- * gnus-summary-refer-parent-article:    Referencing Articles.
- * gnus-summary-reply:                   Forward and Reply.
- * gnus-summary-reply:                   Forward and Reply.
- * gnus-summary-reply-with-original:     Forward and Reply.
- * gnus-summary-reply-with-original:     Forward and Reply.
- * gnus-summary-reselect-current-group:  Exiting Newsgroup.
- * gnus-summary-reselect-current-group:  Exiting Newsgroup.
- * gnus-summary-rmail-digest:            Variables.
- * gnus-summary-rmail-digest:            Variables.
- * gnus-summary-rmail-digest:            Digest Articles.
- * gnus-summary-rmail-digest:            Digest Articles.
- * gnus-summary-save-article:            Saving Articles.
- * gnus-summary-save-article:            Variables.
- * gnus-summary-save-in-file:            Variables.
- * gnus-summary-save-in-file:            Variables.
- * gnus-summary-save-in-folder:          Variables.
- * gnus-summary-save-in-mail:            Variables.
- * gnus-summary-save-in-mail:            Variables.
- * gnus-summary-save-in-mail:            Saving Articles.
- * gnus-summary-save-in-rmail:           Variables.
- * gnus-summary-save-in-rmail:           Variables.
- * gnus-summary-scroll-up:               Scrolling.
- * gnus-summary-search-article-backward: Searching Articles.
- * gnus-summary-search-article-backward: Searching Articles.
- * gnus-summary-search-article-forward:  Searching Articles.
- * gnus-summary-search-article-forward:  Searching Articles.
- * gnus-summary-set-current-mark:        Hooks.
- * gnus-summary-set-current-mark:        Hooks.
- * gnus-summary-show-all-threads:        Thread-based Reading.
- * gnus-summary-show-article:            Reading an Article.
- * gnus-summary-show-thread:             Thread-based Reading.
- * gnus-summary-show-thread:             Hooks.
- * gnus-summary-show-thread:             Thread-based Reading.
- * gnus-summary-sort-by-author:          Sorting Headers.
- * gnus-summary-sort-by-date:            Sorting Headers.
- * gnus-summary-sort-by-number:          Sorting Headers.
- * gnus-summary-sort-by-subject:         Sorting Headers.
- * gnus-summary-stop-page-breaking:      Reading an Article.
- * gnus-summary-toggle-header:           Reading an Article.
- * gnus-summary-toggle-header:           Reading an Article.
- * gnus-summary-toggle-mime:             Reading an Article.
- * gnus-summary-toggle-threads:          Thread-based Reading.
- * gnus-summary-toggle-threads:          Thread-based Reading.
- * gnus-summary-toggle-truncation:       Reading an Article.
- * gnus-summary-up-thread:               Thread-based Reading.
- * gnus-suspend-gnus-hook:               Exiting GNUS.
- * gnus-suspend-gnus-hook:               Hooks.
- * gnus-thread-hide-killed:              Thread-based Reading.
- * gnus-thread-hide-killed:              Variables.
- * gnus-thread-hide-subject:             Variables.
- * gnus-thread-hide-subtree:             Variables.
- * gnus-thread-hide-subtree:             Thread-based Reading.
- * gnus-thread-ignore-subject:           Variables.
- * gnus-thread-indent-level:             Variables.
- * gnus-use-cross-reference:             Variables.
- * gnus-use-followup-to:                 Variables.
- * gnus-use-full-window:                 Variables.
- * gnus-use-generic-from:                Variables.
- * gnus-use-generic-path:                Variables.
- * gnus-use-long-file-name:              Variables.
- * gnus-use-long-file-name:              Variables.
- * gnus-use-long-file-name:              Names of Kill Files.
- * gnus-user-full-name:                  Variables.
- * gnus-user-login-name:                 Variables.
- * gnus-window-configuration:            Variables.
- * gnus-window-configuration:            Article Commands.
- * gnus-window-configuration:            Buffers of GNUS.
- * Group mode:                           Newsgroup Buffer.
- * h (Article Mode):                     Article Commands.
- * history file:                         Spool Variables.
- * incomplete digest articles:           Digest Articles.
- * inews:                                Variables.
- * inews:                                Spool Variables.
- * inews:                                Spool Variables.
- * inews:                                Hooks.
- * info-gnus:                            Reporting Bugs.
- * info-gnus-english:                    Reporting Bugs.
- * INN:                                  Variables.
- * invoke GNUS:                          Getting Started.
- * j (Group Mode):                       Browsing Newsgroups.
- * j (Group Mode):                       Browsing Newsgroups.
- * j (Summary Mode):                     Summary Motion.
- * k (Summary Mode):                     Marking Articles.
- * Kill file:                            Variables.
- * Kill file:                            Kill File.
- * kill newsgroups:                      Maintaining Subscriptions.
- * kill newsgroups:                      Maintaining Subscriptions.
- * kill newsgroups:                      Maintaining Subscriptions.
- * kill newsgroups:                      Variables.
- * Kill-File mode:                       Editing Kill Files.
- * l (Group Mode):                       Maintaining Subscriptions.
- * L (Group Mode):                       Maintaining Subscriptions.
- * l (Summary Mode):                     Moving Among Articles.
- * large newsgroup:                      NNTP Variables.
- * large newsgroup:                      Marking Articles.
- * large newsgroup:                      NNTP Variables.
- * large newsgroup:                      Variables.
- * large newsgroup:                      Selecting a Newsgroup.
- * local kill file:                      Kill File.
- * local news spool:                     Spool Variables.
- * login name:                           Variables.
- * LOGNAME:                              Variables.
- * ls:                                   Directory Variables.
- * m (Summary Mode):                     Forward and Reply.
- * M-C-t (Summary Mode):                 Thread-based Reading.
- * M-k (Group Mode):                     Other Newsgroup Commands.
- * M-K (Group Mode):                     Other Newsgroup Commands.
- * M-k (Summary Mode):                   Editing Kill Files.
- * M-K (Summary Mode):                   Editing Kill Files.
- * M-n (Summary Mode):                   Summary Motion.
- * M-p (Summary Mode):                   Summary Motion.
- * M-r (Summary Mode):                   Searching Articles.
- * M-r (Summary Mode):                   Searching Articles.
- * M-s (Summary Mode):                   Searching Articles.
- * M-s (Summary Mode):                   Searching Articles.
- * M-t (Summary Mode):                   Reading an Article.
- * M-u (Summary Mode):                   Marking Articles.
- * M-U (Summary Mode):                   Marking Articles.
- * M-x gnus:                             Getting Started.
- * M-x gnus:                             Getting Started.
- * M-^ (Summary Mode):                   Referencing Articles.
- * mail:                                 Variables.
- * mail:                                 Variables.
- * mail:                                 Variables.
- * mail:                                 Variables.
- * Mail Mode:                            Variables.
- * Mail Mode:                            Variables.
- * Mail Mode:                            Variables.
- * mailing list:                         Reporting Bugs.
- * major modes of GNUS:                  Buffers of GNUS.
- * mark articles:                        Marking Articles.
- * metamail:                             Variables.
- * metamail-buffer:                      Variables.
- * MH:                                   Variables.
- * MH:                                   Variables.
- * MH:                                   Variables.
- * MH:                                   Variables.
- * MH:                                   Variables.
- * MH and GNUS:                          Finding the News.
- * MH folder:                            Variables.
- * MH folder:                            Variables.
- * mh-e:                                 Variables.
- * mh-e:                                 Variables.
- * mh-e:                                 Variables.
- * mh-e:                                 Variables.
- * mh-e:                                 Variables.
- * mh-e:                                 Variables.
- * mh-e letter Mode:                     Variables.
- * mh-e letter Mode:                     Variables.
- * mh-e letter Mode:                     Variables.
- * mhspool-list-directory-switches:      Directory Variables.
- * mhspool-list-folders-method:          Directory Variables.
- * mhspool-list-folders-using-ls:        Directory Variables.
- * mhspool-list-folders-using-ls:        Directory Variables.
- * mhspool-list-folders-using-sh:        Directory Variables.
- * MIME:                                 Variables.
- * MIME:                                 Variables.
- * MIME:                                 Reading an Article.
- * n (Group Mode):                       Browsing Newsgroups.
- * N (Summary Mode):                     Moving Among Articles.
- * n (Summary Mode):                     Moving Among Articles.
- * N (Summary Mode):                     Moving Among Articles.
- * n (Summary Mode):                     Moving Among Articles.
- * NAME:                                 Variables.
- * new newsgroups:                       Variables.
- * new newsgroups:                       Maintaining Subscriptions.
- * newly arrived article:                Marking Articles.
- * News Mode:                            Posting Articles.
- * news-inews-program:                   Spool Variables.
- * news-path:                            Spool Variables.
- * news-reply-yank-original:             Posting Articles.
- * Newsgroup buffer:                     Newsgroup Buffer.
- * newsgroups file:                      Spool Variables.
- * nnspool-active-file:                  Spool Variables.
- * nnspool-distributions-file:           Spool Variables.
- * nnspool-history-file:                 Spool Variables.
- * nnspool-inews-program:                Spool Variables.
- * nnspool-inews-switches:               Spool Variables.
- * nnspool-newsgroups-file:              Spool Variables.
- * nnspool-request-post:                 Spool Variables.
- * nnspool-spool-directory:              Spool Variables.
- * NNTP:                                 NNTP Variables.
- * NNTP:                                 Top.
- * NNTP debugging:                       NNTP Variables.
- * NNTP server:                          Variables.
- * NNTP service:                         Variables.
- * nntp-buggy-select:                    Troubleshooting.
- * nntp-buggy-select:                    NNTP Variables.
- * nntp-debug-read:                      NNTP Variables.
- * nntp-header-FIELD:                    Variables.
- * nntp-header-FIELD:                    Variables.
- * nntp-large-newsgroup:                 NNTP Variables.
- * nntp-maximum-request:                 Troubleshooting.
- * nntp-maximum-request:                 NNTP Variables.
- * nntp-set-header-subject:              Hooks.
- * NNTPSERVER:                           Variables.
- * o (Article Mode):                     Article Commands.
- * o (Summary Mode):                     Saving Articles.
- * options -n in startup file:           Maintaining Subscriptions.
- * order of newsgroups:                  Maintaining Subscriptions.
- * organization:                         Variables.
- * ORGANIZATION:                         Variables.
- * p (Group Mode):                       Browsing Newsgroups.
- * p (Summary Mode):                     Moving Among Articles.
- * P (Summary Mode):                     Moving Among Articles.
- * P (Summary Mode):                     Moving Among Articles.
- * p (Summary Mode):                     Moving Among Articles.
- * page break:                           Variables.
- * page break:                           Variables.
- * pages (GNUS):                         Reading an Article.
- * Path field:                           Variables.
- * post article:                         Posting Articles.
- * post article:                         Variables.
- * private directory:                    Directory Variables.
- * private directory:                    Variables.
- * private news directory:               Finding the News.
- * Q (Group Mode):                       Exiting GNUS.
- * Q (Group Mode):                       Exiting GNUS.
- * q (Group Mode):                       Exiting GNUS.
- * q (Group Mode):                       Exiting GNUS.
- * q (Summary Mode):                     Exiting Newsgroup.
- * Q (Summary Mode):                     Exiting Newsgroup.
- * quick startup file:                   Startup File.
- * r (Article Mode):                     Article Commands.
- * R (Group Mode):                       Startup File.
- * r (Group Mode):                       Browsing Newsgroups.
- * r (Group Mode):                       Browsing Newsgroups.
- * R (Summary Mode):                     Forward and Reply.
- * r (Summary Mode):                     Forward and Reply.
- * r (Summary Mode):                     Forward and Reply.
- * R (Summary Mode):                     Forward and Reply.
- * raw startup file:                     Startup File.
- * rcvstore:                             Variables.
- * read all articles:                    Selecting a Newsgroup.
- * read newsgroup:                       Selecting a Newsgroup.
- * refer to articles:                    Referencing Articles.
- * references between articles:          Thread-based Reading.
- * reply to article:                     Variables.
- * reply to article:                     Forward and Reply.
- * reply to article:                     Variables.
- * report a bug:                         Reporting Bugs.
- * restrict newsgroups:                  Browsing Newsgroups.
- * restrict newsgroups:                  Browsing Newsgroups.
- * RET (Summary Mode):                   Scrolling.
- * RFC1036:                              Variables.
- * RFC822:                               Variables.
- * RFC977:                               Variables.
- * Rmail:                                Digest Articles.
- * Rmail:                                Digest Articles.
- * Rmail:                                Variables.
- * Rmail file:                           Variables.
- * rmail-output:                         Variables.
- * rn:                                   Moving Among Articles.
- * rn:                                   Variables.
- * rot 13/47:                            Reading an Article.
- * rot 13/47:                            Reading an Article.
- * run GNUS:                             Getting Started.
- * s (Group Mode):                       Startup File.
- * s (Summary Mode):                     Searching Articles.
- * s (Summary Mode):                     Searching Articles.
- * save articles:                        Variables.
- * save articles:                        Variables.
- * save articles:                        Saving Articles.
- * save articles:                        Variables.
- * save articles:                        Variables.
- * save startup file:                    Startup File.
- * saved article:                        Marking Articles.
- * SAVEDIR:                              Variables.
- * SAVEDIR:                              Variables.
- * search for articles:                  Searching Articles.
- * select all articles:                  Selecting a Newsgroup.
- * select error:                         NNTP Variables.
- * select newsgroup:                     Selecting a Newsgroup.
- * send-mail-function:                   Variables.
- * signature:                            Variables.
- * signature:                            Hooks.
- * simplify subjects:                    Hooks.
- * slow terminal:                        NNTP Variables.
- * sort headers:                         Hooks.
- * sort headers:                         Sorting Headers.
- * SPC (Article Mode):                   Article Commands.
- * SPC (Group Mode):                     Selecting a Newsgroup.
- * SPC (Group Mode):                     Selecting a Newsgroup.
- * SPC (Group Mode):                     Selecting a Newsgroup.
- * SPC (Summary Mode):                   Reading an Article.
- * SPC (Summary Mode):                   Scrolling.
- * SPC (Summary Mode):                   Reading Articles.
- * startup file:                         Variables.
- * startup file:                         Startup File.
- * subscribe newsgroups:                 Maintaining Subscriptions.
- * subscribe newsgroups:                 Maintaining Subscriptions.
- * subscribe newsgroups:                 Variables.
- * Summary buffer (GNUS):                Summary Buffer.
- * Summary mode (GNUS):                  Summary Buffer.
- * summary of digest:                    Digest Articles.
- * summary of digest:                    Variables.
- * system-name:                          Variables.
- * t (Summary Mode):                     Reading an Article.
- * t (Summary Mode):                     Reading an Article.
- * tcp:                                  NNTP Variables.
- * tcp-program-name:                     NNTP Variables.
- * tcp.c:                                NNTP Variables.
- * threads:                              Variables.
- * threads:                              Variables.
- * threads:                              Variables.
- * threads:                              Variables.
- * threads:                              Variables.
- * threads:                              Variables.
- * threads (in GNUS):                    Thread-based Reading.
- * time zone:                            Variables.
- * timezone.el:                          Variables.
- * truncation of lines in GNUS:          Reading an Article.
- * U (Group Mode):                       Variables.
- * u (Group Mode):                       Maintaining Subscriptions.
- * U (Group Mode):                       Maintaining Subscriptions.
- * U (Summary Mode):                     Marking Articles.
- * u (Summary Mode):                     Marking Articles.
- * Unix mailbox:                         Variables.
- * Unix mailbox:                         Variables.
- * unread article:                       Marking Articles.
- * unsubscribe newsgroups:               Maintaining Subscriptions.
- * unsubscribe newsgroups:               Variables.
- * unsubscribe newsgroups:               Maintaining Subscriptions.
- * update startup file:                  Startup File.
- * USER:                                 Variables.
- * user full name:                       Variables.
- * user-mail-address:                    Posting Articles.
- * w (Summary Mode):                     Reading an Article.
- * widen:                                Browsing Newsgroups.
- * window configuration:                 Variables.
- * window configuration:                 Variables.
- * window configuration:                 Buffers of GNUS.
- * windows of GNUS:                      Buffers of GNUS.
- * x (Summary Mode):                     Marking Articles.
- * X (Summary Mode):                     Marking Articles.
- * X (Summary Mode):                     Marking Articles.
- * x (Summary Mode):                     Marking Articles.
- * Xref field:                           Maintaining Subscriptions.
- * Xref field:                           Variables.
- * yank newsgroups:                      Maintaining Subscriptions.
- * yank newsgroups:                      Maintaining Subscriptions.
- * z (Group Mode):                       Exiting GNUS.
- * z (Group Mode):                       Exiting GNUS.
- * ^ (Summary Mode):                     Referencing Articles.
- * ^ (Summary Mode):                     Referencing Articles.
- * | (Summary Mode):                     Saving Articles.
- 
- 
--- 0 ----
Index: emacs/info/info
diff -c emacs/info/info:1.1.1.2 emacs/info/info:removed
*** emacs/info/info:1.1.1.2	Mon Jul 22 01:52:52 1996
--- emacs/info/info	Fri Aug  2 20:20:36 1996
***************
*** 1,1826 ****
- This is Info file ../info/info, produced by Makeinfo-1.55 from the
- input file info.texi.
- 
-    This file describes how to use Info, the on-line, menu-driven GNU
- documentation system.
- 
-    Copyright (C) 1989, 1992 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that this permission notice may be stated in a
- translation approved by the Free Software Foundation.
- 
- 
- File: info,  Node: Top,  Next: Getting Started,  Prev: (dir),  Up: (dir)
- 
- Info: An Introduction
- *********************
- 
-    Info is a program for reading documentation, which you are using now.
- 
-    To learn how to use Info, type the command `h'.  It brings you to a
- programmed instruction sequence.  If at any time you are ready to stop
- using Info, type `q'.
- 
-    To learn advanced Info commands, type `n' twice.  This brings you to
- `Info for Experts', skipping over the `Getting Started' chapter.
- 
- * Menu:
- 
- * Getting Started::             Getting started using an Info reader.
- * Advanced Info::               Advanced commands within Info.
- * Create an Info File::         How to make your own Info file.
- 
- 
- File: info,  Node: Getting Started,  Next: Advanced Info,  Prev: Top,  Up: Top
- 
- Getting Started
- ***************
- 
-    This first part of the Info manual describes how to get around inside
- of Info.  The second part of the manual describes various advanced Info
- commands, and how to write an Info as distinct from a Texinfo file.
- The third part is about how to generate Info files from Texinfo files.
- 
- * Menu:
- 
- * Help-Small-Screen::   Starting Info on a Small Screen
- * Help::                How to use Info
- * Help-P::              Returning to the Previous node
- * Help-^L::             The Space, Rubout, B and ^L commands.
- * Help-M::              Menus
- * Help-Adv::            Some advanced Info commands
- * Help-Q::              Quitting Info
- * Using Stand-alone Info::  How to use the stand-alone Info reader.
- 
- 
- File: info,  Node: Help-Small-Screen,  Next: Help,  Up: Getting Started
- 
- Starting Info on a Small Screen
- ===============================
- 
-    Since your terminal has an unusually small number of lines on its
- screen, it is necessary to give you special advice at the beginning.
- 
-    If you see the text `--All----' at near the bottom right corner of
- the screen, it means the entire text you are looking at fits on the
- screen.  If you see `--Top----' instead, it means that there is more
- text below that does not fit.  To move forward through the text and see
- another screen full, press the Space bar, SPC.  To move back up, press
- the key labeled `Delete' or DEL.
- 
-    Here are 40 lines of junk, so you can try Spaces and Deletes and see
- what they do.  At the end are instructions of what you should do next.
- This is line 17
- This is line 18
- This is line 19
- This is line 20
- This is line 21
- This is line 22
- This is line 23
- This is line 24
- This is line 25
- This is line 26
- This is line 27
- This is line 28
- This is line 29
- This is line 30
- This is line 31
- This is line 32
- This is line 33
- This is line 34
- This is line 35
- This is line 36
- This is line 37
- This is line 38
- This is line 39
- This is line 40
- This is line 41
- This is line 42
- This is line 43
- This is line 44
- This is line 45
- This is line 46
- This is line 47
- This is line 48
- This is line 49
- This is line 50
- This is line 51
- This is line 52
- This is line 53
- This is line 54
- This is line 55
- This is line 56
-    If you have managed to get here, go back to the beginning with
- Delete, and come back here again, then you understand Space and Delete.
- So now type an `n' --just one character; don't type the quotes and
- don't type the Return key afterward-- to get to the normal start of the
- course.
- 
- 
- File: info,  Node: Help,  Next: Help-P,  Prev: Help-Small-Screen,  Up: Getting Started
- 
- How to use Info
- ===============
- 
-    You are talking to the program Info, for reading documentation.
- 
-    Right now you are looking at one "Node" of Information.  A node
- contains text describing a specific topic at a specific level of
- detail.  This node's topic is "how to use Info".
- 
-    The top line of a node is its "header".  This node's header (look at
- it now) says that it is the node named `Help' in the file `info'.  It
- says that the `Next' node after this one is the node called `Help-P'.
- An advanced Info command lets you go to any node whose name you know.
- 
-    Besides a `Next', a node can have a `Previous' or an `Up'.  This
- node has a `Previous' which is `Help-Small-Screen', and an `Up' which
- is `Getting Started'.  Some nodes have no `Previous' and some have no
- `Up'.
- 
-    Now it is time to move on to the `Next' node, named `Help-P'.
- 
- >> Type `n' to move there.  Type just one character;
-    do not type the quotes and do not type a RET afterward.
- 
-    `>>' in the margin means it is really time to try a command.
- 
- 
- File: info,  Node: Help-P,  Next: Help-^L,  Prev: Help,  Up: Getting Started
- 
- Returning to the Previous node
- ==============================
- 
-    This node is called `Help-P'.  The `Previous' node, as you see, is
- `Help', which is the one you just came from using the `n' command.
- Another `n' command now would take you to the next node, `Help-^L'.
- 
- >> But do not do that yet.  First, try the `p' command, which takes
-    you to the `Previous' node.  When you get there, you can do an
-    `n' again to return here.
- 
-    This all probably seems insultingly simple so far, but *do not* be
- led into skimming.  Things will get more complicated soon.  Also, do
- not try a new command until you are told it is time to.  Otherwise, you
- may make Info skip past an important warning that was coming up.
- 
- >> Now do an `n' to get to the node `Help-^L' and learn more.
- 
- 
- File: info,  Node: Help-^L,  Next: Help-M,  Prev: Help-P,  Up: Getting Started
- 
- The Space, Delete, B and ^L commands.
- =====================================
- 
-    This node's header tells you that you are now at node `Help-^L', and
- that `p' would get you back to `Help-P'.  The node's title is
- underlined; it says what the node is about (most nodes have titles).
- 
-    This is a big node and it does not all fit on your display screen.
- You can tell that there is more that is not visible because you can see
- the string `--Top-----' rather than `--All----' near the bottom right
- corner of the screen.
- 
-    The Space, Delete and `B' commands exist to allow you to "move
- around" in a node that does not all fit on the screen at once.  Space
- moves forward, to show what was below the bottom of the screen.  Delete
- moves backward, to show what was above the top of the screen (there is
- not anything above the top until you have typed some spaces).
- 
- >> Now try typing a Space (afterward, type a Delete to return here).
- 
-    When you type the space, the two lines that were at the bottom of
- the screen appear at the top, followed by more lines.  Delete takes the
- two lines from the top and moves them to the bottom, *usually*, but if
- there are not a full screen's worth of lines above them they may not
- make it all the way to the bottom.
- 
-    If you type Space when there is no more to see, it rings the bell
- and otherwise does nothing.  The same goes for Delete when the header
- of the node is visible.
- 
-    If your screen is ever garbaged, you can tell Info to print it out
- again by typing `C-l' (`Control-L', that is--hold down "Control" and
- type an L or `l').
- 
- >> Type `C-l' now.
- 
-    To move back to the beginning of the node you are on, you can type a
- lot of Deletes.  You can also type simply `b' for beginning.
- >> Try that now.  (We have put in enough verbiage to push this past
- the first screenful, but screens are so big nowadays that perhaps it
- isn't enough.  You may need to shrink your Emacs or Info window.)
- Then come back, with Spaces.
- 
-    If your screen is very tall, all of this node might fit at once.  In
- that case, "b" won't do anything.  Sorry; what can we do?
- 
-    You have just learned a considerable number of commands.  If you
- want to use one but have trouble remembering which, you should type a ?
- which prints out a brief list of commands.  When you are finished
- looking at the list, make it go away by typing a SPC.
- 
- >> Type a ? now.  After it finishes, type a SPC.
- 
-    (If you are using the standalone Info reader, type `l' to return
- here.)
- 
-    From now on, you will encounter large nodes without warning, and
- will be expected to know how to use Space and Delete to move around in
- them without being told.  Since not all terminals have the same size
- screen, it would be impossible to warn you anyway.
- 
- >> Now type `n' to see the description of the `m' command.
- 
- 
- File: info,  Node: Help-M,  Next: Help-Adv,  Prev: Help-^L,  Up: Getting Started
- 
- Menus
- =====
- 
-    Menus and the `m' command
- 
-    With only the `n' and `p' commands for moving between nodes, nodes
- are restricted to a linear sequence.  Menus allow a branching
- structure.  A menu is a list of other nodes you can move to.  It is
- actually just part of the text of the node formatted specially so that
- Info can interpret it.  The beginning of a menu is always identified by
- a line which starts with `* Menu:'.  A node contains a menu if and only
- if it has a line in it which starts that way.  The only menu you can
- use at any moment is the one in the node you are in.  To use a menu in
- any other node, you must move to that node first.
- 
-    After the start of the menu, each line that starts with a `*'
- identifies one subtopic.  The line usually contains a brief name for
- the subtopic (followed by a `:'), the name of the node that talks about
- that subtopic, and optionally some further description of the subtopic.
- Lines in the menu that do not start with a `*' have no special
- meaning--they are only for the human reader's benefit and do not define
- additional subtopics.  Here is an example:
- 
-      * Foo:  FOO's Node      This tells about FOO
- 
-    The subtopic name is Foo, and the node describing it is `FOO's Node'.
- The rest of the line is just for the reader's Information.  [[ But this
- line is not a real menu item, simply because there is no line above it
- which starts with `* Menu:'.]]
- 
-    When you use a menu to go to another node (in a way that will be
- described soon), what you specify is the subtopic name, the first thing
- in the menu line.  Info uses it to find the menu line, extracts the
- node name from it, and goes to that node.  The reason that there is
- both a subtopic name and a node name is that the node name must be
- meaningful to the computer and may therefore have to be ugly looking.
- The subtopic name can be chosen just to be convenient for the user to
- specify.  Often the node name is convenient for the user to specify and
- so both it and the subtopic name are the same.  There is an
- abbreviation for this:
- 
-      * Foo::   This tells about FOO
- 
- This means that the subtopic name and node name are the same; they are
- both `Foo'.
- 
- >> Now use Spaces to find the menu in this node, then come back to
-    the front with a `b' and some Spaces.  As you see, a menu is
-    actually visible in its node.  If you cannot find a menu in a node
-    by looking at it, then the node does not have a menu and the
-    `m' command is not available.
- 
-    The command to go to one of the subnodes is `m'--but *do not do it
- yet!*  Before you use `m', you must understand the difference between
- commands and arguments.  So far, you have learned several commands that
- do not need arguments.  When you type one, Info processes it and is
- instantly ready for another command.  The `m' command is different: it
- is incomplete without the "name of the subtopic".  Once you have typed
- `m', Info tries to read the subtopic name.
- 
-    Now look for the line containing many dashes near the bottom of the
- screen.  There is one more line beneath that one, but usually it is
- blank.  If it is empty, Info is ready for a command, such as `n' or `b'
- or Space or `m'.  If that line contains text ending in a colon, it mean
- Info is trying to read the "argument" to a command.  At such times,
- commands do not work, because Info tries to use them as the argument.
- You must either type the argument and finish the command you started,
- or type `Control-g' to cancel the command.  When you have done one of
- those things, the line becomes blank again.
- 
-    The command to go to a subnode via a menu is `m'.  After you type
- the `m', the line at the bottom of the screen says `Menu item: '.  You
- must then type the name of the subtopic you want, and end it with a RET.
- 
-    You can abbreviate the subtopic name.  If the abbreviation is not
- unique, the first matching subtopic is chosen.  Some menus put the
- shortest possible abbreviation for each subtopic name in capital
- letters, so you can see how much you need to type.  It does not matter
- whether you use upper case or lower case when you type the subtopic.
- You should not put any spaces at the end, or inside of the item name,
- except for one space where a space appears in the item in the menu.
- 
-    You can also use the "completion" feature to help enter the subtopic
- name.  If you type the Tab key after entering part of a name, it will
- magically fill in more of the name--as much as follows uniquely from
- what you have entered.
- 
-    If you move the cursor to one of the menu subtopic lines, then you do
- not need to type the argument: you just type a Return, and it stands for
- the subtopic of the line you are on.
- 
-    Here is a menu to give you a chance to practice.
- 
-    * Menu:	   The menu starts here.
- 
-    This menu gives you three ways of going to one place, Help-FOO.
- 
-    * Foo:  Help-FOO.       A node you can visit for fun.
- * Bar:  Help-FOO.       Strange!  two ways to get to the same place.
- * Help-FOO::            And yet another!
- >>  Now type just an `m' and see what happens:
- 
-    Now you are "inside" an `m' command.  Commands cannot be used now;
- the next thing you will type must be the name of a subtopic.
- 
-    You can change your mind about doing the `m' by typing Control-g.
- 
- >> Try that now;  notice the bottom line clear.
- 
- >> Then type another `m'.
- 
- >> Now type `BAR' item name.  Do not type Return yet.
- 
-    While you are typing the item name, you can use the Delete key to
- cancel one character at a time if you make a mistake.
- 
- >> Type one to cancel the `R'.  You could type another `R' to
-    replace it.  You do not have to, since `BA' is a valid abbreviation.
- 
- >> Now you are ready to go.  Type a RET.
- 
-    After visiting Help-FOO, you should return here.
- 
- >> Type `n' to see more commands.
- 
-    Here is another way to get to  Help-FOO, a menu.  You can ignore this
- if you want, or else try it (but then please come back to here).
- 
- * Menu:
- 
- * Help-FOO::
- 
- 
- File: info,  Node: Help-FOO,  Up: Help-M
- 
- The `u' command
- ---------------
- 
-    Congratulations!  This is the node `Help-FOO'.  Unlike the other
- nodes you have seen, this one has an `Up': `Help-M', the node you just
- came from via the `m' command.  This is the usual convention--the nodes
- you reach from a menu have `Up' nodes that lead back to the menu.
- Menus move Down in the tree, and `Up' moves Up.  `Previous', on the
- other hand, is usually used to "stay on the same level but go backwards"
- 
-    You can go back to the node `Help-M' by typing the command `u' for
- "Up".  That puts you at the *front* of the node--to get back to where
- you were reading you have to type some SPCs.
- 
- >> Now type `u' to move back up to `Help-M'.
- 
- 
- File: info,  Node: Help-Adv,  Next: Help-Q,  Prev: Help-M,  Up: Getting Started
- 
- Some advanced Info commands
- ===========================
- 
-    The course is almost over, so please stick with it to the end.
- 
-    If you have been moving around to different nodes and wish to
- retrace your steps, the `l' command (`l' for "last") will do that, one
- node-step at a time.  As you move from node to node, Info records the
- nodes where you have been in a special history list.  The `l' command
- revisits nodes in the history list; each successive `l' command moves
- one step back through the history.
- 
-    If you have been following directions, ad `l' command now will get
- you back to `Help-M'.  Another `l' command would undo the `u' and get
- you back to `Help-FOO'.  Another `l' would undo the `m' and get you
- back to `Help-M'.
- 
- >> Try typing three `l''s, pausing in between to see what each
-     `l' does.
- 
-    Then follow directions again and you will end up back here.
- 
-    Note the difference between `l' and `p': `l' moves to where *you*
- last were, whereas `p' always moves to the node which the header says
- is the `Previous' node (from this node, to `Help-M').
- 
-    The `d' command gets you instantly to the Directory node.  This
- node, which is the first one you saw when you entered Info, has a menu
- which leads (directly, or indirectly through other menus), to all the
- nodes that exist.
- 
- >> Try doing a `d', then do an `l' to return here (yes,
-    *do* return).
- 
-    Sometimes, in Info documentation, you will see a cross reference.
- Cross references look like this: *Note Cross: Help-Cross.  That is a
- real, live cross reference which is named `Cross' and points at the
- node named `Help-Cross'.
- 
-    If you wish to follow a cross reference, you must use the `f'
- command.  The `f' must be followed by the cross reference name (in this
- case, `Cross').  While you enter the name, you can use the Delete key
- to edit your input.  If you change your mind about following any
- reference, you can use `Control-g' to cancel the command.
- 
-    Completion is available in the `f' command; you can complete among
- all the cross reference names in the current node by typing a Tab.
- 
- >> Type `f', followed by `Cross', and a RET.
- 
-    To get a list of all the cross references in the current node, you
- can type `?' after an `f'.  The `f' continues to await a cross
- reference name even after printing the list, so if you don't actually
- want to follow a reference, you should type a `Control-g' to cancel the
- `f'.
- 
- >> Type "f?" to get a list of the cross references in this node.  Then
-    type a `Control-g' and see how the `f' gives up.
- 
- >> Now type `n' to see the last node of the course.
- 
- 
- File: info,  Node: Help-Cross,  Up: Help-Adv
- 
- The node reached by the cross reference in Info
- -----------------------------------------------
- 
-    This is the node reached by the cross reference named `Cross'.
- 
-    While this node is specifically intended to be reached by a cross
- reference, most cross references lead to nodes that "belong" someplace
- else far away in the structure of Info.  So you cannot expect the
- footnote to have a `Next', `Previous' or `Up' pointing back to where
- you came from.  In general, the `l' (el) command is the only way to get
- back there.
- 
- >> Type `l' to return to the node where the cross reference was.
- 
- 
- File: info,  Node: Help-Q,  Prev: Help-Adv,  Up: Getting Started
- 
- Quitting Info
- =============
- 
-    To get out of Info, back to what you were doing before, type `q' for
- "Quit".
- 
-    This is the end of the course on using Info.  There are some other
- commands that are meant for experienced users; they are useful, and you
- can find them by looking in the directory node for documentation on
- Info.  Finding them will be a good exercise in using Info in the usual
- manner.
- 
- >> Type `d' to go to the Info directory node; then type
-    `mInfo' and Return, to get to the node about Info and
-    see what other help is available.
- 
- 
- File: info,  Node: Advanced Info,  Next: Create an Info File,  Prev: Getting Started,  Up: Top
- 
- Info for Experts
- ****************
- 
-    This chapter describes various advanced Info commands, and how to
- write an Info as distinct from a Texinfo file.  (However, in most
- cases, writing a Texinfo file is better, since you can use it *both* to
- generate an Info file and to make a printed manual.  *Note Overview of
- Texinfo: (texinfo)Top.)
- 
- * Menu:
- 
- * Expert::               Advanced Info commands: g, s, e, and 1 - 5.
- * Add::                  Describes how to add new nodes to the hierarchy.
-                            Also tells what nodes look like.
- * Menus::                How to add to or create menus in Info nodes.
- * Cross-refs::           How to add cross-references to Info nodes.
- * Tags::                 How to make tags tables for Info files.
- * Checking::             Checking an Info File
- * Emacs Info Variables:: Variables modifying the behavior of Emacs Info.
- 
- 
- File: info,  Node: Expert,  Next: Add,  Up: Advanced Info
- 
- Advanced Info Commands
- ======================
- 
-    `g', `s', `1', - `9', and `e'
- 
-    If you know a node's name, you can go there by typing `g', the name,
- and RET.  Thus, `gTopRET' would go to the node called `Top' in this
- file (its directory node).  `gExpertRET' would come back here.
- 
-    Unlike `m', `g' does not allow the use of abbreviations.
- 
-    To go to a node in another file, you can include the filename in the
- node name by putting it at the front, in parentheses.  Thus,
- `g(dir)TopRET' would go to the Info Directory node, which is node `Top'
- in the file `dir'.
- 
-    The node name `*' specifies the whole file.  So you can look at all
- of the current file by typing `g*RET' or all of any other file with
- `g(FILENAME)RET'.
- 
-    The `s' command allows you to search a whole file for a string.  It
- switches to the next node if and when that is necessary.  You type `s'
- followed by the string to search for, terminated by RET.  To search for
- the same string again, just `s' followed by RET will do.  The file's
- nodes are scanned in the order they are in in the file, which has no
- necessary relationship to the order that they may be in in the tree
- structure of menus and `next' pointers.  But normally the two orders
- are not very different.  In any case, you can always do a `b' to find
- out what node you have reached, if the header is not visible (this can
- happen, because `s' puts your cursor at the occurrence of the string,
- not at the beginning of the node).
- 
-    `Meta-s' is equivalent to `s'.  That is for compatibility with other
- GNU packages that use `M-s' for a similar kind of search command.
- 
-    If you grudge the system each character of type-in it requires, you
- might like to use the commands `1', `2', `3', `4', ...  `9'.  They are
- short for the `m' command together with an argument.  `1' goes through
- the first item in the current node's menu; `2' goes through the second
- item, etc.
- 
-    If your display supports multiple fonts, and you are using Emacs'
- Info mode to read Info files, the `*' for the fifth menu item is
- underlined, and so is the `*' for the ninth item; these underlines make
- it easy to see at a glance which number to use for an item.
- 
-    On ordinary terminals, you won't have underlining.  If you need to
- actually count items, it is better to use `m' instead, and specify the
- name.
- 
-    The Info command `e' changes from Info mode to an ordinary Emacs
- editing mode, so that you can edit the text of the current node.  Type
- `C-c C-c' to switch back to Info.  The `e' command is allowed only if
- the variable `Info-enable-edit' is non-`nil'.
- 
- 
- File: info,  Node: Add,  Next: Menus,  Prev: Expert,  Up: Advanced Info
- 
- Adding a new node to Info
- =========================
- 
-    To add a new topic to the list in the Info directory, you must:
-   1. Create some nodes, in some file, to document that topic.
- 
-   2. Put that topic in the menu in the directory.  *Note Menu: Menus.
- 
-    Usually, the way to create the nodes is with Texinfo *note Overview
- of Texinfo: (texinfo)Top.); this has the advantage that you can also
- make a printed manual from them.  However, if you want to edit an Info
- file, here is how.
- 
-    The new node can live in an existing documentation file, or in a new
- one.  It must have a ^_ character before it (invisible to the user;
- this node has one but you cannot see it), and it ends with either a ^_,
- a ^L, or the end of file.  Note: If you put in a ^L to end a new node,
- be sure that there is a ^_ after it to start the next one, since ^L
- cannot *start* a node.  Also, a nicer way to make a node boundary be a
- page boundary as well is to put a ^L *right after* the ^_.
- 
-    The ^_ starting a node must be followed by a newline or a ^L
- newline, after which comes the node's header line.  The header line
- must give the node's name (by which Info finds it), and state the names
- of the `Next', `Previous', and `Up' nodes (if there are any).  As you
- can see, this node's `Up' node is the node `Top', which points at all
- the documentation for Info.  The `Next' node is `Menus'.
- 
-    The keywords "Node", "Previous", "Up", and "Next", may appear in any
- order, anywhere in the header line, but the recommended order is the
- one in this sentence.  Each keyword must be followed by a colon, spaces
- and tabs, and then the appropriate name.  The name may be terminated
- with a tab, a comma, or a newline.  A space does not end it; node names
- may contain spaces.  The case of letters in the names is insignificant.
- 
-    A node name has two forms.  A node in the current file is named by
- what appears after the `Node: ' in that node's first line.  For
- example, this node's name is `Add'.  A node in another file is named by
- `(FILENAME)NODE-WITHIN-FILE', as in `(info)Add' for this node.  If the
- file name starts with "./", then it is relative to the current
- directory; otherwise, it is relative starting from the standard Info
- file directory of your site.  The name `(FILENAME)Top' can be
- abbreviated to just `(FILENAME)'.  By convention, the name `Top' is
- used for the "highest" node in any single file--the node whose `Up'
- points out of the file.  The Directory node is `(dir)'.  The `Top' node
- of a document file listed in the Directory should have an `Up: (dir)'
- in it.
- 
-    The node name `*' is special: it refers to the entire file.  Thus,
- `g*' shows you the whole current file.  The use of the node `*' is to
- make it possible to make old-fashioned, unstructured files into nodes
- of the tree.
- 
-    The `Node:' name, in which a node states its own name, must not
- contain a filename, since Info when searching for a node does not
- expect one to be there.  The `Next', `Previous' and `Up' names may
- contain them.  In this node, since the `Up' node is in the same file,
- it was not necessary to use one.
- 
-    Note that the nodes in this file have a file name in the header
- line.  The file names are ignored by Info, but they serve as comments
- to help identify the node for the user.
- 
- 
- File: info,  Node: Menus,  Next: Cross-refs,  Prev: Add,  Up: Advanced Info
- 
- How to Create Menus
- ===================
- 
-    Any node in the Info hierarchy may have a "menu"--a list of subnodes.
- The `m' command searches the current node's menu for the topic which it
- reads from the terminal.
- 
-    A menu begins with a line starting with `* Menu:'.  The rest of the
- line is a comment.  After the starting line, every line that begins
- with a `* ' lists a single topic.  The name of the topic-the argument
- that the user must give to the `m' command to select this topic--comes
- right after the star and space, and is followed by a colon, spaces and
- tabs, and the name of the node which discusses that topic.  The node
- name, like node names following `Next', `Previous' and `Up', may be
- terminated with a tab, comma, or newline; it may also be terminated
- with a period.
- 
-    If the node name and topic name are the same, then rather than
- giving the name twice, the abbreviation `* NAME::' may be used (and
- should be used, whenever possible, as it reduces the visual clutter in
- the menu).
- 
-    It is considerate to choose the topic names so that they differ from
- each other very near the beginning--this allows the user to type short
- abbreviations.  In a long menu, it is a good idea to capitalize the
- beginning of each item name which is the minimum acceptable
- abbreviation for it (a long menu is more than 5 or so entries).
- 
-    The nodes listed in a node's menu are called its "subnodes", and it
- is their "superior".  They should each have an `Up:' pointing at the
- superior.  It is often useful to arrange all or most of the subnodes in
- a sequence of `Next' and `Previous' pointers so that someone who wants
- to see them all need not keep revisiting the Menu.
- 
-    The Info Directory is simply the menu of the node `(dir)Top'--that
- is, node `Top' in file `.../info/dir'.  You can put new entries in that
- menu just like any other menu.  The Info Directory is *not* the same as
- the file directory called `info'.  It happens that many of Info's files
- live on that file directory, but they do not have to; and files on that
- directory are not automatically listed in the Info Directory node.
- 
-    Also, although the Info node graph is claimed to be a "hierarchy",
- in fact it can be *any* directed graph.  Shared structures and pointer
- cycles are perfectly possible, and can be used if they are appropriate
- to the meaning to be expressed.  There is no need for all the nodes in
- a file to form a connected structure.  In fact, this file has two
- connected components.  You are in one of them, which is under the node
- `Top'; the other contains the node `Help' which the `h' command goes
- to.  In fact, since there is no garbage collector, nothing terrible
- happens if a substructure is not pointed to, but such a substructure is
- rather useless since nobody can ever find out that it exists.
- 
- 
- File: info,  Node: Cross-refs,  Next: Tags,  Prev: Menus,  Up: Advanced Info
- 
- Creating Cross References
- =========================
- 
-    A cross reference can be placed anywhere in the text, unlike a menu
- item which must go at the front of a line.  A cross reference looks
- like a menu item except that it has `*note' instead of `*'.  It
- *cannot* be terminated by a `)', because `)''s are so often part of
- node names.  If you wish to enclose a cross reference in parentheses,
- terminate it with a period first.  Here are two examples of cross
- references pointers:
- 
-      *Note details: commands.  (See *note 3: Full Proof.)
- 
-    They are just examples.  The places they "lead to" do not really
- exist!
- 
- 
- File: info,  Node: Tags,  Next: Checking,  Prev: Cross-refs,  Up: Advanced Info
- 
- Tags Tables for Info Files
- ==========================
- 
-    You can speed up the access to nodes of a large Info file by giving
- it a tags table.  Unlike the tags table for a program, the tags table
- for an Info file lives inside the file itself and is used automatically
- whenever Info reads in the file.
- 
-    To make a tags table, go to a node in the file using Emacs Info mode
- and type `M-x Info-tagify'.  Then you must use `C-x C-s' to save the
- file.
- 
-    Once the Info file has a tags table, you must make certain it is up
- to date.  If, as a result of deletion of text, any node moves back more
- than a thousand characters in the file from the position recorded in
- the tags table, Info will no longer be able to find that node.  To
- update the tags table, use the `Info-tagify' command again.
- 
-    An Info file tags table appears at the end of the file and looks like
- this:
- 
-      ^_
-      Tag Table:
-      File: info, Node: Cross-refs^?21419
-      File: info,  Node: Tags^?22145
-      ^_
-      End Tag Table
- 
- Note that it contains one line per node, and this line contains the
- beginning of the node's header (ending just after the node name), a
- Delete character, and the character position in the file of the
- beginning of the node.
- 
- 
- File: info,  Node: Checking,  Next: Emacs Info Variables,  Prev: Tags,  Up: Advanced Info
- 
- Checking an Info File
- =====================
- 
-    When creating an Info file, it is easy to forget the name of a node
- when you are making a pointer to it from another node.  If you put in
- the wrong name for a node, this is not detected until someone tries to
- go through the pointer using Info.  Verification of the Info file is an
- automatic process which checks all pointers to nodes and reports any
- pointers which are invalid.  Every `Next', `Previous', and `Up' is
- checked, as is every menu item and every cross reference.  In addition,
- any `Next' which does not have a `Previous' pointing back is reported.
- Only pointers within the file are checked, because checking pointers to
- other files would be terribly slow.  But those are usually few.
- 
-    To check an Info file, do `M-x Info-validate' while looking at any
- node of the file with Emacs Info mode.
- 
- 
- File: info,  Node: Emacs Info Variables,  Prev: Checking,  Up: Advanced Info
- 
- Emacs Info-mode Variables
- =========================
- 
-    The following variables may modify the behaviour of Info-mode in
- Emacs; you may wish to set one or several of these variables
- interactively, or in your `~/.emacs' init file.  *Note Examining and
- Setting Variables: (emacs)Examining.
- 
- `Info-enable-edit'
-      Set to `nil', disables the `e' (`Info-edit') command.  A non-`nil'
-      value enables it.  *Note Edit: Add.
- 
- `Info-enable-active-nodes'
-      When set to a non-`nil' value, allows Info to execute Lisp code
-      associated with nodes.  The Lisp code is executed when the node is
-      selected.
- 
- `Info-directory-list'
-      The list of directories to search for Info files.  Each element is
-      a string (directory name) or `nil' (try default directory).
- 
- `Info-directory'
-      The standard directory for Info documentation files.  Only used
-      when the function `Info-directory' is called.
- 
- 
- File: info,  Node: Create an Info File,  Prev: Advanced Info,  Up: Top
- 
- Creating an Info File from a Makeinfo file
- ******************************************
- 
-    `makeinfo' is a utility that converts a Texinfo file into an Info
- file; `texinfo-format-region' and `texinfo-format-buffer' are GNU Emacs
- functions that do the same.
- 
-    *Note Creating an Info File: (texinfo)Create an Info File, to learn
- how to create an Info file from a Texinfo file.
- 
-    *Note Overview of Texinfo: (texinfo)Top, to learn how to write a
- Texinfo file.
- 
- 
- File: info,  Node: Using Stand-alone Info,  Next: Options,  Up: Top
- 
- Using the Stand-alone Info Reader
- *********************************
- 
- What is Info?
- -------------
- 
-   This text documents the use of the GNU Info program, version
- 2.10.
- 
-   "Info" is a program which is used to view info files on an ASCII
- terminal. "info files" are the result of processing texinfo files with
- the program `makeinfo' or with  the Emacs command `M-x
- texinfo-format-buffer'.  Finally, "texinfo" is a documentation language
- which allows a printed manual and online documentation (an info file)
- to be produced from a single source file.
- 
- * Menu:
- 
- * Options::		    Options you can pass on the command line.
- * Cursor Commands::	    Commands which move the cursor within a node.
- * Scrolling Commands::	    Commands for moving the node around in a window.
- * Node Commands::	    Commands for selecting a new node.
- * Searching Commands::	    Commands for searching an info file.
- * Xref Commands::	    Commands for selecting cross references.
- * Window Commands::	    Commands which manipulate multiple windows.
- * Printing Nodes::	    How to print out the contents of a node.
- * Miscellaneous Commands::  A few commands that defy categories.
- * Variables::		    How to change the default behaviour of Info.
- 
- 
- File: info,  Node: Options,  Next: Cursor Commands,  Up: Using Stand-alone Info
- 
- Command Line Options
- ====================
- 
-   GNU Info accepts several options to control the initial node being
- viewed, and to specify which directories to search for info files.  Here
- is a template showing an invocation of GNU Info from the shell:
- 
-      info [--OPTION-NAME OPTION-VALUE] MENU-ITEM...
- 
-   The following OPTION-NAMES are available when invoking Info from the
- shell:
- 
- `--directory DIRECTORY-PATH'
- `-d DIRECTORY-PATH'
-      Adds DIRECTORY-PATH to the list of directory paths searched when
-      Info needs to find a file.  You may issue `--directory' multiple
-      times; once for each directory which contains info files.
-      Alternatively, you may specify a value for the environment variable
-      `INFOPATH'; if `--directory' is not given, the value of `INFOPATH'
-      is used.  The value of `INFOPATH' is a colon separated list of
-      directory names.  If you do not supply `INFOPATH' or
-      `--directory-path' a default path is used.
- 
- `--file FILENAME'
- `-f FILENAME'
-      Specifies a particular info file to visit.  Instead of visiting
-      the file `dir', Info will start with `(FILENAME)Top' as the first
-      file and node.
- 
- `--node NODENAME'
- `-n NODENAME'
-      Specifies a particular node to visit in the initial file loaded.
-      This is especially useful in conjunction with `--file'(1).  You
-      may specify `--node' multiple times; for an interactive Info, each
-      NODENAME is visited in its own window, for a non-interactive Info
-      (such as when `--output' is given) each NODENAME is processed
-      sequentially.
- 
- `--output FILENAME'
- `-o FILENAME'
-      Specify FILENAME as the name of a file to output to.  Each node
-      that Info visits will be output to FILENAME instead of
-      interactively viewed.  A value of `-' for FILENAME specifies the
-      standard output.
- 
- `--subnodes'
-      This option only has meaning when given in conjunction with
-      `--output'.  It means to recursively output the nodes appearing in
-      the menus of each node being output.  Menu items which resolve to
-      external info files are not output, and neither are menu items
-      which are members of an index.  Each node is only output once.
- 
- `--help'
- `-h'
-      Produces a relatively brief description of the available Info
-      options.
- 
- `--version'
-      Prints the version information of Info and exits.
- 
- `MENU-ITEM'
-      Remaining arguments to Info are treated as the names of menu
-      items.  The first argument would be a menu item in the initial
-      node visited, while the second argument would be a menu item in
-      the first argument's node.  You can easily move to the node of
-      your choice by specifying the menu names which describe the path
-      to that node.  For example,
- 
-           info emacs buffers
- 
-      first selects the menu item `Emacs' in the node `(dir)Top', and
-      then selects the menu item `Buffers' in the node `(emacs)Top'.
- 
-   ---------- Footnotes ----------
- 
-   (1)  Of course, you can specify both the file and node in a `--node'
- command; but don't forget to escape the open and close parentheses from
- the shell as in: `info --node '(emacs)Buffers''
- 
- 
- File: info,  Node: Cursor Commands,  Next: Scrolling Commands,  Prev: Options,  Up: Using Stand-alone Info
- 
- Moving the Cursor
- =================
- 
-   Many people find that reading screens of text page by page is made
- easier when one is able to indicate particular pieces of text with some
- kind of pointing device.  Since this is the case, GNU Info (both the
- Emacs and standalone versions) have several commands which allow you to
- move the cursor about the screen.  The notation used in this manual to
- describe keystrokes is identical to the notation used within the Emacs
- manual, and the GNU Readline manual.  *Note Character Conventions:
- (emacs)Characters, if you are unfamilar with the notation.
- 
-   The following table lists the basic cursor movement commands in Info.
- Each entry consists of the key sequence you should type to execute the
- cursor movement, the `M-x'(1) command name (displayed in parentheses),
- and a short description of what the command does.  All of the cursor
- motion commands can take an "numeric" argument (*note
- `universal-argument': Miscellaneous Commands.), to find out how to
- supply them.  With a numeric argument, the motion commands are simply
- executed that many times; for example, a numeric argument of 4 given to
- `next-line' causes the cursor to move down 4 lines.  With a negative
- numeric argument, the motion is reversed; an argument of -4 given to
- the `next-line' command would cause the cursor to move *up* 4 lines.
- 
- `C-n' (`next-line')
-      Moves the cursor down to the next line.
- 
- `C-p' (`prev-line')
-      Move the cursor up to the previous line.
- 
- `C-a' (`beginning-of-line')
-      Move the cursor to the start of the current line.
- 
- `C-e' (`end-of-line')
-      Moves the cursor to the end of the current line.
- 
- `C-f' (`forward-char')
-      Move the cursor forward a character.
- 
- `C-b' (`backward-char')
-      Move the cursor backward a character.
- 
- `M-f' (`forward-word')
-      Moves the cursor forward a word.
- 
- `M-b' (`backward-word')
-      Moves the cursor backward a word.
- 
- `M-<' (`beginning-of-node')
- `b'
-      Moves the cursor to the start of the current node.
- 
- `M->' (`end-of-node')
-      Moves the cursor to the end of the current node.
- 
- `M-r' (`move-to-window-line')
-      Moves the cursor to a specific line of the window.  Without a
-      numeric argument, `M-r' moves the cursor to the start of the line
-      in the center of the window.  With a numeric argument of N, `M-r'
-      moves the cursor to the start of the Nth line in the window.
- 
-   ---------- Footnotes ----------
- 
-   (1)  `M-x' is also a command; it invokes `execute-extended-command'.
- *Note Executing an extended command: (emacs)M-x, for more detailed
- information.
- 
- 
- File: info,  Node: Scrolling Commands,  Next: Node Commands,  Prev: Cursor Commands,  Up: Using Stand-alone Info
- 
- Moving Text Within a Window
- ===========================
- 
-   Sometimes you are looking at a screenful of text, and only part of the
- current paragraph you are reading is visible on the screen.  The
- commands detailed in this section are used to shift which part of the
- current node is visible on the screen.
- 
- `SPC' (`scroll-forward')
- `C-v'
-      Shift the text in this window up.  That is, show more of the node
-      which is currently below the bottom of the window.  With a numeric
-      argument, show that many more lines at the bottom of the window; a
-      numeric argument of 4 would shift all of the text in the window up
-      4 lines (discarding the top 4 lines), and show you four new lines
-      at the bottom of the window.  Without a numeric argument, SPC
-      takes the bottom two lines of the window and places them at the
-      top of the window, redisplaying almost a completely new screenful
-      of lines.
- 
- `DEL' (`scroll-backward')
- `M-v'
-      Shift the text in this window down.  The inverse of
-      `scroll-forward'.
- 
-   The `scroll-forward' and `scroll-backward' commands can also move
- forward and backward through the node structure of the file.  If you
- press SPC while viewing the end of a node, or DEL while viewing the
- beginning of a node, what happens is controlled by the variable
- `scroll-behaviour'.  *Note `scroll-behaviour': Variables, for more
- information.
- 
- `C-l' (`redraw-display')
-      Redraw the display from scratch, or shift the line containing the
-      cursor to a specified location.  With no numeric argument, `C-l'
-      clears the screen, and then redraws its entire contents.  Given a
-      numeric argument of N, the line containing the cursor is shifted
-      so that it is on the Nth line of the window.
- 
- `C-x w' (`toggle-wrap')
-      Toggles the state of line wrapping in the current window.
-      Normally, lines which are longer than the screen width "wrap",
-      i.e., they are continued on the next line.  Lines which wrap have
-      a `\' appearing in the rightmost column of the screen.  You can
-      cause such lines to be terminated at the rightmost column by
-      changing the state of line wrapping in the window with `C-x w'.
-      When a line which needs more space than one screen width to
-      display is displayed, a `$' appears in the rightmost column of the
-      screen, and the remainder of the line is invisible.
- 
- 
- File: info,  Node: Node Commands,  Next: Searching Commands,  Prev: Scrolling Commands,  Up: Using Stand-alone Info
- 
- Selecting a New Node
- ====================
- 
-   This section details the numerous Info commands which select a new
- node to view in the current window.
- 
-   The most basic node commands are `n', `p', `u', and `l'.
- 
-   When you are viewing a node, the top line of the node contains some
- Info "pointers" which describe where the next, previous, and up nodes
- are.  Info uses this line to move about the node structure of the file
- when you use the following commands:
- 
- `n' (`next-node')
-      Selects the `Next' node.
- 
- `p' (`prev-node')
-      Selects the `Prev' node.
- 
- `u' (`up-node')
-      Selects the `Up' node.
- 
-   You can easily select a node that you have already viewed in this
- window by using the `l' command - this name stands for "last", and
- actually moves through the list of already visited nodes for this
- window.  `l' with a negative numeric argument moves forward through the
- history of nodes for this window, so you can quickly step between two
- adjacent (in viewing history) nodes.
- 
- `l' (`history-node')
-      Selects the most recently selected node in this window.
- 
-   Two additional commands make it easy to select the most commonly
- selected nodes; they are `t' and `d'.
- 
- `t' (`top-node')
-      Selects the node `Top' in the current info file.
- 
- `d' (`dir-node')
-      Selects the directory node (i.e., the node `(dir)').
- 
-   Here are some other commands which immediately result in the selection
- of a different node in the current window:
- 
- `<' (`first-node')
-      Selects the first node which appears in this file.  This node is
-      most often `Top', but it doesn't have to be.
- 
- `>' (`last-node')
-      Selects the last node which appears in this file.
- 
- `]' (`global-next-node')
-      Moves forward or down through node structure.  If the node that
-      you are currently viewing has a `Next' pointer, that node is
-      selected.  Otherwise, if this node has a menu, the first menu item
-      is selected.  If there is no `Next' and no menu, the same process
-      is tried with the `Up' node of this node.
- 
- `[' (`global-prev-node')
-      Moves backward or up through node structure.  If the node that you
-      are currently viewing has a `Prev' pointer, that node is selected.
-      Otherwise, if the node has an `Up' pointer, that node is selected,
-      and if it has a menu, the last item in the menu is selected.
- 
-   You can get the same behaviour as `global-next-node' and
- `global-prev-node' while simply scrolling through the file with SPC and
- DEL; *Note `scroll-behaviour': Variables, for more information.
- 
- `g' (`goto-node')
-      Reads the name of a node and selects it.  No completion is done
-      while reading the node name, since the desired node may reside in
-      a separate file.  The node must be typed exactly as it appears in
-      the info file.  A file name may be included as with any node
-      specification, for example
- 
-           `g(emacs)Buffers'
- 
-      finds the node `Buffers' in the info file `emacs'.
- 
- `C-x k' (`kill-node')
-      Kills a node.  The node name is prompted for in the echo area,
-      with a default of the current node.  "Killing" a node means that
-      Info tries hard to forget about it, removing it from the list of
-      history nodes kept for the window where that node is found.
-      Another node is selected in the window which contained the killed
-      node.
- 
- `C-x C-f' (`view-file')
-      Reads the name of a file and selects the entire file.  The command
-           `C-x C-f FILENAME'
-      is equivalent to typing
-           `g(FILENAME)*'
- 
- `C-x C-b' (`list-visited-nodes')
-      Makes a window containing a menu of all of the currently visited
-      nodes.  This window becomes the selected window, and you may use
-      the standard Info commands within it.
- 
- `C-x b' (`select-visited-node')
-      Selects a node which has been previously visited in a visible
-      window.  This is similar to `C-x C-b' followed by `m', but no
-      window is created.
- 
- 
- File: info,  Node: Searching Commands,  Next: Xref Commands,  Prev: Node Commands,  Up: Using Stand-alone Info
- 
- Searching an Info File
- ======================
- 
-   GNU Info allows you to search for a sequence of characters throughout
- an entire info file, search through the indices of an info file, or find
- areas within an info file which discuss a particular topic.
- 
- `s' (`search')
-      Reads a string in the echo area and searches for it.
- 
- `C-s' (`isearch-forward')
-      Interactively searches forward through the info file for a string
-      as you type it.
- 
- `C-r' (`isearch-backward')
-      Interactively searches backward through the info file for a string
-      as you type it.
- 
- `i' (`index-search')
-      Looks up a string in the indices for this info file, and selects a
-      node where the found index entry points to.
- 
- `,' (`next-index-match')
-      Moves to the node containing the next matching index item from the
-      last `i' command.
- 
-   The most basic searching command is `s' (`search').  The `s' command
- prompts you for a string in the echo area, and then searches the
- remainder of the info file for an ocurrence of that string.  If the
- string is found, the node containing it is selected, and the cursor is
- left positioned at the start of the found string.  Subsequent `s'
- commands show you the default search string within `[' and `]';
- pressing RET instead of typing a new string will use the default search
- string.
- 
-   "Incremental searching" is similar to basic searching, but the string
- is looked up while you are typing it, instead of waiting until the
- entire search string has been specified.
- 
- 
- File: info,  Node: Xref Commands,  Next: Window Commands,  Prev: Searching Commands,  Up: Using Stand-alone Info
- 
- Selecting Cross References
- ==========================
- 
-   We have already discussed the `Next', `Prev', and `Up' pointers which
- appear at the top of a node.  In addition to these pointers, a node may
- contain other pointers which refer you to a different node, perhaps in
- another info file.  Such pointers are called "cross references", or
- "xrefs" for short.
- 
- * Menu:
- 
- * Parts of an Xref::	What a cross reference is made of.
- * Selecting Xrefs::	Commands for selecting menu or note items.
- 
- 
- File: info,  Node: Parts of an Xref,  Next: Selecting Xrefs,  Up: Xref Commands
- 
- Parts of an Xref
- ----------------
- 
-   Cross references have two major parts: the first part is called the
- "label"; it is the name that you can use to refer to the cross
- reference, and the second is the "target"; it is the full name of the
- node that the cross reference points to.
- 
-   The target is separated from the label by a colon `:'; first the
- label appears, and then the target.  For example, in the sample menu
- cross reference below, the single colon separates the label from the
- target.
- 
-      * Foo Label: Foo Target.	More information about Foo.
- 
-   Note the `.' which ends the name of the target.  The `.' is not part
- of the target; it serves only to let Info know where the target name
- ends.
- 
-   A shorthand way of specifying references allows two adjacent colons to
- stand for a target name which is the same as the label name:
- 
-      * Foo Commands::		Commands pertaining to Foo.
- 
-   In the above example, the name of the target is the same as the name
- of the label, in this case `Foo Commands'.
- 
-   You will normally see two types of cross references while viewing
- nodes: "menu" references, and "note" references.  Menu references
- appear within a node's menu; they begin with a `*' at the beginning of
- a line, and continue with a label, a target, and a comment which
- describes what the contents of the node pointed to contains.
- 
-   Note references appear within the body of the node text; they begin
- with `*Note', and continue with a label and a target.
- 
-   Like `Next', `Prev' and `Up' pointers, cross references can point to
- any valid node.  They are used to refer you to a place where more
- detailed information can be found on a particular subject.  Here is a
- cross reference which points to a node within the Texinfo
- documentation:  *Note Writing an Xref: (texinfo)xref, for more
- information on creating your own texinfo cross references.
- 
- 
- File: info,  Node: Selecting Xrefs,  Prev: Parts of an Xref,  Up: Xref Commands
- 
- Selecting Xrefs
- ---------------
- 
-   The following table lists the Info commands which operate on menu
- items.
- 
- `1' (`menu-digit')
- `2' ... `9'
-      Within an Info window, pressing a single digit, (such as `1'),
-      selects that menu item, and places its node in the current window.
-      For convenience, there is one exception; pressing `0' selects the
-      *last* item in the node's menu.
- 
- `0' (`last-menu-item')
-      Select the last item in the current node's menu.
- 
- `m' (`menu-item')
-      Reads the name of a menu item in the echo area and selects its
-      node.  Completion is available while reading the menu label.
- 
- `M-x find-menu'
-      Moves the cursor to the start of this node's menu.
- 
-   This table lists the Info commands which operate on note cross
- references.
- 
- `f' (`xref-item')
- `r'
-      Reads the name of a note cross reference in the echo area and
-      selects its node.  Completion is available while reading the cross
-      reference label.
- 
-   Finally, the next few commands operate on menu or note references
- alike:
- 
- `TAB' (`move-to-next-xref')
-      Moves the cursor to the start of the next nearest menu item or note
-      reference in this node.  You can then use RET
-      (`select-reference-this-line' to select the menu or note reference.
- 
- `M-TAB' (`move-to-prev-xref')
-      Moves the cursor the start of the nearest previous menu item or
-      note reference in this node.
- 
- `RET' (`select-reference-this-line')
-      Selects the menu item or note reference appearing on this line.
- 
- 
- File: info,  Node: Window Commands,  Next: Printing Nodes,  Prev: Xref Commands,  Up: Using Stand-alone Info
- 
- Manipulating Multiple Windows
- =============================
- 
-   A "window" is a place to show the text of a node.  Windows have a
- view area where the text of the node is displayed, and an associated
- "mode line", which briefly describes the node being viewed.
- 
-   GNU Info supports multiple windows appearing in a single screen; each
- window is separated from the next by its modeline.  At any time, there
- is only one "active" window, that is, the window in which the cursor
- appears.  There are commands available for creating windows, changing
- the size of windows, selecting which window is active, and for deleting
- windows.
- 
- * Menu:
- 
- * The Mode Line::	What appears in the mode line?
- * Basic Windows::	Manipulating windows in Info.
- * The Echo Area::	Used for displaying errors and reading input.
- 
- 
- File: info,  Node: The Mode Line,  Next: Basic Windows,  Up: Window Commands
- 
- The Mode Line
- -------------
- 
-   A "mode line" is a line of inverse video which appears at the bottom
- of an info window.  It describes the contents of the window just above
- it; this information includes the name of the file and node appearing in
- that window, the number of screen lines it takes to display the node,
- and the percentage of text that is above the top of the window.  It can
- also tell you if the indirect tags table for this info file needs to be
- updated, and whether or not the info file was compressed when stored on
- disk.
- 
-   Here is a sample mode line for a window containing an uncompressed
- file named `dir', showing the node `Top'.
- 
-      -----Info: (dir)Top, 40 lines --Top---------------------------------------
-                  ^^   ^   ^^^        ^^
-                (file)Node #lines    where
- 
-   When a node comes from a file which is compressed on disk, this is
- indicated in the mode line with two small `z''s.  In addition, if the
- info file containing the node has been split into subfiles, the name of
- the subfile containing the node appears in the modeline as well:
- 
-      --zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z---------------
- 
-   When Info makes a node internally, such that there is no corresponding
- info file on disk, the name of the node is surrounded by asterisks
- (`*').  The name itself tells you what the contents of the window are;
- the sample mode line below shows an internally constructed node showing
- possible completions:
- 
-      -----Info: *Completions*, 7 lines --All-----------------------------------
- 
- 
- File: info,  Node: Basic Windows,  Next: The Echo Area,  Prev: The Mode Line,  Up: Window Commands
- 
- Window Commands
- ---------------
- 
-   It can be convenient to view more than one node at a time.  To allow
- this, Info can display more than one "window".  Each window has its own
- mode line (*note The Mode Line::.) and history of nodes viewed in that
- window (*note `history-node': Node Commands.).
- 
- `C-x o' (`next-window')
-      Selects the next window on the screen.  Note that the echo area
-      can only be selected if it is already in use, and you have left it
-      temporarily.  Normally, `C-x o' simply moves the cursor into the
-      next window on the screen, or if you are already within the last
-      window, into the first window on the screen.  Given a numeric
-      argument, `C-x o' moves over that many windows.  A negative
-      argument causes `C-x o' to select the previous window on the
-      screen.
- 
- `M-x prev-window'
-      Selects the previous window on the screen.  This is identical to
-      `C-x o' with a negative argument.
- 
- `C-x 2' (`split-window')
-      Splits the current window into two windows, both showing the same
-      node.  Each window is one half the size of the original window,
-      and the cursor remains in the original window.  The variable
-      `automatic-tiling' can cause all of the windows on the screen to
-      be resized for you automatically, please *note automatic-tiling:
-      Variables. for more information.
- 
- `C-x 0' (`delete-window')
-      Deletes the current window from the screen.  If you have made too
-      many windows and your screen appears cluttered, this is the way to
-      get rid of some of them.
- 
- `C-x 1' (`keep-one-window')
-      Deletes all of the windows excepting the current one.
- 
- `ESC C-v' (`scroll-other-window')
-      Scrolls the other window, in the same fashion that `C-v' might
-      scroll the current window.  Given a negative argument, the "other"
-      window is scrolled backward.
- 
- `C-x ^' (`grow-window')
-      Grows (or shrinks) the current window.  Given a numeric argument,
-      grows the current window that many lines; with a negative numeric
-      argument, the window is shrunk instead.
- 
- `C-x t' (`tile-windows')
-      Divides the available screen space among all of the visible
-      windows.  Each window is given an equal portion of the screen in
-      which to display its contents.  The variable `automatic-tiling'
-      can cause `tile-windows' to be called when a window is created or
-      deleted.  *Note `automatic-tiling': Variables.
- 
- 
- File: info,  Node: The Echo Area,  Prev: Basic Windows,  Up: Window Commands
- 
- The Echo Area
- -------------
- 
-   The "echo area" is a one line window which appears at the bottom of
- the screen.  It is used to display informative or error messages, and to
- read lines of input from you when that is necessary.  Almost all of the
- commands available in the echo area are identical to their Emacs
- counterparts, so please refer to that documentation for greater depth of
- discussion on the concepts of editing a line of text.  The following
- table briefly lists the commands that are available while input is being
- read in the echo area:
- 
- `C-f' (`echo-area-forward')
-      Moves forward a character.
- 
- `C-b' (`echo-area-backward')
-      Moves backward a character.
- 
- `C-a' (`echo-area-beg-of-line')
-      Moves to the start of the input line.
- 
- `C-e' (`echo-area-end-of-line')
-      Moves to the end of the input line.
- 
- `M-f' (`echo-area-forward-word')
-      Moves forward a word.
- 
- `M-b' (`echo-area-backward-word')
-      Moves backward a word.
- 
- `C-d' (`echo-area-delete')
-      Deletes the character under the cursor.
- 
- `DEL' (`echo-area-rubout')
-      Deletes the character behind the cursor.
- 
- `C-g' (`echo-area-abort')
-      Cancels or quits the current operation.  If completion is being
-      read, `C-g' discards the text of the input line which does not
-      match any completion.  If the input line is empty, `C-g' aborts
-      the calling function.
- 
- `RET' (`echo-area-newline')
-      Accepts (or forces completion of) the current input line.
- 
- `C-q' (`echo-area-quoted-insert')
-      Inserts the next character verbatim.  This is how you can insert
-      control characters into a search string, for example.
- 
- PRINTING CHARACTER (`echo-area-insert')
-      Inserts the character.
- 
- `M-TAB' (`echo-area-tab-insert')
-      Inserts a TAB character.
- 
- `C-t' (`echo-area-transpose-chars')
-      Transposes the characters at the cursor.
- 
-   The next group of commands deal with "killing", and "yanking" text.
- For an in depth discussion of killing and yanking, *note Killing and
- Deleting: (emacs)Killing.
- 
- `M-d' (`echo-area-kill-word')
-      Kills the word following the cursor.
- 
- `M-DEL' (`echo-area-backward-kill-word')
-      Kills the word preceding the cursor.
- 
- `C-k' (`echo-area-kill-line')
-      Kills the text from the cursor to the end of the line.
- 
- `C-x DEL' (`echo-area-backward-kill-line')
-      Kills the text from the cursor to the beginning of the line.
- 
- `C-y' (`echo-area-yank')
-      Yanks back the contents of the last kill.
- 
- `M-y' (`echo-area-yank-pop')
-      Yanks back a previous kill, removing the last yanked text first.
- 
-   Sometimes when reading input in the echo area, the command that needed
- input will only accept one of a list of several choices.  The choices
- represent the "possible completions", and you must respond with one of
- them.  Since there are a limited number of responses you can make, Info
- allows you to abbreviate what you type, only typing as much of the
- response as is necessary to uniquely identify it.  In addition, you can
- request Info to fill in as much of the response as is possible; this is
- called "completion".
- 
-   The following commands are available when completing in the echo area:
- 
- `TAB' (`echo-area-complete')
- `SPC'
-      Inserts as much of a completion as is possible.
- 
- `?' (`echo-area-possible-completions')
-      Displays a window containing a list of the possible completions of
-      what you have typed so far.  For example, if the available choices
-      are:
-           bar
-           foliate
-           food
-           forget
-      and you have typed an `f', followed by `?', the possible
-      completions would contain:
-           foliate
-           food
-           forget
-      i.e., all of the choices which begin with `f'.  Pressing SPC or
-      TAB would result in `fo' appearing in the echo area, since all of
-      the choices which begin with `f' continue with `o'.  Now, typing
-      `l' followed by `TAB' results in `foliate' appearing in the echo
-      area, since that is the only choice which begins with `fol'.
- 
- `ESC C-v' (`echo-area-scroll-completions-window')
-      Scrolls the completions window, if that is visible, or the "other"
-      window if not.
- 
- 
- File: info,  Node: Printing Nodes,  Next: Miscellaneous Commands,  Prev: Window Commands,  Up: Using Stand-alone Info
- 
- Printing Out Nodes
- ==================
- 
-   You may wish to print out the contents of a node as  a quick reference
- document for later use.  Info provides you with a command for doing
- this.  In general, we recommend that you use TeX to format the document
- and print sections of it, by running `tex' on the texinfo source file.
- 
- `M-x print-node'
-      Pipes the contents of the current node through the command in the
-      environment variable `INFO_PRINT_COMMAND'.  If the variable doesn't
-      exist, the node is simply piped to `lpr'.
- 
- 
- File: info,  Node: Miscellaneous Commands,  Next: Variables,  Prev: Printing Nodes,  Up: Using Stand-alone Info
- 
- Miscellaneous Commands
- ======================
- 
-   GNU Info contains several commands which self-document GNU Info:
- 
- `M-x describe-command'
-      Reads the name of an Info command in the echo area and then
-      displays a brief description of what that command does.
- 
- `M-x describe-key'
-      Reads a key sequence in the echo area, and then displays the name
-      and documentation of the Info command that the key sequence
-      invokes.
- 
- `M-x describe-variable'
-      Reads the name of a variable in the echo area and then displays a
-      brief description of what the variable affects.
- 
- `M-x where-is'
-      Reads the name of an Info command in the echo area, and then
-      displays a key sequence which can be typed in order to invoke that
-      command.
- 
- `C-h' (`get-help-window')
- `?'
-      Creates (or moves into) the window displaying `*Help*', and places
-      a node containing a quick reference card into it.  This window
-      displays the most concise information about GNU Info available.
- 
- `h' (`get-info-help-node')
-      Tries hard to visit the node `(info)Help'.  The info file
-      `info.texi' distributed with GNU Info contains this node.  Of
-      course, the file must first be processed with `makeinfo', and then
-      placed into the location of your info directory.
- 
-   Here are the commands for creating a numeric argument:
- 
- `C-u' (`universal-argument')
-      Starts (or multiplies by 4) the current numeric argument.  `C-u' is
-      a good way to give a small numeric argument to cursor movement or
-      scrolling commands; `C-u C-v' scrolls the screen 4 lines, while
-      `C-u C-u C-n' moves the cursor down 16 lines.
- 
- `M-1' (`add-digit-to-numeric-arg')
- `M-2' ... `M-9'
-      Adds the digit value of the invoking key to the current numeric
-      argument.  Once Info is reading a numeric argument, you may just
-      type the digits of the argument, without the Meta prefix.  For
-      example, you might give `C-l' a numeric argument of 32 by typing:
- 
-           `C-u 3 2 C-l'
-      or
-           `M-3 2 C-l'
- 
-   `C-g' is used to abort the reading of a multi-character key sequence,
- to cancel lengthy operations (such as multi-file searches) and to
- cancel reading input in the echo area.
- 
- `C-g' (`abort-key')
-      Cancels current operation.
- 
-   The `q' command of Info simply quits running Info.
- 
- `q' (`quit')
-      Exits GNU Info.
- 
-   If the operating system tells GNU Info that the screen is 60 lines
- tall, and it is actually only 40 lines tall, here is a way to tell Info
- that the operating system is correct.
- 
- `M-x set-screen-height'
-      Reads a height value in the echo area and sets the height of the
-      displayed screen to that value.
- 
-   Finally, Info provides a convenient way to display footnotes which
- might be associated with the current node that you are viewing:
- 
- `ESC C-f' (`show-footnotes')
-      Shows the footnotes (if any) associated with the current node in
-      another window.  You can have Info automatically display the
-      footnotes associated with a node when the node is selected by
-      setting the variable `automatic-footnotes'.  *Note
-      `automatic-footnotes': Variables.
- 
- 
- File: info,  Node: Variables,  Prev: Miscellaneous Commands,  Up: Using Stand-alone Info
- 
- Manipulating Variables
- ======================
- 
-   GNU Info contains several "variables" whose values are looked at by
- various Info commands.  You can change the values of these variables,
- and thus change the behaviour of Info to more closely match your
- environment and info file reading manner.
- 
- `M-x set-variable'
-      Reads the name of a variable, and the value for it, in the echo
-      area and then sets the variable to that value.  Completion is
-      available when reading the variable name; often, completion is
-      available when reading the value to give to the variable, but that
-      depends on the variable itself.  If a variable does *not* supply
-      multiple choices to complete over, it expects a numeric value.
- 
- `M-x describe-variable'
-      Reads the name of a variable in the echo area and then displays a
-      brief description of what the variable affects.
- 
-   Here is a list of the variables that you can set in Info.
- 
- `automatic-footnotes'
-      When set to `On', footnotes appear and disappear automatically.
-      This variable is `On' by default.  When a node is selected, a
-      window containing the footnotes which appear in that node is
-      created, and the footnotes are displayed within the new window.
-      The window that Info creates to contain the footnotes is called
-      `*Footnotes*'.  If a node is selected which contains no footnotes,
-      and a `*Footnotes*' window is on the screen, the `*Footnotes*'
-      window is deleted.  Footnote windows created in this fashion are
-      not automatically tiled so that they can use as little of the
-      display as is possible.
- 
- `automatic-tiling'
-      When set to `On', creating or deleting a window resizes other
-      windows.  This variable is `Off' by default.  Normally, typing
-      `C-x 2' divides the current window into two equal parts.  When
-      `automatic-tiling' is set to `On', all of the windows are resized
-      automatically, keeping an equal number of lines visible in each
-      window.  There are exceptions to the automatic tiling;
-      specifically, the windows `*Completions*' and `*Footnotes*' are
-      *not* resized through automatic tiling; they remain their original
-      size.
- 
- `visible-bell'
-      When set to `On', GNU Info attempts to flash the screen instead of
-      ringing the bell.  This variable is `Off' by default.  Of course,
-      Info can only flash the screen if the terminal allows it; in the
-      case that the terminal does not allow it, the setting of this
-      variable has no effect.  However, you can make Info perform
-      quietly by setting the `errors-ring-bell' variable to `Off'.
- 
- `errors-ring-bell'
-      When set to `On', errors cause the bell to ring.  The default
-      setting of this variable is `On'.
- 
- `gc-compressed-files'
-      When set to `On', Info garbage collects files which had to be
-      uncompressed.  The default value of this variable is `Off'.
-      Whenever a node is visited in Info, the info file containing that
-      node is read into core, and Info reads information about the tags
-      and nodes contained in that file.  Once the tags information is
-      read by Info, it is never forgotten.  However, the actual text of
-      the nodes does not need to remain in core unless a particular info
-      window needs it.  For non-compressed files, the text of the nodes
-      does not remain in core when it is no longer in use.  But
-      de-compressing a file can be a time consuming operation, and so
-      Info tries hard not to do it twice.  `gc-compressed-files' tells
-      Info it is okay to garbage collect the text of the nodes of a file
-      which was compressed on disk.
- 
- `show-index-match'
-      When set to `On', the portion of the matched search string is
-      highlighted in the message which explains where the matched search
-      string was found.  The default value of this variable is `On'.
-      When Info displays the location where an index match was found,
-      (*note `next-index-match': Searching Commands.), the portion of the
-      string that you had typed is highlighted by displaying it in the
-      inverse case from its surrounding characters.
- 
- `scroll-behaviour'
-      Controls what happens when forward scrolling is requested at the
-      end of a node, or when backward scrolling is requested at the
-      beginning of a node.  The default value for this variable is
-      `Continuous'.  There are three possible values for this variable:
- 
-     `Continuous'
-           Tries to get the first item in this node's menu, or failing
-           that, the `Next' node, or failing that, the `Next' of the
-           `Up'.  This behaviour is identical to using the `]'
-           (`global-next-node') and `[' (`global-prev-node') commands.
- 
-     `Next Only'
-           Only tries to get the `Next' node.
- 
-     `Page Only'
-           Simply gives up, changing nothing.  If `scroll-behaviour' is
-           `Page Only', no scrolling command can change the node that is
-           being viewed.
- 
- `scroll-step'
-      The number of lines to scroll when the cursor moves out of the
-      window.  Scrolling happens automatically if the cursor has moved
-      out of the visible portion of the node text when it is time to
-      display.  Usually the scrolling is done so as to put the cursor on
-      the center line of the current window.  However, if the variable
-      `scroll-step' has a nonzero value, Info attempts to scroll the
-      node text by that many lines; if that is enough to bring the
-      cursor back into the window, that is what is done.  The default
-      value of this variable is 0, thus placing the cursor (and the text
-      it is attached to) in the center of the window.  Setting this
-      variable to 1 causes a kind of "smooth scrolling" which some
-      people prefer.
- 
- `ISO-Latin'
-      When set to `On', Info accepts and displays ISO Latin-1 characters.
-      By default, Info assumes an ASCII character set.  `ISO-Latin' tells
-      Info that it is running in an environment where the European
-      standard character set is in use, and allows you to input such
-      characters to Info, as well as display them.
- 
- 
- 
- Tag Table:
- Node: Top916
- Node: Getting Started1621
- Node: Help-Small-Screen2432
- Node: Help4164
- Node: Help-P5279
- Node: Help-^L6132
- Node: Help-M9006
- Node: Help-FOO14996
- Node: Help-Adv15724
- Node: Help-Cross18382
- Node: Help-Q19020
- Node: Advanced Info19639
- Node: Expert20611
- Node: Add23243
- Node: Menus26577
- Node: Cross-refs29446
- Node: Tags30143
- Node: Checking31450
- Node: Emacs Info Variables32398
- Node: Create an Info File33382
- Node: Using Stand-alone Info33916
- Node: Options35193
- Node: Cursor Commands38384
- Node: Scrolling Commands41049
- Node: Node Commands43528
- Node: Searching Commands47532
- Node: Xref Commands49144
- Node: Parts of an Xref49747
- Node: Selecting Xrefs51677
- Node: Window Commands53258
- Node: The Mode Line54164
- Node: Basic Windows55801
- Node: The Echo Area58315
- Node: Printing Nodes62490
- Node: Miscellaneous Commands63144
- Node: Variables66366
- 
- End Tag Table
--- 0 ----
Index: emacs/info/mh-e
diff -c emacs/info/mh-e:1.1.1.1 emacs/info/mh-e:removed
*** emacs/info/mh-e:1.1.1.1	Mon Jul 22 01:52:54 1996
--- emacs/info/mh-e	Fri Aug  2 20:21:44 1996
***************
*** 1,120 ****
- This is Info file ../info/mh-e, produced by Makeinfo-1.55 from the
- input file mh-e.texi.
- 
-    This is Edition 1.1, last updated 26 April 1995, of `mh-e, The Emacs
- Interface to MH', for mh-e, Version 5.0.1.
- 
-    Copyright 1995 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "Copying" is included exactly as in the
- original, and provided that the entire resulting derived work is
- distributed under the terms of a permission notice identical to this
- one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that this permission notice may be stated in a
- translation approved by the Free Software Foundation.
- 
- 
- Indirect:
- mh-e-1: 1024
- mh-e-2: 51008
- mh-e-3: 99086
- mh-e-4: 148070
- 
- Tag Table:
- (Indirect)
- Node: Top1024
- Node: Preface1842
- Node: Tour Through mh-e3578
- Node: Conventions4742
- Node: Getting Started8307
- Node: Sending Mail Tour11204
- Node: Reading Mail Tour12986
- Node: Processing Mail Tour14520
- Node: Leaving mh-e17737
- Node: More About mh-e18349
- Node: Using mh-e19628
- Node: Reading Mail21033
- Node: Viewing22912
- Node: Reading Digests23672
- Node: Reading MIME25050
- Node: Moving Around25644
- Node: Sending Mail27033
- Node: Replying28923
- Node: Forwarding30402
- Node: Redistributing31310
- Node: Old Drafts31908
- Node: Draft Editing32980
- Node: Editing Textual34842
- Node: Inserting Letter35239
- Node: Inserting Messages36748
- Node: Header37273
- Node: Recipients38147
- Node: Signature38442
- Node: Editing MIME38750
- Node: Forwarding MIME40661
- Node: FTP41048
- Node: Tar41455
- Node: Other MIME Objects42031
- Node: Sending MIME42434
- Node: Sending Message44933
- Node: Killing Draft45270
- Node: Moving Mail45574
- Node: Incorporating47369
- Node: Deleting48108
- Node: Organizing48909
- Node: Printing51008
- Node: Files and Pipes51464
- Node: Finishing Up52802
- Node: Searching54132
- Node: Sequences57531
- Node: Miscellaneous60412
- Node: Customizing mh-e61046
- Node: Customizing Reading64813
- Node: Customizing Viewing71551
- Node: Customizing Moving Around75661
- Node: Customizing Sending76203
- Node: Customizing Replying80229
- Node: Customizing Forwarding80733
- Node: Customizing Redistributing81500
- Node: Customizing Old Drafts82192
- Node: Customizing Draft Editing83165
- Node: Customizing Editing Textual84673
- Node: Customizing Inserting Letter85101
- Node: Customizing Signature87053
- Node: Customizing Editing MIME87373
- Node: Customizing Sending MIME89882
- Node: Customizing Sending Message90539
- Node: Customizing Moving Mail91035
- Node: Customizing Incorporating92814
- Node: Customizing Deleting94264
- Node: Customizing Organizing94627
- Node: Customizing Scan Line Formats99086
- Node: Customizing Printing102440
- Node: Customizing Files and Pipes103161
- Node: Customizing Finishing Up104052
- Node: Customizing Searching104571
- Node: Odds and Ends105428
- Node: Bug Reports105814
- Node: Mailing List106191
- Node: MH FAQ106575
- Node: Getting mh-e107370
- Node: History108671
- Node: From Brian Reid109156
- Node: From Jim Larus110799
- Node: From Stephen Gildea113056
- Node: Changes to mh-e115192
- Node: Copying118649
- Node: Function Index137813
- Node: Variable Index142550
- Node: Concept Index148070
- 
- End Tag Table
--- 0 ----
Index: emacs/info/mh-e-1
diff -c emacs/info/mh-e-1:1.1.1.1 emacs/info/mh-e-1:removed
*** emacs/info/mh-e-1:1.1.1.1	Mon Jul 22 01:52:54 1996
--- emacs/info/mh-e-1	Fri Aug  2 20:21:48 1996
***************
*** 1,1373 ****
- This is Info file ../info/mh-e, produced by Makeinfo-1.55 from the
- input file mh-e.texi.
- 
-    This is Edition 1.1, last updated 26 April 1995, of `mh-e, The Emacs
- Interface to MH', for mh-e, Version 5.0.1.
- 
-    Copyright 1995 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "Copying" is included exactly as in the
- original, and provided that the entire resulting derived work is
- distributed under the terms of a permission notice identical to this
- one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that this permission notice may be stated in a
- translation approved by the Free Software Foundation.
- 
- 
- File: mh-e,  Node: Top,  Next: Preface,  Prev: (dir),  Up: (dir)
- 
- MH and Emacs
- ************
- 
-    This is Edition 1.1 of `mh-e, The Emacs Interface to MH', last
- updated 26 April 1995 for mh-e Version 5.0.1.
- 
- * Menu:
- 
- * Preface::                     Introduction to mh-e.
- * Tour Through mh-e::           Use mh-e quickly!
- * Using mh-e::                  Documentation for all commands.
- * Customizing mh-e::            Documentation for all variables.
- * Odds and Ends::               Getting mh-e, reporting bugs, mailing
-                                 list and FAQ.
- * History::                     The authors speak up!
- * Changes to mh-e::             Actual changes between Versions 3 and beyond.
- * Copying::                     The GNU General Public License
- * Function Index::
- * Variable Index::
- * Concept Index::
- 
- 
- File: mh-e,  Node: Preface,  Next: Tour Through mh-e,  Prev: Top,  Up: Top
- 
- Preface
- *******
- 
-    These chapters introduce another interface to MH that is accessible
- through the GNU Emacs editor, namely, *mh-e*.  mh-e is easy to use.  I
- don't assume that you know GNU Emacs or even MH at this point, since I
- didn't know either of them when I discovered mh-e.  However, mh-e was
- the tip of the iceberg, and I discovered more and more niceties about
- GNU Emacs and MH.  Now I'm fully hooked on both of them.
- 
-    The mh-e package is distributed with GNU Emacs, so you shouldn't
- have to do anything special to use it.  But it's important to note a
- brief history of mh-e.  Version 3 was prevalent through the Emacs 18
- and early Emacs 19 years.  Then Version 4 came out (Emacs 19.23), which
- introduced several new and changed commands.  Finally, Version 5.0 was
- released, which fixed some bugs and incompatibilities.  This is the
- version covered by this manual.  *Note Getting Started:: will help you
- decide which version you have.
- 
-    If you don't already use GNU Emacs but want to learn more, you can
- read an online tutorial by starting GNU Emacs and typing `C-h t'
- (`help-with-tutorial').  (This notation is described in *Note
- Conventions::.)  If you want to take the plunge, consult the *Note GNU
- Emacs Manual: (emacs)top, from the Free Software Foundation.
- 
-    If more information is needed, you can go to the Unix manual pages of
- the individual MH commands.  When the name is not obvious, I'll guide
- you to a relevant MH manual page that describes the action more fully.
- 
-    I hope you enjoy these chapters!  If you have any comments, or
- suggestions for this document, please let me know.
- 
- Bill Wohler <wohler@newt.com>
- 8 February 1995
- 
- 
- File: mh-e,  Node: Tour Through mh-e,  Next: Using mh-e,  Prev: Preface,  Up: Top
- 
- Tour Through mh-e
- *****************
- 
-    This chapter introduces some of the terms you'll need to know and
- then takes you on a tour of mh-e. (1)  When you're done, you'll be able
- to send, read, and file mail, which is all that a lot of people ever
- do.  But if you're the curious type, you'll read *Note Using mh-e:: to
- be able to use all the features of mh-e.  If you're the adventurous
- type, you'll read *Note Customizing mh-e:: to make mh-e do what you
- want.  I suggest you read this chapter first to get the big picture,
- and then you can read the other two as you wish.
- 
- * Menu:
- 
- * Conventions::                 GNU Emacs Terms and Conventions
- * Getting Started::
- * Sending Mail Tour::
- * Reading Mail Tour::
- * Processing Mail Tour::
- * Leaving mh-e::
- * More About mh-e::
- 
-    ---------- Footnotes ----------
- 
-    (1)  The keys mentioned in these chapters refer to the default key
- bindings.  If you've changed the bindings, refer to the command
- summaries at the beginning of each major section in *Note Using mh-e::,
- for a mapping between default key bindings and function names.
- 
- 
- File: mh-e,  Node: Conventions,  Next: Getting Started,  Prev: Tour Through mh-e,  Up: Tour Through mh-e
- 
- GNU Emacs Terms and Conventions
- ===============================
- 
-    If you're an experienced Emacs user, you can skip the following
- conventions and definition of terms and go directly to *Note Getting
- Started:: below.  The conventions are as follows:
- 
- `C-x'
-      Hold down the CTRL (Control) key and press the `x' key.
- 
- `M-x'
-      Hold down the META or ALT key and press the `x' key.
- 
-      Since some keyboards don't have a META key, you can generate
-      `M-x', for example, by pressing ESC (Escape), *releasing it*, (1)
-      and then pressing the `x' key.
- 
- `RET'
-      Press the RETURN or ENTER key.  This is normally used to complete
-      a command.
- 
- `SPC'
-      Press the space bar.
- 
- `TAB'
-      Press the TAB key.
- 
- `DEL'
-      Press the DELETE key.  This may also be a Backspace key, depending
-      on your keyboard or Emacs configuration.
- 
-    A "prefix argument" allows you to pass an argument to any Emacs
- function.  To pass an argument, type `C-u' before the Emacs command or
- keystroke.  Numeric arguments can be passed as well.  For example, to
- insert five f's, use `C-u 5 f'.  There is a default of four when using
- `C-u', and you can use multiple prefix arguments to provide arguments
- of powers of four.  To continue our example, you could insert four f's
- with `C-u f', 16 f's with `C-u C-u f', 64 f's with `C-u C-u C-u f', and
- so on.  Numeric and valueless negative arguments can also be inserted
- with the META key.  Examples include `M-5' to specify an argument of 5,
- or `M--' which specifies a negative argument with no particular value.
- 
-                                 *NOTE*
- 
-      The prefix `C-u' or `M-' is not necessary in mh-e's MH-Folder
-      modes (*note Reading Mail Tour::.).  In these modes, simply enter
-      the numerical argument before entering the command.
- 
-    There are several other terms that are used in Emacs that you should
- know.  The "point" is where the cursor currently is.  You can save your
- current place in the file by setting a "mark".  This operation is
- useful in several ways.  The mark can be later used when defining a
- "region", which is the text between the point and mark.  Many commands
- operate on regions, such as those for deleting text or filling
- paragraphs.  A mark can be set with `C-@' (or `C-SPC').
- 
-    The "minibuffer" is the bottom line of the Emacs window, where all
- prompting and multiple-character input is directed.  If you are prompted
- for information in the minibuffer, such as a filename, Emacs can help
- you complete your answer if you type SPC or TAB.  A second SPC or TAB
- will list all possibilities at that point.  The minibuffer is also
- where you enter Emacs function names after typing `M-x'.  For example,
- in the first paragraph, I mentioned that you could obtain help with
- `C-h t' (`help-with-tutorial').  What this means is that you can get a
- tutorial by typing either `C-h t' or `M-x help-with-tutorial'.  In the
- latter case, you are prompted for `help-with-tutorial' in the
- minibuffer after typing `M-x'.
- 
-    In case of trouble: Emacs can be interrupted at any time with `C-g'.
- For example, if you've started a command that requests that you enter
- something in the minibuffer, but then you change your mind, type `C-g'
- and you'll be back where you started.  If you want to exit Emacs
- entirely, use `C-x C-c'.
- 
-    ---------- Footnotes ----------
- 
-    (1)  This is emphasized because pressing ESC twice or holding it
- down a second too long so that it repeats gives you an error message.
- 
- 
- File: mh-e,  Node: Getting Started,  Next: Sending Mail Tour,  Prev: Conventions,  Up: Tour Through mh-e
- 
- Getting Started
- ===============
- 
-    Because there are many old versions of mh-e out there, it is
- important to know which version you have.  I'll be talking about
- Version 5 which is similar to Version 4 and vastly different from
- Version 3.
- 
-    First, enter `M-x load-library RET mh-e RET'. (1)  The message,
- `Loading mh-e...done', should be displayed in the minibuffer.  If you
- get `Cannot open load file: mh-e', then your Emacs is very badly
- configured, or mh-e is missing.  You may wish to have your system
- administrator install a new Emacs or at least the latest mh-e files.
- 
-    Having loaded mh-e successfully, enter `M-x mh-version RET'.  The
- version of mh-e should be displayed.  Hopefully it says that you're
- running Version 5.0.1 which is the latest version as of this printing.
- If instead Emacs beeps and says `[No match]', then you're running an
- old version of mh-e.
- 
-    If these tests reveal a non-existent or old version of mh-e, please
- consider obtaining a new version.  You can have your system
- administrator upgrade the system-wide version, or you can install your
- own personal version.  It's really quite easy; instructions for getting
- and installing mh-e are in *Note Getting mh-e::.  In the meantime, see
- *Note Changes to mh-e::, which compares the old and new names of
- commands, functions, variables, and buffers.
- 
-    Also, older versions of mh-e assumed that you had already set up
- your MH environment.  Newer versions set up a new MH environment for
- you by running `install-mh' and notifying you of this fact with the
- message in a temporary buffer:
- 
-      I'm going to create the standard MH path for you.
- 
-    Therefore, if you've never run MH before and you're using an old
- version of mh-e, you need to run `install-mh' from the shell before you
- continue the tour.  If you don't, you'll be greeted with the error
- message: `Can't find MH profile'.
- 
-    If, during the tour described in this chapter, you see a message
- like: `Searching for program: no such file or directory,
- /usr/local/bin/mhpath', it means that the MH programs and files are kept
- in a nonstandard directory.  In this case, simply add the following to
- `~/.emacs' and restart `emacs'.
- 
-      (setq mh-progs "/PATH/TO/MH/BINARY/DIRECTORY/")
-      (setq mh-lib "/PATH/TO/MH/LIBRARY/DIRECTORY/")
- 
-    The `~' notation used by `~/.emacs' above represents your home
- directory.  This is used by the `bash' and `csh' shells.  If your shell
- does not support this feature, you could use the environment variable
- `$HOME' (such as `$HOME/.emacs') or the absolute path (as in
- `/home/wohler/.emacs') instead.
- 
-    At this point, you should see something like the screen in the
- figure in *Note Reading Mail Tour::.  We're now ready to move on.
- 
-    ---------- Footnotes ----------
- 
-    (1)  You wouldn't ordinarily do this.
- 
- 
- File: mh-e,  Node: Sending Mail Tour,  Next: Reading Mail Tour,  Prev: Getting Started,  Up: Tour Through mh-e
- 
- Sending Mail
- ============
- 
-    Let's start our tour by sending ourselves a message which we can
- later read and process.  Enter `M-x mh-smail' to invoke the mh-e program
- to send messages.  You will be prompted in the minibuffer by `To:'.
- Enter your login name.  The next prompt is `cc:'.  Hit RET to indicate
- that no carbon copies are to be sent.  At the `Subject:' prompt, enter
- `Test' or anything else that comes to mind.
- 
-    Once you've specified the recipients and subject, your message
- appears in an Emacs buffer whose mode (1) is MH-Letter.  Enter some
- text in the body of the message, using normal Emacs commands.  You
- should now have something like this: (2)
- 
- 
- 
- 
- 
- 
- 
-      -----Emacs: *scratch*         (Lisp Interaction)--All---------------------
-      To: wohler
-      cc:
-      Subject: Test
-      --------
-        This is a test message to get the wheels churning...#
-      
-      
-      --**-{draft}      (MH-Letter)--All----------------------------------------
-      mh-e message composition window
- 
-    Note the line of dashes that separates the header and the body of the
- message.  It is essential that these dashes (or a blank line) are
- present or the body of your message will be considered to be part of
- the header.
- 
-    There are several commands specific to MH-Letter mode, but at this
- time we'll only use `C-c C-c' to send your message.  Type `C-c C-c'
- now.  That's all there is to it!
- 
-    ---------- Footnotes ----------
- 
-    (1)  A "mode" changes Emacs to make it easier to edit a particular
- type of text.
- 
-    (2)  If you're running Emacs under the X Window System, then you
- would also see a menubar.  I've left out the menubar in all of the
- example screens.
- 
- 
- File: mh-e,  Node: Reading Mail Tour,  Next: Processing Mail Tour,  Prev: Sending Mail Tour,  Up: Tour Through mh-e
- 
- Receiving Mail
- ==============
- 
-    To read the mail you've just sent yourself, enter `M-x mh-rmail'.
- This incorporates the new mail and put the output from `inc' (called
- "scan lines" after the MH program `scan' which prints a one-line
- summary of each message) into a buffer called `+inbox' whose major mode
- is MH-Folder.
- 
-                                 *NOTE*
- 
-      The `M-x mh-rmail' command will show you only new mail, not old
-      mail.  If you were to run this tour again, you would use `M-r' to
-      pull all your messages into mh-e.
- 
-    You should see the scan line for your message, and perhaps others.
- Use `n' or `p' to move the cursor to your test message and type RET to
- read your message.  You should see something like:
- 
-         3  24Aug  root       received fax files on Wed Aug 24 11:00:13 PDT 1994
-      #  4+ 24Aug  To:wohler  Test<<This is a test message to get the wheels chu
-      
-      --%%-{+inbox} 4 msgs (1-4)      (MH-Folder Show)--Bot---------------------
-      To: wohler
-      Subject: Test
-      Date: Wed, 24 Aug 1994 13:01:13 -0700
-      From: Bill Wohler <wohler@newt.com>
-      
-        This is a test message to get the wheels churning...
-      
-      
-      
-      
-      
-      -----{show-+inbox} 4      (MH-Show)--Bot----------------------------------
-      After incorporating new messages
- 
-    If you typed a long message, you can view subsequent pages with SPC
- and previous pages with DEL.
- 
- 
- File: mh-e,  Node: Processing Mail Tour,  Next: Leaving mh-e,  Prev: Reading Mail Tour,  Up: Tour Through mh-e
- 
- Processing Mail
- ===============
- 
-    The first thing we want to do is reply to the message that we sent
- ourselves.  Ensure that the cursor is still on the same line as your
- test message and type `r'.  You are prompted in the minibuffer with
- `Reply to whom:'.  Here mh-e is asking whether you'd like to reply to
- the original sender only, to the sender and primary recipients, or to
- the sender and all recipients.  If you simply hit RET, you'll reply
- only to the sender.  Hit RET now.
- 
-    You'll find yourself in an Emacs buffer similar to that when you were
- sending the original message, like this:
- 
-      To: wohler
-      Subject: Re: Test
-      In-reply-to: Bill Wohler's message of Wed, 24 Aug 1994 13:01:13 -0700
-                   <199408242001.NAA00505@newt.com>
-      --------
-      #
-      
-      --**-{draft}      (MH-Letter)--All----------------------------------------
-      To: wohler
-      Subject: Test
-      Date: Wed, 24 Aug 1994 13:01:13 -0700
-      From: Bill Wohler <wohler@newt.com>
-      
-        This is a test message to get the wheels churning...
-      
-      -----{show-+inbox} 4      (MH-Show)--Bot----------------------------------
-      Composing a reply...done
-      Composition window during reply
- 
-    By default, MH will not add you to the address list of your replies,
- so if you find that the `To:' header field is missing, don't worry.  In
- this case, type `C-c C-f C-t' to create and go to the `To:' field,
- where you can type your login name again.  You can move around with the
- arrow keys or with `C-p' (`previous-line'), `C-n' (`next-line'), `C-b'
- (`backward-char'), and `C-f' (`forward-char') and can delete the
- previous character with DEL.  When you're finished editing your
- message, send it with `C-c C-c' as before.
- 
-    You'll often want to save messages that were sent to you in an
- organized fashion.  This is done with "folders".  You can use folders
- to keep messages from your friends, or messages related to a particular
- topic.  With your cursor in the MH-Folder buffer and positioned on the
- message you sent to yourself, type `o' to output (`refile' in MH
- parlance) that message to a folder.  Enter `test' at the `Destination:'
- prompt and type `y' (or SPC) when mh-e asks to create the folder
- `+test'.  Note that a `^' (caret) appears next to the message number,
- which means that the message has been marked for refiling but has not
- yet been refiled.  We'll talk about how the refile is actually carried
- out in a moment.
- 
-    Your previous reply is now waiting in the system mailbox.  You
- incorporate this mail into your MH-Folder buffer named `+inbox' with
- the `i' command.  Do this now.  After the mail is incorporated, use `n'
- or `p' to move the cursor to the new message, and read it with RET.
- Let's delete this message by typing `d'.  Note that a `D' appears next
- to the message number.  This means that the message is marked for
- deletion but is not yet deleted.  To perform the deletion (and the
- refile we did previously), use the `x' command.
- 
-    If you want to send another message you can use `m' instead of `M-x
- mh-smail'.  So go ahead, send some mail to your friends!
- 
- 
- File: mh-e,  Node: Leaving mh-e,  Next: More About mh-e,  Prev: Processing Mail Tour,  Up: Tour Through mh-e
- 
- Leaving mh-e
- ============
- 
-    You may now wish to exit `emacs' entirely.  Use `C-x C-c' to exit
- `emacs'.  If you exited without running `x' in the `+inbox' buffer,
- Emacs will offer to save it for you.  Type `y' or SPC to save `+inbox'
- changes, which means to perform any refiles and deletes that you did
- there.
- 
-    If you don't want to leave Emacs, you can type `q' to bury (hide)
- the mh-e folder or delete them entirely with `C-x k'.  You can then
- later recall them with `C-x b' or `M-x mh-rmail'.
- 
- 
- File: mh-e,  Node: More About mh-e,  Prev: Leaving mh-e,  Up: Tour Through mh-e
- 
- More About mh-e
- ===============
- 
-    These are the basic commands to get you going, but there are plenty
- more.  If you think that mh-e is for you, read *Note Using mh-e:: and
- *Note Customizing mh-e:: to find out how you can:
- 
-    * Print your messages.  (*Note Printing:: and *Note Customizing
-      Printing::.)
- 
-    * Edit messages and include your signature.  (*Note Draft Editing::
-      and *Note Customizing Draft Editing::.)
- 
-    * Forward messages.  (*Note Forwarding:: and *Note Customizing
-      Forwarding::.)
- 
-    * Read digests.  (*Note Viewing::.)
- 
-    * Edit bounced messages.  (*Note Old Drafts:: and *Note Customizing
-      Old Drafts::.)
- 
-    * Send multimedia messages.  (*Note Editing MIME:: and *Note
-      Customizing Editing MIME::.)
- 
-    * Process mail that was sent with `shar' or `uuencode'.  (*Note
-      Files and Pipes::.)
- 
-    * Use sequences conveniently.  (*Note Sequences::.)
- 
-    * Show header fields in different fonts.  (*Note Customizing
-      Viewing::.)
- 
-    * Find previously refiled messages.  (*Note Searching::.)
- 
-    * Place messages in a file.  (*Note Files and Pipes::.)
- 
-    Remember that you can also use MH commands when you're not running
- mh-e (and when you are!).
- 
- 
- File: mh-e,  Node: Using mh-e,  Next: Customizing mh-e,  Prev: Tour Through mh-e,  Up: Top
- 
- Using mh-e
- **********
- 
-    This chapter leaves the tutorial style and goes into more detail
- about every mh-e command.  The default, or "out of the box," behavior is
- documented.  If this is not to your liking (for instance, you print with
- something other than `lpr)', see the associated section in *Note
- Customizing mh-e:: which is organized exactly like this chapter.
- 
-    There are many commands, but don't get intimidated.  There are
- command summaries at the beginning of each section.  In case you have
- or would like to rebind the keys, the command summaries also list the
- associated Emacs Lisp function.  Furthermore, even if you're stranded
- on a desert island with a laptop and are without your manuals, you can
- get a summary of all these commands with GNU Emacs online help: use
- `C-h m' (`describe-mode') for a brief summary of commands or `C-h i' to
- read this manual via Info.  The online help is quite good; try running
- `C-h C-h C-h'.  This brings up a list of available help topics, one of
- which displays the documentation for a given key (like `C-h k C-n').
- In addition, review *Note Conventions::, if any of the GNU Emacs
- conventions are strange to you.
- 
-    Let's get started!
- 
- * Menu:
- 
- * Reading Mail::
- * Sending Mail::
- * Draft Editing::
- * Moving Mail::
- * Searching::
- * Sequences::
- * Miscellaneous::
- 
- 
- File: mh-e,  Node: Reading Mail,  Next: Sending Mail,  Prev: Using mh-e,  Up: Using mh-e
- 
- Reading Your Mail
- =================
- 
-    The mh-e entry point for reading mail is `M-x mh-rmail'.  This
- command incorporates your mail and creates a buffer called `+inbox' in
- MH-Folder mode.  The `M-x mh-rmail' command shows you only new mail,
- not old mail. (1)  The `+inbox' buffer contains "scan lines", which are
- one-line summaries of each incorporated message.  You can perform most
- MH commands on these messages via one-letter commands discussed in this
- chapter.  See `scan'(1) for a description of the contents of the scan
- lines, and see the Figure in *Note Reading Mail Tour::, for an example.
- 
- `RET'
-      Display a message (`mh-show').
- 
- `SPC'
-      Go to next page in message (`mh-page-msg').
- 
- `DEL'
-      Go to previous page in message (`mh-previous-page').
- 
- `, (comma)'
-      Display a message with all header fields (`mh-header-display').
- 
- `M-SPC'
-      Go to next message in digest (`mh-page-digest').
- 
- `M-DEL'
-      Go to previous message in digest (`mh-page-digest-backwards').
- 
- `M-b'
-      Break up digest into separate messages (`mh-burst-digest').
- 
- `n'
-      Display next message (`mh-next-undeleted-msg').
- 
- `p'
-      Display previous message (`mh-previous-undeleted-msg').
- 
- `g'
-      Go to a message (`mh-goto-msg').
- 
- `M-<'
-      Go to first message (`mh-first-msg').
- 
- `M->'
-      Go to last message (`mh-last-msg').
- 
- `t'
-      Toggle between MH-Folder and MH-Folder Show modes
-      (`mh-toggle-showing').
- 
- * Menu:
- 
- * Viewing::
- * Moving Around::
- 
-    ---------- Footnotes ----------
- 
-    (1)  If you want to see your old mail as well, use `M-r' to pull all
- your messages into mh-e.  Or, give a prefix argument to `mh-rmail' so
- it will prompt you for folder to visit like `M-f' (for example, `C-u
- M-x mh-rmail RET bob RET').  Both `M-r' and `M-f' are described in
- *Note Organizing::.
- 
- 
- File: mh-e,  Node: Viewing,  Next: Moving Around,  Prev: Reading Mail,  Up: Reading Mail
- 
- Viewing Your Mail
- -----------------
- 
-    The `RET' (`mh-show') command displays the message that the cursor
- is on.  If the message is already displayed, it scrolls to the
- beginning of the message.  Use SPC (`mh-page-msg') and DEL
- (`mh-previous-page') to move forwards and backwards one page at a time
- through the message.  You can give either of these commands a prefix
- argument that specifies the number of lines to scroll (such as `10
- SPC').  mh-e normally hides a lot of the superfluous header fields that
- mailers add to a message, but if you wish to see all of them, use the
- `,' (comma; `mh-header-display') command.
- 
- * Menu:
- 
- * Reading Digests::
- * Reading MIME::
- 
- 
- File: mh-e,  Node: Reading Digests,  Next: Reading MIME,  Prev: Viewing,  Up: Viewing
- 
- Reading Digests
- ...............
- 
-    A digest is a message that contains other messages.  Special mh-e
- commands let you read digests conveniently.  You can use SPC and DEL to
- page through the digest as if it were a normal message, but if you wish
- to skip to the next message in the digest, use `M-SPC'
- (`mh-page-digest').  To return to a previous message, use `M-DEL'
- (`mh-page-digest-backwards').
- 
-    Another handy command is `M-b' (`mh-burst-digest').  This command
- uses the MH command `burst' to break out each message in the digest
- into its own message.  Using this command, you can quickly delete
- unwanted messages, like this: Once the digest is split up, toggle out
- of MH-Folder Show mode with `t' (*note Moving Around::.) so that the
- scan lines fill the screen and messages aren't displayed.  Then use `d'
- (*note Deleting::.) to quickly delete messages that you don't want to
- read (based on the `Subject:' header field).  You can also burst the
- digest to reply directly to the people who posted the messages in the
- digest.  One problem you may encounter is that the `From:' header
- fields are preceded with a `>' so that your reply can't create the
- `To:' field correctly.  In this case, you must correct the `To:' field
- yourself.  This is described later in *Note Editing Textual::.
- 
- 
- File: mh-e,  Node: Reading MIME,  Prev: Reading Digests,  Up: Viewing
- 
- Reading Multimedia Mail
- .......................
- 
-    MH has the ability to read "MIME" (Multipurpose Internet Mail
- Extensions) messages.  Unfortunately, mh-e does not yet have this
- ability, so you have to use the MH commands `show' or `mhn' from the
- shell to read MIME messages.  (1)
- 
-    ---------- Footnotes ----------
- 
-    (1)  You can call them directly from Emacs if you're running the X
- Window System: type `M-!  xterm -e mhn MESSAGE-NUMBER'.  You can leave
- out the `xterm -e' if you use `mhn -list' or `mhn -store'.
- 
- 
- File: mh-e,  Node: Moving Around,  Prev: Viewing,  Up: Reading Mail
- 
- Moving Around
- -------------
- 
-    To move on to the next message, use the `n'
- (`mh-next-undeleted-msg') command; use the `p'
- (`mh-previous-undeleted-msg') command to read the previous message.
- Both of these commands can be given a prefix argument to specify how
- many messages to skip (for example, `5 n').  You can also move to a
- specific message with `g' (`mh-goto-msg').  You can enter the message
- number either before or after typing `g'.  In the latter case, Emacs
- prompts you.  Finally, you can go to the first or last message with
- `M-<' (`mh-first-msg') and `M->' (`mh-last-msg') respectively.
- 
-    You can also use the Emacs commands `C-p' (`previous-line') and
- `C-n' (`next-line') to move up and down the scan lines in the MH-Folder
- window.  These commands can be used in conjunction with `RET' to look
- at deleted or refiled messages.
- 
-    The command `t' (`mh-toggle-showing') switches between MH-Folder
- mode and MH-Folder Show mode.  (1) MH-Folder mode turns off the
- associated show buffer so that you can perform operations on the
- messages quickly without reading them.  This is an excellent way to
- prune out your junk mail or to refile a group of messages to another
- folder for later examination.
- 
-    ---------- Footnotes ----------
- 
-    (1)  For you Emacs wizards, this is implemented as an Emacs minor
- mode.
- 
- 
- File: mh-e,  Node: Sending Mail,  Next: Draft Editing,  Prev: Reading Mail,  Up: Using mh-e
- 
- Sending Mail
- ============
- 
-    You can send a mail message in several ways.  You can call `M-x
- mh-smail' directly, or from the command line like this:
- 
-      % `emacs -f mh-smail'
- 
-    From within mh-e's MH-Folder mode, other methods of sending mail are
- available as well:
- 
- `m'
-      Compose a message (`mh-send').
- 
- `r'
-      Reply to a message (`mh-reply').
- 
- `f'
-      Forward message(s) (`mh-forward').
- 
- `M-d'
-      Redistribute a message (`mh-redistribute').
- 
- `M-e'
-      Edit a message that was bounced by mailer
-      (`mh-extract-rejected-mail').
- 
- `M-a'
-      Edit a message to send it again (`mh-edit-again').
- 
-    From within a MH-Folder buffer, you can simply use the command `m'
- (`mh-send').  However you invoke `mh-send', you are prompted for the
- `To:', `cc:', and `Subject:' header fields.  Once you've specified the
- recipients and subject, your message appears in an Emacs buffer whose
- mode is MH-Letter (see the Figure in *Note Sending Mail:: to see what
- the buffer looks like).  MH-Letter mode allows you to edit your
- message, to check the validity of the recipients, to insert other
- messages into your message, and to send the message.  We'll go more
- into depth about editing a "draft" (1) (a message you're composing) in
- just a moment.
- 
-    `mh-smail' always creates a two-window layout with the current
- buffer on top and the draft on the bottom.  If you would rather preserve
- the window layout, use `M-x mh-smail-other-window'.
- 
- * Menu:
- 
- * Replying::
- * Forwarding::
- * Redistributing::
- * Old Drafts::
- 
-    ---------- Footnotes ----------
- 
-    (1)  I highly recommend that you use a "draft folder" so that you
- can edit several drafts in parallel.  To do so, create a folder (e.g.,
- `+drafts'), and add a profile component called `Draft-Folder:' which
- contains `+drafts' (see `mh-profile'(5)).
- 
- 
- File: mh-e,  Node: Replying,  Next: Forwarding,  Prev: Sending Mail,  Up: Sending Mail
- 
- Replying to Mail
- ----------------
- 
-    To compose a reply to a message, use the `r' (`mh-reply') command.
- If you supply a prefix argument (as in `C-u r'), the message you are
- replying to is inserted in your reply after having first been run
- through `mhl' with the format file `mhl.reply'.  See `mhl'(1) to see
- how you can modify the default `mhl.reply' file.
- 
-    When you reply to a message, you are first prompted with `Reply to
- whom?'.  You have several choices here.
- 
-      Response     Reply Goes To
-      
-      `from'         The person who sent the message.  This is the default,
-                   so RET is sufficient.
-      
-      `to'           Replies to the sender, plus all recipients in the
-                   `To:' header field.
-      
-      `all'
-      `cc'           Forms a reply to the sender, plus all recipients.
- 
-    Depending on your answer, `repl' is given a different argument to
- form your reply.  Specifically, a choice of `from' or none at all runs
- `repl -nocc all', and a choice of `to' runs `repl -cc to'.  Finally,
- either `cc' or `all' runs `repl -cc all -nocc me'.
- 
-    Two windows are then created.  One window contains the message to
- which you are replying.  Your draft, in MH-Letter mode (described in
- *Note Draft Editing::), is in the other window.
- 
-    If you wish to customize the header or other parts of the reply
- draft, please see `repl'(1) and `mh-format'(5).
- 
- 
- File: mh-e,  Node: Forwarding,  Next: Redistributing,  Prev: Replying,  Up: Sending Mail
- 
- Forwarding Mail
- ---------------
- 
-    To forward a message, use the `f' (`mh-forward') command.  You are
- given a draft to edit that looks like it would if you had run the MH
- command `forw'.  You are given a chance to add some text (see *Note
- Draft Editing::).
- 
-    You can forward several messages by using a prefix argument; in this
- case, you are prompted for the name of a "sequence", a symbolic name
- that represents a list or range of message numbers (for example, `C-u f
- forbob RET').  All of the messages in the sequence are inserted into
- your draft.  By the way, although sequences are often mentioned in this
- chapter, you don't have to worry about them for now; the full
- description of sequences in mh-e is at the end in *Note Sequences::.
- To learn more about sequences in general, please see `mh-sequence'(5).
- 
- 
- File: mh-e,  Node: Redistributing,  Next: Old Drafts,  Prev: Forwarding,  Up: Sending Mail
- 
- Redistributing Your Mail
- ------------------------
- 
-    The command `M-d' (`mh-redistribute') is similar in function to
- forwarding mail, but it does not allow you to edit the message, nor does
- it add your name to the `From:' header field.  It appears to the
- recipient as if the message had come from the original sender.  For more
- information on redistributing messages, see `dist'(1).  Also
- investigate the `M-a' (`mh-edit-again') command in *Note Old Drafts::,
- for another way to redistribute messages.
- 
- 
- File: mh-e,  Node: Old Drafts,  Prev: Redistributing,  Up: Sending Mail
- 
- Editing Old Drafts and Bounced Messages
- ---------------------------------------
- 
-    If you don't complete a draft for one reason or another, and if the
- draft buffer is no longer available, you can pick your draft up again
- with `M-a' (`mh-edit-again').  If you don't use a draft folder, your
- last `draft' file will be used.  If you use draft folders, you'll need
- to visit the draft folder with `M-f drafts RET', use `n' to move to the
- appropriate message, and then use `M-a' to prepare the message for
- editing.
- 
-    The `M-a' command can also be used to take messages that were sent
- to you and to send them to more people.
- 
-    Don't use `M-a' to re-edit a message from a Mailer-Daemon who
- complained that your mail wasn't posted for some reason or another.  In
- this case, use `M-e' (`mh-extract-rejected-mail') to prepare the
- message for editing by removing the Mailer-Daemon envelope and unneeded
- header fields.  Fix whatever addressing problem you had, and send the
- message again with `C-c C-c'.
- 
- 
- File: mh-e,  Node: Draft Editing,  Next: Moving Mail,  Prev: Sending Mail,  Up: Using mh-e
- 
- Editing a Draft
- ===============
- 
-    When you edit a message that you want to send (called a "draft" in
- this case), the mode used is MH-Letter.  This mode provides several
- commands in addition to the normal Emacs editing commands to help you
- edit your draft.
- 
- `C-c C-y'
-      Insert contents of message to which you're replying
-      (`mh-yank-cur-msg').
- 
- `C-c C-i'
-      Insert a message from a folder (`mh-insert-letter').
- 
- `C-c C-f C-t'
-      Move to `To:' header field (`mh-to-field').
- 
- `C-c C-f C-c'
-      Move to `cc:' header field (`mh-to-field').
- 
- `C-c C-f C-s'
-      Move to `Subject:' header field (`mh-to-field').
- 
- `C-c C-f C-f'
-      Move to `From:' header field (`mh-to-field').
- 
- `C-c C-f C-b'
-      Move to `Bcc:' header field (`mh-to-field').
- 
- `C-c C-f C-f'
-      Move to `Fcc:' header field (`mh-to-fcc').
- 
- `C-c C-f C-d'
-      Move to `Dcc:' header field (`mh-to-field').
- 
- `C-c C-w'
-      Display expanded recipient list (`mh-check-whom').
- 
- `C-c C-s'
-      Insert signature in message (`mh-insert-signature').
- 
- `C-c C-m C-f'
-      Include forwarded message (MIME) (`mh-mhn-compose-forw').
- 
- `C-c C-m C-e'
-      Include anonymous ftp reference (MIME) (`mh-mhn-compose-anon-ftp').
- 
- `C-c C-m C-t'
-      Include anonymous ftp reference to compressed tar file (MIME)
-      (`mh-mhn-compose-external-compressed-tar').
- 
- `C-c C-m C-i'
-      Include binary, image, sound, etc. (MIME)
-      (`mh-mhn-compose-insertion').
- 
- `C-c C-e'
-      Run through `mhn' before sending (`mh-edit-mhn').
- 
- `C-c C-m C-u'
-      Undo effects of `mhn' (`mh-revert-mhn-edit').
- 
- `C-c C-c'
-      Save draft and send message (`mh-send-letter').
- 
- `C-c C-q'
-      Quit editing and delete draft message (`mh-fully-kill-draft').
- 
- * Menu:
- 
- * Editing Textual::
- * Editing MIME::
- * Sending Message::
- * Killing Draft::
- 
- 
- File: mh-e,  Node: Editing Textual,  Next: Editing MIME,  Prev: Draft Editing,  Up: Draft Editing
- 
- Editing Textual Messages
- ------------------------
- 
-    The following sections show you how to edit a draft.  The commands
- described here are also applicable to messages that have multimedia
- components.
- 
- * Menu:
- 
- * Inserting Letter::
- * Inserting Messages::
- * Header::
- * Recipients::
- * Signature::
- 
- 
- File: mh-e,  Node: Inserting Letter,  Next: Inserting Messages,  Prev: Editing Textual,  Up: Editing Textual
- 
- Inserting letter to which you're replying
- .........................................
- 
-    It is often useful to insert a snippet of text from a letter that
- someone mailed to provide some context for your reply.  The command
- `C-c C-y' (`mh-yank-cur-msg') does this by yanking a portion of text
- from the message to which you're replying and inserting `> ' before
- each line.
- 
-    You can control how much text is included when you run this command.
- If you run this command right away, without entering the buffer
- containing the message to you, this command will yank the entire
- message, as is, into your reply. (1) If you enter the buffer containing
- the message sent to you and move the cursor to a certain point and
- return to your reply and run `C-c C-y', then the text yanked will range
- from that point to the end of the message.  Finally, the most common
- action you'll perform is to enter the message sent to you, move the
- cursor to the beginning of a paragraph or phrase, set the "mark" with
- `C-SPC' or `C-@', and move the cursor to the end of the paragraph or
- phrase.  The cursor position is called the "point", and the space
- between the mark and point is called the "region".  Having done that,
- `C-c C-y' will insert the region you selected.
- 
-    ---------- Footnotes ----------
- 
-    (1)  If you'd rather have the header cleaned up, use `C-u r' instead
- of `r' when replying (see *Note Replying::).
- 
- 
- File: mh-e,  Node: Inserting Messages,  Next: Header,  Prev: Inserting Letter,  Up: Editing Textual
- 
- Inserting messages
- ..................
- 
-    Messages can be inserted with `C-c C-i' (`mh-insert-letter').  This
- command prompts you for the folder and message number and inserts the
- message, indented by `> '.  Certain undesirable header fields are
- removed before insertion.  If given a prefix argument (like `C-u C-c
- C-i'), the header is left intact, the message is not indented, and `> '
- is not inserted before each line.
- 
- 
- File: mh-e,  Node: Header,  Next: Recipients,  Prev: Inserting Messages,  Up: Editing Textual
- 
- Editing the header
- ..................
- 
-    Because the header is part of the message, you can edit the header
- fields as you wish.  However, several convenience functions exist to
- help you create and edit them.  For example, the command `C-c C-f C-t'
- (`mh-to-field'; alternatively, `C-c C-f t') moves the cursor to the
- `To:' header field, creating it if necessary.  The functions to move to
- the `cc:', `Subject:', `From:', `Bcc:', and `Dcc:' header fields are
- similar.
- 
-    One function behaves differently from the others, namely, `C-c C-f
- C-f' (`mh-to-fcc'; alternatively, `C-c C-f f').  This function will
- prompt you for the folder name in which to file a copy of the draft.
- 
-    Be sure to leave a row of dashes or a blank line between the header
- and the body of the message.
- 
- 
- File: mh-e,  Node: Recipients,  Next: Signature,  Prev: Header,  Up: Editing Textual
- 
- Checking recipients
- ...................
- 
-    The `C-c C-w' (`mh-check-whom') command expands aliases so you can
- check the actual address(es) in the alias.  A new buffer is created
- with the output of `whom'.
- 
- 
- File: mh-e,  Node: Signature,  Prev: Recipients,  Up: Editing Textual
- 
- Inserting your signature
- ........................
- 
-    You can insert your signature at the current cursor location with the
- `C-c C-s' (`mh-insert-signature') command.  The text of your signature
- is taken from the file `~/.signature'.
- 
- 
- File: mh-e,  Node: Editing MIME,  Next: Sending Message,  Prev: Editing Textual,  Up: Draft Editing
- 
- Editing Multimedia Messages
- ---------------------------
- 
-    mh-e has the capability to create multimedia messages.  It uses the
- MIME (Multipurpose Internet Mail Extensions) protocol.  The MIME
- protocol allows you to incorporate images, sound, video, binary files,
- and even commands that fetch a file with `ftp' when your recipient
- reads the message!  If you were to create a multimedia message with
- plain MH commands, you would use `mhn'.  Indeed, the mh-e MIME commands
- merely insert `mhn' directives which are later expanded by `mhn'.
- 
-    Each of the mh-e commands for editing multimedia messages or for
- incorporating multimedia objects is prefixed with `C-c C-m' .
- 
-    Several MIME objects are defined.  They are called "content types".
- The table in *Note Customizing Draft Editing:: contains a list of the
- content types that mh-e currently knows about.  Several of the mh-e
- commands fill in the content type for you, whereas others require you to
- enter one.  Most of the time, it should be obvious which one to use
- (e.g., use `image/jpeg' to include a JPEG image).  If not, you can
- refer to RFC 1521, (1) which defines the MIME protocol, for a list of
- valid content types.
- 
-    You are also sometimes asked for a "content description".  This is
- simply an optional brief phrase, in your own words, that describes the
- object.  If you don't care to enter a content description, just press
- return and none will be included; however, a reader may skip over
- multimedia fields unless the content description is compelling.
- 
-    Remember: you can always add `mhn' directives by hand.
- 
- * Menu:
- 
- * Forwarding MIME::
- * FTP::
- * Tar::
- * Other MIME Objects::
- * Sending MIME::
- 
-    ---------- Footnotes ----------
- 
-    (1)  This RFC (Request For Comments) is available via the URL
- `ftp://ds.internic.net/rfc/rfc1521.txt'.
- 
- 
- File: mh-e,  Node: Forwarding MIME,  Next: FTP,  Prev: Editing MIME,  Up: Editing MIME
- 
- Forwarding multimedia messages
- ..............................
- 
-    Mail may be forwarded with MIME using the command `C-c C-m C-f'
- (`mh-mhn-compose-forw').  You are prompted for a content description,
- the name of the folder in which the messages to forward are located,
- and the messages' numbers.
- 
- 
- File: mh-e,  Node: FTP,  Next: Tar,  Prev: Forwarding MIME,  Up: Editing MIME
- 
- Including an ftp reference
- ..........................
- 
-    You can even have your message initiate an `ftp' transfer when the
- recipient reads the message.  To do this, use the `C-c C-m C-e'
- (`mh-mhn-compose-anon-ftp') command.  You are prompted for the remote
- host and pathname, the content type, and the content description.
- 
- 
- File: mh-e,  Node: Tar,  Next: Other MIME Objects,  Prev: FTP,  Up: Editing MIME
- 
- Including tar files
- ...................
- 
-    If the remote file (*note FTP::.) is a compressed tar file, you can
- use `C-c C-m C-t' (`mh-mhn-compose-external-compressed-tar').  Then, in
- addition to retrieving the file via anonymous *ftp*, the file will also
- be uncompressed and untarred.  You are prompted for the remote host and
- pathname and the content description.  The pathname should contain at
- least one `/' (slash), because the pathname is broken up into directory
- and name components.
- 
- 
- File: mh-e,  Node: Other MIME Objects,  Next: Sending MIME,  Prev: Tar,  Up: Editing MIME
- 
- Including other multimedia objects
- ..................................
- 
-    Images, sound, and video can be inserted in your message with the
- `C-c C-m C-i' (`mh-mhn-compose-insertion') command.  You are prompted
- for the filename containing the object, the content type, and a content
- description of the object.
- 
- 
- File: mh-e,  Node: Sending MIME,  Prev: Other MIME Objects,  Up: Editing MIME
- 
- Readying multimedia messages for sending
- ........................................
- 
-    When you are finished editing a MIME message, it might look like
- this:
- 
-         3  24Aug  root               received fax files on Wed Aug 24 11:00:13
-         4+ 24Aug  To:wohler          Test<<This is a test message to get the wh
-      
-      
-      
-      
-      
-      --%%-{+inbox} 4 msgs (1-4)      (MH-Folder Show)--Bot-------------------
-      To: wohler
-      cc:
-      Subject: Test of MIME
-      --------
-      #@application/octet-stream [Nonexistent ftp test file] \
-      access-type=anon-ftp; site=berzerk.com; name=panacea.tar.gz; \
-      directory="/pub/"
-      #audio/basic [Test sound bite] /tmp/noise.au
-      --**-{draft}      (MH-Letter)--All--------------------------------------
-      mh-e MIME draft
- 
-    The lines added by the previous commands are `mhn' directives and
- need to be converted to MIME directives before sending.  This is
- accomplished by the command `C-c C-e' (`mh-edit-mhn'), which runs `mhn'
- on the message.  The following screen shows what those commands look
- like in full MIME format.  You can see why mail user agents are usually
- built to hide these details from the user.
- 
-      To: wohler
-      cc:
-      Subject: Test of MIME
-      MIME-Version: 1.0
-      Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
-      Content-ID: <1623.777796162.0@newt.com>
-      
-      ------- =_aaaaaaaaaa0
-      Content-Type: message/external-body; access-type="anon-ftp";
-              site="berzerk.com"; name="panacea.tar.gz"; directory="/pub/"
-      
-      Content-Type: application/octet-stream
-      Content-ID: <1623.777796162.1@newt.com>
-      Content-Description: Nonexistent ftp test file
-      
-      ------- =_aaaaaaaaaa0
-      Content-Type: audio/basic
-      Content-ID: <1623.777796162.2@newt.com>
-      Content-Description: Test sound bite
-      Content-Transfer-Encoding: base64
-      
-      Q3JlYXRpdmUgVm9pY2UgRmlsZRoaAAoBKREBQh8AgwCAgH9/f35+fn59fX5+fn5+f39/f39/f3
-      f4B/f39/f39/f39/f39/f39+f39+f39/f39/f4B/f39/fn5/f39/f3+Af39/f39/gH9/f39/fn
-      -----{draft}      (MH-Letter)--Top--------------------------------------
-      mh-e MIME draft ready to send
- 
-    This action can be undone by running `C-c C-m C-u'
- (`mh-revert-mhn-edit').  It does this by reverting to a backup file.
- You are prompted to confirm this action, but you can avoid the
- confirmation by adding an argument (for example, `C-u C-c C-m C-u').
- 
- 
- File: mh-e,  Node: Sending Message,  Next: Killing Draft,  Prev: Editing MIME,  Up: Draft Editing
- 
- Sending a Message
- -----------------
- 
-    When you are all through editing a message, you send it with the
- `C-c C-c' (`mh-send-letter') command.  You can give an argument (as in
- `C-u C-c C-c') to monitor the first stage of the delivery.
- 
- 
- File: mh-e,  Node: Killing Draft,  Prev: Sending Message,  Up: Draft Editing
- 
- Killing the Draft
- -----------------
- 
-    If for some reason you are not happy with the draft, you can kill it
- instead with `C-c C-q' (`mh-fully-kill-draft').  Emacs then kills the
- draft buffer and deletes the draft message.
- 
- 
- File: mh-e,  Node: Moving Mail,  Next: Searching,  Prev: Draft Editing,  Up: Using mh-e
- 
- Moving Your Mail Around
- =======================
- 
-    This section covers how messages and folders can be moved about or
- manipulated.  Messages may be incorporated into your `+inbox', deleted,
- and refiled.  Messages containing `shar' or `uuencode' output can be
- stored.  Folders can be visited, sorted, packed, or deleted.  Here's a
- list of the available commands to do these things:
- 
- `i'
-      Incorporate new mail into folder (`mh-inc-folder').
- 
- `d'
-      Delete message (`mh-delete-msg').
- 
- `C-d'
-      Delete message, don't move to next message
-      (`mh-delete-msg-no-motion').
- 
- `M-s'
-      Find messages that meet search criteria (`mh-search-folder').
- 
- `o'
-      Output (refile) message to folder (`mh-refile-msg').
- 
- `c'
-      Copy message to folder (`mh-copy-msg').
- 
- `C-o'
-      Output (write) message to file (`mh-write-msg-to-file').
- 
- `!'
-      Repeat last output command (`mh-refile-or-write-again').
- 
- `l'
-      Print message with `lpr' (`mh-print-msg').
- 
- `|'
-      Pipe message through shell command (`mh-pipe-msg').
- 
- `M-n'
-      Unpack message created with `uudecode' or `shar' (`mh-store-msg').
- 
- `M-l'
-      List all folders (`mh-list-folders').
- 
- `M-f'
-      Visit folder (`mh-visit-folder').
- 
- `M-r'
-      Regenerate scan lines (`mh-rescan-folder').
- 
- `M-x mh-sort-folder'
-      Sort folder.
- 
- `M-p'
-      Pack folder (`mh-pack-folder').
- 
- `M-k'
-      Remove folder (`mh-kill-folder').
- 
- `x'
-      Execute pending refiles and deletes (`mh-execute-commands').
- 
- `u'
-      Undo pending refile or delete (`mh-undo').
- 
- `M-u'
-      Undo all pending refiles and deletes (`mh-undo-folder').
- 
- `q'
-      Quit (`mh-quit').
- 
- * Menu:
- 
- * Incorporating::
- * Deleting::
- * Organizing::
- * Printing::
- * Files and Pipes::
- * Finishing Up::
- 
- 
- File: mh-e,  Node: Incorporating,  Next: Deleting,  Prev: Moving Mail,  Up: Moving Mail
- 
- Incorporating Your Mail
- -----------------------
- 
-    If at any time you receive new mail, incorporate the new mail into
- your `+inbox' buffer with `i' (`mh-inc-folder').  Note that `i' will
- display the `+inbox' buffer, even if there isn't any new mail.  You can
- incorporate mail from any file into the current folder by specifying a
- prefix argument; you'll be prompted for the name of the file to use
- (for example, `C-u i ~/mbox RET').
- 
-    Emacs can notify you when you have new mail by displaying `Mail' in
- the mode line.  To enable this behavior, and to have a clock in the mode
- line besides, add the following to `~/.emacs':
- 
-      (display-time)
- 
- 
- File: mh-e,  Node: Deleting,  Next: Organizing,  Prev: Incorporating,  Up: Moving Mail
- 
- Deleting Your Mail
- ------------------
- 
-    To mark a message for deletion, use the `d' (`mh-delete-msg')
- command.  A `D' is placed by the message in the scan window, and the
- next message is displayed.  If the previous command had been `p', then
- the next message displayed is the message previous to the message just
- deleted.  If you specify a prefix argument, you will be prompted for a
- sequence (*note Sequences::.) to delete (for example, `C-u d frombob
- RET').  The `x' command actually carries out the deletion (*note
- Finishing Up::.).  `C-d' (`mh-delete-msg-no-motion') marks the message
- for deletion but leaves the cursor at the current message in case you
- wish to perform other operations on the message.
- 
- 
- File: mh-e,  Node: Organizing,  Next: Printing,  Prev: Deleting,  Up: Moving Mail
- 
- Organizing Your Mail with Folders
- ---------------------------------
- 
-    mh-e has analogies for each of the MH `folder' and `refile'
- commands.  To refile a message in another folder, use the `o'
- (`mh-refile-msg') (mnemonic: "output") command.  You are prompted for
- the folder name.
- 
-    If you are refiling several messages into the same folder, you can
- use the `!' (`mh-refile-or-write-again') command to repeat the last
- refile or write (see the description of `C-o' in *Note Files and
- Pipes::).  Or, place the messages into a sequence (*Note Sequences::)
- and specify a prefix argument to `o', in which case you'll be prompted
- for the name of the sequence (for example, `C-u o search RET').
- 
-    If you wish to copy a message to another folder, you can use the `c'
- (`mh-copy-msg') command (see the `-link' argument to `refile'(1)).  You
- are prompted for a folder, and you can specify a prefix argument if you
- want to copy a sequence into another folder.  In this case, you are
- then prompted for the sequence.  Note that unlike the `o' command, the
- copy takes place immediately.  The original copy remains in the current
- folder.
- 
-    When you want to read the messages that you have refiled into
- folders, use the `M-f' (`mh-visit-folder') command to visit the folder.
- You are prompted for the folder name.
- 
-    Other commands you can perform on folders include: `M-l'
- (`mh-list-folders'), to list all the folders in your mail directory;
- `M-k' (`mh-kill-folder'), to remove a folder; `M-x mh-sort-folder', to
- sort the messages by date (see `sortm'(1) to see how to sort by other
- criteria); `M-p' (`mh-pack-folder'), to pack a folder, removing gaps
- from the numbering sequence; and `M-r' (`mh-rescan-folder'), to rescan
- the folder, which is useful to grab all messages in your `+inbox' after
- processing your new mail for the first time.  If you don't want to
- rescan the entire folder, give `M-r' or `M-p' a prefix argument and
- you'll be prompted for a range of messages to display (for instance,
- `C-u M-r last:50 RET').
- 
--- 0 ----
Index: emacs/info/mh-e-2
diff -c emacs/info/mh-e-2:1.1.1.1 emacs/info/mh-e-2:removed
*** emacs/info/mh-e-2:1.1.1.1	Mon Jul 22 01:52:54 1996
--- emacs/info/mh-e-2	Fri Aug  2 20:22:32 1996
***************
*** 1,1179 ****
- This is Info file ../info/mh-e, produced by Makeinfo-1.55 from the
- input file mh-e.texi.
- 
-    This is Edition 1.1, last updated 26 April 1995, of `mh-e, The Emacs
- Interface to MH', for mh-e, Version 5.0.1.
- 
-    Copyright 1995 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "Copying" is included exactly as in the
- original, and provided that the entire resulting derived work is
- distributed under the terms of a permission notice identical to this
- one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that this permission notice may be stated in a
- translation approved by the Free Software Foundation.
- 
- 
- File: mh-e,  Node: Printing,  Next: Files and Pipes,  Prev: Organizing,  Up: Moving Mail
- 
- Printing Your Mail
- ------------------
- 
-    Printing mail is simple.  Enter `l' (`mh-print-msg') (for line
- printer or lpr).  The message is formatted with `mhl' and printed with
- the `lpr' command.  You can print all the messages in a sequence by
- specifying a prefix argument, in which case you are prompted for the
- name of the sequence (as in `C-u l frombob RET').
- 
- 
- File: mh-e,  Node: Files and Pipes,  Next: Finishing Up,  Prev: Printing,  Up: Moving Mail
- 
- Files and Pipes
- ---------------
- 
-    mh-e does offer a couple of commands that are not a part of MH.  The
- first one, `C-o' (`mh-write-msg-to-file'), writes a message to a file
- (think of the `o' as in "output").  You are prompted for the filename.
- If the file already exists, the message is appended to it.  You can
- also write the message to the file without the header by specifying a
- prefix argument (such as `C-u C-o /tmp/foobar RET').  Subsequent writes
- to the same file can be made with the `!' command.
- 
-    You can also pipe the message through a Unix shell command with the
- `|' (`mh-pipe-msg') command.  You are prompted for the Unix command
- through which you wish to run your message.  If you give an argument to
- this command, the message header is included in the text passed to the
- command (the contrived example `C-u | lpr' would be done with the `l'
- command instead).
- 
-    If the message is a shell archive `shar' or has been run through
- `uuencode' use `M-n' (`mh-store-msg') to extract the body of the
- message.  The default directory for extraction is the current
- directory, and you have a chance to specify a different extraction
- directory.  The next time you use this command, the default directory is
- the last directory you used.
- 
- 
- File: mh-e,  Node: Finishing Up,  Prev: Files and Pipes,  Up: Moving Mail
- 
- Finishing Up
- ------------
- 
-    If you've deleted a message or refiled it, but changed your mind, you
- can cancel the action before you've executed it.  Use `u' (`mh-undo')
- to undo a refile on or deletion of a single message.  You can also undo
- refiles and deletes for messages that belong to a given sequence by
- specifying a prefix argument.  You'll be prompted for the name of the
- sequence (as in `C-u u frombob RET').  Alternatively, you can use `M-u'
- (`mh-undo-folder') to undo all refiles or deletes in the current folder.
- 
-    If you've marked messages to be deleted or refiled and you want to go
- ahead and delete or refile the messages, use `x'
- (`mh-execute-commands').  Many mh-e commands that may affect the
- numbering of the messages (such as `M-r' or `M-p') will ask if you want
- to process refiles or deletes first and then either run `x' for you or
- undo the pending refiles and deletes, which are lost.
- 
-    When you want to quit using mh-e and go back to editing, you can use
- the `q' (`mh-quit') command.  This buries the buffers of the current
- mh-e folder and restores the buffers that were present when you first
- ran `M-x mh-rmail'.  You can later restore your mh-e session by
- selecting the `+inbox' buffer or by running `M-x mh-rmail' again.
- 
- 
- File: mh-e,  Node: Searching,  Next: Sequences,  Prev: Moving Mail,  Up: Using mh-e
- 
- Searching Through Messages
- ==========================
- 
-    You can search a folder for messages to or from a particular person
- or about a particular subject.  In fact, you can also search for
- messages containing selected strings in any arbitrary header field or
- any string found within the messages.  Use the `M-s'
- (`mh-search-folder') command.  You are first prompted for the name of
- the folder to search and then placed in the following buffer in MH-Pick
- mode:
- 
-      From: #
-      To:
-      Cc:
-      Date:
-      Subject:
-      --------
-      
-      
-      
-      
-      
-      
-      
-      
-      
-      --**-Emacs: pick-pattern    (MH-Pick)------All----------------------------
-      Pick window
- 
-    Edit this template by entering your search criteria in an appropriate
- header field that is already there, or create a new field yourself.  If
- the string you're looking for could be anywhere in a message, then place
- the string underneath the row of dashes.  The `M-s' command uses the MH
- command `pick' to do the real work, so read `pick'(1) to find out more
- about how to enter the criteria.
- 
-    There are no semantics associated with the search criteria--they are
- simply treated as strings.  Case is ignored when all lowercase is used,
- and regular expressions (a la `ed') are available.  It is all right to
- specify several search criteria.  What happens then is that a logical
- *and* of the various fields is performed.  If you prefer a logical *or*
- operation, run `M-s' multiple times.
- 
-    As an example, let's say that we want to find messages from Ginnean
- about horseback riding in the Kosciusko National Park (Australia) during
- January, 1994.  Normally we would start with a broad search and narrow
- it down if necessary to produce a manageable amount of data, but we'll
- cut to the chase and create a fairly restrictive set of criteria as
- follows:
- 
-      From: ginnean
-      To:
-      Cc:
-      Date: Jan 1994
-      Subject: horse.*kosciusko
-      --------
- 
-    As with MH-Letter mode, MH-Pick provides commands like `C-c C-f C-t'
- to help you fill in the blanks.
- 
- `C-c C-f C-t'
-      Move to `To:' header field (`mh-to-field').
- 
- `C-c C-f C-c'
-      Move to `cc:' header field (`mh-to-field').
- 
- `C-c C-f C-s'
-      Move to `Subject:' header field (`mh-to-field').
- 
- `C-c C-f C-f'
-      Move to `From:' header field (`mh-to-field').
- 
- `C-c C-f C-b'
-      Move to `Bcc:' header field (`mh-to-field').
- 
- `C-c C-f C-f'
-      Move to `Fcc:' header field (`mh-to-field').
- 
- `C-c C-f C-d'
-      Move to `Dcc:' header field (`mh-to-field').
- 
- `C-c C-c'
-      Execute the search (`mh-do-pick-search').
- 
-    To perform the search, type `C-c C-c' (`mh-do-pick-search').  The
- selected messages are placed in the search sequence, which you can use
- later in forwarding (*note Forwarding::.), printing (*note
- Printing::.), or narrowing your field of view (*note Sequences::.).
- Subsequent searches are appended to the search sequence.  If, however,
- you wish to start with a clean slate, first delete the search sequence
- (how to do this is discussed in *Note Sequences::).
- 
-    If you're searching in a folder that is already displayed in a
- MH-Folder buffer, only those messages contained in the buffer are used
- for the search.  Therefore, if you want to search in all messages,
- first kill the folder's buffer with `C-x k' or scan the entire folder
- with `M-r'.
- 
- 
- File: mh-e,  Node: Sequences,  Next: Miscellaneous,  Prev: Searching,  Up: Using mh-e
- 
- Using Sequences
- ===============
- 
-    For the whole scoop on MH sequences, refer to `mh-sequence'(5).  As
- you've read, several of the mh-e commands can operate on a sequence,
- which is a shorthand for a range or group of messages.  For example, you
- might want to forward several messages to a friend or colleague.  Here's
- how to manipulate sequences.
- 
- `%'
-      Put message in a sequence (`mh-put-msg-in-seq').
- 
- `?'
-      Display sequences that message belongs to (`mh-msg-is-in-seq').
- 
- `M-q'
-      List all sequences in folder (`mh-list-sequences').
- 
- `M-%'
-      Remove message from sequence (`mh-delete-msg-from-seq').
- 
- `M-#'
-      Delete sequence (`mh-delete-seq').
- 
- `C-x n'
-      Restrict display to messages in sequence (`mh-narrow-to-seq').
- 
- `C-x w'
-      Remove restriction; display all messages (`mh-widen').
- 
- `M-x mh-update-sequences'
-      Push mh-e's state out to MH.
- 
-    To place a message in a sequence, use `%' (`mh-put-msg-in-seq') to
- do it manually, or use the MH command `pick' or the mh-e version of
- `pick' (*Note Searching::) which create a sequence automatically.  Give
- `%' a prefix argument and you can add all the messages in one sequence
- to another sequence (for example, `C-u % SourceSequence RET').
- 
-    Once you've placed some messages in a sequence, you may wish to
- narrow the field of view to just those messages in the sequence you've
- created.  To do this, use `C-x n' (`mh-narrow-to-seq').  You are
- prompted for the name of the sequence.  What this does is show only
- those messages that are in the selected sequence in the MH-Folder
- buffer.  In addition, it limits further mh-e searches to just those
- messages.  When you want to widen the view to all your messages again,
- use `C-x w' (`mh-widen').
- 
-    You can see which sequences a message is in with the `?'
- (`mh-msg-is-in-seq') command.  Or, you can list all sequences in a
- selected folder (default is current folder) with `M-q'
- (`mh-list-sequences').
- 
-    If you want to remove a message from a sequence, use `M-%'
- (`mh-delete-msg-from-seq'), and if you want to delete an entire
- sequence, use `M-#' (`mh-delete-seq').  In the latter case you are
- prompted for the sequence to delete.  Note that this deletes only the
- sequence, not the messages in the sequence.  If you want to delete the
- messages, use `C-u d' (see *Note Deleting:: above).
- 
-    Two sequences are maintained internally by mh-e and pushed out to MH
- when you type either the `x' or `q' command.  They are the sequence
- specified by your `Unseen-Sequence:' profile entry and cur.  However,
- you can also just update MH's state with the command `M-x
- mh-update-sequences'.  See *Note Customizing Viewing:: for an example
- of how this command might be used.
- 
-    With the exceptions of `C-x n' and `C-x w', the underlying MH
- command dealing with sequences is `mark'.
- 
- 
- File: mh-e,  Node: Miscellaneous,  Prev: Sequences,  Up: Using mh-e
- 
- Miscellaneous Commands
- ======================
- 
-    One other command worth noting is `M-x mh-version'.  Since there
- were a few changes in command letters between Versions 3 and 4, use
- this command to see which version you are running.  This command didn't
- exist before Version 4, so the message `[No match]' indicates that it's
- time to upgrade (*note Getting mh-e::.).  In the meantime, use the
- older commands that are listed in *Note Changes to mh-e::.  The output
- of `M-x mh-version' should also be included with any bug report you
- send (*note Bug Reports::.).
- 
- 
- File: mh-e,  Node: Customizing mh-e,  Next: Odds and Ends,  Prev: Using mh-e,  Up: Top
- 
- Customizing mh-e
- ****************
- 
-    Until now, we've talked about the mh-e commands as they work "out of
- the box."  Of course, it is also possible to reconfigure mh-e beyond
- recognition.  The following sections describe all of the customization
- variables, show the defaults, and make recommendations for
- customization.  The outline of this chapter is identical to that of
- *Note Using mh-e::, to make it easier to find the variables you'd need
- to modify to affect a particular command.
- 
-    However, when customizing your mail environment, first try to change
- what you want in MH, and only change mh-e if changing MH is not
- possible.  That way you will get the same behavior inside and outside
- GNU Emacs.  Note that mh-e does not provide hooks for customizations
- that can be done in MH; this omission is intentional.
- 
-    Many string or integer variables are easy enough to modify using
- Emacs Lisp.  Any such modifications should be placed in a file called
- `.emacs' in your home directory (that is, `~/.emacs').  For example, to
- modify the variable that controls printing, you could add:
- 
-      (setq mh-lpr-command-format "nenscript -G -r -2 -i'%s'")
- 
-    *Note Customizing Printing:: talks more about this variable.
- 
-    Variables can also hold Boolean values.  In Emacs Lisp, the Boolean
- values are `nil', which means false, and `t', which means true.
- Usually, variables are turned off by setting their value to `nil', as in
- 
-      (setq mh-bury-show-buffer nil)
- 
-    which keeps the MH-Show buffer at the top of the buffer stack.  To
- turn a variable on, you use
- 
-      (setq mh-bury-show-buffer t)
- 
-    which places the MH-Show buffer at the bottom of the buffer stack.
- However, the text says to turn on a variable by setting it to a
- *non-`nil'* value, because sometimes values other than `t' are
- meaningful (for example, see `mhl-formfile', described in *Note
- Customizing Viewing::).  Other variables, such as hooks, involve a
- little more Emacs Lisp programming expertise.
- 
-    You can also "preview" the effects of changing variables before
- committing the changes to `~/.emacs'.  Variables can be changed in the
- current Emacs session by using `M-x set-variable'.
- 
-    In general, "commands" in this text refer to Emacs Lisp functions.
- Programs outside of Emacs are specifically called MH commands, shell
- commands, or Unix commands.
- 
-    I hope I've included enough examples here to get you well on your
- way.  If you want to explore Emacs Lisp further, a programming manual
- does exist, (1) and you can look at the code itself for examples.  Look
- in the Emacs Lisp directory on your system (such as
- `/usr/local/lib/emacs/lisp') and find all the `mh-*.el' files there.
- When calling mh-e and other Emacs Lisp functions directly from Emacs
- Lisp code, you'll need to know the correct arguments.  Use the online
- help for this.  For example, try `C-h f mh-execute-commands RET'.  If
- you write your own functions, please do not prefix your symbols
- (variables and functions) with `mh-'.  This prefix is reserved for the
- mh-e package.  To avoid conflicts with existing mh-e symbols, use a
- prefix like `my-' or your initials.
- 
- * Menu:
- 
- * Customizing Reading::
- * Customizing Sending::
- * Customizing Draft Editing::
- * Customizing Moving Mail::
- * Customizing Searching::
- 
-    ---------- Footnotes ----------
- 
-    (1)  Perhaps you can find the online version of *Note The GNU Emacs
- Lisp Reference Manual: (elisp)Top.  If not, you can order a printed
- manual, which has the desirable side-effect of helping to support the
- Free Software Foundation which made all this great software available.
- You can find an order form by running `C-h C-d', or you can request an
- order form from gnu@prep.ai.mit.edu.
- 
- 
- File: mh-e,  Node: Customizing Reading,  Next: Customizing Sending,  Prev: Customizing mh-e,  Up: Customizing mh-e
- 
- Reading Your Mail
- =================
- 
-    I'll start out by including a function that I use as a front end to
- mh-e.  (1) It toggles between your working window configuration, which
- may be quite involved--windows filled with source, compilation output,
- man pages, and other documentation--and your mh-e window configuration.
- Like the rest of the customization described in this chapter, simply
- add the following code to `~/.emacs'.  Don't be intimidated by the size
- of this example; most customizations are only one line.
- 
-      Starting mh-e
-      
-      (defvar my-mh-screen-saved nil
-        "Set to non-`nil' when mh-e window configuration shown.")
-      (defvar my-normal-screen nil "Normal window configuration.")
-      (defvar my-mh-screen nil "mh-e window configuration.")
-      
-      (defun my-mh-rmail (&optional arg)
-        "Toggle between mh-e and normal screen configurations.
-      With non-`nil' or prefix argument, inc mailbox as well
-      when going into mail."
-        (interactive "P")                 ; user callable function, P=prefix arg
-        (setq my-mh-screen-saved          ; save state
-              (cond
-               ;; Bring up mh-e screen if arg or normal window configuration.
-               ;; If arg or +inbox buffer doesn't exist, run mh-rmail.
-               ((or arg (null my-mh-screen-saved))
-                (setq my-normal-screen (current-window-configuration))
-                (if (or arg (null (get-buffer "+inbox")))
-                    (mh-rmail)
-                  (set-window-configuration my-mh-screen))
-                t)                        ; set my-mh-screen-saved to `t'
-               ;; Otherwise, save mh-e screen and restore normal screen.
-               (t
-                (setq my-mh-screen (current-window-configuration))
-                (set-window-configuration my-normal-screen)
-                nil))))                   ; set my-mh-screen-saved to nil
-      
-      (global-set-key "\C-x\r" 'my-mh-rmail)  ; call with C-x RET
- 
-    If you type an argument (`C-u') or if `my-mh-screen-saved' is `nil'
- (meaning a non-mh-e window configuration), the current window
- configuration is saved, either +inbox is displayed or `mh-rmail' is
- run, and the mh-e window configuration is shown.  Otherwise, the mh-e
- window configuration is saved and the original configuration is
- displayed.
- 
-    Now to configure mh-e.  The following table lists general mh-e
- variables and variables that are used while reading mail.
- 
- `mh-progs'
-      Directory containing MH programs (default: dynamic).
- 
- `mh-lib'
-      Directory containing MH support files and programs (default:
-      dynamic).
- 
- `mh-do-not-confirm'
-      Don't confirm on non-reversible commands (default: `nil').
- 
- `mh-summary-height'
-      Number of scan lines to show (includes mode line) (default: 4).
- 
- `mh-folder-mode-hook'
-      Functions to run in MH-Folder mode (default: `nil').
- 
- `mh-clean-message-header'
-      Remove extraneous headers (default: `nil').
- 
- `mh-invisible-headers'
-      Headers to hide (default: `"^Received: \\| ^Message-Id: \\|
-      ^Remailed-\\| ^Via: \\| ^Mail-from: \\| ^Return-Path: \\|
-      ^In-Reply-To: \\| ^Resent-"').
- 
- `mh-visible-headers'
-      Headers to display (default: `nil').
- 
- `mhl-formfile'
-      Format file for `mhl' (default: `nil').
- 
- `mh-show-hook'
-      Functions to run when showing message (default: `nil').
- 
- `mh-show-mode-hook'
-      Functions to run when showing message (default: `nil').
- 
- `mh-bury-show-buffer'
-      Leave show buffer at bottom of stack (default: `t').
- 
- `mh-show-buffer-mode-line-buffer-id'
-      Name of show buffer in mode line (default: `"{show-%s} %d"').
- 
-    The two variables `mh-progs' and `mh-lib' are used to tell mh-e
- where the MH programs and supporting files are kept, respectively.
- mh-e does try to figure out where they are kept for itself by looking in
- common places and in the user's `PATH' environment variable, but if it
- cannot find the directories, or finds the wrong ones, you should set
- these variables.  The name of the directory should be placed in double
- quotes, and there should be a trailing slash (`/').  See the example in
- *Note Getting Started::.
- 
-    If you never make mistakes, and you do not like confirmations for
- your actions, you can set `mh-do-not-confirm' to a non-`nil' value to
- disable confirmation for unrecoverable commands such as `M-k'
- (`mh-kill-folder') and `M-u' (`mh-undo-folder').  Here's how you set
- boolean values:
- 
-      (setq mh-do-not-confirm t)
- 
-    The variable `mh-summary-height' controls the number of scan lines
- displayed in the MH-Folder window, including the mode line.  The
- default value of 4 means that 3 scan lines are displayed.  Here's how
- you set numerical values:
- 
-      (setq mh-summary-height 2)              ; only show the current scan line
- 
-    Normally the buffer for displaying messages is buried at the bottom
- at the buffer stack.  You may wish to disable this feature by setting
- `mh-bury-show-buffer' to `nil'.  One advantage of not burying the show
- buffer is that one can delete the show buffer more easily in an
- electric buffer list because of its proximity to its associated
- MH-Folder buffer.  Try running `M-x electric-buffer-list' to see what I
- mean.
- 
-    The hook `mh-folder-mode-hook' is called when a new folder is
- created with MH-Folder mode.  This could be used to set your own key
- bindings, for example:
- 
-      Create additional key bindings via mh-folder-mode-hook
-      
-      (defvar my-mh-init-done nil "Non-`nil' when one-time mh-e settings made.")
-      
-      (defun my-mh-folder-mode-hook ()
-        "Hook to set key bindings in MH-Folder mode."
-        (if (not my-mh-init-done)             ; only need to bind the keys once 
-            (progn
-              (local-set-key "/" 'search-msg)
-              (local-set-key "b" 'mh-burst-digest)    ; better use of `b'
-              (setq my-mh-init-done t))))
-      
-      ;;; Emacs 19
-      (add-hook 'mh-folder-mode-hook 'my-mh-folder-mode-hook)
-      ;;; Emacs 18
-      ;;;   (setq mh-folder-mode-hook (cons 'my-mh-folder-mode-hook
-      ;;;                               mh-folder-mode-hook))
-      
-      (defun search-msg ()
-        "Search for a regexp in the current message."
-        (interactive)                         ; user function
-        (save-window-excursion
-          (other-window 1)                    ; go to next window
-          (isearch-forward-regexp)))          ; string search; hit return (ESC
-                                              ;   in Emacs 18) when done
- 
- * Menu:
- 
- * Customizing Viewing::
- * Customizing Moving Around::
- 
-    ---------- Footnotes ----------
- 
-    (1)  Stephen Gildea's favorite binding is `(global-set-key "\C-cr"
- 'mh-rmail)'.
- 
- 
- File: mh-e,  Node: Customizing Viewing,  Next: Customizing Moving Around,  Prev: Customizing Reading,  Up: Customizing Reading
- 
- Viewing Your Mail
- -----------------
- 
-    Several variables control what displayed messages look like.
- Normally messages are delivered with a handful of uninteresting header
- fields.  You can make them go away by setting `mh-clean-message-header'
- to a non-`nil' value.  The header can then be cleaned up in two ways.
- By default, the header fields in `mh-invisible-headers' are removed.
- On the other hand, you could set `mh-visible-headers' to the fields
- that you would like to see.  If this variable is set,
- `mh-invisible-headers' is ignored.  I suggest that you not set
- `mh-visible-headers' since if you use this variable, you might miss a
- lot of header fields that you'd rather not miss.  As an example of how
- to set a string variable, `mh-visible-headers' can be set to show a
- minimum set of header fields (see (*Note Syntax of Regular Expressions:
- (emacs)Regexps, for a description of the special characters in this
- string):
- 
-      (setq mh-visible-headers "^From: \\|^Subject: \\|^Date: ")
- 
-    Normally mh-e takes care of displaying messages itself (rather than
- calling an MH program to do the work).  If you'd rather have `mhl'
- display the message (within mh-e), set the variable `mhl-formfile' to a
- non-`nil' value.  You can set this variable either to `t' to use the
- default format file or to a filename if you have your own format file
- (`mhl'(1) tells you how to write one).  When writing your own format
- file, use a nonzero value for `overflowoffset' to ensure the header is
- RFC 822 compliant and parseable by mh-e.  `mhl' is always used for
- printing and forwarding; in this case, the value of `mhl-formfile' is
- consulted if it is a filename.
- 
-    Two hooks can be used to control how messages are displayed.  The
- first hook, `mh-show-mode-hook', is called early on in the process of
- displaying of messages.  It is used to perform some actions on the
- contents of messages, such as highlighting the header fields.  If you're
- running Emacs 19 under the X Window System, the following example will
- highlight the `From:' and `Subject:' header fields.  This is a very
- nice feature indeed.
- 
-      Emphasize header fields in different fonts via mh-show-mode-hook
-      
-      (defvar my-mh-keywords
-         '(("^From: \\(.*\\)" 1 'bold t)
-           ("^Subject: \\(.*\\)" 1 'highlight t))
-        "mh-e additions for font-lock-keywords.")
-      
-      (defun my-mh-show-mode-hook ()
-        "Hook to turn on and customize fonts."
-        (require 'font-lock)                 ; for font-lock-keywords below
-        (make-local-variable 'font-lock-mode-hook) ; don't affect other buffers
-        (add-hook 'font-lock-mode-hook       ; set a hook with inline function
-                  (function                  ; modifies font-lock-keywords when
-                   (lambda ()                ; font-lock-mode run
-                     (setq font-lock-keywords
-                           (append my-mh-keywords font-lock-keywords)))))
-        (font-lock-mode 1))                  ; change the typefaces
-      
-      (if window-system                      ; can't do this on ASCII terminal
-          (add-hook 'mh-show-mode-hook 'my-mh-show-mode-hook))
- 
-    The second hook, `mh-show-hook', is the last thing called after
- messages are displayed.  It's used to affect the behavior of mh-e in
- general or when `mh-show-mode-hook' is too early.  For example, if you
- wanted to keep mh-e in sync with MH, you could use `mh-show-hook' as
- follows:
- 
-      (add-hook 'mh-show-hook 'mh-update-sequences)
- 
-    The function `mh-update-sequences' is documented in *Note Finishing
- Up::.  For those who like to modify their mode lines, use
- `mh-show-buffer-mode-line-buffer-id' to modify the mode line in the
- MH-Show buffers.  Place the two escape strings `%s' and `%d', which
- will display the folder name and the message number, respectively,
- somewhere in the string in that order.  The default value of
- `"{show-%s} %d"' yields a mode line of
- 
-      -----{show-+inbox} 4      (MH-Show)--Bot----------------------------------
- 
- 
- File: mh-e,  Node: Customizing Moving Around,  Prev: Customizing Viewing,  Up: Customizing Reading
- 
- Moving Around
- -------------
- 
-    When you use `t' (`mh-toggle-showing') to toggle between show mode
- and scan mode, the MH-Show buffer is hidden and the MH-Folder buffer is
- left alone.  Setting `mh-recenter-summary-p' to a non-`nil' value
- causes the toggle to display as many scan lines as possible, with the
- cursor at the middle.  The effect of `mh-recenter-summary-p' is rather
- useful, but it can be annoying on a slow network connection.
- 
- 
- File: mh-e,  Node: Customizing Sending,  Next: Customizing Draft Editing,  Prev: Customizing Reading,  Up: Customizing mh-e
- 
- Sending Mail
- ============
- 
-    You may wish to start off by adding the following useful key
- bindings to your `.emacs' file:
- 
-      (global-set-key "\C-xm" 'mh-smail)
-      (global-set-key "\C-x4m" 'mh-smail-other-window)
- 
-    In addition, several variables are useful when sending mail or
- replying to mail.  They are summarized in the following table.
- 
- `mh-comp-formfile'
-      Format file for drafts (default: `"components"').
- 
- `mh-repl-formfile'
-      Format file for replies (default: `"replcomps"').
- 
- `mh-letter-mode-hook'
-      Functions to run in MH-Letter mode (default: `nil').
- 
- `mh-compose-letter-function'
-      Functions to run when starting a new draft (default: `nil').
- 
- `mh-reply-default-reply-to'
-      Whom reply goes to (default: `nil').
- 
- `mh-forward-subject-format'
-      Format string for forwarded message subject (default: `"%s: %s"').
- 
- `mh-redist-full-contents'
-      `send' requires entire message (default: `nil').
- 
- `mh-new-draft-cleaned-headers'
-      Remove these header fields from re-edited draft (default:
-      `"^Date:\\| ^Received:\\| ^Message-Id:\\| ^From:\\| ^Sender:\\|
-      ^Delivery-Date:\\| ^Return-Path:"').
- 
-    Since mh-e does not use `comp' to create the initial draft, you need
- to set `mh-comp-formfile' to the name of your components file if it
- isn't `components'.  This is the name of the file that contains the
- form for composing messages.  If it does not contain an absolute
- pathname, mh-e searches for the file first in your MH directory and
- then in the system MH library directory (such as `/usr/local/lib/mh').
- Replies, on the other hand, are built using `repl'.  You can change the
- location of the field file from the default of `replcomps' by modifying
- `mh-repl-formfile'.
- 
-    Two hooks are provided to run commands on your freshly created draft.
- The first hook, `mh-letter-mode-hook', allows you to do some processing
- before editing a letter.  For example, you may wish to modify the
- header after `repl' has done its work, or you may have a complicated
- `components' file and need to tell mh-e where the cursor should go.
- Here's an example of how you would use this hook--all of the other
- hooks are set in this fashion as well.
- 
-      Prepare draft for editing via mh-letter-mode-hook
-      
-      (defvar letter-mode-init-done nil
-        "Non-`nil' when one-time mh-e settings have made.")
-      
-      (defun my-mh-letter-mode-hook ()
-        "Hook to prepare letter for editing."
-        (if (not letter-mode-init-done)    ; only need to bind the keys once
-            (progn
-              (local-set-key "\C-ctb" 'add-enriched-text)
-              (local-set-key "\C-cti" 'add-enriched-text)
-              (local-set-key "\C-ctf" 'add-enriched-text)
-              (local-set-key "\C-cts" 'add-enriched-text)
-              (local-set-key "\C-ctB" 'add-enriched-text)
-              (local-set-key "\C-ctu" 'add-enriched-text)
-              (local-set-key "\C-ctc" 'add-enriched-text)
-              (setq letter-mode-init-done t)))
-        (setq fill-prefix "  ")            ; I find indented text easier to read
-        (save-excursion
-          (goto-char (point-max))          ; go to end of message to
-          (mh-insert-signature)))          ;   insert signature
-      
-      (add-hook 'mh-letter-mode-hook 'my-mh-letter-mode-hook)
- 
-    The function, `add-enriched-text' is defined in the example in *Note
- Customizing Editing MIME::.
- 
-    The second hook, a function really, is `mh-compose-letter-function'.
- Like `mh-letter-mode-hook', it is called just before editing a new
- message; however, it is the last function called before you edit your
- message.  The consequence of this is that you can write a function to
- write and send the message for you.  This function is passed three
- arguments: the contents of the `To:', `Subject:', and `cc:' header
- fields.
- 
- * Menu:
- 
- * Customizing Replying::
- * Customizing Forwarding::
- * Customizing Redistributing::
- * Customizing Old Drafts::
- 
- 
- File: mh-e,  Node: Customizing Replying,  Next: Customizing Forwarding,  Prev: Customizing Sending,  Up: Customizing Sending
- 
- Replying to Mail
- ----------------
- 
-    If you find that most of the time that you specify `cc' when you
- reply to a message, set `mh-reply-default-reply-to' to `cc'.  This
- variable is normally set to `nil' so that you are prompted for the
- recipient of a reply.  It can be set to one of `from', `to', or `cc';
- you are then no longer prompted for the recipient(s) of your reply.
- 
- 
- File: mh-e,  Node: Customizing Forwarding,  Next: Customizing Redistributing,  Prev: Customizing Replying,  Up: Customizing Sending
- 
- Forwarding Mail
- ---------------
- 
-    When forwarding a message, the format of the `Subject:' header field
- can be modified by the variable `mh-forward-subject-format'.  This
- variable is a string which includes two escapes (`%s').  The first `%s'
- is replaced with the sender of the original message, and the second one
- is replaced with the original `Subject:'.  The default value of `"%s:
- %s"' takes a message with the header:
- 
-      To: Bill Wohler <wohler@newt.com>
-      Subject: Re: 49er football
-      From: Greg DesBrisay <gd@cellnet.com>
- 
-    and creates a subject header field of:
- 
-      Subject: Greg DesBrisay: Re: 49er football
- 
- 
- File: mh-e,  Node: Customizing Redistributing,  Next: Customizing Old Drafts,  Prev: Customizing Forwarding,  Up: Customizing Sending
- 
- Redistributing Your Mail
- ------------------------
- 
-    The variable `mh-redist-full-contents' must be set to non-`nil' if
- `dist' requires the whole letter for redistribution, which is the case
- if `send' is compiled with the BERK (1)  option (which many people
- abhor).  If you find that MH will not allow you to redistribute a
- message that has been redistributed before, this variable should be set
- to `nil'.
- 
-    ---------- Footnotes ----------
- 
-    (1)  To see which options your copy of MH was compiled with, use
- `M-x mh-version' (*Note Miscellaneous::).
- 
- 
- File: mh-e,  Node: Customizing Old Drafts,  Prev: Customizing Redistributing,  Up: Customizing Sending
- 
- Editing Old Drafts and Bounced Messages
- ---------------------------------------
- 
-    The header fields specified by `mh-new-draft-cleaned-headers' are
- removed from an old draft that has been recreated with `M-e'
- (`mh-extract-rejected-mail') or `M-a' (`mh-edit-again').  If when you
- edit an old draft with these commands you find that there are header
- fields that you don't want included, you can append them to this
- variable.  For example,
- 
-      (setq mh-new-draft-cleaned-headers
-            (concat mh-new-draft-cleaned-headers "\\|^Some-Field:"))
- 
-    This appends the regular expression `\\|^Some-Field:' to the
- variable (*note Syntax of Regular Expressions: (emacs)Regexps.).  The
- `\\|' means *or*, and the `^' (caret) matches the beginning of the
- line.  This is done to be very specific about which fields match.  The
- literal `:' is appended for the same reason.
- 
- 
- File: mh-e,  Node: Customizing Draft Editing,  Next: Customizing Moving Mail,  Prev: Customizing Sending,  Up: Customizing mh-e
- 
- Editing a Draft
- ===============
- 
-    There are several variables used during the draft editing phase.
- Examples include changing the name of the file that holds your signature
- or telling mh-e about new multimedia types.  They are:
- 
- `mh-yank-from-start-of-msg'
-      How to yank when region not set (default: `t').
- 
- `mh-ins-buf-prefix'
-      Indent for yanked messages (default: `"> "').
- 
- `mail-citation-hook'
-      Functions to run on yanked messages (default: `nil').
- 
- `mh-delete-yanked-msg-window'
-      Delete message window on yank (default: `nil').
- 
- `mh-mime-content-types'
-      List of valid content types (default: `'(("text/plain")
-      ("text/richtext") ("multipart/mixed") ("multipart/alternative")
-      ("multipart/digest") ("multipart/parallel") ("message/rfc822")
-      ("message/partial") ("message/external-body")
-      ("application/octet-stream") ("application/postscript")
-      ("image/jpeg") ("image/gif") ("audio/basic") ("video/mpeg"))').
- 
- `mh-mhn-args'
-      Additional arguments for `mhn' (default: `nil').
- 
- `mh-signature-file-name'
-      File containing signature (default: `"~/.signature"').
- 
- `mh-before-send-letter-hook'
-      Functions to run before sending draft (default: `nil').
- 
- `mh-send-prog'
-      MH program used to send messages (default: `"send"').
- 
- * Menu:
- 
- * Customizing Editing Textual::
- * Customizing Editing MIME::
- * Customizing Sending Message::
- 
- 
- File: mh-e,  Node: Customizing Editing Textual,  Next: Customizing Editing MIME,  Prev: Customizing Draft Editing,  Up: Customizing Draft Editing
- 
- Editing Textual Messages
- ------------------------
- 
-    The following two sections include variables that customize the way
- you edit a draft.  The discussion here applies to editing multimedia
- messages as well.
- 
- * Menu:
- 
- * Customizing Inserting Letter::
- * Customizing Signature::
- 
- 
- File: mh-e,  Node: Customizing Inserting Letter,  Next: Customizing Signature,  Prev: Customizing Editing Textual,  Up: Customizing Editing Textual
- 
- Inserting letter to which you're replying
- .........................................
- 
-    To control how much of the message to which you are replying is
- yanked by `C-c C-y' (`mh-yank-cur-msg') into your reply, modify
- `mh-yank-from-start-of-msg'.  The default value of `t' means that the
- entire message is copied.  If it is set to `'body' (don't forget the
- apostrophe), then only the message body is copied.  If it is set to
- `nil', only the part of the message following point (the current cursor
- position in the message's buffer) is copied.  In any case, this
- variable is ignored if a region is set in the message you are replying
- to.  The string contained in `mh-ins-buf-prefix' is inserted before
- each line of a message that is inserted into a draft with `C-c C-y'
- (`mh-yank-cur-msg').  I suggest that you not modify this variable.  The
- default value of `"> "' is the default string for many mailers and news
- readers: messages are far easier to read if several included messages
- have all been indented by the same string.  The variable
- `mail-citation-hook' is `nil' by default, which means that when a
- message is inserted into the letter, each line is prefixed by
- `mh-ins-buf-prefix'.  Otherwise, it can be set to a function that
- modifies an included citation.  (1) If you like to yank all the text
- from the message you're replying to in one go, set
- `mh-delete-yanked-msg-window' to non-`nil' to delete the window
- containing the original message after yanking it to make more room on
- your screen for your reply.
- 
-    ---------- Footnotes ----------
- 
-    (1)  *Supercite* is an example of a full-bodied, full-featured
- citation package.  It is in Emacs versions 19.15 and later, and can be
- found via anonymous `ftp' on `archive.cis.ohio-state.edu' in
- `/pub/gnu/emacs/elisp-archive/packages/sc3.1.tar.Z'
- 
- 
- File: mh-e,  Node: Customizing Signature,  Prev: Customizing Inserting Letter,  Up: Customizing Editing Textual
- 
- Inserting your signature
- ........................
- 
-    You can change the name of the file inserted with `C-c C-s'
- (`mh-insert-signature') by changing `mh-signature-file-name' (default:
- `"~/.signature"').
- 
- 
- File: mh-e,  Node: Customizing Editing MIME,  Next: Customizing Sending Message,  Prev: Customizing Editing Textual,  Up: Customizing Draft Editing
- 
- Editing Multimedia Messages
- ---------------------------
- 
-    The variable `mh-mime-content-types' contains a list of the
- currently valid content types.  They are listed in the table in *Note
- Customizing Draft Editing::.  If you encounter a new content type, you
- can add it like this:
- 
-      (setq mh-mime-content-types (append mh-mime-content-types
-                                          '(("NEW/TYPE"))))
- 
-    Emacs macros can be used to insert enriched text directives like
- `<bold>'.  The following code will make, for example, `C-c t b' insert
- the `<bold>' directive.
- 
-      Emacs macros for entering enriched text
-      
-      (defvar enriched-text-types '(("b" . "bold") ("i" . "italic") ("f" . "fixed")
-                                    ("s" . "smaller") ("B" . "bigger")
-                                    ("u" . "underline") ("c" . "center"))
-        "Alist of (final-character . directive) choices for add-enriched-text.
-      Additional types can be found in RFC 1563.")
-      
-      (defun add-enriched-text (begin end)
-        "Add enriched text directives around region.
-      The directive used comes from the list enriched-text-types and is
-      specified by the last keystroke of the command.  When called from Lisp,
-      arguments are BEGIN and END."
-        (interactive "r")
-        ;; Set type to the directive indicated by the last keystroke.
-        (let ((type (cdr (assoc (char-to-string (logior last-input-char ?`))
-                                enriched-text-types))))
-          (save-restriction              ; restores state from narrow-to-region
-            (narrow-to-region begin end) ; narrow view to region
-            (goto-char (point-min))      ; move to beginning of text
-            (insert "<" type ">")        ; insert beginning directive
-            (goto-char (point-max))      ; move to end of text
-            (insert "</" type ">"))))    ; insert terminating directive
- 
-    To use the function `add-enriched-text', first create keybindings
- for it (*note Customizing Sending::.).  Then, set the mark with `C-@'
- or `C-SPC', type in the text to be highlighted, and type `C-c t b'.
- This adds `<bold>' where you set the mark and adds `</bold>' at the
- location of your cursor, giving you something like: `You should be
- <bold>very</bold>'.  You may also be interested in investigating
- `sgml-mode'.
- 
- * Menu:
- 
- * Customizing Sending MIME::
- 
- 
- File: mh-e,  Node: Customizing Sending MIME,  Prev: Customizing Editing MIME,  Up: Customizing Editing MIME
- 
- Readying multimedia messages for sending
- ........................................
- 
-    If you wish to pass additional arguments to `mhn' to affect how it
- builds your message, use the variable `mh-mhn-args'.  For example, you
- can build a consistency check into the message by setting `mh-mhn-args'
- to `-check'.  The recipient of your message can then run `mhn -check'
- on the message--`mhn' will complain if the message has been corrupted
- on the way.  The `C-c C-e' (`mh-mhn-edit') command only consults this
- variable when given a prefix argument.
- 
- 
- File: mh-e,  Node: Customizing Sending Message,  Prev: Customizing Editing MIME,  Up: Customizing Draft Editing
- 
- Sending a Message
- -----------------
- 
-    If you want to check your spelling in your message before sending,
- use `mh-before-send-letter-hook' like this:
- 
-    Spell-check message via mh-before-send-letter-hook
- 
-      (add-hook 'mh-before-send-letter-hook 'ispell-message)
- 
-    In case the MH `send' program is installed under a different name,
- use `mh-send-prog' to tell mh-e the name.
- 
- 
- File: mh-e,  Node: Customizing Moving Mail,  Next: Customizing Searching,  Prev: Customizing Draft Editing,  Up: Customizing mh-e
- 
- Moving Your Mail Around
- =======================
- 
-    If you change the name of some of the MH programs or have your own
- printing programs, the following variables can help you.  They are
- described in detail in the subsequent sections.
- 
- `mh-inc-prog'
-      Program to incorporate mail (default: `"inc"').
- 
- `mh-inc-folder-hook'
-      Functions to run when incorporating mail (default: `nil').
- 
- `mh-delete-msg-hook'
-      Functions to run when deleting messages (default: `nil').
- 
- `mh-print-background'
-      Print in foreground or background (default: `nil').
- 
- `mh-lpr-command-format'
-      Command used to print (default: `"lpr -J '%s'"').
- 
- `mh-default-folder-for-message-function'
-      Function to generate a default folder (default: `nil').
- 
- `mh-auto-folder-collect'
-      Collect folder names in background at startup (default: `t').
- 
- `mh-recursive-folders'
-      Collect nested folders (default: `nil').
- 
- `mh-refile-msg-hook'
-      Functions to run when refiling message (default: `nil').
- 
- `mh-store-default-directory'
-      Default directory for storing files created by `uuencode' or `shar'
-      (default: `nil').
- 
- `mh-sortm-args'
-      Additional arguments for `sortm' (default: `nil').
- 
- `mh-scan-prog'
-      Program to scan messages (default: `"scan"').
- 
- `mh-before-quit-hook'
-      Functions to run before quitting (default: `nil').  See also
-      `mh-quit-hook'.
- 
- `mh-quit-hook'
-      Functions to run after quitting (default: `nil'). See also
-      `mh-before-quit-hook'.
- 
- * Menu:
- 
- * Customizing Incorporating::
- * Customizing Deleting::
- * Customizing Organizing::
- * Customizing Printing::
- * Customizing Files and Pipes::
- * Customizing Finishing Up::
- 
- 
- File: mh-e,  Node: Customizing Incorporating,  Next: Customizing Deleting,  Prev: Customizing Moving Mail,  Up: Customizing Moving Mail
- 
- Incorporating Your Mail
- -----------------------
- 
-    The name of the program that incorporates new mail is stored in
- `mh-inc-prog'; it is `"inc"' by default.  This program generates a
- one-line summary for each of the new messages.  Unless it is an
- absolute pathname, the file is assumed to be in the `mh-progs'
- directory.  You may also link a file to `inc' that uses a different
- format (see `mh-profile'(5)).  You'll then need to modify several
- variables appropriately; see `mh-scan-prog' below.  You can set the
- hook `mh-inc-folder-hook', which is called after new mail is
- incorporated by the `i' (`mh-inc-folder') command.  A good use of this
- hook is to rescan the whole folder either after running `M-x mh-rmail'
- the first time or when you've changed the message numbers from outside
- of mh-e.
- 
-      Rescan folder after incorporating new mail via mh-inc-folder-hook
-      
-      (defun my-mh-inc-folder-hook ()
-        "Hook to rescan folder after incorporating mail."
-        (if (buffer-modified-p)            ; if outstanding refiles and deletes,
-            (mh-execute-commands))         ;   carry them out
-        (mh-rescan-folder)                 ; synchronize with +inbox
-        (mh-show))                         ; show the current message
-      
-      (add-hook 'mh-inc-folder-hook 'my-mh-inc-folder-hook)
- 
- 
- File: mh-e,  Node: Customizing Deleting,  Next: Customizing Organizing,  Prev: Customizing Incorporating,  Up: Customizing Moving Mail
- 
- Deleting Your Mail
- ------------------
- 
-    The hook `mh-delete-msg-hook' is called after you mark a message for
- deletion.  For example, the current maintainer of mh-e used this once
- when he kept statistics on his mail usage.
- 
- 
- File: mh-e,  Node: Customizing Organizing,  Next: Customizing Printing,  Prev: Customizing Deleting,  Up: Customizing Moving Mail
- 
- Organizing Your Mail with Folders
- ---------------------------------
- 
-    By default, operations on folders work only one level at a time.  Set
- `mh-recursive-folders' to non-`nil' to operate on all folders.  This
- mostly means that you'll be able to see all your folders when you press
- TAB when prompted for a folder name.  The variable
- `mh-auto-folder-collect' is normally turned on to generate a list of
- folder names in the background as soon as mh-e is loaded.  Otherwise,
- the list is generated when you need a folder name the first time (as
- with `o' (`mh-refile-msg')).  If you have a lot of folders and you have
- `mh-recursive-folders' set, this could take a while, which is why it's
- nice to do the folder collection in the background.
- 
-    The function `mh-default-folder-for-message-function' is used by `o'
- (`mh-refile-msg') and `C-c C-f C-f' (`mh-to-fcc') to generate a default
- folder.  The generated folder name should be a string with a `+' before
- it.  For each of my correspondents, I use the same name for both an
- alias and a folder.  So, I wrote a function that takes the address in
- the `From:' header field, finds it in my alias file, and returns the
- alias, which is used as a default folder name.  This is the most
- complicated example given here, and it demonstrates several features of
- Emacs Lisp programming.  You should be able to drop this into
- `~/.emacs', however.  If you use this to store messages in a subfolder
- of your Mail directory, you can modify the line that starts `(format
- +%s...'  and insert your subfolder after the folder symbol `+'.
- 
-      Creating useful default folder for refiling via mh-default-folder-for-message-function
-      
-      (defun my-mh-folder-from-address ()
-        "Determine folder name from address.
-      Takes the address in the From: header field, and returns its corresponding
-      alias from the user's personal aliases file. Returns `nil' if the address
-      was not found."
-        (require 'rfc822)                         ; for the rfc822 functions
-        (search-forward-regexp "^From: \\(.*\\)") ; grab header field contents
-        (save-excursion                     ; save state
-          (let ((addr (car (rfc822-addresses  ; get address
-                            (buffer-substring (match-beginning 1)
-                                              (match-end 1)))))
-                (buffer (get-buffer-create " *temp*")) ; set local variables
-                folder)
-            (set-buffer buffer)             ; jump to temporary buffer
-            (unwind-protect                 ; run kill-buffer when done
-                (progn                      ; function grouping construct
-                  (insert-file-contents (expand-file-name "aliases"
-                                                          mh-user-path))
-                  (goto-char (point-min))   ; grab aliases file and go to start
-                  (setq folder
-                        ;; Search for the given address, even commented-out
-                        ;; addresses are found!
-                        ;; The function search-forward-regexp sets values that are
-                        ;; later used by match-beginning and match-end.
-                        (if (search-forward-regexp (format "^;*\\(.*\\):.*%s"
-                                                           addr) nil t)
-                            ;; NOTE WELL: this is what the return value looks like.
-                            ;; You can modify the format string to match your own
-                            ;; Mail hierarchy.
-                            (format "+%s" (buffer-substring (match-beginning 1)
-                                                            (match-end 1))))))
-              (kill-buffer buffer))          ; get rid of our temporary buffer
-            folder)))                        ; function's return value
-      
-      (setq mh-default-folder-for-message-function 'my-mh-folder-from-address)
- 
-    The hook `mh-refile-msg-hook' is called after a message is marked to
- be refiled.
- 
-    The variable `mh-sortm-args' holds extra arguments to pass on to the
- `sortm' command.  Note: this variable is only consulted when a prefix
- argument is given to `M-x mh-sort-folder'.  It is used to override any
- arguments given in a `sortm:' entry in your MH profile
- (`~/.mh_profile').
- 
- * Menu:
- 
- * Customizing Scan Line Formats::
- 
--- 0 ----
Index: emacs/info/mh-e-3
diff -c emacs/info/mh-e-3:1.1.1.1 emacs/info/mh-e-3:removed
*** emacs/info/mh-e-3:1.1.1.1	Mon Jul 22 01:52:55 1996
--- emacs/info/mh-e-3	Fri Aug  2 20:23:11 1996
***************
*** 1,1049 ****
- This is Info file ../info/mh-e, produced by Makeinfo-1.55 from the
- input file mh-e.texi.
- 
-    This is Edition 1.1, last updated 26 April 1995, of `mh-e, The Emacs
- Interface to MH', for mh-e, Version 5.0.1.
- 
-    Copyright 1995 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "Copying" is included exactly as in the
- original, and provided that the entire resulting derived work is
- distributed under the terms of a permission notice identical to this
- one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that this permission notice may be stated in a
- translation approved by the Free Software Foundation.
- 
- 
- File: mh-e,  Node: Customizing Scan Line Formats,  Prev: Customizing Organizing,  Up: Customizing Organizing
- 
- Scan line formatting
- ....................
- 
-    The name of the program that generates a listing of one line per
- message is held in `mh-scan-prog' (default: `"scan"').  Unless this
- variable contains an absolute pathname, it is assumed to be in the
- `mh-progs' directory.  You may link another program to `scan' (see
- `mh-profile'(5)) to produce a different type of listing.
- 
-    If you change the format of the scan lines you'll need to tell mh-e
- how to parse the new format.  As you see, quite a lot of variables are
- involved to do that.  The first variable has to do with pruning out
- garbage.
- 
- `mh-valid-scan-line'
-      This regular expression describes a valid scan line.  This is used
-      to eliminate error messages that are occasionally produced by
-      `inc' or `scan' (default: `"^ *[0-9]"').
- 
-    Next, two variables control how the message numbers are parsed.
- 
- `mh-msg-number-regexp'
-      This regular expression is used to extract the message number from
-      a scan line.  Note that the message number must be placed in quoted
-      parentheses, (\\(...\\)), as in the default of `"^ *\\([0-9]+\\)"'.
- 
- `mh-msg-search-regexp'
-      Given a message number (which is inserted in `%d'), this regular
-      expression will match the scan line that it represents (default:
-      `"^[^0-9]*%d[^0-9]"').
- 
-    Finally, there are a slew of variables that control how mh-e marks up
- the scan lines.
- 
- `mh-cmd-note'
-      Number of characters to skip over before inserting notation
-      (default: 4).  Note how it relates to the following regular
-      expressions.
- 
- `mh-deleted-msg-regexp'
-      This regular expression describes deleted messages (default:
-      `"^....D"').  See also `mh-note-deleted'.
- 
- `mh-refiled-msg-regexp'
-      This regular expression describes refiled messages (default:
-      `"^....\\^"').  See also `mh-note-refiled'.
- 
- `mh-cur-scan-msg-regexp'
-      This regular expression matches the current message (default:
-      `"^....\\+"').  See also `mh-note-cur'.
- 
- `mh-good-msg-regexp'
-      This regular expression describes which messages should be shown
-      when mh-e goes to the next or previous message.  Normally, deleted
-      or refiled messages are skipped over (default: `"^....[^D^]"').
- 
- `mh-note-deleted'
-      Messages that have been deleted to are marked by this string
-      (default: `"D"').  See also `mh-deleted-msg-regexp'.
- 
- `mh-note-refiled'
-      Messages that have been refiled are marked by this string (default:
-      `"^"').  See also `mh-refiled-msg-regexp'.
- 
- `mh-note-copied'
-      Messages that have been copied are marked by this string (default:
-      `"C"').
- 
- `mh-note-cur'
-      The current message (in MH, not in mh-e) is marked by this string
-      (default: `"+"').  See also `mh-cur-scan-msg-regexp'.
- 
- `mh-note-repl'
-      Messages that have been replied to are marked by this string
-      (default: `"-"').
- 
- `mh-note-forw'
-      Messages that have been forwarded are marked by this string
-      (default: `"F"').
- 
- `mh-note-dist'
-      Messages that have been redistributed are marked by this string
-      (default: `"R"').
- 
- `mh-note-printed'
-      Messages that have been printed are marked by this string (default:
-      `"P"').
- 
- `mh-note-seq'
-      Messages in a sequence are marked by this string (default: `"%"').
- 
- 
- File: mh-e,  Node: Customizing Printing,  Next: Customizing Files and Pipes,  Prev: Customizing Organizing,  Up: Customizing Moving Mail
- 
- Printing Your Mail
- ------------------
- 
-    Normally messages are printed in the foreground.  If this is slow on
- your system, you may elect to set `mh-print-background' to non-`nil' to
- print in the background.  If you do this, do not delete the message
- until it is printed or else the output may be truncated.  The variable
- `mh-lpr-command-format' controls how the printing is actually done.
- The string can contain one escape, `%s', which is filled with the name
- of the folder and the message number and is useful for print job names.
- As an example, the default is `"lpr -J '%s'"'.
- 
- 
- File: mh-e,  Node: Customizing Files and Pipes,  Next: Customizing Finishing Up,  Prev: Customizing Printing,  Up: Customizing Moving Mail
- 
- Files and Pipes
- ---------------
- 
-    The initial directory for the `mh-store-msg' command is held in
- `mh-store-default-directory'.  Since I almost always run `mh-store-msg'
- on sources, I set it to my personal source directory like this:
- 
-      (setq mh-store-default-directory (expand-file-name "~/src/"))
- 
-    Subsequent incarnations of `mh-store-msg' offer the last directory
- used as the default.  By the way, `mh-store-msg' calls the Emacs Lisp
- function `mh-store-buffer'.  I mention this because you can use it
- directly if you're editing a buffer that contains a file that has been
- run through `uuencode' or `shar'.  For example, you can extract the
- contents of the current buffer in your home directory by typing `M-x
- mh-store-buffer RET ~ RET'.
- 
- 
- File: mh-e,  Node: Customizing Finishing Up,  Prev: Customizing Files and Pipes,  Up: Customizing Moving Mail
- 
- Finishing Up
- ------------
- 
-    The two variables `mh-before-quit-hook' and `mh-quit-hook' are
- called by `q' (`mh-quit').  The former one is called before the quit
- occurs, so you might use it to perform any mh-e operations; you could
- perform some query and abort the quit or call `mh-execute-commands',
- for example.  The latter is not run in an mh-e context, so you might
- use it to modify the window setup.
- 
- 
- File: mh-e,  Node: Customizing Searching,  Prev: Customizing Moving Mail,  Up: Customizing mh-e
- 
- Searching Through Messages
- ==========================
- 
-    If you find that you do the same thing over and over when editing the
- search template, you may wish to bind some shortcuts to keys.  This can
- be done with the variable `mh-pick-mode-hook', which is called when
- `M-s' (`mh-search-folder') is run on a new pattern.
- 
-    The string `mh-partial-folder-mode-line-annotation' is used to
- annotate the mode line when only a portion of the folder is shown.  For
- example, this will be displayed after running `M-s'
- (`mh-search-folder') to list messages based on some search criteria
- (see *Note Searching::).  The default annotation of `"select"' yields a
- mode line that looks like:
- 
-      --%%-{+inbox/select} 2 msgs (2-3)      (MH-Folder)--All-----------------
- 
- 
- File: mh-e,  Node: Odds and Ends,  Next: History,  Prev: Customizing mh-e,  Up: Top
- 
- Odds and Ends
- *************
- 
-    This appendix covers a few topics that don't fit elsewhere.  Here I
- tell you how to report bugs and how to get on the mh-e mailing list.  I
- also point out some additional sources of information.
- 
- * Menu:
- 
- * Bug Reports::
- * Mailing List::
- * MH FAQ::
- * Getting mh-e::
- 
- 
- File: mh-e,  Node: Bug Reports,  Next: Mailing List,  Prev: Odds and Ends,  Up: Odds and Ends
- 
- Bug Reports
- ===========
- 
-    The current maintainer of mh-e is Stephen Gildea
- <gildea@lcs.mit.edu>.  Please mail bug reports directly to him, as well
- as any praise or suggestions.  Please include the output of `M-x
- mh-version' (*note Miscellaneous::.) in any bug report you send.
- 
- 
- File: mh-e,  Node: Mailing List,  Next: MH FAQ,  Prev: Bug Reports,  Up: Odds and Ends
- 
- mh-e Mailing List
- =================
- 
-    There is a mailing list, mh-e@x.org, for discussion of mh-e and
- announcements of new versions.  Send a "subscribe" message to
- mh-e-request@x.org to be added.  Do not report bugs on this list; mail
- them directly to the maintainer (*note Bug Reports::.).
- 
- 
- File: mh-e,  Node: MH FAQ,  Next: Getting mh-e,  Prev: Mailing List,  Up: Odds and Ends
- 
- MH FAQ
- ======
- 
-    An FAQ appears monthly in the newsgroup `comp.mail.mh'.  While very
- little is there that deals with mh-e specifically, there is an
- incredible wealth of material about MH itself which you will find
- useful.  The subject of the FAQ is `MH Frequently Asked Questions (FAQ)
- with Answers'.
- 
-    The FAQ can be also obtained by anonymous `ftp' or via the World
- Wide Web (WWW).  It is located at:
- 
-      ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/mh-faq/part1
-      http://www.cis.ohio-state.edu/hypertext/faq/usenet/mail/mh-faq/part1/faq.html
- 
-    Otherwise, you can use mail.  Send mail to mail-server@rtfm.mit.edu
- containing the following:
- 
-      send usenet/news.answers/mail/mh-faq/part1
- 
- 
- File: mh-e,  Node: Getting mh-e,  Prev: MH FAQ,  Up: Odds and Ends
- 
- Getting mh-e
- ============
- 
-    If you're running a pre-4.0 version of mh-e, please consider
- upgrading.  You can either have your system administrator upgrade your
- Emacs, or just the files for mh-e.
- 
-    The MH distribution contains a copy of mh-e in `miscellany/mh-e'.
- Make sure it is at least Version 4.0.
- 
-    The latest version of mh-e can be obtained via anonymous `ftp' from
- `ftp.x.org'.  The file containing mh-e is currently
- `/misc/mh-e/mh-e-5.0.1.tar.Z'.  I suggest that you extract the files
- from `mh-e-5.0.1.tar.Z' in the following fashion:
- 
-      % `cd'                                  # Start in your home directory
-      % `mkdir lib lib/emacs'                 # Create directory for mh-e
-      % `cd lib/emacs'
-      % `zcat PATH/TO/mh-e-5.0.1.tar.Z | tar xvf -'    # Extract files
- 
-    To use these new files, add the following to `~/.emacs':
- 
-      (setq load-path (cons (expand-file-name "~/lib/emacs") load-path))
- 
-    That's it!  If you're already running Emacs, please quit that session
- and start again to load in the new mh-e.  Check that you're running the
- new version with the command `M-x mh-version' after running any mh-e
- command.  The distribution comes with a file called `MH-E-NEWS' so you
- can see what's new.
- 
- 
- File: mh-e,  Node: History,  Next: Changes to mh-e,  Prev: Odds and Ends,  Up: Top
- 
- History of mh-e
- ***************
- 
-    mh-e was originally written by Brian Reid in 1983 and has changed
- hands twice since then.  Jim Larus wanted to do something similar for
- GNU Emacs, and ended up completely rewriting it that same year.  In
- 1989, Stephen Gildea picked it up and is now currently improving and
- maintaining it.
- 
- * Menu:
- 
- * From Brian Reid::
- * From Jim Larus::
- * From Stephen Gildea::
- 
- 
- File: mh-e,  Node: From Brian Reid,  Next: From Jim Larus,  Prev: History,  Up: History
- 
- From Brian Reid
- ===============
- 
-    One day in 1983 I got the flu and had to stay home from work for
- three days with nothing to do.  I used that time to write MHE.  The
- fundamental idea behind MHE was that it was a "puppeteer" driving the MH
- programs underneath it.  MH had a model that the editor was supposed to
- run as a subprocess of the mailer, which seemed to me at the time to be
- the tail wagging the dog.  So I turned it around and made the editor
- drive the MH programs.  I made sure that the UCI people (who were
- maintaining MH at the time) took in my changes and made them stick.
- 
-    Today, I still use my own version of MHE because I don't at all like
- the way that GNU mh-e works and I've never gotten to be good enough at
- hacking Emacs Lisp to make GNU mh-e do what I want.  The Gosling-emacs
- version of MHE and the GNU Emacs version of mh-e have almost nothing in
- common except similar names.  They work differently, have different
- conceptual models, and have different key bindings.  (1)
- 
-    Brian Reid, June 1994
- 
-    ---------- Footnotes ----------
- 
-    (1)  After reading this article, I questioned Brian about his
- version of MHE, and received some great ideas for improving mh-e such
- as a dired-like method of selecting folders; and removing the prompting
- when sending mail, filling in the blanks in the draft buffer instead.
- I passed them on to Stephen Gildea, the current maintainer, and he was
- excited about the ideas as well.  Perhaps one day, mh-e will again
- resemble MHE, although none of these ideas are manifest in Version 5.0.
- 
- 
- File: mh-e,  Node: From Jim Larus,  Next: From Stephen Gildea,  Prev: From Brian Reid,  Up: History
- 
- From Jim Larus
- ==============
- 
-    Brian Reid, while at CMU or shortly after going to Stanford wrote a
- mail reading program called MHE for Gosling Emacs.  It had much the same
- structure as mh-e (i.e., invoked MH programs), though it was simpler and
- the commands were slightly different.  Unfortunately, I no longer have a
- copy so the differences are lost in the mists of time.
- 
-    In '82-83, I was working at BBN and wrote a lot of mlisp code in
- Gosling Emacs to make it look more like Tennex Emacs.  One of the
- packages that I picked up and improved was Reid's mail system.  In '83,
- I went back to Berkeley.  About that time, Stallman's first version of
- GNU Emacs came out and people started to move to it from Gosling Emacs
- (as I recall, the transition took a year or two).  I decided to port
- Reid's MHE and used the mlisp to Emacs Lisp translator that came with
- GNU Emacs.  It did a lousy job and the resulting code didn't work, so I
- bit the bullet and rewrote the code by hand (it was a lot smaller and
- simpler then, so it took only a day or two).
- 
-    Soon after that, mh-e became part of the standard Emacs distribution
- and suggestions kept dribbling in for improvements.  mh-e soon reached
- sufficient functionality to keep me happy, but I kept on improving it
- because I was a graduate student with plenty of time on my hands and it
- was more fun than my dissertation.  In retrospect, the one thing that I
- regret is not writing any documentation, which seriously limited the use
- and appeal of the package.
- 
-    In '89, I came to Wisconsin as a professor and decided not to work on
- mh-e.  It was stable, except for minor bugs, and had enough
- functionality, so I let it be for a few years.  Stephen Gildea of BBN
- began to pester me about the bugs, but I ignored them.  In 1990, he went
- off to the X Consortium, said good bye, and said that he would now be
- using `xmh'.  A few months later, he came back and said that he
- couldn't stand `xmh' and could I put a few more bug fixes into mh-e.
- At that point, I had no interest in fixing mh-e, so I gave the
- responsibility of maintenance to him and he has done a fine job since
- then.
- 
-    Jim Larus, June 1994
- 
- 
- File: mh-e,  Node: From Stephen Gildea,  Prev: From Jim Larus,  Up: History
- 
- From Stephen Gildea
- ===================
- 
-    In 1987 I went to work for Bolt Beranek and Newman, as Jim had before
- me.  In my previous job, I had been using RMAIL, but as my folders tend
- to run large, I was frustrated with the speed of RMAIL.  However, I
- stuck with it because I wanted the GNU Emacs interface.  I am very
- familiar and comfortable with the Emacs interface (with just a few
- modifications of my own) and dislike having to use applications with
- embedded editors; they never live up to Emacs.
- 
-    MH is the mail reader of choice at BBN, so I converted to it.  Since
- I didn't want to give up using an Emacs interface, I started using mh-e.
- As is my wont, I started hacking on it almost immediately.  I first used
- version 3.4m.  One of the first features I added was to treat the folder
- buffer as a file-visiting buffer: you could lock it, save it, and be
- warned of unsaved changes when killing it.  I also worked to bring its
- functionality a little closer to RMAIL.  Jim Larus was very cooperative
- about merging in my changes, and my efforts first appeared in version
- 3.6, distributed with Emacs 18.52 in 1988.  Next I decided mh-e was too
- slow and optimized it a lot.  Version, 3.7, distributed with Emacs 18.56
- in 1990, was noticeably faster.
- 
-    When I moved to the X Consortium I became the first person there to
- not use xmh.  (There is now one other engineer there using mh-e.)  About
- this point I took over maintenance of mh-e from Jim and was finally able
- to add some features Jim hadn't accepted, such as the backward searching
- undo.  My first release was 3.8 (Emacs 18.58) in 1992.
- 
-    Now, in 1994, we see a flurry of releases, with both 4.0 and 5.0.
- Version 4.0 added many new features, including background folder
- collection and support for composing MIME messages.  (Reading MIME
- messages remains to be done, alas.)  While writing this book, Bill
- Wohler gave mh-e its closest examination ever, uncovering bugs and
- inconsistencies that required a new major version to fix, and so version
- 5 was released.
- 
-    Stephen Gildea, June 1994
- 
- 
- File: mh-e,  Node: Changes to mh-e,  Next: Copying,  Prev: History,  Up: Top
- 
- Changes to mh-e
- ***************
- 
-    mh-e had a fairly major facelift between Versions 3 and 4.  The
- differences between Versions 4 and 5 from the user's viewpoint are
- relatively minor.  The prompting order for the folder and message number
- in a couple of functions had been switched inadvertently in Version 4.
- Version 5 switches the order back.  The `+inbox' folder is no longer
- hard-coded, but rather uses the `Inbox' MH Profile entry.  See the file
- `etc/MH-E-NEWS' in the Emacs distribution for more details on the
- changes.
- 
-    This section documents the changes between Version 3 and newer
- versions so that you'll know which commands to use (or which commands
- you won't have) in case you're stuck with an old version.
- 
-    The following tables summarize the changes to buffer names, commands
- and variables.
- 
- Buffer Mode Names
- =================
- 
-      Version 3           Version 4
-      
-      mh-e folder        MH-Folder
-      mh-e scan          MH-Folder
-      mh-e show          MH-Folder Show
-      Fundamental        MH-Show
-      mh-e letter        MH-Letter
-      mh-e letter        MH-Pick
- 
- Commands
- ========
- 
-                 Version 3                        Version 4
-      
-      Function               Command   Command          Function
-      
-      mh-first-msg           <          M-<               mh-first-msg
-      -                      -          M->               mh-last-msg
-      mh-show                .          RET               mh-show
-      -                      -          ,                 mh-header-display
-      mh-reply               a          r                 mh-reply
-      mh-redistribute        r          M-d               mh-redistribute
-      mh-unshar-msg          -          M-n               mh-store-msg
-      mh-write-msg-to-file   M-o        C-o               mh-write-msg-to-file
-      mh-delete-msg-from-seq C-u M-%    M-#               mh-delete-seq
-      -                      -          M-q               mh-list-sequences
-      mh-quit                b          q                 mh-quit
-      -                      -          C-C C-f C-r       mh-to-field (`From:')
-      -                      -          C-C C-f C-d       mh-to-field (`Dcc:')
- 
- Variables
- =========
- 
-                Version 3                           Version 4
-      
-      Variable              Value             Value           Variable
-      
-      mh-show-buffer-      "{%%b}  %s/%d"    "{show-%s} %d"  mh-show-buffer-
-      mode-line-buffer-id                                    mode-line-buffer-id
-      mh-unshar-default-   ""                nil             mh-store-default-
-      directory                                              directory
- 
- New Variables
- =============
- 
-      mail-citation-hook                           mh-new-draft-cleaned-headers
-      mail-header-separator                        mh-pick-mode-hook
-      mh-auto-folder-collect                       mh-refile-msg-hook
-      mh-comp-formfile                             mh-scan-prog
-      mh-repl-formfile                             mh-send-prog
-      mh-delete-msg-hook                           mh-show-hook
-      mh-forward-subject-format                    mh-show-mode-hook
-      mh-inc-prog                                  mh-signature-file-name
-      mh-mime-content-types                        mh-sortm-args
-      mh-default-folder-for-message-function       mh-repl-formfile
-      mh-mhn-args
- 
- 
- File: mh-e,  Node: Copying,  Next: Function Index,  Prev: Changes to mh-e,  Up: Top
- 
- GNU GENERAL PUBLIC LICENSE
- **************************
- 
-                          Version 2, June 1991
- 
-      Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-      675 Mass Ave, Cambridge, MA 02139, USA
-      
-      Everyone is permitted to copy and distribute verbatim copies
-      of this license document, but changing it is not allowed.
- 
- Preamble
- ========
- 
-    The licenses for most software are designed to take away your
- freedom to share and change it.  By contrast, the GNU General Public
- License is intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users.  This
- General Public License applies to most of the Free Software
- Foundation's software and to any other program whose authors commit to
- using it.  (Some other Free Software Foundation software is covered by
- the GNU Library General Public License instead.)  You can apply it to
- your programs, too.
- 
-    When we speak of free software, we are referring to freedom, not
- price.  Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.
- 
-    To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the software, or if you modify it.
- 
-    For example, if you distribute copies of such a program, whether
- gratis or for a fee, you must give the recipients all the rights that
- you have.  You must make sure that they, too, receive or can get the
- source code.  And you must show them these terms so they know their
- rights.
- 
-    We protect your rights with two steps: (1) copyright the software,
- and (2) offer you this license which gives you legal permission to copy,
- distribute and/or modify the software.
- 
-    Also, for each author's protection and ours, we want to make certain
- that everyone understands that there is no warranty for this free
- software.  If the software is modified by someone else and passed on, we
- want its recipients to know that what they have is not the original, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.
- 
-    Finally, any free program is threatened constantly by software
- patents.  We wish to avoid the danger that redistributors of a free
- program will individually obtain patent licenses, in effect making the
- program proprietary.  To prevent this, we have made it clear that any
- patent must be licensed for everyone's free use or not licensed at all.
- 
-    The precise terms and conditions for copying, distribution and
- modification follow.
- 
-     TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- 
-   0. This License applies to any program or other work which contains a
-      notice placed by the copyright holder saying it may be distributed
-      under the terms of this General Public License.  The "Program",
-      below, refers to any such program or work, and a "work based on
-      the Program" means either the Program or any derivative work under
-      copyright law: that is to say, a work containing the Program or a
-      portion of it, either verbatim or with modifications and/or
-      translated into another language.  (Hereinafter, translation is
-      included without limitation in the term "modification".)  Each
-      licensee is addressed as "you".
- 
-      Activities other than copying, distribution and modification are
-      not covered by this License; they are outside its scope.  The act
-      of running the Program is not restricted, and the output from the
-      Program is covered only if its contents constitute a work based on
-      the Program (independent of having been made by running the
-      Program).  Whether that is true depends on what the Program does.
- 
-   1. You may copy and distribute verbatim copies of the Program's
-      source code as you receive it, in any medium, provided that you
-      conspicuously and appropriately publish on each copy an appropriate
-      copyright notice and disclaimer of warranty; keep intact all the
-      notices that refer to this License and to the absence of any
-      warranty; and give any other recipients of the Program a copy of
-      this License along with the Program.
- 
-      You may charge a fee for the physical act of transferring a copy,
-      and you may at your option offer warranty protection in exchange
-      for a fee.
- 
-   2. You may modify your copy or copies of the Program or any portion
-      of it, thus forming a work based on the Program, and copy and
-      distribute such modifications or work under the terms of Section 1
-      above, provided that you also meet all of these conditions:
- 
-        a. You must cause the modified files to carry prominent notices
-           stating that you changed the files and the date of any change.
- 
-        b. You must cause any work that you distribute or publish, that
-           in whole or in part contains or is derived from the Program
-           or any part thereof, to be licensed as a whole at no charge
-           to all third parties under the terms of this License.
- 
-        c. If the modified program normally reads commands interactively
-           when run, you must cause it, when started running for such
-           interactive use in the most ordinary way, to print or display
-           an announcement including an appropriate copyright notice and
-           a notice that there is no warranty (or else, saying that you
-           provide a warranty) and that users may redistribute the
-           program under these conditions, and telling the user how to
-           view a copy of this License.  (Exception: if the Program
-           itself is interactive but does not normally print such an
-           announcement, your work based on the Program is not required
-           to print an announcement.)
- 
-      These requirements apply to the modified work as a whole.  If
-      identifiable sections of that work are not derived from the
-      Program, and can be reasonably considered independent and separate
-      works in themselves, then this License, and its terms, do not
-      apply to those sections when you distribute them as separate
-      works.  But when you distribute the same sections as part of a
-      whole which is a work based on the Program, the distribution of
-      the whole must be on the terms of this License, whose permissions
-      for other licensees extend to the entire whole, and thus to each
-      and every part regardless of who wrote it.
- 
-      Thus, it is not the intent of this section to claim rights or
-      contest your rights to work written entirely by you; rather, the
-      intent is to exercise the right to control the distribution of
-      derivative or collective works based on the Program.
- 
-      In addition, mere aggregation of another work not based on the
-      Program with the Program (or with a work based on the Program) on
-      a volume of a storage or distribution medium does not bring the
-      other work under the scope of this License.
- 
-   3. You may copy and distribute the Program (or a work based on it,
-      under Section 2) in object code or executable form under the terms
-      of Sections 1 and 2 above provided that you also do one of the
-      following:
- 
-        a. Accompany it with the complete corresponding machine-readable
-           source code, which must be distributed under the terms of
-           Sections 1 and 2 above on a medium customarily used for
-           software interchange; or,
- 
-        b. Accompany it with a written offer, valid for at least three
-           years, to give any third party, for a charge no more than your
-           cost of physically performing source distribution, a complete
-           machine-readable copy of the corresponding source code, to be
-           distributed under the terms of Sections 1 and 2 above on a
-           medium customarily used for software interchange; or,
- 
-        c. Accompany it with the information you received as to the offer
-           to distribute corresponding source code.  (This alternative is
-           allowed only for noncommercial distribution and only if you
-           received the program in object code or executable form with
-           such an offer, in accord with Subsection b above.)
- 
-      The source code for a work means the preferred form of the work for
-      making modifications to it.  For an executable work, complete
-      source code means all the source code for all modules it contains,
-      plus any associated interface definition files, plus the scripts
-      used to control compilation and installation of the executable.
-      However, as a special exception, the source code distributed need
-      not include anything that is normally distributed (in either
-      source or binary form) with the major components (compiler,
-      kernel, and so on) of the operating system on which the executable
-      runs, unless that component itself accompanies the executable.
- 
-      If distribution of executable or object code is made by offering
-      access to copy from a designated place, then offering equivalent
-      access to copy the source code from the same place counts as
-      distribution of the source code, even though third parties are not
-      compelled to copy the source along with the object code.
- 
-   4. You may not copy, modify, sublicense, or distribute the Program
-      except as expressly provided under this License.  Any attempt
-      otherwise to copy, modify, sublicense or distribute the Program is
-      void, and will automatically terminate your rights under this
-      License.  However, parties who have received copies, or rights,
-      from you under this License will not have their licenses
-      terminated so long as such parties remain in full compliance.
- 
-   5. You are not required to accept this License, since you have not
-      signed it.  However, nothing else grants you permission to modify
-      or distribute the Program or its derivative works.  These actions
-      are prohibited by law if you do not accept this License.
-      Therefore, by modifying or distributing the Program (or any work
-      based on the Program), you indicate your acceptance of this
-      License to do so, and all its terms and conditions for copying,
-      distributing or modifying the Program or works based on it.
- 
-   6. Each time you redistribute the Program (or any work based on the
-      Program), the recipient automatically receives a license from the
-      original licensor to copy, distribute or modify the Program
-      subject to these terms and conditions.  You may not impose any
-      further restrictions on the recipients' exercise of the rights
-      granted herein.  You are not responsible for enforcing compliance
-      by third parties to this License.
- 
-   7. If, as a consequence of a court judgment or allegation of patent
-      infringement or for any other reason (not limited to patent
-      issues), conditions are imposed on you (whether by court order,
-      agreement or otherwise) that contradict the conditions of this
-      License, they do not excuse you from the conditions of this
-      License.  If you cannot distribute so as to satisfy simultaneously
-      your obligations under this License and any other pertinent
-      obligations, then as a consequence you may not distribute the
-      Program at all.  For example, if a patent license would not permit
-      royalty-free redistribution of the Program by all those who
-      receive copies directly or indirectly through you, then the only
-      way you could satisfy both it and this License would be to refrain
-      entirely from distribution of the Program.
- 
-      If any portion of this section is held invalid or unenforceable
-      under any particular circumstance, the balance of the section is
-      intended to apply and the section as a whole is intended to apply
-      in other circumstances.
- 
-      It is not the purpose of this section to induce you to infringe any
-      patents or other property right claims or to contest validity of
-      any such claims; this section has the sole purpose of protecting
-      the integrity of the free software distribution system, which is
-      implemented by public license practices.  Many people have made
-      generous contributions to the wide range of software distributed
-      through that system in reliance on consistent application of that
-      system; it is up to the author/donor to decide if he or she is
-      willing to distribute software through any other system and a
-      licensee cannot impose that choice.
- 
-      This section is intended to make thoroughly clear what is believed
-      to be a consequence of the rest of this License.
- 
-   8. If the distribution and/or use of the Program is restricted in
-      certain countries either by patents or by copyrighted interfaces,
-      the original copyright holder who places the Program under this
-      License may add an explicit geographical distribution limitation
-      excluding those countries, so that distribution is permitted only
-      in or among countries not thus excluded.  In such case, this
-      License incorporates the limitation as if written in the body of
-      this License.
- 
-   9. The Free Software Foundation may publish revised and/or new
-      versions of the General Public License from time to time.  Such
-      new versions will be similar in spirit to the present version, but
-      may differ in detail to address new problems or concerns.
- 
-      Each version is given a distinguishing version number.  If the
-      Program specifies a version number of this License which applies
-      to it and "any later version", you have the option of following
-      the terms and conditions either of that version or of any later
-      version published by the Free Software Foundation.  If the Program
-      does not specify a version number of this License, you may choose
-      any version ever published by the Free Software Foundation.
- 
-  10. If you wish to incorporate parts of the Program into other free
-      programs whose distribution conditions are different, write to the
-      author to ask for permission.  For software which is copyrighted
-      by the Free Software Foundation, write to the Free Software
-      Foundation; we sometimes make exceptions for this.  Our decision
-      will be guided by the two goals of preserving the free status of
-      all derivatives of our free software and of promoting the sharing
-      and reuse of software generally.
- 
-                                 NO WARRANTY
- 
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
-      WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
-      LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-      HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
-      WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
-      NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-      FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE
-      QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-      PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
-      SERVICING, REPAIR OR CORRECTION.
- 
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-      WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
-      MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
-      LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
-      INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
-      INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-      DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
-      OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
-      OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
-      ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- 
-                       END OF TERMS AND CONDITIONS
- 
- How to Apply These Terms to Your New Programs
- =============================================
- 
-    If you develop a new program, and you want it to be of the greatest
- possible use to the public, the best way to achieve this is to make it
- free software which everyone can redistribute and change under these
- terms.
- 
-    To do so, attach the following notices to the program.  It is safest
- to attach them to the start of each source file to most effectively
- convey the exclusion of warranty; and each file should have at least
- the "copyright" line and a pointer to where the full notice is found.
- 
-      ONE LINE TO GIVE THE PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES.
-      Copyright (C) 19YY  NAME OF AUTHOR
-      
-      This program is free software; you can redistribute it and/or
-      modify it under the terms of the GNU General Public License
-      as published by the Free Software Foundation; either version 2
-      of the License, or (at your option) any later version.
-      
-      This program is distributed in the hope that it will be useful,
-      but WITHOUT ANY WARRANTY; without even the implied warranty of
-      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-      GNU General Public License for more details.
-      
-      You should have received a copy of the GNU General Public License
-      along with this program; if not, write to the Free Software
-      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- 
-    Also add information on how to contact you by electronic and paper
- mail.
- 
-    If the program is interactive, make it output a short notice like
- this when it starts in an interactive mode:
- 
-      Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
-      Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-      type `show w'.  This is free software, and you are welcome
-      to redistribute it under certain conditions; type `show c'
-      for details.
- 
-    The hypothetical commands `show w' and `show c' should show the
- appropriate parts of the General Public License.  Of course, the
- commands you use may be called something other than `show w' and `show
- c'; they could even be mouse-clicks or menu items--whatever suits your
- program.
- 
-    You should also get your employer (if you work as a programmer) or
- your school, if any, to sign a "copyright disclaimer" for the program,
- if necessary.  Here is a sample; alter the names:
- 
-      Yoyodyne, Inc., hereby disclaims all copyright
-      interest in the program `Gnomovision'
-      (which makes passes at compilers) written
-      by James Hacker.
-      
-      SIGNATURE OF TY COON, 1 April 1989
-      Ty Coon, President of Vice
- 
-    This General Public License does not permit incorporating your
- program into proprietary programs.  If your program is a subroutine
- library, you may consider it more useful to permit linking proprietary
- applications with the library.  If this is what you want to do, use the
- GNU Library General Public License instead of this License.
- 
- 
- File: mh-e,  Node: Function Index,  Next: Variable Index,  Prev: Copying,  Up: Top
- 
- Function Index
- **************
- 
- * Menu:
- 
- * display-time:                         Incorporating.
- * mh-burst-digest:                      Reading Digests.
- * mh-check-whom:                        Recipients.
- * mh-copy-msg:                          Organizing.
- * mh-delete-msg-from-seq:               Sequences.
- * mh-delete-msg-no-motion:              Deleting.
- * mh-delete-msg:                        Deleting.
- * mh-delete-seq:                        Sequences.
- * mh-do-pick-search:                    Searching.
- * mh-edit-again:                        Old Drafts.
- * mh-edit-mhn:                          Sending MIME.
- * mh-execute-commands:                  Customizing Incorporating.
- * mh-execute-commands:                  Customizing Finishing Up.
- * mh-execute-commands:                  Finishing Up.
- * mh-extract-rejected-mail:             Old Drafts.
- * mh-first-msg:                         Moving Around.
- * mh-forward:                           Forwarding.
- * mh-fully-kill-draft:                  Killing Draft.
- * mh-goto-msg:                          Moving Around.
- * mh-inc-folder:                        Incorporating.
- * mh-insert-letter:                     Inserting Messages.
- * mh-insert-signature:                  Signature.
- * mh-insert-signature, example:         Customizing Sending.
- * mh-last-msg:                          Moving Around.
- * mh-list-folders:                      Organizing.
- * mh-list-sequences:                    Sequences.
- * mh-mhn-compose-anon-ftp:              FTP.
- * mh-mhn-compose-external-compressed-tar: Tar.
- * mh-mhn-compose-forw:                  Forwarding MIME.
- * mh-mhn-compose-insertion:             Other MIME Objects.
- * mh-msg-is-in-seq:                     Sequences.
- * mh-narrow-to-seq:                     Sequences.
- * mh-next-undeleted-msg:                Moving Around.
- * mh-pack-folder:                       Organizing.
- * mh-page-digest-backwards:             Reading Digests.
- * mh-page-digest:                       Reading Digests.
- * mh-page-msg:                          Viewing.
- * mh-pipe-msg:                          Files and Pipes.
- * mh-previous-page:                     Viewing.
- * mh-previous-undeleted-msg:            Moving Around.
- * mh-print-msg:                         Printing.
- * mh-put-msg-in-seq:                    Sequences.
- * mh-quit:                              Finishing Up.
- * mh-redistribute:                      Redistributing.
- * mh-refile-msg:                        Customizing Organizing.
- * mh-refile-msg:                        Organizing.
- * mh-refile-or-write-again:             Organizing.
- * mh-reply:                             Replying.
- * mh-rescan-folder:                     Organizing.
- * mh-rescan-folder, example:            Customizing Incorporating.
- * mh-revert-mhn-edit:                   Sending MIME.
- * mh-rmail:                             Finishing Up.
- * mh-rmail:                             Reading Mail.
- * mh-rmail:                             Reading Mail Tour.
- * mh-rmail, example:                    Customizing Reading.
- * mh-search-folder:                     Searching.
- * mh-send-letter:                       Sending Message.
- * mh-send:                              Sending Mail.
- * mh-show:                              Viewing.
- * mh-show, example:                     Customizing Incorporating.
- * mh-smail-other-window:                Sending Mail.
- * mh-smail:                             Sending Mail.
- * mh-smail:                             Processing Mail Tour.
- * mh-smail:                             Sending Mail Tour.
- * mh-smail:                             Sending Mail.
- * mh-sort-folder:                       Organizing.
- * mh-sort-folder:                       Customizing Organizing.
- * mh-store-buffer:                      Customizing Files and Pipes.
- * mh-store-msg:                         Customizing Files and Pipes.
- * mh-store-msg:                         Files and Pipes.
- * mh-to-fcc:                            Header.
- * mh-to-fcc:                            Customizing Organizing.
- * mh-to-field:                          Header.
- * mh-to-field:                          Searching.
- * mh-toggle-showing:                    Moving Around.
- * mh-undo-folder:                       Finishing Up.
- * mh-undo:                              Finishing Up.
- * mh-update-sequences:                  Sequences.
- * mh-version:                           Miscellaneous.
- * mh-visit-folder:                      Organizing.
- * mh-visit-folder:                      Organizing.
- * mh-widen:                             Sequences.
- * mh-write-msg-to-file:                 Files and Pipes.
- * mh-yank-cur-msg:                      Inserting Letter.
- 
- 
- File: mh-e,  Node: Variable Index,  Next: Concept Index,  Prev: Function Index,  Up: Top
- 
- Variable Index
- **************
- 
- * Menu:
- 
- * mail-citation-hook:                   Customizing Inserting Letter.
- * mh-auto-folder-collect:               Customizing Organizing.
- * mh-before-quit-hook:                  Customizing Finishing Up.
- * mh-before-send-letter-hook:           Customizing Sending Message.
- * mh-before-send-letter-hook, example:  Customizing Sending Message.
- * mh-bury-show-buffer:                  Customizing Reading.
- * mh-bury-show-buffer, example:         Customizing mh-e.
- * mh-clean-message-header:              Customizing Viewing.
- * mh-cmd-note:                          Customizing Scan Line Formats.
- * mh-comp-formfile:                     Customizing Sending.
- * mh-compose-letter-function:           Customizing Sending.
- * mh-cur-scan-msg-regexp:               Customizing Scan Line Formats.
- * mh-default-folder-for-message-function: Customizing Organizing.
- * mh-default-folder-for-message-function, example: Customizing Organizing.
- * mh-delete-msg-hook:                   Customizing Deleting.
- * mh-delete-yanked-msg-window:          Customizing Inserting Letter.
- * mh-deleted-msg-regexp:                Customizing Scan Line Formats.
- * mh-do-not-confirm:                    Customizing Reading.
- * mh-folder-mode-hook:                  Customizing Reading.
- * mh-folder-mode-hook, example:         Customizing Reading.
- * mh-forward-subject-format:            Customizing Forwarding.
- * mh-good-msg-regexp:                   Customizing Scan Line Formats.
- * mh-inc-folder-hook:                   Customizing Incorporating.
- * mh-inc-folder-hook, example:          Customizing Incorporating.
- * mh-inc-prog:                          Customizing Incorporating.
- * mh-ins-buf-prefix:                    Customizing Inserting Letter.
- * mh-ins-buf-prefix:                    Customizing Inserting Letter.
- * mh-invisible-headers:                 Customizing Viewing.
- * mh-letter-mode-hook:                  Customizing Sending.
- * mh-lib:                               Customizing Reading.
- * mh-lib, example:                      Getting Started.
- * mh-lpr-command-format:                Customizing Printing.
- * mh-lpr-command-format, example:       Customizing mh-e.
- * mh-mhn-args:                          Customizing Sending MIME.
- * mh-mime-content-types:                Customizing Editing MIME.
- * mh-mime-content-types, example:       Customizing Editing MIME.
- * mh-msg-number-regexp:                 Customizing Scan Line Formats.
- * mh-msg-search-regexp:                 Customizing Scan Line Formats.
- * mh-new-draft-cleaned-headers:         Customizing Old Drafts.
- * mh-new-draft-cleaned-headers, example: Customizing Old Drafts.
- * mh-note-copied:                       Customizing Scan Line Formats.
- * mh-note-cur:                          Customizing Scan Line Formats.
- * mh-note-deleted:                      Customizing Scan Line Formats.
- * mh-note-dist:                         Customizing Scan Line Formats.
- * mh-note-forw:                         Customizing Scan Line Formats.
- * mh-note-printed:                      Customizing Scan Line Formats.
- * mh-note-refiled:                      Customizing Scan Line Formats.
- * mh-note-repl:                         Customizing Scan Line Formats.
- * mh-note-seq:                          Customizing Scan Line Formats.
- * mh-partial-folder-mode-line-annotation: Customizing Searching.
- * mh-pick-mode-hook:                    Customizing Searching.
- * mh-print-background:                  Customizing Printing.
- * mh-progs:                             Customizing Scan Line Formats.
- * mh-progs:                             Customizing Incorporating.
- * mh-progs:                             Customizing Reading.
- * mh-progs, example:                    Getting Started.
- * mh-quit-hook:                         Customizing Finishing Up.
- * mh-recenter-summary-p:                Customizing Moving Around.
- * mh-recursive-folders:                 Customizing Organizing.
- * mh-redist-full-contents:              Customizing Redistributing.
- * mh-refile-msg-hook:                   Customizing Organizing.
- * mh-refiled-msg-regexp:                Customizing Scan Line Formats.
- * mh-repl-formfile:                     Customizing Sending.
- * mh-reply-default-reply-to:            Customizing Replying.
- * mh-scan-prog:                         Customizing Scan Line Formats.
- * mh-scan-prog:                         Customizing Incorporating.
- * mh-send-prog:                         Customizing Sending Message.
- * mh-show-buffer-mode-line-buffer-id:   Customizing Viewing.
- * mh-show-hook:                         Customizing Viewing.
- * mh-show-hook, example:                Customizing Viewing.
- * mh-show-mode-hook:                    Customizing Viewing.
- * mh-show-mode-hook, example:           Customizing Viewing.
- * mh-signature-file-name:               Customizing Signature.
- * mh-sortm-args:                        Customizing Organizing.
- * mh-store-default-directory:           Customizing Files and Pipes.
- * mh-store-default-directory, example:  Customizing Files and Pipes.
- * mh-summary-height:                    Customizing Reading.
- * mh-user-path, example:                Customizing Organizing.
- * mh-valid-scan-line:                   Customizing Scan Line Formats.
- * mh-visible-headers:                   Customizing Viewing.
- * mh-yank-from-start-of-msg:            Customizing Inserting Letter.
- * mhl-formfile:                         Customizing Viewing.
- 
--- 0 ----
Index: emacs/info/mh-e-4
diff -c emacs/info/mh-e-4:1.1.1.1 emacs/info/mh-e-4:removed
*** emacs/info/mh-e-4:1.1.1.1	Mon Jul 22 01:52:55 1996
--- emacs/info/mh-e-4	Fri Aug  2 20:23:43 1996
***************
*** 1,319 ****
- This is Info file ../info/mh-e, produced by Makeinfo-1.55 from the
- input file mh-e.texi.
- 
-    This is Edition 1.1, last updated 26 April 1995, of `mh-e, The Emacs
- Interface to MH', for mh-e, Version 5.0.1.
- 
-    Copyright 1995 Free Software Foundation, Inc.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the section entitled "Copying" is included exactly as in the
- original, and provided that the entire resulting derived work is
- distributed under the terms of a permission notice identical to this
- one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that this permission notice may be stated in a
- translation approved by the Free Software Foundation.
- 
- 
- File: mh-e,  Node: Concept Index,  Prev: Variable Index,  Up: Top
- 
- Concept Index
- *************
- 
- * Menu:
- 
- * burst:                                Reading Digests.
- * comp:                                 Customizing Sending.
- * dist:                                 Customizing Redistributing.
- * folder:                               Organizing.
- * forw:                                 Forwarding.
- * ftp:                                  Tar.
- * ftp:                                  FTP.
- * inc:                                  Customizing Incorporating.
- * inc:                                  Reading Mail Tour.
- * inc:                                  Customizing Scan Line Formats.
- * install-mh:                           Getting Started.
- * lpr:                                  Printing.
- * lpr:                                  Customizing Printing.
- * mark:                                 Sequences.
- * mh-e: comparison between versions:    Changes to mh-e.
- * mhl:                                  Replying.
- * mhl:                                  Printing.
- * mhl:                                  Customizing Viewing.
- * mhn:                                  Editing MIME.
- * mhn:                                  Sending MIME.
- * mhn:                                  Reading MIME.
- * pick:                                 Sequences.
- * pick:                                 Searching.
- * refile:                               Organizing.
- * repl:                                 Customizing Sending.
- * repl:                                 Replying.
- * repl:                                 Customizing Sending.
- * scan:                                 Reading Mail Tour.
- * scan:                                 Customizing Scan Line Formats.
- * scan:                                 Customizing Scan Line Formats.
- * send:                                 Customizing Redistributing.
- * send:                                 Customizing Sending Message.
- * shar:                                 Files and Pipes.
- * shar:                                 Customizing Files and Pipes.
- * show:                                 Reading MIME.
- * sortm:                                Customizing Organizing.
- * tar:                                  Tar.
- * uuencode:                             Customizing Files and Pipes.
- * uuencode:                             Files and Pipes.
- * whom:                                 Recipients.
- * xmh, in mh-e history:                 From Jim Larus.
- * .emacs:                               Incorporating.
- * .emacs:                               Getting mh-e.
- * .emacs:                               Customizing mh-e.
- * .emacs:                               Getting Started.
- * .emacs:                               Customizing Organizing.
- * .emacs:                               Customizing Reading.
- * .mh_profile:                          Customizing Organizing.
- * .signature:                           Signature.
- * .signature:                           Customizing Signature.
- * components:                           Customizing Sending.
- * components:                           Customizing Sending.
- * draft:                                Old Drafts.
- * mhl.reply:                            Replying.
- * replcomps:                            Customizing Sending.
- * bugs:                                 Bug Reports.
- * checking recipients:                  Recipients.
- * content description:                  Editing MIME.
- * content types:                        Editing MIME.
- * deleting:                             Customizing Deleting.
- * deleting:                             Deleting.
- * digests:                              Reading Digests.
- * editing draft:                        Draft Editing.
- * editing draft:                        Customizing Draft Editing.
- * editing header:                       Header.
- * Emacs:                                Preface.
- * Emacs:                                Conventions.
- * Emacs, Emacs Lisp manual:             Customizing mh-e.
- * Emacs, file completion:               Conventions.
- * Emacs, functions; describe-mode:      Using mh-e.
- * Emacs, info:                          Customizing mh-e.
- * Emacs, interrupting:                  Conventions.
- * Emacs, mark:                          Inserting Letter.
- * Emacs, mark:                          Conventions.
- * Emacs, minibuffer:                    Conventions.
- * Emacs, notification of new mail:      Incorporating.
- * Emacs, online help:                   Customizing mh-e.
- * Emacs, online help:                   Using mh-e.
- * Emacs, packages, supercite:           Customizing Inserting Letter.
- * Emacs, point:                         Conventions.
- * Emacs, point:                         Inserting Letter.
- * Emacs, prefix argument:               Conventions.
- * Emacs, quitting:                      Conventions.
- * Emacs, quitting:                      Leaving mh-e.
- * Emacs, region:                        Conventions.
- * Emacs, region:                        Inserting Letter.
- * Emacs, setting variables:             Customizing mh-e.
- * Emacs, terms and conventions:         Conventions.
- * expunging refiles and deletes:        Finishing Up.
- * FAQ:                                  MH FAQ.
- * file completion:                      Conventions.
- * files, .emacs:                        Getting Started.
- * files, .emacs:                        Getting mh-e.
- * files, .emacs:                        Customizing mh-e.
- * files, .emacs:                        Customizing Organizing.
- * files, .emacs:                        Incorporating.
- * files, .emacs:                        Customizing Reading.
- * files, .mh_profile:                   Customizing Organizing.
- * files, .signature:                    Customizing Signature.
- * files, .signature:                    Signature.
- * files, components:                    Customizing Sending.
- * files, components:                    Customizing Sending.
- * files, draft:                         Old Drafts.
- * files, mhl.reply:                     Replying.
- * files, replcomps:                     Customizing Sending.
- * files, MH-E-NEWS:                     Getting mh-e.
- * folder:                               Processing Mail Tour.
- * forwarding:                           Customizing Forwarding.
- * forwarding:                           Forwarding.
- * Gildea, Stephen:                      Bug Reports.
- * Gildea, Stephen:                      From Stephen Gildea.
- * history:                              Preface.
- * history of mh-e:                      History.
- * images:                               Other MIME Objects.
- * incorporating:                        Customizing Incorporating.
- * incorporating:                        Incorporating.
- * info:                                 Customizing mh-e.
- * inserting messages:                   Customizing Inserting Letter.
- * inserting messages:                   Inserting Letter.
- * inserting messages:                   Inserting Messages.
- * inserting signature:                  Signature.
- * inserting signature:                  Customizing Signature.
- * interrupting:                         Conventions.
- * junk mail:                            Moving Around.
- * killing draft:                        Killing Draft.
- * Larus, Jim:                           From Jim Larus.
- * Mailer-Daemon:                        Old Drafts.
- * mailing list:                         Mailing List.
- * mark:                                 Inserting Letter.
- * mark:                                 Conventions.
- * MH commands, burst:                   Reading Digests.
- * MH commands, comp:                    Customizing Sending.
- * MH commands, dist:                    Customizing Redistributing.
- * MH commands, folder:                  Organizing.
- * MH commands, forw:                    Forwarding.
- * MH commands, inc:                     Customizing Incorporating.
- * MH commands, inc:                     Reading Mail Tour.
- * MH commands, inc:                     Customizing Scan Line Formats.
- * MH commands, install-mh:              Getting Started.
- * MH commands, mark:                    Sequences.
- * MH commands, mhl:                     Replying.
- * MH commands, mhl:                     Printing.
- * MH commands, mhl:                     Customizing Viewing.
- * MH commands, mhn:                     Reading MIME.
- * MH commands, mhn:                     Sending MIME.
- * MH commands, mhn:                     Editing MIME.
- * MH commands, pick:                    Sequences.
- * MH commands, pick:                    Searching.
- * MH commands, refile:                  Organizing.
- * MH commands, repl:                    Customizing Sending.
- * MH commands, repl:                    Replying.
- * MH commands, repl:                    Customizing Sending.
- * MH commands, scan:                    Reading Mail Tour.
- * MH commands, scan:                    Customizing Scan Line Formats.
- * MH commands, scan:                    Customizing Scan Line Formats.
- * MH commands, send:                    Customizing Sending Message.
- * MH commands, send:                    Customizing Redistributing.
- * MH commands, show:                    Reading MIME.
- * MH commands, sortm:                   Customizing Organizing.
- * MH commands, whom:                    Recipients.
- * MH FAQ:                               MH FAQ.
- * MH profile components, sortm:         Customizing Organizing.
- * MH-Folder mode:                       Sequences.
- * MH-Folder mode:                       Searching.
- * MH-Folder mode:                       Customizing Reading.
- * MH-Folder mode:                       Processing Mail Tour.
- * MH-Folder mode:                       Customizing Reading.
- * MH-Folder mode:                       Reading Mail Tour.
- * MH-Folder mode:                       Reading Mail.
- * MH-Folder mode:                       Moving Around.
- * MH-Folder mode:                       Moving Around.
- * MH-Folder mode:                       Customizing Moving Around.
- * MH-Folder mode:                       Sending Mail.
- * MH-Folder mode:                       Customizing Reading.
- * MH-Folder Show mode:                  Reading Digests.
- * MH-Folder Show mode:                  Moving Around.
- * MH-Letter mode:                       Sending Mail Tour.
- * MH-Letter mode:                       Sending Mail Tour.
- * MH-Letter mode:                       Sending Mail.
- * MH-Letter mode:                       Replying.
- * MH-Letter mode:                       Draft Editing.
- * MH-Show mode:                         Customizing Viewing.
- * MH-Show mode:                         Customizing Moving Around.
- * MIME:                                 Customizing Editing MIME.
- * MIME:                                 Editing MIME.
- * MIME:                                 Reading MIME.
- * MIME, ftp:                            Tar.
- * MIME, ftp:                            FTP.
- * MIME, tar:                            Tar.
- * MIME, content description:            Editing MIME.
- * MIME, content types:                  Editing MIME.
- * MIME, images:                         Other MIME Objects.
- * MIME, sound:                          Other MIME Objects.
- * MIME, video:                          Other MIME Objects.
- * minibuffer:                           Conventions.
- * mode:                                 Sending Mail Tour.
- * modes, MH-Folder:                     Reading Mail.
- * modes, MH-Folder:                     Searching.
- * modes, MH-Folder:                     Reading Mail Tour.
- * modes, MH-Folder:                     Customizing Reading.
- * modes, MH-Folder:                     Processing Mail Tour.
- * modes, MH-Folder:                     Customizing Moving Around.
- * modes, MH-Folder:                     Sequences.
- * modes, MH-Folder:                     Customizing Reading.
- * modes, MH-Folder:                     Sending Mail.
- * modes, MH-Folder:                     Customizing Reading.
- * modes, MH-Folder:                     Moving Around.
- * modes, MH-Folder:                     Moving Around.
- * modes, MH-Folder Show:                Reading Digests.
- * modes, MH-Folder Show:                Moving Around.
- * modes, MH-Letter:                     Sending Mail.
- * modes, MH-Letter:                     Replying.
- * modes, MH-Letter:                     Draft Editing.
- * modes, MH-Letter:                     Sending Mail Tour.
- * modes, MH-Letter:                     Sending Mail Tour.
- * modes, MH-Show:                       Customizing Moving Around.
- * modes, MH-Show:                       Customizing Viewing.
- * moving between messages:              Customizing Moving Around.
- * moving between messages:              Moving Around.
- * multimedia mail:                      Reading MIME.
- * multimedia mail:                      Editing MIME.
- * multimedia mail:                      Customizing Editing MIME.
- * new mail:                             Incorporating.
- * news:                                 Getting mh-e.
- * notification of new mail:             Incorporating.
- * obtaining mh-e:                       Getting mh-e.
- * online help:                          Customizing mh-e.
- * online help:                          Using mh-e.
- * point:                                Conventions.
- * point:                                Inserting Letter.
- * prefix argument:                      Conventions.
- * printing:                             Customizing Printing.
- * printing:                             Printing.
- * processing mail:                      Processing Mail Tour.
- * processing mail:                      Moving Mail.
- * processing mail:                      Customizing Moving Mail.
- * quitting:                             Conventions.
- * quitting:                             Leaving mh-e.
- * quitting:                             Customizing Finishing Up.
- * re-editing drafts:                    Customizing Old Drafts.
- * re-editing drafts:                    Old Drafts.
- * reading mail:                         Reading Mail Tour.
- * reading mail:                         Reading Mail.
- * reading mail:                         Customizing Reading.
- * redistributing:                       Customizing Redistributing.
- * redistributing:                       Redistributing.
- * region:                               Inserting Letter.
- * region:                               Conventions.
- * regular expressions:                  Customizing Old Drafts.
- * Reid, Brian:                          From Brian Reid.
- * replying:                             Replying.
- * replying:                             Customizing Replying.
- * searching:                            Customizing Searching.
- * searching:                            Searching.
- * sending mail:                         Sending Mail.
- * sending mail:                         Sending Message.
- * sending mail:                         Sending Mail Tour.
- * sending mail:                         Customizing Sending Message.
- * sending mail:                         Customizing Sending.
- * sequences:                            Sequences.
- * setting variables:                    Customizing mh-e.
- * signature:                            Customizing Signature.
- * signature:                            Signature.
- * sound:                                Other MIME Objects.
- * spell check:                          Customizing Sending Message.
- * starting from command line:           Sending Mail.
- * Unix commands, ftp:                   Tar.
- * Unix commands, ftp:                   FTP.
- * Unix commands, lpr:                   Printing.
- * Unix commands, lpr:                   Customizing Printing.
- * Unix commands, shar:                  Files and Pipes.
- * Unix commands, shar:                  Customizing Files and Pipes.
- * Unix commands, tar:                   Tar.
- * Unix commands, uuencode:              Customizing Files and Pipes.
- * Unix commands, uuencode:              Files and Pipes.
- * Unix commands, Emacs:                 Conventions.
- * Unix commands, Emacs:                 Preface.
- * using files:                          Customizing Files and Pipes.
- * using files:                          Files and Pipes.
- * using folders:                        Organizing.
- * using folders:                        Customizing Organizing.
- * using pipes:                          Files and Pipes.
- * using pipes:                          Customizing Files and Pipes.
- * video:                                Other MIME Objects.
- * ~:                                    Getting Started.
- 
- 
--- 0 ----
Index: emacs/info/sc
diff -c emacs/info/sc:1.1.1.2 emacs/info/sc:removed
*** emacs/info/sc:1.1.1.2	Mon Jul 22 01:52:56 1996
--- emacs/info/sc	Fri Aug  2 20:23:55 1996
***************
*** 1,66 ****
- This is Info file ../info/sc, produced by Makeinfo-1.55 from the input
- file sc.texi.
- 
-    This document describes the Supercite Version 3.1 package for citing
- and attributing the replies for various GNU Emacs mail and news reading
- subsystems.
- 
-    Copyright (C) 1993 Barry A. Warsaw
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
- 
- Indirect:
- sc-1: 448
- sc-2: 47946
- sc-3: 97470
- 
- Tag Table:
- (Indirect)
- Node: Top448
- Node: Introduction1148
- Node: Usage Overview3113
- Node: What Supercite Does Not Do4270
- Node: What Supercite Does5398
- Node: Citations8223
- Node: Citation Elements10512
- Node: Recognizing Citations12389
- Node: Information Keys and the Info Alist14434
- Node: Reference Headers17025
- Node: The Built-in Header Rewrite Functions18590
- Node: Electric References21035
- Node: Getting Connected23904
- Node: Emacs 19 MUAs27422
- Node: Emacs 18 MUAs28253
- Node: MH-E with any Emacsen29609
- Node: VM with any Emacsen31368
- Node: GNEWS with any Emacsen32430
- Node: Overloading for Non-conforming MUAs33152
- Node: Replying and Yanking36402
- Node: Reply Buffer Initialization36737
- Node: Filling Cited Text43620
- Node: Selecting an Attribution47089
- Node: Attribution Preferences47946
- Node: Anonymous Attributions51857
- Node: Author Names54893
- Node: Configuring the Citation Engine57376
- Node: Using Regi59101
- Node: Frames You Can Customize62970
- Node: Post-yank Formatting Commands65495
- Node: Citing Commands66640
- Node: Insertion Commands69352
- Node: Variable Toggling Shortcuts70287
- Node: Mail Field Commands72641
- Node: Miscellaneous Commands75006
- Node: Hints to MUA Authors76270
- Node: Version 3 Changes80309
- Node: Thanks and History83006
- Node: The Supercite Mailing List84602
- Node: Concept Index85930
- Node: Command Index91999
- Node: Key Index97470
- Node: Variable Index99492
- 
- End Tag Table
--- 0 ----
Index: emacs/info/sc-1
diff -c emacs/info/sc-1:1.1.1.2 emacs/info/sc-1:removed
*** emacs/info/sc-1:1.1.1.2	Mon Jul 22 01:52:57 1996
--- emacs/info/sc-1	Fri Aug  2 20:23:57 1996
***************
*** 1,1085 ****
- This is Info file ../info/sc, produced by Makeinfo-1.55 from the input
- file sc.texi.
- 
-    This document describes the Supercite Version 3.1 package for citing
- and attributing the replies for various GNU Emacs mail and news reading
- subsystems.
- 
-    Copyright (C) 1993 Barry A. Warsaw
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
- 
- File: sc,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
- 
-    This document describes the Supercite Version 3.1 package for citing
- and attributing the replies for various GNU Emacs mail and news reading
- subsystems.  The manual is divided into the following chapters.
- 
- * Menu:
- 
- * Introduction::
- * Citations::
- * Getting Connected::
- * Replying and Yanking::
- * Selecting an Attribution::
- * Configuring the Citation Engine::
- * Post-yank Formatting Commands::
- * Information Keys and the Info Alist::
- * Reference Headers::
- * Hints to MUA Authors::
- * Version 3 Changes::
- * Thanks and History::
- * The Supercite Mailing List::
- 
- * Concept Index::
- * Command Index::
- * Key Index::
- * Variable Index::
- 
- 
- File: sc,  Node: Introduction,  Next: Usage Overview,  Prev: Top,  Up: Top
- 
- Introduction
- ************
- 
-    Supercite version 3.1 is a GNU Emacs package written entirely in
- Emacs Lisp. It interfaces to most of the commonly used Emacs mail user
- agents ("MUAs") and news user agents ("NUAs"), and provides
- sophisticated facilities for the citing and attributing of message
- replies.  Supercite has a very specific and limited role in the process
- of composing replies to both USENET network news and electronic mail.
- 
-    The preferred way to spell Supercite is with a capital `S',
- lowercase `upercite'.  There are a few alternate spellings out there
- and I won't be terribly offended if you use them.  People often ask
- though...
- 
- * Menu:
- 
- * Usage Overview::
- * What Supercite Does Not Do::
- * What Supercite Does::
- 
-    Supercite is only useful in conjunction with MUAs and NUAs such as
- VM, GNUS, RMAIL, etc. (hereafter referred to collectively as MUAs).
- Supercite is typically called by the MUA after a reply buffer has been
- setup.  Thereafter, Supercite's many commands and formatting styles are
- available in that reply buffer until the reply is sent.  Supercite is
- re-initialized in each new reply buffer.
- 
-    Supercite is currently at major revision 3.1, and is known to work
- in the following environments:
- 
- Emacs versions:
-      	GNU Emacs 18.57 through 18.59, all Emacs 19, 	all current Lucid
-      Emacs, and Epoch 4.
- 
- MUAs:
-      	VM 4.37 and beyond (including VM version 5), RMAIL, MH-E 3.7 and
-      beyond, PCMAIL.
- 
- NUAs:
-      	RNEWS, GNUS 3.12 and beyond, GNEWS.
- 
-    For systems with version numbers, all known subsequent versions also
- work with Supercite.  For those systems without version numbers,
- Supercite probably works with any recently released version.  Note that
- only some of these systems will work with Supercite "out of the box."
- All others must overload interfacing routines to supply the necessary
- glue.  *Note Getting Connected:: for more details.
- 
- 
- File: sc,  Node: Usage Overview,  Next: What Supercite Does Not Do,  Prev: Introduction,  Up: Introduction
- 
- Usage Overview
- ==============
- 
-    Typical usage is as follows. You want to reply or followup to a
- message in your MUA. You will probably hit `r' (i.e., "reply") or `f'
- (i.e., "forward") to begin composing the reply.  In response, the MUA
- will create a reply buffer and initialize the outgoing mail headers
- appropriately.  The body of the reply will usually be empty at this
- point.  You now decide that you would like to include part of the
- original message in your reply. To do this, you "yank" the original
- message into the reply buffer, typically with a key stroke such as `C-c
- C-y'.  This sequence will invoke an MUA-specific function which fills
- the body of the reply with the original message and then "attributes"
- this text to its author.  This is called "citing" and its effect is to
- prefix every line from the original message with a special text tag.
- Most MUAs provide some default style of citing; by using Supercite you
- gain a wider flexibility in the look and style of citations.
- Supercite's only job is to cite the original message.
- 
- 
- File: sc,  Node: What Supercite Does Not Do,  Next: What Supercite Does,  Prev: Usage Overview,  Up: Introduction
- 
- What Supercite Doesn't Do
- =========================
- 
-    Because of this clear division of labor, there are useful features
- which are the sole responsibility of the MUA, even though it might seem
- that Supercite should provide them.  For example, many people would
- like to be able to yank (and cite) only a portion of the original
- message.  Since Supercite only modifies the text it finds in the reply
- buffer as set up by the MUA, it is the MUA's responsibility to do
- partial yanking.  *Note Reply Buffer Initialization::.
- 
-    Another potentially useful thing would be for Supercite to set up the
- outgoing mail headers with information it gleans from the reply buffer.
- But by previously agreed upon convention, any text above the
- `mail-header-separator' which separates mail headers from message
- bodies cannot be modified by Supercite.  Supercite, in fact, doesn't
- know anything about the meaning of these headers, and never ventures
- outside the designated region. *Note Hints to MUA Authors:: for more
- details.
- 
- 
- File: sc,  Node: What Supercite Does,  Next: Citations,  Prev: What Supercite Does Not Do,  Up: Introduction
- 
- What Supercite Does
- ===================
- 
-    Supercite is invoked for the first time on a reply buffer via your
- MUA's reply or forward command.  This command will actually perform
- citations by calling a hook variable to which Supercite's top-level
- function `sc-cite-original' has been added.  When `sc-cite-original' is
- executed, the original message must be set up in a very specific way,
- but this is handled automatically by the MUA.  *Note Hints to MUA
- Authors::.
- 
-    The first thing Supercite does, via `sc-cite-original', is to parse
- through the original message's mail headers.  It saves this data in an
- "information association list", or "info alist".  The information in
- this list is used in a number of places throughout Supercite.  *Note
- Information Keys and the Info Alist::.
- 
-    After the mail header info is extracted, the headers are optionally
- removed ("nuked") from the reply.  Supercite then writes a "reference
- header" into the buffer.  This reference header is a string carrying
- details about the citation it is about to perform.
- 
-    Next, Supercite visits each line in the reply, transforming the line
- according to a customizable "script".  Lines which were not previously
- cited in the original message are given a citation, while already cited
- lines remain untouched, or are coerced to your preferred style.
- Finally, Supercite installs a keymap into the reply buffer so that you
- have access to Supercite's post-yank formatting and reciting commands as
- you subsequently edit your reply.  You can tell that Supercite has been
- installed into the reply buffer because that buffer's modeline will
- display the minor mode string `SC'.
- 
-    When the original message is cited by `sc-cite-original', it will
- (optionally) be filled by Supercite.  However, if you manually edit the
- cited text and want to re-fill it, you must use an add-on package such
- as `filladapt' or `gin-mode'.  These packages can recognize Supercited
- text and will fill them appropriately.  Emacs' built-in filling
- routines, e.g. `fill-paragraph', do not recognize cited text and will
- not re-fill them properly because it cannot guess the `fill-prefix'
- being used.  *Note Post-yank Formatting Commands:: for details.
- 
-    As mentioned above, Supercite provides commands to recite or uncite
- regions of text in the reply buffer, and commands to perform other
- beautifications on the cited original text, maintaining consistent and
- informative citations throughout.  Supercite tries to be as configurable
- as possible to allow for a wide range of personalized citation styles,
- but it is also immediately useful with the default configuration, once
- it has been properly connected to your MUA.  *Note Getting Connected::
- for more details.
- 
- 
- File: sc,  Node: Citations,  Next: Citation Elements,  Prev: What Supercite Does,  Up: Top
- 
- Citations
- *********
- 
-    A "citation" is the acknowledgement of the original author of a mail
- message in the body of the reply.  There are two basic citation styles
- which Supercite supports.  The first, called "nested citations" is an
- anonymous form of citation; in other words, an indication is made that
- the cited line was written by someone *other* that the current message
- author (i.e., other than you, the person composing the reply), but no
- reference is made as to the identity of the original author.  This
- style should look familiar since its use on the net is widespread.
- Here's an example of what a message buffer would look like using nested
- citations after multiple replies:
- 
-      >> John originally wrote this
-      >> and this as well
-      > Jane said that John didn't know
-      > what he was talking about
-      And that's what I think too.
- 
- * Menu:
- 
- * Citation Elements::
- * Recognizing Citations::
- 
-    Note that multiple inclusions of the original messages result in a
- nesting of the ``>'' characters.  This can sometimes be quite confusing
- when many levels of citations are included since it may be difficult or
- impossible to figure out who actually participated in the thread, and
- multiple nesting of ``>'' characters can sometimes make the message
- very difficult for the eye to scan.
- 
-    In "non-nested citations", each cited line begins with an
- informative string attributing that line to the original author. Only
- the first level of attribution will be shown; subsequent citations don't
- nest the citation strings. The above dialog might look like this when
- non-nested citations are used:
- 
-      John> John originally wrote this
-      John> and this as well
-      Jane> Jane said that John didn't know
-      Jane> what he was talking about
-      And that's what I think too.
- 
-    Notice here that my inclusion of Jane's inclusion of John's original
- message did not result in a line cited with `Jane>John>'.
- 
-    Supercite supports both styles of citation, and the variable
- `sc-nested-citation-p' controls which style it will use when citing
- previously uncited text. When this variable is `nil' (the default),
- non-nested citations are used.  When non-`nil', nested citations are
- used.
- 
- 
- File: sc,  Node: Citation Elements,  Next: Recognizing Citations,  Prev: Citations,  Up: Citations
- 
- Citation Elements
- =================
- 
-    "Citation strings" are composed of one or more elements. Non-nested
- citations are composed of four elements, three of which are directly
- user definable.  The elements are concatenated together, in this order:
- 
-   1. The "citation leader".  The citation leader is contained in the
-      variable `sc-citation-leader', and has the default value of a
-      string containing four spaces.
- 
-   2. The "attribution string".  This element is supplied automatically
-      by Supercite, based on your preferences and the original message's
-      mail headers, though you may be asked to confirm Supercite's
-      choice.  *Note Selecting an Attribution:: for more details.
- 
-   3. The "citation delimiter".  This string, contained in the variable
-      `sc-citation-delimiter' visually separates the citation from the
-      text of the line.  This variable has a default value of `">"' and
-      for best results, the string should consist of only a single
-      character.
- 
-   4. The "citation separator".  The citation separator is contained in
-      the variable `sc-citation-separator', and has the default value of
-      a string containing a single space.
- 
-    For example, suppose you were using the default values for the above
- variables, and Supercite provided the attribution string `Jane'.  In
- this case, the composed, non-nested citation string used might be
- something like `"    Jane> "'.  This citation string will be inserted
- in front of every line in the original message that is not already
- cited.
- 
-    Nested citations, being simpler than non-nested citations, are
- composed of the same elements, sans the attribution string.  Supercite
- is smart enough to not put additional spaces between citation
- delimiters for multi-level nested citations.
- 
- 
- File: sc,  Node: Recognizing Citations,  Next: Getting Connected,  Prev: Citation Elements,  Up: Citations
- 
- Recognizing Citations
- =====================
- 
-    Supercite also recognizes citations in the original article, and can
- transform these already cited lines in a number of ways. This is how
- Supercite suppresses the multiple citing of non-nested citations.
- Recognition of cited lines is controlled by variables analogous to those
- that make up the citation string as mentioned previously.
- 
-    The variable `sc-citation-leader-regexp' describes how citation
- leaders can look, by default it matches any number of spaces or tabs.
- Note that since the lisp function `looking-at' is used to do the
- matching, if you change this variable it need not start with a leading
- `"^"'.
- 
-    Similarly, the variables `sc-citation-delimiter-regexp' and
- `sc-citation-separator-regexp' respectively describe how citation
- delimiters and separators can look.  They follow the same rule as
- `sc-citation-leader-regexp' above.
- 
-    When Supercite composes a citation string, it provides the
- attribution automatically.  The analogous variable which handles
- recognition of the attribution part of citation strings is
- `sc-citation-root-regexp'.  This variable describes the attribution
- root for both nested and non-nested citations.  By default it can match
- zero-to-many alphanumeric characters (also ".", "-", and "_").  But in
- some situations, Supercite has to determine whether it is looking at a
- nested or non-nested citation.  Thus the variable
- `sc-citation-nonnested-root-regexp' is used to describe only non-nested
- citation roots.  It is important to remember that if you change
- `sc-citation-root-regexp' you should always also change
- `sc-citation-nonnested-root-regexp'.
- 
-    Nemacs users: For best results, try setting
- `sc-citation-root-regexp' to:
- 
-      "\\([-._a-zA-Z0-9]\\|\\cc\\|\\cC\\|\\ch\\|\\cH\\|\\ck\\|\\cK\\|\\ca\\|\\cg\\|\\cr\\|\\cu\\)*"
- 
-    Mule users: For best results, try setting `sc-citation-root-regexp'
- to:
- 
-      "\\([-._a-zA-Z0-9]\\|\\cj\\)*"
- 
- 
- File: sc,  Node: Information Keys and the Info Alist,  Next: Reference Headers,  Prev: Miscellaneous Commands,  Up: Top
- 
- Information Keys and the Info Alist
- ***********************************
- 
-    "Mail header information keys" are nuggets of information that
- Supercite extracts from the various mail headers of the original
- message, placed in the reply buffer by the MUA.  Information is kept in
- the "Info Alist" as key-value pairs, and can be retrieved for use in
- various places within Supercite, such as in header rewrite functions and
- attribution selection.  Other bits of data, composed and created by
- Supercite, are also kept as key-value pairs in this alist. In the case
- of mail fields, the key is the name of the field, omitting the trailing
- colon.  Info keys are always case insensitive (as are mail headers), and
- the value for a corresponding key can be retrieved from the alist with
- the `sc-mail-field' function.  Thus, if the following fields were
- present in the original article:
- 
-      Date: 08 April 1991, 17:32:09 EST
-      Subject: Better get out your asbestos suit
- 
- then, the following lisp constructs return:
- 
-      (sc-mail-field "date")
-      ==> "08 April 1991, 17:32:09 EST"
-      
-      (sc-mail-field "subject")
-      ==> "Better get out your asbestos suit"
- 
-    Since the argument to `sc-mail-field' can be any string, it is
- possible that the mail field will not be present on the info alist
- (possibly because the mail header was not present in the original
- message). In this case, `sc-mail-field' will return the value of the
- variable `sc-mumble'.
- 
-    Supercite always places all mail fields found in the yanked original
- article into the info alist.  If possible, Supercite will also places
- the following keys into the info alist:
- 
- `"sc-attribution"'
-      the selected attribution string.
- 
- `"sc-citation"'
-      the non-nested citation string.
- 
- `"sc-from-address"'
-      email address extracted from the `From:' field.
- 
- `"sc-reply-address"'
-      email address extracted from the `Reply-To:' field.
- 
- `"sc-sender-address"'
-      email address extracted from the `Sender:' field.
- 
- `"sc-emailname"'
-      email terminus extracted from the `From:' field.
- 
- `"sc-initials"'
-      the author's initials.
- 
- `"sc-author"'
-      the author's full name.
- 
- `"sc-firstname"'
-      the author's first name.
- 
- `"sc-lastname"'
-      the author's last name.
- 
- `"sc-middlename-1"'
-      the author's first middle name.
- 
-    If the author's name has more than one middle name, they will appear
- as info keys with the appropriate index (e.g., `"sc-middlename-2"',
- ...).  *Note Selecting an Attribution::.
- 
- 
- File: sc,  Node: Reference Headers,  Next: The Built-in Header Rewrite Functions,  Prev: Information Keys and the Info Alist,  Up: Top
- 
- Reference Headers
- *****************
- 
-    Supercite will insert an informative "reference header" at the
- beginning of the cited body of text, which display more detail about the
- original article and provides the mapping between the attribution and
- the original author in non-nested citations.  Whereas the citation
- string usually only contains a portion of the original author's name,
- the reference header can contain such information as the author's full
- name, email address, the original article's subject, etc.  In fact any
- information contained in the info alist can be inserted into a reference
- header.
- 
- * Menu:
- 
- * The Built-in Header Rewrite Functions::
- * Electric References::
- 
-    There are a number of built-in "header rewrite functions" supplied
- by Supercite, but you can write your own custom header rewrite functions
- (perhaps using the built-in ones as examples). The variable
- `sc-rewrite-header-list' contains the list of such header rewrite
- functions.  This list is consulted both when inserting the initial
- reference header, and when displaying "electric references".  *Note
- Electric References::.
- 
-    When Supercite is initially run on a reply buffer (via
- `sc-cite-original'), it will automatically call one of these functions.
- The one it uses is defined in the variable `sc-preferred-header-style'.
- The value of this variable is an integer which is an index into the
- `sc-rewrite-header-list', beginning at zero.
- 
- 
- File: sc,  Node: The Built-in Header Rewrite Functions,  Next: Electric References,  Prev: Reference Headers,  Up: Reference Headers
- 
- The Built-in Header Rewrite Functions
- =====================================
- 
-    Below are examples of the various built-in header rewrite functions.
- Please note the following: first, the text which appears in the
- examples below as INFOKEY indicates that the corresponding value of the
- info key from the info alist will be inserted there.  (*Note
- Information Keys and the Info Alist::).  For example, in
- `sc-header-on-said' below, DATE and FROM correspond to the values of the
- `Date:' and `From:' mail headers respectively.
- 
-    Also, the string `">>>>>"' below is really the value of the variable
- `sc-reference-tag-string'.  This variable is used in all built-in
- header rewrite functions, and you can customize its value to change the
- tag string globally.
- 
-    Finally, the references headers actually written may omit certain
- parts of the header if the info key associated with INFOKEY is not
- present in the info alist.  In fact, for all built-in headers, if the
- `From:' field is not present in the mail headers, the entire reference
- header will be omitted (but this usually signals a serious problem
- either in your MUA or in Supercite's installation).
- 
- `sc-no-header'
-      This function produces no header. It should be used instead of
-      `nil' to produce a blank header.  This header can possibly contain
-      a blank line after the `mail-header-separator' line.
- 
- `sc-no-blank-line-or-header'
-      This function is similar to `sc-no-header' except that any blank
-      line after the `mail-header-separator' line will be removed.
- 
- `sc-header-on-said'
-      `>>>>> On DATE, FROM said:'
- 
- `sc-header-inarticle-writes'
-      `>>>>> In article MESSAGE-ID, FROM writes:'
- 
- `sc-header-regarding-adds'
-      `>>>>> Regarding SUBJECT; FROM adds:'
- 
- `sc-header-attributed-writes'
-      `>>>>> "SC-ATTRIBUTION" == SC-AUTHOR <SC-REPLY-ADDRESS> writes:'
- 
- `sc-header-author-writes'
-      `>>>>> SC-AUTHOR writes:'
- 
- `sc-header-verbose'
-      `>>>>> On DATE,'
-      `>>>>> SC-AUTHOR'
-      `>>>>> from the organization of ORGANIZATION'
-      `>>>>> who can be reached at: SC-REPLY-ADDRESS'
-      `>>>>> (whose comments are cited below with: "SC-CITE")'
-      `>>>>> had this to say in article MESSAGE-ID'
-      `>>>>> in newsgroups NEWSGROUPS'
-      `>>>>> concerning the subject of SUBJECT'
-      `>>>>> see REFERENCES for more details'
- 
- 
- File: sc,  Node: Electric References,  Next: Hints to MUA Authors,  Prev: The Built-in Header Rewrite Functions,  Up: Reference Headers
- 
- Electric References
- ===================
- 
-    By default, when Supercite cites the original message for the first
- time, it just goes ahead and inserts the reference header indexed by
- `sc-preferred-header-style'.  However, you may want to select different
- reference headers based on the type of reply or forwarding you are
- doing. You may also want to preview the reference header before
- deciding whether to insert it into the reply buffer or not. Supercite
- provides an optional "electric reference" mode which you can drop into
- to give you this functionality.
- 
-    If the variable `sc-electric-references-p' is non-`nil', Supercite
- will bring up an electric reference mode buffer and place you into a
- recursive edit.  The electric reference buffer is read-only, so you
- cannot directly modify the reference text until you exit electric
- references and insert the text into the reply buffer.  But you can cycle
- through all the reference header rewrite functions in your
- `sc-rewrite-header-list'.
- 
-    You can also set a new preferred header style, jump to any header, or
- jump to the preferred header. The header will be shown in the electric
- reference buffer and the header index and function name will appear in
- the echo area.
- 
-    The following commands are available while in electric reference mode
- (shown here with their default key bindings):
- 
- `sc-eref-next' (`n')
-      Displays the next reference header in the electric reference
-      buffer. If the variable `sc-electric-circular-p' is non-`nil',
-      invoking `sc-eref-next' while viewing the last reference header in
-      the list will wrap around to the first header.
- 
- `sc-eref-prev' (`p')
-      Displays the previous reference header in the electric reference
-      buffer.  If the variable `sc-electric-circular-p' is non-`nil',
-      invoking `sc-eref-prev' will wrap around to the last header.
- 
- `sc-eref-goto' (`g')
-      Goes to a specified reference header.  The index (into the
-      `sc-rewrite-header-list') can be specified as a numeric argument to
-      the command.  Otherwise, Supercite will query you for the index in
-      the minibuffer.
- 
- `sc-eref-jump' (`j')
-      Display the preferred reference header, i.e., the one indexed by
-      the current value of `sc-preferred-header-style'.
- 
- `sc-eref-setn' (`s')
-      Set the preferred reference header (i.e.,
-      `sc-preferred-header-style') to the currently displayed header.
- 
- `sc-eref-exit' (LFD, RET, and ESC C-c)
-      Exit from electric reference mode and insert the current header
-      into the reply buffer.
- 
- `sc-eref-abort' (`q', `x')
-      Exit from electric reference mode without inserting the current
-      header.
- 
- Supercite will execute the hook `sc-electric-mode-hook' before entering
- electric reference mode.
- 
- 
- File: sc,  Node: Getting Connected,  Next: Emacs 19 MUAs,  Prev: Recognizing Citations,  Up: Top
- 
- Getting Connected
- *****************
- 
-    Hitting `C-c C-y' in your MUA's reply buffer yanks and cites the
- original message into the reply buffer.  In reality, the citation of the
- original message is performed via a call through a configurable hook
- variable.  The name of this variable has been agreed to in advance as
- part of the "citation interface specification".  By default this hook
- variable has a `nil' value, which the MUA recognizes to mean, "use your
- default citation function".  When you add Supercite's citation function
- to the hook, thereby giving the variable a non-`nil' value, it tells
- the MUA to run the hook via `run-hooks' instead of using the default
- citation.
- 
- * Menu:
- 
- * Emacs 19 MUAs::
- * Emacs 18 MUAs::
- * MH-E with any Emacsen::
- * VM with any Emacsen::
- * GNEWS with any Emacsen::
- * Overloading for Non-conforming MUAs::
- 
-    Early in Supercite's development, the Supercite author, a few MUA
- authors, and some early Supercite users got together and agreed upon a
- standard interface between MUAs and citation packages (of which
- Supercite is currently the only known add-on :-).  With the recent
- release of the Free Software Foundation's GNU Emacs 19, the interface
- has undergone some modification and it is possible that not all MUAs
- support the new interface yet.  Some support only the old interface and
- some do not support the interface at all.  Still, it is possible for all
- known MUAs to use Supercite, and the following sections will outline the
- procedures you need to follow.
- 
-    To learn exactly how to connect Supercite to the software systems you
- are using, read the appropriate following sections.  For details on the
- interface specifications, or if you are writing or maintaining an MUA,
- *note Hints to MUA Authors::..
- 
-    The first thing that everyone should do, regardless of the MUA you
- are using is to set up Emacs so it will load Supercite at the
- appropriate time.  You can either dump Supercite into your Emacs binary
- (ask your local Emacs guru how to do this if you don't know), or you
- can set up an "autoload" for Supercite.  To do the latter, put the
- following in your `.emacs' file:
- 
-      (autoload 'sc-cite-original     "supercite" "Supercite 3.1" t)
-      (autoload 'sc-submit-bug-report "supercite" "Supercite 3.1" t)
- 
-    The function `sc-cite-original' is the top-level Supercite function
- designed to be run from the citation hook.  It expects `point' and
- `mark' to be set around the region to cite, and it expects the original
- article's mail headers to be present within this region.  Note that
- Supercite *never* touches any text outside this region.  Note further
- that for Emacs 19, the region need not be active for `sc-cite-original'
- to do its job.  *Note Hints to MUA Authors::.
- 
-    The other step in the getting connected process is to make sure your
- MUA calls `sc-cite-original' at the right time.  As mentioned above,
- some MUAs handle this differently.  Read the sections that follow
- pertaining to the MUAs you are using.
- 
-    One final note.  After Supercite is loaded into your Emacs session,
- it runs the hook `sc-load-hook'.  You can put any customizations into
- this hook since it is only run once.  This will not work, however, if
- your Emacs maintainer has put Supercite into your dumped Emacs' image.
- In that case, you can use the `sc-pre-hook' variable, but this will get
- executed every time `sc-cite-original' is called.  *Note Reply Buffer
- Initialization::.
- 
- 
- File: sc,  Node: Emacs 19 MUAs,  Next: Emacs 18 MUAs,  Prev: Getting Connected,  Up: Getting Connected
- 
- GNUS, RMAIL, or RNEWS with any Emacs 19
- =======================================
- 
-    These MUAs, distributed with Emacs and with Lucid Emacs, use Emacs's
- built-in yanking facility, which provides the citing hook variable
- `mail-citation-hook'.  By default, this hook's value is `nil', but by
- adding the following to your `.emacs' file, you can tell these MUAs to
- use Supercite to perform the citing of the original message:
- 
-      (add-hook 'mail-citation-hook 'sc-cite-original)
- 
-    GNUS users may also want to add the following bit of lisp as well.
- This prevents GNUS from inserting its default attribution header.
- Otherwise, both GNUS and Supercite will insert an attribution header:
- 
-      (setq news-reply-header-hook nil)
- 
- 
- File: sc,  Node: Emacs 18 MUAs,  Next: MH-E with any Emacsen,  Prev: Emacs 19 MUAs,  Up: Getting Connected
- 
- GNUS, RMAIL, PCMAIL, RNEWS with Emacs 18 or Epoch 4
- ===================================================
- 
-    These MUAs use Emacs' built-in yanking and citing routines,
- contained in the `sendmail.el' file.  `sendmail.el' for Emacs 18, and
- its derivative Epoch 4, do not know anything about the citation
- interface required by Supercite.  To connect Supercite to any of these
- MUAs under Emacs 18 or Epoch 4, you should first *note Overloading for
- Non-conforming MUAs::..  Then follow the directions for using these
- MUAs under Emacs 19.  *Note Emacs 19 MUAs::.
- 
-    Note that those instructions will tell you to use the function
- `add-hook'. This function is new with Emacs 19 and you will not have it
- by default if you are running Emacs 18 or Epoch 4.  You can either
- substitute the appropriate call to `setq', or you can use the
- `add-hook' function that is provided in the `sc-unsupp.el' file of
- unsupported Supercite hacks and ideas.  Or you can upgrade to some
- Emacs 19 variant!  :-)
- 
-    To use `setq' instead of `add-hook', you would, for example, change
- this:
- 
-      (add-hook 'mail-citation-hook 'sc-cite-original)
- 
-    to:
- 
-      (setq mail-citation-hook 'sc-cite-original)
- 
-    Note the lack of of a single quote on the first argument to `setq'.
- 
- 
- File: sc,  Node: MH-E with any Emacsen,  Next: VM with any Emacsen,  Prev: Emacs 18 MUAs,  Up: Getting Connected
- 
- MH-E with any Emacsen
- =====================
- 
-    MH-E 4.x conforms to the `mail-citation-hook' interface supported by
- other MUAs.  At the time of this writing, MH-E 4.0 has not been
- released, but if you have it, put this in your `.emacs' file to connect
- Supercite and MH-E 4.x:
- 
-      (add-hook 'mail-citation-hook 'sc-cite-original)
- 
-    Note that if you are using Emacs 18 or Epoch 4, you will not have the
- `add-hook' function.  *Note Emacs 18 MUAs:: for details on how to
- proceed without `add-hook'.
- 
-    MH-E version 3.x uses a slightly different interface than other MUAs.
- MH-E provides a hook variable `mh-yank-hooks', but it doesn't act like
- a hook, and doing an `add-hook' will not work.
- 
-    To connect Supercite to MH-E 3.x, you should instead add the
- following to your `.emacs' file:
- 
-      (add-hook 'mh-yank-hooks 'sc-cite-original)
- 
-    You also need to make sure that MH-E includes all the original mail
- headers in the yanked message.  The variable that controls this is
- `mh-yank-from-start-of-msg'.  By default, this variable has the value
- `t', which tells MH-E to include all the mail headers when yanking the
- original message.  Before you switched to using Supercite, you may have
- set this variable to other values so as not to include the mail headers
- in the yanked message.  Since Supercite requires these headers (and
- cleans them out for you), you need to make sure the value is `t'.  This
- lisp, in your `.emacs' file will do the trick:
- 
-      (setq mh-yank-from-start-of-msg t)
- 
-    Note that versions of MH-E before 3.7 did not provide the
- `mh-yank-hooks' variable.  Your only option is to upgrade to MH-E
- version 3.7 or later.
- 
- 
- File: sc,  Node: VM with any Emacsen,  Next: GNEWS with any Emacsen,  Prev: MH-E with any Emacsen,  Up: Getting Connected
- 
- VM with any Emacsen
- ===================
- 
-    Since release 4.40, VM has supported the citation interface required
- by Supercite.  But since the interface has changed recently the details
- of getting connected differ with the version of VM you are using.
- 
-    If you are running any release of VM after 4.40, you can add the
- following to your `.emacs' to connect Supercite with VM:
- 
-      (add-hook 'mail-yank-hooks 'sc-cite-original)
- 
-    Note that if you are using Emacs 18 or Epoch 4, you will not have the
- `add-hook' function.  *Note Emacs 18 MUAs:: for details on how to
- proceed without `add-hook'.
- 
-    Since version 5.34, VM has supported the newer `mail-citation-hook'
- interface, but `mail-yank-hooks' is still being supported for backward
- compatibility.  If you are running a newer version of VM and you want
- to maintain consistency with other MUAs, use this bit of code instead:
- 
-      (add-hook 'mail-citation-hook 'sc-cite-original)
- 
- 
- File: sc,  Node: GNEWS with any Emacsen,  Next: Overloading for Non-conforming MUAs,  Prev: VM with any Emacsen,  Up: Getting Connected
- 
- GNEWS with any Emacsen
- ======================
- 
-    As far as I know, no version of GNEWS supports the citation interface
- required by Supercite.  To connect Supercite with GNEWS, please first
- *note Overloading for Non-conforming MUAs::..
- 
-    After you have followed the directions in that section.  You should
- add the following lisp code to your `.emacs' file:
- 
-      (add-hook 'mail-citation-hook 'sc-cite-original)
- 
-    Note that if you are using Emacs 18 or Epoch 4, you will not have the
- `add-hook' function.  *Note Emacs 18 MUAs:: for details on how to
- proceed without `add-hook'.
- 
- 
- File: sc,  Node: Overloading for Non-conforming MUAs,  Next: Replying and Yanking,  Prev: GNEWS with any Emacsen,  Up: Getting Connected
- 
- Overloading for Non-conforming MUAs
- ===================================
- 
-    As mentioned elsewhere, some MUAs do not provide the necessary hooks
- to connect with Supercite.  Supercite version 3.1 provides an
- unsupported mechanism, called "overloading" which redefines certain key
- functions in the MUA, so that it will call the `mail-citation-hook'
- variable instead of the MUA's default hard-coded citing routines.  Since
- most newer versions of the known MUAs support the `mail-citation-hook'
- variable, it is recommended that you upgrade if at all possible.  But
- if you can't upgrade, at least you're not out of luck!  Once you set up
- overloading properly, you should follow the directions for connecting
- Supercite to the Emacs 19 MUAs.  *Note Emacs 19 MUAs::.
- 
-    Users of Bob Weiner's Hyperbole package take note.  Hyperbole
- provides the necessary overloads (and a whole lot more!) and you can
- potentially clobber it if you were to load Supercite's overloading after
- Hyperbole's.  For this reason, Supercite will *not* perform any
- overloading if it finds the variable `hyperb:version' is `boundp' (i.e.
- it exists because Hyperbole has been loaded into your Emacs session).
- If this is the case, Supercite will display a warning message in the
- minibuffer.  You should consult the Hyperbole manual for further
- details.
- 
-    Overloading involves the re-definition of the citing function with
- the new, `mail-citation-hook' savvy version.  The function in
- `sc-oloads.el' that does this is `sc-perform-overloads'.  This function
- is smart enough to only overload the MUA functions when it is
- absolutely necessary, based on the version numbers it can figure out.
- Also, `sc-perform-overloads' will only install the new functions once.
- It is also smart enough to do nothing if the MUA is not yet loaded.
- 
-    The tricky part is finding the right time and place to perform the
- overloading.  It must be done after the MUA has been loaded into your
- Emacs session, but before the first time you try to yank in a message.
- Fortunately, this has been figured out for you.
- 
-    If you must overload, you should put the following lisp code in your
- `.emacs' file, to make sure the `sc-oloads.el' file gets loaded at the
- right time:
- 
-      (autoload 'sc-perform-overloads "sc-oloads" "Supercite 3.1" t)
- 
-    Then you must make sure that the function `sc-perform-overloads'
- gets run at the right time.  For GNUS, put this in your `.emacs' file:
- 
-      (setq news-reply-mode-hook 'sc-perform-overloads)
-      (setq mail-setup-hook 'sc-perform-overloads)
- 
-    If you are using RNEWS, put this in your `.emacs' file:
- 
-      (setq news-reply-mode-hook 'sc-perform-overloads)
- 
-    If you are using RMAIL or PCMAIL, put this in your `.emacs' file:
- 
-      (setq mail-setup-hook 'sc-perform-overloads)
- 
-    If you are using GNEWS, put this in your `.emacs' file:
- 
-      (setq news-reply-mode-hook 'sc-perform-overloads)
-      (setq gnews-ready-hook 'sc-perform-overloads)
- 
-    Now go back and follow the directions for getting the Emacs 19 MUAs
- connected to Supercite.  Be sure to *note Emacs 18 MUAs::. on
- substitutes for Emacs 19's `add-hook' function.
- 
- 
- File: sc,  Node: Replying and Yanking,  Next: Reply Buffer Initialization,  Prev: Overloading for Non-conforming MUAs,  Up: Top
- 
- Replying and Yanking
- ********************
- 
-    This chapter explains what happens when you reply and yank an
- original message from an MUA.
- 
- * Menu:
- 
- * Reply Buffer Initialization::
- * Filling Cited Text::
- 
- 
- File: sc,  Node: Reply Buffer Initialization,  Next: Filling Cited Text,  Prev: Replying and Yanking,  Up: Replying and Yanking
- 
- Reply Buffer Initialization
- ===========================
- 
-    Executing `sc-cite-original' performs the following steps as it
- initializes the reply buffer:
- 
-   1. *Runs `sc-pre-hook'.* This hook variable is run before
-      `sc-cite-original' does any other work.  You could conceivably use
-      this hook to set certain Supercite variables based on the reply
-      buffer's mode or name (i.e., to do something different based on
-      whether you are replying or following up to an article).
- 
-   2. *Inserts Supercite's keymap.* Supercite provides a number of
-      commands for performing post-yank modifications to the reply
-      buffer.  These commands are installed on Supercite's top-level
-      keymap.  Since Supercite has to interface with a wide variety of
-      MUAs, it does not install all of its commands directly into the
-      reply buffer's keymap.  Instead, it puts its commands on a keymap
-      prefix, then installs this prefix onto the buffer's keymap.  What
-      this means is that you typically have to type more characters to
-      invoke a Supercite command, but Supercite's keybindings can be
-      made much more consistent across MUAs.
- 
-      You can control what key Supercite uses as its keymap prefix by
-      changing the variable `sc-mode-map-prefix'.  By default, this
-      variable is set to `C-c C-p'; a finger twister perhaps, but
-      unfortunately the best default due to the scarcity of available
-      keybindings in many MUAs.
- 
-   3. *Turns on Supercite minor mode.* The modeline of the reply buffer
-      should indicate that Supercite is active in that buffer by
-      displaying the string `SC'.
- 
-   4. *Sets the "Undo Boundary".* Supercite sets an undo boundary before
-      it begins to modify the original yanked text.  This allows you to
-      easily undo Supercite's changes to affect alternative citing
-      styles.
- 
-   5. *Processes the the mail headers.* All previously retrieved info
-      key-value pairs are deleted from the info alist, then the mail
-      headers in the body of the yanked message are scanned. Info
-      key-value pairs are created for each header found. Also, such
-      useful information as the author's name and email address are
-      extracted.  If the variable `sc-mail-warn-if-non-rfc822-p' is
-      non-`nil', then Supercite will warn you if it finds a mail header
-      that does not conform to RFC822.  This is rare and indicates a
-      problem either with your MUA or the original author's MUA, or some
-      MTA (mail transport agent) along the way.
- 
-      Once the info keys have been extracted from the mail headers, the
-      headers are nuked from the reply buffer.  You can control exactly
-      which headers are removed or kept, but by default, all headers are
-      removed.
- 
-      There are two variables which control mail header nuking.  The
-      variable `sc-nuke-mail-headers' controls the overall behavior of
-      the header nuking routines.  By setting this variable to `'all',
-      you automatically nuke all mail headers.  Likewise, setting this
-      variable to `'none' inhibits nuking of any mail headers.  In
-      between these extremes, you can tell Supercite to nuke only a
-      specified list of mail headers by setting this variable to
-      `'specified', or to keep only a specified list of headers by
-      setting it to `'keep'.
- 
-      If `sc-nuke-mail-headers' is set to `'specified' or `'keep', then
-      the variable `sc-nuke-mail-header-list' is consulted for the list
-      of headers to nuke or keep.  This variable contains a list of
-      regular expressions.  If the mail header line matches a regular
-      expression in this list, the header will be nuked or kept.  The
-      line is matched against the regexp using `looking-at' rooted at
-      the beginning of the line.
- 
-      If the variable `sc-blank-lines-after-headers' is non-`nil', it
-      contains the number of blank lines remaining in the buffer after
-      mail headers are nuked.  By default, only one blank line is left
-      in the buffer.
- 
-   6. *Selects the attribution and citation strings.* Once the mail
-      headers have been processed, Supercite selects a attribution
-      string and a citation string which it will use to cite the
-      original message.  *Note Selecting an Attribution:: for details.
- 
-   7. *Cites the message body.* After the selection of the attribution
-      and citation strings, Supercite cites the original message by
-      inserting the citation string prefix in front of every uncited
-      line.  You may not want Supercite to automatically cite very long
-      messages however.  For example, some email could contain a smaller
-      header section followed by a huge uuencoded message.  It wouldn't
-      make sense to cite the uuencoded message part when responding to
-      the original author's short preface.  For this reason, Supercite
-      provides a variable which limits the automatic citation of long
-      messages to a certain maximum number of lines.  The variable is
-      called `sc-cite-region-limit'.  If this variable contains an
-      integer, messages with more lines that this will not be cited at
-      all, and a warning message will be displayed.  Supercite has
-      performed everything necessary, though, for you to manually cite
-      only the small portion of the original message that you want to
-      use.
- 
-      If `sc-cite-region-limit' contains a non-`nil' value, the original
-      message will always be cited, regardless of its size.  If the
-      variable contains the value `nil', the region will never be cited
-      automatically.  Use this if you always want to be able to edit and
-      cite the message manually.
- 
-      The variable `sc-cite-blank-lines-p' controls whether blank lines
-      in the original message should be cited or not.  If this variable
-      is non-`nil', blank lines will be cited just like non-blank lines.
-      Otherwise, blank lines will be treated as paragraph separators.
- 
-      Citing of the original message is highly configurable. Supercite's
-      default setup does a pretty good job of citing many common forms of
-      previously cited messages.  But there are as many citation styles
-      out there as people on the net, or just about!  It would be
-      impossible for Supercite to anticipate every style in existence,
-      and you probably wouldn't encounter them all anyway.  But you can
-      configure Supercite to recognize those styles you see often.
-      *Note Configuring the Citation Engine:: for details.
- 
-   8. *Runs `sc-post-hook'.* This variable is very similar to
-      `sc-pre-hook', except that it runs after `sc-cite-original' is
-      finished. This hook is provided mostly for completeness and
-      backward compatibility. Perhaps it could be used to reset certain
-      variables set in `sc-pre-hook'.
- 
- 
- File: sc,  Node: Filling Cited Text,  Next: Selecting an Attribution,  Prev: Reply Buffer Initialization,  Up: Replying and Yanking
- 
- Filling Cited Text
- ==================
- 
-    Supercite will automatically fill newly cited text from the original
- message unless the variable `sc-auto-fill-region-p' has a `nil' value.
- Supercite will also re-fill paragraphs when you manually cite or
- re-cite text.
- 
-    However, during normal editing, Supercite itself cannot be used to
- fill paragraphs.  This is a change from version 2.  There are other
- add-on lisp packages which do filling much better than Supercite ever
- did.  The two best known are "filladapt" and "gin-mode".  Both work well
- with Supercite and both are available at the normal Emacs Lisp archive
- sites.  "gin-mode" works pretty well out of the box, but if you use
- "filladapt", you may want to run the function `sc-setup-filladapt' from
- your `sc-load-hook'.  This simply makes "filladapt" a little more
- Supercite savvy than its default setup.
- 
-    Also, Supercite will collapse leading whitespace between the citation
- string and the text on a line when the variable `sc-fixup-whitespace-p'
- is non-`nil'.  The default value for this variable is `nil'.
- 
-    Its important to understand that Supercite's automatic filling
- (during the initial citation of the reply) is very fragile.  That is
- because figuring out the `fill-prefix' for a particular paragraph is a
- really hard thing to do automatically.  This is especially the case when
- the original message contains code or some other text where leading
- whitespace is important to preserve.  For this reason, many Supercite
- users typically run with `sc-auto-fill-region-p' (and possibly also
- `sc-fixup-whitespace-p') set to `nil'.  They then manually fill each
- cited paragraph in the reply buffer.
- 
-    I usually run with both these variables containing their default
- values.  When Supercite's automatic filling breaks on a particular
- message, I will use Emacs' undo feature to undo back before the
- citation was applied to the original message.  Then I'll toggle the
- variables and manually cite those paragraphs that I don't want to fill
- or collapse whitespace on.  *Note Variable Toggling Shortcuts::.
- 
-    If you find that Supercite's automatic filling is just too fragile
- for your tastes, you might consider one of these alternate approaches.
- Also, to make life easier, a shortcut function to toggle the state of
- both of these variables is provided on the key binding `C-c C-p C-p'
- (with the default value of `sc-mode-map-prefix'; *note Post-yank
- Formatting Commands::.).
- 
-    You will noticed that the minor mode string will show the state of
- these variables as qualifier characters. When both variables are `nil',
- the Supercite minor mode string will display `SC'.  When just
- `sc-auto-fill-region-p' is non-`nil', the string will display `SC:f',
- and when just `sc-fixup-whitespace-p' is non-`nil', the string will
- display `SC:w'.  When both variables are non-`nil', the string will
- display `SC:fw'.  Note that the qualifiers chosen are mnemonics for the
- default bindings of the toggling function for each respective variable.
- *Note Variable Toggling Shortcuts::.
- 
-    Why are these variables not set to `nil' by default?  It is because
- many users won't manually fill paragraphs that are Supercited, and there
- have been widespread complaints on the net about mail and news messages
- containing lines greater than about 72 characters.  So the default is to
- fill cited text.
- 
- 
- File: sc,  Node: Selecting an Attribution,  Next: Attribution Preferences,  Prev: Filling Cited Text,  Up: Top
- 
- Selecting an Attribution
- ************************
- 
-    As you know, the attribution string is the part of the author's name
- that will be used to composed a non-nested citation string. Supercite
- scans the various mail headers present in the original article and uses
- a number of heuristics to extract strings which it puts into the
- "attribution association list" or "attribution alist". This is
- analogous, but different than, the info alist previously mentioned. Each
- element in the attribution alist is a key-value pair containing such
- information as the author's first name, middle names, and last name, the
- author's initials, and the author's email terminus.
- 
- * Menu:
- 
- * Attribution Preferences::
- * Anonymous Attributions::
- * Author Names::
- 
--- 0 ----
Index: emacs/info/sc-2
diff -c emacs/info/sc-2:1.1.1.2 emacs/info/sc-2:removed
*** emacs/info/sc-2:1.1.1.2	Mon Jul 22 01:52:59 1996
--- emacs/info/sc-2	Fri Aug  2 20:24:26 1996
***************
*** 1,1047 ****
- This is Info file ../info/sc, produced by Makeinfo-1.55 from the input
- file sc.texi.
- 
-    This document describes the Supercite Version 3.1 package for citing
- and attributing the replies for various GNU Emacs mail and news reading
- subsystems.
- 
-    Copyright (C) 1993 Barry A. Warsaw
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
- 
- File: sc,  Node: Attribution Preferences,  Next: Anonymous Attributions,  Prev: Selecting an Attribution,  Up: Selecting an Attribution
- 
- Attribution Preferences
- =======================
- 
-    When you cite an original message, you can tell Supercite which part
- of the author's name you would prefer it to use as the attribution.  The
- variable `sc-preferred-attribution-list' controls this; it contains
- keys which are matched against the attribution alist in the given order.
- The first value of a key that produces a non-`nil', non-empty string
- match is used as the attribution string, and if no keys match, a
- secondary mechanism is used to generate the attribution.  *Note
- Anonymous Attributions::.
- 
-    The following preferences are always available in the attribution
- alist (barring error):
- 
- `"emailname"'
-      the author's email terminus.
- 
- `"initials"'
-      the author's initials.
- 
- `"firstname"'
-      the author's first name.
- 
- `"lastname"'
-      the author's last name.
- 
- `"middlename-1"'
-      the author's first middle name.
- 
- `"sc-lastchoice"'
-      the last attribution string you have selected. This is useful when
-      you recite paragraphs in the reply.
- 
- `"sc-consult"'
-      consults the customizable list `sc-attrib-selection-list' which can
-      be used to select special attributions based on the value of any
-      info key.  See below for details.
- 
- `"x-attribution"'
-      the original author's suggestion for attribution string choice.
-      See below for details.
- 
-    Middle name indexes can be any positive integer greater than zero,
- though it is unlikely that many authors will have more than one middle
- name, if that many.
- 
-    At this point, let me digress into a discussion of etiquette.  It is
- my belief that while the style of the citations is a reflection of the
- personal tastes of the replier (i.e., you), the attribution selection is
- ultimately the personal choice of the original author.  In a sense it is
- his or her "net nickname", and therefore the author should have some
- say in the selection of attribution string.  Imagine how you would feel
- if someone gave you a nickname that you didn't like?
- 
-    For this reason, Supercite recognizes a special mail header,
- `X-Attribution:', which if present, tells Supercite the attribution
- string preferred by the original author.  It is the value of this header
- that is associated with the `"x-attribution"' key in the attribution
- alist.  Currently, you can override the preference of this key by
- changing `sc-preferred-attribution-list', but that isn't polite, and in
- the future Supercite may hard-code this.  For now, it is suggested that
- if you change the order of the keys in this list, that
- `"x-attribution"' always be first, or possible second behind only
- `"sc-lastchoice"'.  This latter is the default.
- 
-    The value `"sc-consult"' in `sc-preferred-attribution-list' has a
- special meaning during attribution selection.  When Supercite
- encounters this preference, it begins processing a customizable list of
- attributions, contained in the variable `sc-attrib-selection-list'.
- Each element in this list contains lists of the following form:
- 
-      (INFOKEY ((REGEXP . ATTRIBUTION)
-               (REGEXP . ATTRIBUTION)
-               (...)))
- 
- where INFOKEY is a key for `sc-mail-field' and REGEXP is a regular
- expression to match against the INFOKEY's value. If REGEXP matches the
- INFOKEY's value, the ATTRIBUTION is used as the attribution string.
- Actually, ATTRIBUTION can be a string or a list; if it is a list, it is
- `eval'uated and the return value (which must be a string), is used as
- the attribution.
- 
-    This can be very useful for when you are replying to net
- acquaintances who do not use the `X-Attribution:' mail header.  You may
- know what nickname they would prefer to use, and you can set up this
- list to match against a specific mail field, e.g., `From:', allowing you
- to cite your friend's message with the appropriate attribution.
- 
- 
- File: sc,  Node: Anonymous Attributions,  Next: Author Names,  Prev: Attribution Preferences,  Up: Selecting an Attribution
- 
- Anonymous Attributions
- ======================
- 
-    When the author's name cannot be found in the `From:' mail header, a
- fallback author name and attribution string must be supplied.  The
- fallback author name is contained in the variable
- `sc-default-author-name' and the fallback attribution string is
- contained in the variable `sc-default-attribution'.  Default values for
- these variables are `"Anonymous"' and `"Anon"', respectively. Note that
- in most circumstances, getting the default author name or attribution
- is a sign that something is set up incorrectly.
- 
-    Also, if the preferred attribution, which you specified in your
- `sc-preferred-attribution-alist' variable cannot be found, a secondary
- method can be employed to find a valid attribution string. The variable
- `sc-use-only-preference-p' controls what happens in this case.  If the
- variable's value is non-`nil', then `sc-default-author-name' and
- `sc-default-attribution' are used, otherwise, the following steps are
- taken to find a valid attribution string, and the first step to return
- a non-`nil', non-empty string becomes the attribution:
- 
-   1. Use the last selected attribution, if there is one.
- 
-   2. Use the value of the `"x-attribution"' key.
- 
-   3. Use the author's first name.
- 
-   4. Use the author's last name.
- 
-   5. Use the author's initials.
- 
-   6. Find the first non-`nil', non-empty attribution string in the
-      attribution alist.
- 
-   7. `sc-default-attribution' is used.
- 
-    Once the attribution string has been automatically selected, a
- number of things can happen. If the variable `sc-confirm-always-p' is
- non-`nil', you are queried for confirmation of the chosen attribution
- string. The possible values for completion are those strings in the
- attribution alist, however you are not limited to these choices.  You
- can type any arbitrary string at the confirmation prompt. The string
- you enter becomes the value associated with the `"sc-lastchoice"' key
- in the attribution alist.
- 
-    Once an attribution string has been selected, Supercite will force
- the string to lower case if the variable `sc-downcase-p' is non-`nil'.
- 
-    Two hook variables provide even greater control of the attribution
- selection process.  The hook `sc-attribs-preselect-hook' is run before
- any attribution is selected.  Likewise, the hook
- `sc-attribs-postselect-hook' is run after the attribution is selected
- (and the corresponding citation string is built), but before these
- values are committed for use by Supercite.  During the post-selection
- hook, the local variables `attribution' and `citation' are bound to the
- appropriate strings.  By changing these variables in your hook
- functions, you change the attribution and citation strings used by
- Supercite.  One possible use of this would be to override any
- automatically derived attribution string when it is only one character
- long; e.g. you prefer to use `"initials"' but the author only has one
- name.
- 
- 
- File: sc,  Node: Author Names,  Next: Configuring the Citation Engine,  Prev: Anonymous Attributions,  Up: Selecting an Attribution
- 
- Author Names
- ============
- 
-    Supercite employs a number of heuristics to decipher the author's
- name based on value of the `From:' mail field of the original message.
- Supercite can recognize almost all of the common `From:' field formats
- in use.  If you encounter a `From:' field that Supercite cannot parse,
- please report this bug.  *Note The Supercite Mailing List::.
- 
-    There are a number of Supercite variables that control how author
- names are extracted from the `From:' header.  Some headers may contain a
- descriptive title as in:
- 
-      From: computer!speedy!doe (John Xavier-Doe -- Decent Hacker)
- 
-    Supercite knows which part of the `From:' header is email address
- and which part is author name, but in this case the string `"Decent
- Hacker"' is not part of the author's name.  You can tell Supercite to
- ignore the title, while still recognizing hyphenated names through the
- use of a regular expression in the variable `sc-titlecue-regexp'.  This
- variable has the default value of `"\\\\s +-+\\\\s +"'.  Any text after
- this regexp is encountered is ignored as noise.
- 
-    Some `From:' headers may contain extra titles in the name fields not
- separated by a title cue, but which are nonetheless not part of the
- author's name proper.  Examples include the titles "Dr.", "Mr.", "Ms.",
- "Jr.", "Sr.", and "III" (e.g., Thurston Howe, the Third).  Also, some
- companies prepend or append the name of the division, organization, or
- project on the author's name.  All of these titles are noise which
- should be ignored.  The variable `sc-name-filter-alist' is used for
- this purpose. As implied by its name, this variable is an association
- list, where each element is a cons cell of the form:
- 
-      (REGEXP . POSITION)
- 
- where REGEXP is a regular expression that is matched (using
- `string-match') against each element of the `From:' field's author
- name.  POSITION is a position indicator, starting at zero.  Thus to
- strip out all titles of "Dr.", "Mr.", etc. from the name,
- `sc-name-filter-alist' would have an entry such as:
- 
-      ("^\\(Mr\\|Mrs\\|Ms\\|Dr\\)[.]?$" . 0)
- 
- which only removes them if they appear as the first word in the name.
- The position indicator is an integer, or one of the two special symbols
- `last' or `any'.  `last' always matches against the last word in the
- name field, while `any' matches against every word in the name field.
- 
- 
- File: sc,  Node: Configuring the Citation Engine,  Next: Using Regi,  Prev: Author Names,  Up: Top
- 
- Configuring the Citation Engine
- *******************************
- 
-    At the heart of Supercite is a regular expression interpreting engine
- called "Regi".  Regi operates by interpreting a data structure called a
- Regi-frame (or just "frame"), which is a list of Regi-entries (or just
- "entry").  Each entry contains a predicate, typically a regular
- expression, which is matched against a line of text in the current
- buffer.  If the predicate matches true, an associated expression is
- `eval'uated.  In this way, an entire region of text can be transformed
- in an *awk*-like manner.  Regi is used throughout Supercite, from mail
- header information extraction, to header nuking, to citing text.
- 
- * Menu:
- 
- * Using Regi::
- * Frames You Can Customize::
- 
-    While the details of Regi are discussed below (*note Using Regi::.),
- only those who wish to customize certain aspects of Supercite need
- concern themselves with it.  It is important to understand though, that
- any conceivable citation style that can be described by a regular
- expression can be recognized by Supercite.  This leads to some
- interesting applications.  For example, if you regularly recieve email
- from a co-worker that uses an uncommon citation style (say one that
- employs a `|' or `}' character at the front of the line), it is
- possible for Supercite to recognize this and *coerce* the citation to
- your preferred style, for consistency.  In theory, it is possible for
- Supercite to recognize such things as uuencoded messages or C code and
- cite or fill those differently than normal text.  None of this is
- currently part of Supercite, but contributions are welcome!
- 
- 
- File: sc,  Node: Using Regi,  Next: Frames You Can Customize,  Prev: Configuring the Citation Engine,  Up: Configuring the Citation Engine
- 
- Using Regi
- ==========
- 
-    Regi works by interpreting frames with the function
- `regi-interpret'.  A frame is a list of arbitrary size where each
- element is a entry of the following form:
- 
-      (PRED FUNC [NEGATE-P [CASE-FOLD-SEARCH]])
- 
-    Regi starts with the first entry in a frame, evaluating the PRED of
- that entry against the beginning of the line that `point' is on.  If
- the PRED evaluates to true (or false if the optional NEGATE-P is
- non-`nil'), then the FUNC for that entry is `eval'uated.  How
- processing continues is determined by the return value for FUNC, and is
- described below.  If PRED was false the next entry in the frame is
- checked until all entries have been matched against the current line.
- If no entry matches, `point' is moved forward one line and the frame is
- reset to the first entry.
- 
-    PRED can be a string, a variable, a list or one of the following
- symbols: `t', `begin', `end', or `every'.  If PRED is a string, or a
- variable or list that `eval'uates to a string, it is interpreted as a
- regular expression.  This regexp is matched against the current line,
- from the beginning, using `looking-at'.  This match folds case if the
- optional CASE-FOLD-SEARCH is non-`nil'.  If PRED is not a string, or
- does not `eval'uate to a string, it is interpreted as a binary value
- (`nil' or non-`nil').
- 
-    The four special symbol values for PRED are recognized:
- 
- `t'
-      Always produces a true outcome.
- 
- `begin'
-      Always executed before the frame is interpreted. This can be used
-      to initialize some global variables for example.
- 
- `end'
-      Always executed after frame interpreting is completed. This can be
-      used to perform any necessary post-processing.
- 
- `every'
-      Executes whenever the frame is reset, usually after the entire
-      frame has been matched against the current line.
- 
-    Note that NEGATE-P and CASE-FOLD-SEARCH are ignored if PRED is one
- of these special symbols.  Only the first occurance of each symbol in a
- frame is used; any duplicates are ignored.  Also note that for
- performance reasons, the entries associated with these symbols are
- removed from the frame during the main interpreting loop.
- 
-    Your FUNC can return certain values which control continued Regi
- processing.  By default, if your FUNC returns `nil' (as it should be
- careful to do explicitly), Regi will reset the frame to the first
- entry, and advance `point' to the beginning of the next line.  If a
- list is returned from your function, it can contain any combination of
- the following elements:
- 
- the symbol `continue'
-      This tells Regi to continue processing entries after a match,
-      instead of reseting the frame and moving `point'. In this way,
-      lines of text can have multiple matches, but you have to be
-      careful to avoid entering infinite loops.
- 
- the symbol `abort'
-      This tells Regi to terminate frame processing. However, any `end'
-      entry is still processed.
- 
- the list `(frame . NEWFRAME)'
-      This tells Regi to substitute NEWFRAME as the frame it is
-      interpreting.  In other words, your FUNC can modify the Regi frame
-      on the fly.  NEWFRAME can be a variable containing a frame, or it
-      can be the frame in-lined.
- 
- the list `(step . STEP)'
-      Tells Regi to move STEP number of lines forward as it continues
-      processing. By default, Regi moves forward one line.  STEP can be
-      zero or negative of course, but watch out for infinite loops.
- 
-    During execution of your FUNC, the following variables will be
- temporarily bound to some useful information:
- 
- `curline'
-      The current line in the buffer that Regi is `looking-at', as a
-      string.
- 
- `curframe'
-      The current frame being interpreted.
- 
- `curentry'
-      The current frame entry being interpreted.
- 
- 
- File: sc,  Node: Frames You Can Customize,  Next: Post-yank Formatting Commands,  Prev: Using Regi,  Up: Configuring the Citation Engine
- 
- Frames You Can Customize
- ========================
- 
-    As mentioned earlier, Supercite uses various frames to perform
- certain jobs such as mail header information extraction and mail header
- nuking.  However, these frames are not available for you to customize,
- except through abstract interfaces such as `sc-nuke-mail-header', et al.
- 
-    However, the citation frames Supercite uses provide a lot of
- customizing power and are thus available to you to change to suit your
- needs.  The workhorse of citation is the frame contained in the variable
- `sc-default-cite-frame'.  This frame recognizes many situations, such
- as blank lines, which it interprets as paragraph separators.  It also
- recognizes previously cited nested and non-nested citations in the
- original message.  By default it will coerce non-nested citations into
- your preferred citation style, and it will add a level of citation to
- nested citations.  It will also simply cite uncited lines in your
- preferred style.
- 
-    In a similar vein, there are default frames for "unciting" and
- "reciting", contained in the variables `sc-default-uncite-frame' and
- `sc-default-recite-frame' respectively.
- 
-    As mentioned earlier (*note Recognizing Citations::.), citations are
- recognized through the values of the regular expressions
- `sc-citation-root-regexp', et al.  To recognize odd styles, you could
- modify these variables, or you could modify the default citing frame.
- Alternatively, you could set up association lists of frames for
- recognizing specific alternative forms.
- 
-    For each of the actions - citing, unciting, and reciting - an alist
- is consulted to find the frame to use (`sc-cite-frame-alist',
- `sc-uncite-frame-alist', and `sc-recite-frame-alist' respectively).
- These frames can contain alists of the form:
- 
-      ((INFOKEY (REGEXP . FRAME) (REGEXP . FRAME) ...)
-       (INFOKEY (REGEXP . FRAME) (REGEXP . FRAME) ...)
-       (...))
- 
-    Where INFOKEY is a key suitable for `sc-mail-field', REGEXP is a
- regular expression which is `string-match''d against the value of the
- `sc-mail-field' key, and FRAME is the frame to use if a match occurred.
- FRAME can be a variable containing a frame or a frame in-lined.
- 
-    When Supercite is about to cite, uncite, or recite a region, it
- consults the appropriate alist and attempts to find a frame to use.  If
- one is not found from the alist, then the appropriate default frame is
- used.
- 
- 
- File: sc,  Node: Post-yank Formatting Commands,  Next: Citing Commands,  Prev: Frames You Can Customize,  Up: Top
- 
- Post-yank Formatting Commands
- *****************************
- 
-    Once the original message has been yanked into the reply buffer, and
- `sc-cite-original' has had a chance to do its thing, a number of useful
- Supercite commands will be available to you. Since there is wide
- variety in the keymaps that MUAs set up in their reply buffers, it is
- next to impossible for Supercite to properly sprinkle its commands into
- the existing keymap.  For this reason Supercite places its commands on a
- separate keymap, putting this keymap onto a prefix key in the reply
- buffer. You can customize the prefix key Supercite uses by changing the
- variable `sc-mode-map-prefix'.  By default, the `sc-mode-map-prefix' is
- `C-c C-p'; granted, not a great choice, but unfortunately the best
- general solution so far.  In the rest of this chapter, we'll assume
- you've installed Supercite's keymap on the default prefix.
- 
- * Menu:
- 
- * Citing Commands::
- * Insertion Commands::
- * Variable Toggling Shortcuts::
- * Mail Field Commands::
- * Miscellaneous Commands::
- 
- 
- File: sc,  Node: Citing Commands,  Next: Insertion Commands,  Prev: Post-yank Formatting Commands,  Up: Post-yank Formatting Commands
- 
- Commands to Manually Cite, Recite, and Uncite
- =============================================
- 
-    Probably the three most common post-yank formatting operations that
- you will perform will be the manual citing, reciting, and unciting of
- regions of text in the reply buffer. Often you may want to recite a
- paragraph to use a nickname, or manually cite a message when setting
- `sc-cite-region-limit' to `nil'.  The following commands perform these
- functions on the region of text between `point' and `mark'.  Each of
- them sets the "undo boundary" before modifying the region so that the
- command can be undone in the standard Emacs way.
- 
-    A quick note about Emacs 19.  Unlike in Emacs 18, the region
- delimited by `point' and `mark' can have two states.  It can be
- "active" or "inactive".  Although Emacs 19 and Lucid Emacs 19 use
- different terminology and functions, both employ the same convention
- such that when the region is inactive, commands that modify the region
- should generate an error.  The user needs to explicitly activate the
- region before successfully executing the command.  All Supercite
- commands conform to this convention.
- 
-    Here is the list of Supercite citing commands:
- 
- `sc-cite-region' (`C-c C-p c')
-      This command cites each line in the region of text by interpreting
-      the selected frame from `sc-cite-frame-alist', or the default
-      citing frame `sc-default-cite-frame'.  It runs the hook
-      `sc-pre-cite-hook' before interpreting the frame.  With an optional
-      universal argument (`C-u'), it temporarily sets
-      `sc-confirm-always-p' to `t' so you can confirm the attribution
-      string for a single manual citing.  *Note Configuring the Citation
-      Engine::.
- 
- `sc-uncite-region' (`C-c C-p u')
-      This command removes any citation strings from the beginning of
-      each cited line in the region by interpreting the selected frame
-      from `sc-uncite-frame-alist', or the default unciting frame
-      `sc-default-uncite-frame'.  It runs the hook `sc-pre-uncite-hook'
-      before interpreting the frame.  *Note Configuring the Citation
-      Engine::.
- 
- `sc-recite-region' (`C-c C-p r')
-      This command recites each line the region by interpreting the
-      selected frame from `sc-recite-frame-alist', or the default
-      reciting frame `sc-default-recite-frame'. It runs the hook
-      `sc-pre-recite-hook' before interpreting the frame.  *Note
-      Configuring the Citation Engine::.
- 
-      Supercite will always ask you to confirm the attribution when
-      reciting a region, regardless of the value of
-      `sc-confirm-always-p'.
- 
- 
- File: sc,  Node: Insertion Commands,  Next: Variable Toggling Shortcuts,  Prev: Citing Commands,  Up: Post-yank Formatting Commands
- 
- Insertion Commands
- ==================
- 
-    These two functions insert various strings into the reply buffer.
- 
- `sc-insert-reference' (`C-c C-p w')
-      Inserts a reference header into the reply buffer at `point'.  With
-      no arguments, the header indexed by `sc-preferred-header-style' is
-      inserted. An optional numeric argument is the index into
-      `sc-rewrite-header-list' indicating which reference header to
-      write.
- 
-      With just the universal argument (`C-u'), electric reference mode
-      is entered, regardless of the value of `sc-electric-references-p'.
- 
- `sc-insert-citation' (`C-c C-p i')
-      Inserts the current citation string at the beginning of the line
-      that `point' is on.  If the line is already cited, Supercite will
-      issue an error and will not cite the line.
- 
- 
- File: sc,  Node: Variable Toggling Shortcuts,  Next: Mail Field Commands,  Prev: Insertion Commands,  Up: Post-yank Formatting Commands
- 
- Variable Toggling Shortcuts
- ===========================
- 
-    Supercite defines a number of commands that make it easier for you to
- toggle and set various Supercite variables as you are editing the reply
- buffer.  For example, you may want to turn off filling or whitespace
- cleanup, but only temporarily.  These toggling shortcut commands make
- this easy to do.
- 
-    Like Supercite commands in general, the toggling commands are placed
- on a keymap prefix within the greater Supercite keymap.  For the default
- value of `sc-mode-map-prefix', this will be `C-c C-p C-t'.
- 
-    The following commands toggle the value of certain Supercite
- variables which take only a binary value:
- 
- `C-c C-p C-t b'
-      Toggles the variable `sc-mail-nuke-blank-lines-p'.
- 
- `C-c C-p C-t c'
-      Toggles the variable `sc-confirm-always-p'.
- 
- `C-c C-p C-t d'
-      Toggles the variable `sc-downcase-p'.
- 
- `C-c C-p C-t e'
-      Toggles the variable `sc-electric-references-p'.
- 
- `C-c C-p C-t f'
-      Toggles the variable `sc-auto-fill-region-p'.
- 
- `C-c C-p C-t o'
-      Toggles the variable `sc-electric-circular-p'.
- 
- `C-c C-p C-t s'
-      Toggles the variable `sc-nested-citation-p'.
- 
- `C-c C-p C-t u'
-      Toggles the variable `sc-use-only-preferences-p'.
- 
- `C-c C-p C-t w'
-      Toggles the variable `sc-fixup-whitespace-p'.
- 
-    The following commands let you set the value of multi-value
- variables, in the same way that Emacs' `set-variable' does:
- 
- `C-c C-p C-t a'
-      Sets the value of the variable `sc-preferred-attribution-list'.
- 
- `C-c C-p C-t l'
-      Sets the value of the variable `sc-cite-region-limit'.
- 
- `C-c C-p C-t n'
-      Sets the value of the variable `sc-mail-nuke-mail-headers'.
- 
- `C-c C-p C-t N'
-      Sets the value of the variable `sc-mail-header-nuke-list'.
- 
- `C-c C-p C-t p'
-      Sets the value of the variable `sc-preferred-header-style'.
- 
-    One special command is provided to toggle both
- `sc-auto-fill-region-p' and `sc-fixup-whitespace-p' together.  This is
- because you typically want to run Supercite with either variable as
- `nil' or non-`nil'.  The command to toggle these variables together is
- bound on `C-c C-p C-p'.
- 
-    Finally, the command `C-c C-p C-t h' (also `C-c C-p C-t ?') brings
- up a Help message on the toggling keymap.
- 
- 
- File: sc,  Node: Mail Field Commands,  Next: Miscellaneous Commands,  Prev: Variable Toggling Shortcuts,  Up: Post-yank Formatting Commands
- 
- Mail Field Commands
- ===================
- 
-    These commands allow you to view, modify, add, and delete various
- bits of information from the info alist.  *Note Information Keys and
- the Info Alist::.
- 
- `sc-mail-field-query' (`C-c C-p f')
-      Allows you to interactively view, modify, add, and delete info
-      alist key-value pairs.  With no argument, you are prompted (with
-      completion) for a info key.  The value associated with that key is
-      displayed in the minibuffer.  With an argument, this command will
-      first ask if you want to view, modify, add, or delete an info key.
-      Viewing is identical to running the command with no arguments.
- 
-      If you want to modify the value of a key, Supercite will first
-      prompt you (with completion) for the key of the value you want to
-      change.  It will then put you in the minibuffer with the key's
-      current value so you can edit the value as you wish.  When you hit
-      RET, the key's value is changed.  For those of you running Emacs
-      19, minibuffer history is kept for the values.
- 
-      If you choose to delete a key-value pair, Supercite will prompt
-      you (with completion) for the key to delete.
- 
-      If you choose to add a new key-value pair, Supercite firsts
-      prompts you for the key to add.  Note that completion is turned on
-      for this prompt, but you can type any key name here, even one that
-      does not yet exist.  After entering the key, Supercite prompts you
-      for the key's value.  It is not an error to enter a key that
-      already exists, but the new value will override any old value.  It
-      will not replace it though; if you subsequently delete the
-      key-value pair, the old value will reappear.
- 
- `sc-mail-process-headers' (`C-c C-p g')
-      This command lets you re-initialize Supercite's info alist from
-      any set of mail headers in the region between `point' and `mark'.
-      This function is especially useful for replying to digest messages
-      where Supercite will initially set up its information for the
-      digest originator, but you want to cite each component article
-      with the real message author.  Note that unless an error during
-      processing occurs, any old information is lost.
- 
- 
- File: sc,  Node: Miscellaneous Commands,  Next: Information Keys and the Info Alist,  Prev: Mail Field Commands,  Up: Post-yank Formatting Commands
- 
- Miscellaneous Commands
- ======================
- 
- `sc-open-line' (`C-c C-p o')
-      Similar to Emacs' standard `open-line' commands, but inserts the
-      citation string in front of the new line.  As with `open-line', an
-      optional numeric argument inserts that many new lines.
- 
- `sc-describe' (`C-c C-p h' and `C-c C-p ?')
-      This function has been obsoleted by the TeXinfo manual you are now
-      reading. It is still provided for compatibility, but it will
-      eventually go away.
- 
- `sc-version' (`C-c C-p v')
-      Echos the version of Supercite you are using.  With the optional
-      universal argument (`C-u'), this command inserts the version
-      information into the current buffer.
- 
- `sc-submit-bug-report' (`C-c C-p C-b')
-      If you encounter a bug, or wish to suggest an enhancement, use this
-      command to set up an outgoing mail buffer, with the proper address
-      to the Supercite maintainer automatically inserted in the `To:'
-      field.  This command also inserts information that the Supercite
-      maintainer can use to recreate your exact setup, making it easier
-      to verify your bug.
- 
- 
- File: sc,  Node: Hints to MUA Authors,  Next: Version 3 Changes,  Prev: Electric References,  Up: Top
- 
- Hints to MUA Authors
- ********************
- 
-    In June of 1989, some discussion was held between the various MUA
- authors, the Supercite author, and other Supercite users. These
- discussions centered around the need for a standard interface between
- MUAs and Supercite (or any future Supercite-like packages).  This
- interface was formally proposed by Martin Neitzel on Fri, 23 Jun 89, in
- a mail message to the Supercite mailing list:
- 
-      	Martin> Each news/mail-reader should provide a form of
-      	Martin> mail-yank-original that
-      
-      	Martin> 1: inserts the original message incl. header into the
-      	Martin>    reply buffer; no indentation/prefixing is done, the header
-      	Martin>    tends to be a "full blown" version rather than to be
-      	Martin>    stripped down.
-      
-      	Martin> 2: `point' is at the start of the header, `mark' at the
-      	Martin>    end of the message body.
-      
-      	Martin> 3: (run-hooks 'mail-yank-hooks)
-      
-      	Martin> [Supercite] should be run as such a hook and merely
-      	Martin> rewrite the message.  This way it isn't anymore
-      	Martin> [Supercite]'s job to gather the original from obscure
-      	Martin> sources. [...]
- 
-    This specification was adopted, but with the recent release of Emacs
- 19, it has undergone a slight modification.  Instead of the variable
- `mail-yank-hooks', the new preferred hook variable that the MUA should
- provide is `mail-citation-hook'.  `mail-yank-hooks' can be provided for
- backward compatibility, but `mail-citation-hook' should always take
- precedence.  Richard Stallman (of the FSF) suggests that the MUAs
- should `defvar' `mail-citation-hook' to `nil' and perform some default
- citing when that is the case.  Take a look at Emacs 19's `sendmail.el'
- file, specifically the `mail-yank-original' defun for details.
- 
-    If you are writing a new MUA package, or maintaining an existing MUA
- package, you should make it conform to this interface so that your users
- will be able to link Supercite easily and seamlessly. To do this, when
- setting up a reply or forward buffer, your MUA should follow these
- steps:
- 
-   1. Insert the original message, including the mail headers into the
-      reply buffer. At this point you should not modify the raw text in
-      any way, and you should place all the original headers into the
-      body of the reply.  This means that many of the mail headers will
-      be duplicated, one copy above the `mail-header-separator' line and
-      one copy below, however there will probably be more headers below
-      this line.
- 
-   2. Set `point' to the beginning of the line containing the first mail
-      header in the body of the reply. Set `mark' at the end of the
-      message text.  It is very important that the region be set around
-      the text Supercite is to modify and that the mail headers are
-      within this region.  Supercite will not venture outside the region
-      for any reason, and anything within the region is fair game, so
-      don't put anything that *must* remain unchanged inside the region.
-      Further note that for Emacs 19, the region need not be set
-      active.  Supercite will work properly when the region is inactive,
-      as should any other like-minded package.
- 
-   3. Run the hook `mail-citation-hook'. You will probably want to
-      provide some kind of default citation functions in cases where the
-      user does not have Supercite installed.  By default, your MUA
-      should `defvar' `mail-citation-hook' to `nil', and in your yanking
-      function, check its value.  If it finds `mail-citation-hook' to be
-      `nil', it should perform some default citing behavior.  User who
-      want to connect to Supercite then need only add `sc-cite-original'
-      to this list of hooks using `add-hook'.
- 
-    If you do all this, your users will not need to overload your
- routines to use Supercite, and your MUA will join the ranks of those
- that conform to this interface "out of the box."
- 
- 
- File: sc,  Node: Version 3 Changes,  Next: Thanks and History,  Prev: Hints to MUA Authors,  Up: Top
- 
- Version 3 Changes
- *****************
- 
-    With version 3, Supercite has undergone an almost complete rewrite,
- and has hopefully benefitted in a number of ways, including vast
- improvements in the speed of performance, a big reduction in size of the
- code and in the use of Emacs resources, and a much cleaner and flexible
- internal architecture.  The central construct of the info alist, and its
- role in Supercite has been expanded, and the other central concept, the
- general package Regi, was developed to provide a theoretically unlimited
- flexibility.
- 
-    But most of this work is internal and not of very great importance
- to the casual user. There have been some changes at the user-visible
- level, but for the most part, the Supercite configuration variables from
- version 2 should still be relevant to version 3.  Below, I briefly
- outline those user-visible things that have changed since version 2. For
- details, look to other sections of this manual.
- 
-   1. Supercite proper now comes in a single file, `supercite.el', which
-      contains everything except the unsupported noodlings, overloading
-      (which should be more or less obsolete with the release of Emacs
-      19), and the general lisp packages `reporter.el' and `regi.el'.
-      Finally, the TeXinfo manual comes in its own file as well.  In
-      particular, the file `sc.el' from the version 2 distribution is
-      obsolete, as is the file `sc-elec.el'.
- 
-   2. `sc-spacify-name-chars' is gone in version 3.
- 
-   3. `sc-nickname-alist' is gone in version 3.  The
-      `sc-attrib-selection-list' is a more general construct supporting
-      the same basic feature.
- 
-   4. The version 2 variable `sc-preferred-attribution' has been changed
-      to `sc-preferred-attribution-list', and has been expanded upon to
-      allow you to specify an ordered list of preferred attributions.
- 
-   5. `sc-mail-fields-list' has been removed, and header nuking in
-      general has been greatly improved, giving you wider flexibility in
-      specifying which headers to keep and remove while presenting a
-      simplified interface to commonly chosen defaults.
- 
-   6. Post-yank paragraph filling has been completely removed from
-      Supercite, other packages just do it better than Supercite ever
-      would.  Supercite will still fill newly cited paragraphs.
- 
-   7. The variable `sc-all-but-cite-p' has been replaced by
-      `sc-cite-region-limit'.
- 
-   8. Keymap hacking in the reply buffer has been greatly simplified,
-      with, I believe, little reduction in functionality.
- 
-   9. Hacking of the reply buffer's docstring has been completely
-      eliminated.
- 
- 
- File: sc,  Node: Thanks and History,  Next: The Supercite Mailing List,  Prev: Version 3 Changes,  Up: Top
- 
- Thanks and History
- ******************
- 
-    The Supercite package was derived from its predecessor Superyank 1.11
- which was inspired by various bits of code and ideas from Martin Neitzel
- and Ashwin Ram. They were the folks who came up with the idea of
- non-nested citations and implemented some rough code to provide this
- style. Superyank and Supercite version 2 evolved to the point where much
- of the attribution selection mechanism was automatic, and features have
- been continuously added through the comments and suggestions of the
- Supercite mailing list participants.  Supercite version 3 represents a
- nearly complete rewrite with many of the algorithms and coding styles
- being vastly improved.  Hopefully Supercite version 3 is faster,
- smaller, and much more flexible than its predecessors.
- 
-    In the version 2 manual I thanked some specific people for their
- help in developing Supercite 2.  You folks know who you are and your
- continued support is greatly appreciated.  I wish to thank everyone on
- the Supercite mailing list, especially the brave alpha testers, who
- helped considerably in testing out the concepts and implementation of
- Supercite version 3.  Special thanks go out to the MUA and Emacs
- authors Kyle Jones, Stephen Gildea, Richard Stallman, and Jamie
- Zawinski for coming to a quick agreement on the new
- `mail-citation-hook' interface, and for adding the magic lisp to their
- code to support this.
- 
-    All who have helped and contributed have been greatly appreciated.
- 
- 
- File: sc,  Node: The Supercite Mailing List,  Next: Concept Index,  Prev: Thanks and History,  Up: Top
- 
- The Supercite Mailing List
- **************************
- 
-    The author runs a simple mail expanding mailing list for discussion
- of issues related to Supercite. This includes enhancement requests, bug
- reports, general help questions, etc.  To subscribe or unsubscribe to
- the mailing list, send a request to the administrative address:
- 
-      Internet: supercite-request@anthem.nlm.nih.gov
-          UUCP: uunet!anthem.nlm.nih.gov!supercite-request
- 
-    Please be sure to include the most reliable and shortest (preferably
- Internet) address back to you.  To post articles to the list, send your
- message to this address (you do not need to be a member to post, but be
- sure to indicate this in your article or replies may not be CC'd to
- you):
- 
-      Internet: supercite@anthem.nlm.nih.gov
-          UUCP: uunet!anthem.nlm.nih.gov!supercite
- 
-    If you are sending bug reports, they should go to the following
- address, but *please*! use the command `sc-submit-bug-report' since it
- will be much easier for me to duplicate your problem if you do so.  It
- will set up a mail buffer automatically with this address on the `To:'
- line:
- 
-      Internet: supercite-help@anthem.nlm.nih.gov
-          UUCP: uunet!anthem.nlm.nih.gov!supercite-help
- 
- 
- File: sc,  Node: Concept Index,  Next: Command Index,  Prev: The Supercite Mailing List,  Up: Top
- 
- Concept Index
- *************
- 
- * Menu:
- 
- * .emacs file:                          Overloading for Non-conforming MUAs.
- * .emacs file:                          Getting Connected.
- * .emacs file:                          VM with any Emacsen.
- * .emacs file:                          Emacs 19 MUAs.
- * .emacs file:                          Emacs 18 MUAs.
- * .emacs file:                          MH-E with any Emacsen.
- * add-hook substitute:                  Emacs 18 MUAs.
- * attribute, attributing:               Usage Overview.
- * attribution info field (sc-):         Information Keys and the Info Alist.
- * attribution list:                     Selecting an Attribution.
- * attribution string:                   Citation Elements.
- * author info field (sc-):              Information Keys and the Info Alist.
- * author names:                         Author Names.
- * autoload:                             Getting Connected.
- * citation:                             Citations.
- * citation delimiter:                   Citation Elements.
- * citation info field (sc-):            Information Keys and the Info Alist.
- * citation interface specification:     Getting Connected.
- * citation leader:                      Citation Elements.
- * citation separator:                   Citation Elements.
- * citation string:                      Citation Elements.
- * cite, citing:                         Usage Overview.
- * electric references:                  Electric References.
- * emailname info field (sc-):           Information Keys and the Info Alist.
- * entries (Regi):                       Configuring the Citation Engine.
- * filladapt:                            What Supercite Does.
- * filladapt:                            Filling Cited Text.
- * filling paragraphs:                   Filling Cited Text.
- * firstname info field (sc-):           Information Keys and the Info Alist.
- * frames (Regi):                        Configuring the Citation Engine.
- * from-address info field (sc-):        Information Keys and the Info Alist.
- * gin-mode:                             What Supercite Does.
- * gin-mode:                             Filling Cited Text.
- * header rewrite functions:             Reference Headers.
- * header rewrite functions, built-in:   The Built-in Header Rewrite Functions.
- * Hyperbole:                            Overloading for Non-conforming MUAs.
- * Info Alist:                           Information Keys and the Info Alist.
- * info alist:                           What Supercite Does.
- * information extracted from mail fields: Information Keys and the Info Alist.
- * information keys:                     Information Keys and the Info Alist.
- * initials info field (sc-):            Information Keys and the Info Alist.
- * keymap prefix:                        Reply Buffer Initialization.
- * lastname info field (sc-):            Information Keys and the Info Alist.
- * mail-citation-hook:                   MH-E with any Emacsen.
- * mailing list address:                 The Supercite Mailing List.
- * mark:                                 Getting Connected.
- * middlename-1 info field (sc-):        Information Keys and the Info Alist.
- * modeline:                             Reply Buffer Initialization.
- * modeline:                             What Supercite Does.
- * MUA:                                  Introduction.
- * nested citations:                     Citations.
- * non-nested citations:                 Citations.
- * NUA:                                  Introduction.
- * nuking mail headers:                  What Supercite Does.
- * overloading:                          Emacs 18 MUAs.
- * overloading:                          Overloading for Non-conforming MUAs.
- * point:                                Getting Connected.
- * reciting:                             Frames You Can Customize.
- * reference header:                     What Supercite Does.
- * reference headers:                    Reference Headers.
- * Regi:                                 Configuring the Citation Engine.
- * regi.el file:                         Version 3 Changes.
- * reply-address info field (sc-):       Information Keys and the Info Alist.
- * reporter.el file:                     Version 3 Changes.
- * sc-attribution info field:            Information Keys and the Info Alist.
- * sc-author info field:                 Information Keys and the Info Alist.
- * sc-citation info field:               Information Keys and the Info Alist.
- * sc-elec.el from version 2:            Version 3 Changes.
- * sc-emailname info field:              Information Keys and the Info Alist.
- * sc-firstname info field:              Information Keys and the Info Alist.
- * sc-from-address info field:           Information Keys and the Info Alist.
- * sc-initials info field:               Information Keys and the Info Alist.
- * sc-lastname info field:               Information Keys and the Info Alist.
- * sc-middlename-1 info field:           Information Keys and the Info Alist.
- * sc-oloads.el:                         Overloading for Non-conforming MUAs.
- * sc-reply-address info field:          Information Keys and the Info Alist.
- * sc-sender-address info field:         Information Keys and the Info Alist.
- * sc-unsupp.el file:                    Version 3 Changes.
- * sc-unsupp.el file:                    Emacs 18 MUAs.
- * sc.el from version 2:                 Version 3 Changes.
- * sender-address info field (sc-):      Information Keys and the Info Alist.
- * sendmail.el:                          Hints to MUA Authors.
- * sendmail.el file:                     Emacs 18 MUAs.
- * setq as a substitute for add-hook:    Emacs 18 MUAs.
- * supercite mailing list address:       The Supercite Mailing List.
- * supercite.el file:                    Version 3 Changes.
- * toggling variables:                   Variable Toggling Shortcuts.
- * unciting:                             Frames You Can Customize.
- * undo boundary:                        Reply Buffer Initialization.
- * yank:                                 Usage Overview.
- 
- 
- File: sc,  Node: Command Index,  Next: Key Index,  Prev: Concept Index,  Up: Top
- 
- Command Index
- *************
- 
-    Since all supercite commands are prepended with the string "`sc-'",
- each appears under its `sc-'COMMAND name and its COMMAND name.
- 
- * Menu:
- 
- * add-hook:                             Emacs 18 MUAs.
- * add-hook:                             MH-E with any Emacsen.
- * cite-original (sc-):                  Getting Connected.
- * cite-original (sc-):                  Reply Buffer Initialization.
- * cite-region (sc-):                    Citing Commands.
- * defvar:                               Hints to MUA Authors.
- * describe (sc-):                       Miscellaneous Commands.
- * eref-abort (sc-):                     Electric References.
- * eref-exit (sc-):                      Electric References.
- * eref-goto (sc-):                      Electric References.
- * eref-jump (sc-):                      Electric References.
- * eref-next (sc-):                      Electric References.
- * eref-prev (sc-):                      Electric References.
- * eref-setn (sc-):                      Electric References.
- * eval:                                 Using Regi.
- * fill-paragraph:                       What Supercite Does.
- * header-attributed-writes (sc-):       The Built-in Header Rewrite Functions.
- * header-author-writes (sc-):           The Built-in Header Rewrite Functions.
- * header-inarticle-writes (sc-):        The Built-in Header Rewrite Functions.
- * header-on-said (sc-):                 The Built-in Header Rewrite Functions.
- * header-regarding-adds (sc-):          The Built-in Header Rewrite Functions.
- * header-verbose (sc-):                 The Built-in Header Rewrite Functions.
- * insert-citation (sc-):                Insertion Commands.
- * insert-reference (sc-):               Insertion Commands.
- * looking-at:                           Using Regi.
- * mail-field (sc-):                     Attribution Preferences.
- * mail-field (sc-):                     Information Keys and the Info Alist.
- * mail-field-query (sc-):               Mail Field Commands.
- * mail-process-headers (sc-):           Mail Field Commands.
- * mail-yank-original:                   Hints to MUA Authors.
- * no-blank-line-or-header (sc-):        The Built-in Header Rewrite Functions.
- * no-header (sc-):                      The Built-in Header Rewrite Functions.
- * open-line:                            Miscellaneous Commands.
- * open-line (sc-):                      Miscellaneous Commands.
- * perform-overloads (sc-):              GNEWS with any Emacsen.
- * recite-region (sc-):                  Citing Commands.
- * regi-interpret:                       Using Regi.
- * sc-cite-original:                     Reply Buffer Initialization.
- * sc-cite-original:                     What Supercite Does.
- * sc-cite-original:                     Getting Connected.
- * sc-cite-region:                       Citing Commands.
- * sc-describe:                          Miscellaneous Commands.
- * sc-eref-abort:                        Electric References.
- * sc-eref-exit:                         Electric References.
- * sc-eref-goto:                         Electric References.
- * sc-eref-jump:                         Electric References.
- * sc-eref-next:                         Electric References.
- * sc-eref-prev:                         Electric References.
- * sc-eref-setn:                         Electric References.
- * sc-header-attributed-writes:          The Built-in Header Rewrite Functions.
- * sc-header-author-writes:              The Built-in Header Rewrite Functions.
- * sc-header-inarticle-writes:           The Built-in Header Rewrite Functions.
- * sc-header-on-said:                    The Built-in Header Rewrite Functions.
- * sc-header-regarding-adds:             The Built-in Header Rewrite Functions.
- * sc-header-verbose:                    The Built-in Header Rewrite Functions.
- * sc-insert-citation:                   Insertion Commands.
- * sc-insert-reference:                  Insertion Commands.
- * sc-mail-field:                        Information Keys and the Info Alist.
- * sc-mail-field:                        Attribution Preferences.
- * sc-mail-field-query:                  Mail Field Commands.
- * sc-mail-process-headers:              Mail Field Commands.
- * sc-no-blank-line-or-header:           The Built-in Header Rewrite Functions.
- * sc-no-header:                         The Built-in Header Rewrite Functions.
- * sc-open-line:                         Miscellaneous Commands.
- * sc-perform-overloads:                 Overloading for Non-conforming MUAs.
- * sc-perform-overloads:                 GNEWS with any Emacsen.
- * sc-recite-region:                     Citing Commands.
- * sc-setup-filladapt:                   Filling Cited Text.
- * sc-submit-bug-report:                 Miscellaneous Commands.
- * sc-submit-bug-report:                 Getting Connected.
- * sc-uncite-region:                     Citing Commands.
- * sc-version:                           Miscellaneous Commands.
- * set-variable:                         Variable Toggling Shortcuts.
- * setq:                                 Emacs 18 MUAs.
- * setup-filladapt (sc-):                Filling Cited Text.
- * string-match:                         Frames You Can Customize.
- * submit-bug-report (sc-):              Getting Connected.
- * submit-bug-report (sc-):              Miscellaneous Commands.
- * uncite-region (sc-):                  Citing Commands.
- * version (sc-):                        Miscellaneous Commands.
- 
--- 0 ----
Index: emacs/info/sc-3
diff -c emacs/info/sc-3:1.1.1.1 emacs/info/sc-3:removed
*** emacs/info/sc-3:1.1.1.1	Fri Jul 19 01:55:26 1996
--- emacs/info/sc-3	Fri Aug  2 20:25:07 1996
***************
*** 1,191 ****
- This is Info file ../info/sc, produced by Makeinfo-1.55 from the input
- file sc.texi.
- 
-    This document describes the Supercite Version 3.1 package for citing
- and attributing the replies for various GNU Emacs mail and news reading
- subsystems.
- 
-    Copyright (C) 1993 Barry A. Warsaw
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
- 
- File: sc,  Node: Key Index,  Next: Variable Index,  Prev: Command Index,  Up: Top
- 
- Key Index
- *********
- 
- * Menu:
- 
- * C-c C-p:                              Post-yank Formatting Commands.
- * C-c C-p:                              Reply Buffer Initialization.
- * C-c C-p ?:                            Miscellaneous Commands.
- * C-c C-p c:                            Citing Commands.
- * C-c C-p C-b:                          Miscellaneous Commands.
- * C-c C-p C-p:                          Variable Toggling Shortcuts.
- * C-c C-p C-p:                          Filling Cited Text.
- * C-c C-p C-t:                          Variable Toggling Shortcuts.
- * C-c C-p f:                            Mail Field Commands.
- * C-c C-p f:                            Mail Field Commands.
- * C-c C-p g:                            Mail Field Commands.
- * C-c C-p h:                            Miscellaneous Commands.
- * C-c C-p i:                            Insertion Commands.
- * C-c C-p o:                            Miscellaneous Commands.
- * C-c C-p r:                            Citing Commands.
- * C-c C-p u:                            Citing Commands.
- * C-c C-p v:                            Miscellaneous Commands.
- * C-c C-p w:                            Insertion Commands.
- * C-c C-y:                              Usage Overview.
- * C-u:                                  Citing Commands.
- * f:                                    Usage Overview.
- * g:                                    Electric References.
- * j:                                    Electric References.
- * LFD:                                  Electric References.
- * n:                                    Electric References.
- * p:                                    Electric References.
- * q:                                    Electric References.
- * r:                                    Usage Overview.
- * RET:                                  Electric References.
- * s:                                    Electric References.
- * x:                                    Electric References.
- 
- 
- File: sc,  Node: Variable Index,  Prev: Key Index,  Up: Top
- 
- Variable Index
- **************
- 
-    Since all supercite variables are prepended with the string "`sc-'",
- each appears under its `sc-'VARIABLE name and its VARIABLE name.
- 
- * Menu:
- 
- * attrib-selection-list:                Version 3 Changes.
- * attrib-selection-list (sc-):          Attribution Preferences.
- * attrib-selection-list (sc-):          Attribution Preferences.
- * attribs-postselect-hook (sc-):        Anonymous Attributions.
- * attribs-preselect-hook (sc-):         Anonymous Attributions.
- * auto-fill-region-p (sc-):             Filling Cited Text.
- * blank-lines-after-headers (sc-):      Reply Buffer Initialization.
- * citation-delimiter (sc-):             Citation Elements.
- * citation-delimiter-regexp (sc-):      Recognizing Citations.
- * citation-leader (sc-):                Citation Elements.
- * citation-leader-regexp (sc-):         Recognizing Citations.
- * citation-nonnested-root-regexp (sc-): Recognizing Citations.
- * citation-root-regexp (sc-):           Recognizing Citations.
- * citation-separator (sc-):             Citation Elements.
- * citation-separator-regexp (sc-):      Recognizing Citations.
- * cite-blank-lines-p (sc-):             Reply Buffer Initialization.
- * cite-region-limit:                    Version 3 Changes.
- * cite-region-limit (sc-)b:             Reply Buffer Initialization.
- * confirm-always-p:                     Citing Commands.
- * confirm-always-p (sc-):               Reply Buffer Initialization.
- * confirm-always-p (sc-):               Anonymous Attributions.
- * confirm-always-p (sc-):               Citing Commands.
- * default-attribution (sc-):            Anonymous Attributions.
- * default-author-name (sc-):            Anonymous Attributions.
- * downcase-p (sc-):                     Anonymous Attributions.
- * electric-circular-p (sc-):            Electric References.
- * electric-mode-hook (sc-):             Electric References.
- * electric-references-p (sc-):          Electric References.
- * fill-prefix:                          What Supercite Does.
- * fill-prefix:                          Filling Cited Text.
- * fixup-whitespace-p (sc-):             Filling Cited Text.
- * gnews-ready-hook:                     GNEWS with any Emacsen.
- * hyperb:version:                       Overloading for Non-conforming MUAs.
- * load-hook (sc-):                      Filling Cited Text.
- * load-hook (sc-):                      Getting Connected.
- * mail-citation-hook:                   Overloading for Non-conforming MUAs.
- * mail-citation-hook:                   Emacs 19 MUAs.
- * mail-citation-hook:                   VM with any Emacsen.
- * mail-citation-hook:                   Hints to MUA Authors.
- * mail-citation-hook:                   Emacs 18 MUAs.
- * mail-header-separator:                What Supercite Does Not Do.
- * mail-warn-if-non-rfc822-p (sc-):      Reply Buffer Initialization.
- * mail-yank-hooks:                      Hints to MUA Authors.
- * mail-yank-hooks:                      VM with any Emacsen.
- * mh-yank-from-start-of-msg:            MH-E with any Emacsen.
- * mh-yank-hooks:                        MH-E with any Emacsen.
- * mode-map-prefix (sc-):                Reply Buffer Initialization.
- * mode-map-prefix (sc-):                Post-yank Formatting Commands.
- * mumble (sc-):                         Information Keys and the Info Alist.
- * name-filter-alist (sc-):              Author Names.
- * nested-citation-p (sc-):              Citations.
- * news-reply-mode-hook:                 GNEWS with any Emacsen.
- * news-reply-mode-hook:                 Overloading for Non-conforming MUAs.
- * nuke-mail-header-list (sc-):          Reply Buffer Initialization.
- * nuke-mail-headers (sc-):              Reply Buffer Initialization.
- * post-hook (sc-):                      Reply Buffer Initialization.
- * pre-cite-hook (sc-):                  Citing Commands.
- * pre-hook (sc-):                       Reply Buffer Initialization.
- * pre-hook (sc-):                       Getting Connected.
- * preferred-attribution-list (sc-):     Selecting an Attribution.
- * preferred-header-style (sc-):         Reference Headers.
- * preferred-header-style (sc-):         Insertion Commands.
- * reference-tag-string (sc-):           The Built-in Header Rewrite Functions.
- * rewrite-header-list (sc-):            Reference Headers.
- * sc-attrib-selection-list:             Attribution Preferences.
- * sc-attrib-selection-list:             Attribution Preferences.
- * sc-attrib-selection-list:             Version 3 Changes.
- * sc-attribs-postselect-hook:           Anonymous Attributions.
- * sc-attribs-preselect-hook:            Anonymous Attributions.
- * sc-auto-fill-region-p:                Filling Cited Text.
- * sc-blank-lines-after-headers:         Reply Buffer Initialization.
- * sc-citation-delimiter:                Citation Elements.
- * sc-citation-delimiter-regexp:         Recognizing Citations.
- * sc-citation-leader:                   Citation Elements.
- * sc-citation-leader-regexp:            Recognizing Citations.
- * sc-citation-nonnested-root-regexp:    Recognizing Citations.
- * sc-citation-root-regexp:              Recognizing Citations.
- * sc-citation-separator:                Citation Elements.
- * sc-citation-separator-regexp:         Recognizing Citations.
- * sc-cite-blank-lines-p:                Reply Buffer Initialization.
- * sc-cite-frame-alist:                  Frames You Can Customize.
- * sc-cite-region-limit:                 Reply Buffer Initialization.
- * sc-cite-region-limit:                 Citing Commands.
- * sc-cite-region-limit:                 Version 3 Changes.
- * sc-confirm-always-p:                  Anonymous Attributions.
- * sc-confirm-always-p:                  Citing Commands.
- * sc-confirm-always-p:                  Reply Buffer Initialization.
- * sc-confirm-always-p:                  Citing Commands.
- * sc-default-attribution:               Anonymous Attributions.
- * sc-default-author-name:               Anonymous Attributions.
- * sc-default-cite-frame:                Frames You Can Customize.
- * sc-default-recite-frame:              Frames You Can Customize.
- * sc-default-uncite-frame:              Frames You Can Customize.
- * sc-downcase-p:                        Anonymous Attributions.
- * sc-electric-circular-p:               Electric References.
- * sc-electric-mode-hook:                Electric References.
- * sc-electric-references-p:             Electric References.
- * sc-fixup-whitespace-p:                Filling Cited Text.
- * sc-load-hook:                         Getting Connected.
- * sc-load-hook:                         Filling Cited Text.
- * sc-mail-field:                        Frames You Can Customize.
- * sc-mail-warn-if-non-rfc822-p:         Reply Buffer Initialization.
- * sc-mode-map-prefix:                   Post-yank Formatting Commands.
- * sc-mode-map-prefix:                   Reply Buffer Initialization.
- * sc-mumble:                            Information Keys and the Info Alist.
- * sc-name-filter-alist:                 Author Names.
- * sc-nested-citation-p:                 Citations.
- * sc-nuke-mail-header:                  Frames You Can Customize.
- * sc-nuke-mail-header-list:             Reply Buffer Initialization.
- * sc-nuke-mail-headers:                 Reply Buffer Initialization.
- * sc-post-hook:                         Reply Buffer Initialization.
- * sc-pre-cite-hook:                     Citing Commands.
- * sc-pre-hook:                          Reply Buffer Initialization.
- * sc-pre-hook:                          Getting Connected.
- * sc-preferred-attribution-list:        Selecting an Attribution.
- * sc-preferred-header-style:            Reference Headers.
- * sc-preferred-header-style:            Insertion Commands.
- * sc-recite-frame-alist:                Frames You Can Customize.
- * sc-reference-tag-string:              The Built-in Header Rewrite Functions.
- * sc-rewrite-header-list:               Reference Headers.
- * sc-titlecue-regexp:                   Author Names.
- * sc-uncite-frame-alist:                Frames You Can Customize.
- * sc-use-only-preference-p:             Anonymous Attributions.
- * titlecue-regexp (sc-):                Author Names.
- * use-only-preference-p (sc-):          Anonymous Attributions.
- 
- 
--- 0 ----
Index: emacs/info/vip
diff -c emacs/info/vip:1.1.1.2 emacs/info/vip:removed
*** emacs/info/vip:1.1.1.2	Mon Jul 22 01:53:02 1996
--- emacs/info/vip	Fri Aug  2 20:25:14 1996
***************
*** 1,74 ****
- This is Info file ../info/vip, produced by Makeinfo-1.55 from the input
- file vip.texi.
- 
- Distribution
- ************
- 
-    Copyright (C) 1987 Masahiko Sato.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- Indirect:
- vip-1: 721
- vip-2: 49772
- 
- Tag Table:
- (Indirect)
- Node: Top721
- Node: Survey1707
- Node: Basic Concepts2192
- Node: Loading VIP3816
- Node: Modes in VIP4550
- Node: Emacs Mode7092
- Node: Vi Mode7446
- Node: Insert Mode7754
- Node: Differences from Vi8373
- Node: Undoing9367
- Node: Changing9722
- Node: Searching10332
- Node: z Command11042
- Node: Counts11373
- Node: Marking11874
- Node: Region Commands12374
- Node: New Commands13042
- Node: New Bindings15791
- Node: Window Commands17953
- Node: Buffer Commands18418
- Node: File Commands18898
- Node: Misc Commands19260
- Node: Vi Commands19671
- Node: Numeric Arguments20609
- Node: Important Keys21099
- Node: Buffers and Windows22837
- Node: Files25054
- Node: Viewing the Buffer28279
- Node: Mark Commands30168
- Node: Motion Commands31022
- Node: Searching and Replacing36547
- Node: Modifying Commands38814
- Node: Delete Commands40284
- Node: Yank Commands41983
- Node: Put Back Commands42863
- Node: Change Commands44312
- Node: Repeating and Undoing Modifications45327
- Node: Other Vi Commands46142
- Node: Commands in Insert Mode49772
- Node: Ex Commands51837
- Node: Ex Command Reference53012
- Node: Customization59496
- Node: Customizing Constants59913
- Node: Customizing Key Bindings61233
- 
- End Tag Table
--- 0 ----
Index: emacs/info/vip-1
diff -c emacs/info/vip-1:1.1.1.2 emacs/info/vip-1:removed
*** emacs/info/vip-1:1.1.1.2	Mon Jul 22 01:53:04 1996
--- emacs/info/vip-1	Fri Aug  2 20:25:16 1996
***************
*** 1,1461 ****
- This is Info file ../info/vip, produced by Makeinfo-1.55 from the input
- file vip.texi.
- 
- Distribution
- ************
- 
-    Copyright (C) 1987 Masahiko Sato.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- File: vip,  Node: Top,  Next: Survey,  Up: (DIR)
- 
- VIP
- ***
- 
-    VIP is a Vi emulating package written in Emacs Lisp.  VIP implements
- most Vi commands including Ex commands.  It is therefore hoped that
- this package will enable you to do Vi style editing under the powerful
- GNU Emacs environment.  This info file describes the usage of VIP
- assuming that you are fairly accustomed to Vi but not so much with
- Emacs.  Also we will concentrate mainly on differences from Vi,
- especially features unique to VIP.
- 
-    It is recommended that you read nodes on survey and on customization
- before you start using VIP.  Other nodes may be visited as needed.
- 
-    Comments and bug reports are welcome.  Please send messages to
- `ms@Sail.Stanford.Edu' if you are outside of Japan and to
- `masahiko@sato.riec.tohoku.junet' if you are in Japan.
- 
- * Menu:
- 
- * Survey::		A survey of VIP.
- * Vi Commands::		Details of Vi commands.
- * Ex Commands::		Details of Ex commands.
- * Customization::	How to customize VIP.
- 
- 
- File: vip,  Node: Survey,  Next: Basic Concepts,  Prev: Top,  Up: Top
- 
- A Survey of VIP
- ***************
- 
-    In this chapter we describe basics of VIP with emphasis on the
- features not found in Vi and on how to use VIP under GNU Emacs.
- 
- * Menu:
- 
- * Basic Concepts::	Basic concepts in Emacs.
- * Loading VIP::		How to load VIP automatically.
- * Modes in VIP::	VIP has three modes, which are orthogonal to modes
- 			in Emacs.
- * Differences from Vi:: Differences of VIP from Vi is explained.
- 
- 
- File: vip,  Node: Basic Concepts,  Next: Loading VIP,  Prev: Survey,  Up: Survey
- 
- Basic Concepts
- ==============
- 
-    We begin by explaining some basic concepts of Emacs.  These concepts
- are explained in more detail in the GNU Emacs Manual.
- 
-    Conceptually, a "buffer" is just a string of ASCII characters and two
- special characters PNT ("point") and MRK ("mark") such that the
- character PNT occurs exactly once and MRK occurs at most once.  The
- "text" of a buffer is obtained by deleting the occurrences of PNT and
- MRK.  If, in a buffer, there is a character following PNT then we say
- that point is "looking at" the character; otherwise we say that point
- is "at the end of buffer".  PNT and MRK are used to indicate positions
- in a buffer and they are not part of the text of the buffer.  If a
- buffer contains a MRK then the text between MRK and PNT is called the
- "region" of the buffer.
- 
-    Emacs provides (multiple) "windows" on the screen, and you can see
- the content of a buffer through the window associated with the buffer.
- The cursor of the screen is always positioned on the character after
- PNT.
- 
-    A "keymap" is a table that records the bindings between characters
- and command functions.  There is the "global keymap" common to all the
- buffers.  Each buffer has its "local keymap" that determines the "mode"
- of the buffer.  Local keymap overrides global keymap, so that if a
- function is bound to some key in the local keymap then that function
- will be executed when you type the key.  If no function is bound to a
- key in the local map, however, the function bound to the key in the
- global map becomes in effect.
- 
- 
- File: vip,  Node: Loading VIP,  Next: Modes in VIP,  Prev: Basic Concepts,  Up: Survey
- 
- Loading VIP
- ===========
- 
-    The recommended way to load VIP automatically is to include the line:
-      (load "vip")
- 
- in your `.emacs' file.  The `.emacs' file is placed in your home
- directory and it will be executed every time you invoke Emacs.  If you
- wish to be in vi mode whenever Emacs starts up, you can include the
- following line in your `.emacs' file instead of the above line:
-      (setq term-setup-hook 'vip-mode)
- 
- (*Note Vi Mode::, for the explanation of vi mode.)
- 
-    Even if your `.emacs' file does not contain any of the above lines,
- you can load VIP and enter vi mode by typing the following from within
- Emacs.
-      M-x vip-mode
- 
- 
- File: vip,  Node: Modes in VIP,  Next: Emacs Mode,  Prev: Loading VIP,  Up: Survey
- 
- Modes in VIP
- ============
- 
- Loading VIP has the effect of globally binding `C-z' (`Control-z') to
- the function `vip-change-mode-to-vi'. The default binding of `C-z' in
- GNU Emacs is `suspend-emacs', but, you can also call `suspend-emacs' by
- typing `C-x C-z'.  Other than this, all the key bindings of Emacs
- remain the same after loading VIP.
- 
-    Now, if you hit `C-z', the function `vip-change-mode-to-vi' will be
- called and you will be in "vi mode".  (Some major modes may locally bind
- `C-z' to some special functions.  In such cases, you can call
- `vip-change-mode-to-vi' by `execute-extended-command' which is invoked
- by `M-x'.  Here `M-x' means `Meta-x', and if your terminal does not
- have a META key you can enter it by typing `ESC x'.  The same effect
- can also be achieve by typing `M-x vip-mode'.)
- 
-    You can observe the change of mode by looking at the "mode line".
- For instance, if the mode line is:
-      -----Emacs: *scratch*              (Lisp Interaction)----All------------
- 
- then it will change to:
-      -----Vi:    *scratch*              (Lisp Interaction)----All------------
- 
- Thus the word `Emacs' in the mode line will change to `Vi'.
- 
-    You can go back to the original "emacs mode" by typing `C-z' in vi
- mode.  Thus `C-z' toggles between these two modes.
- 
-    Note that modes in VIP exist orthogonally to modes in Emacs.  This
- means that you can be in vi mode and at the same time, say, shell mode.
- 
-    Vi mode corresponds to Vi's command mode.  From vi mode you can enter
- "insert mode" (which corresponds to Vi's insert mode) by usual Vi
- command keys like `i', `a', `o' ... etc.
- 
-    In insert mode, the mode line will look like this:
-      -----Insert *scratch*              (Lisp Interaction)----All------------
- 
- You can exit from insert mode by hitting ESC key as you do in Vi.
- 
-    That VIP has three modes may seem very complicated, but in fact it
- is not so.  VIP is implemented so that you can do most editing
- remaining only in the two modes for Vi (that is vi mode and insert
- mode).
- 
-    The figure below shows the transition of three modes in VIP.
- 
- 
-                 === C-z ==>          == i,o ... ==>
-      emacs mode             vi mode                 insert mode
-                 <== X-z ===          <=== ESC ====
- 
- * Menu:
- 
- * Emacs Mode::		This is the mode you should know better.
- * Vi Mode::		Vi commands are executed in this mode.
- * Insert Mode::		You can enter text, and also can do editing if you
- 			know enough Emacs commands.
- 
- 
- File: vip,  Node: Emacs Mode,  Next: Vi Mode,  Prev: Modes in VIP,  Up: Modes in VIP
- 
- Emacs Mode
- ----------
- 
-    You will be in this mode just after you loaded VIP.  You can do all
- normal Emacs editing in this mode.  Note that the key `C-z' is globally
- bound to `vip-change-mode-to-vi'.  So, if you type `C-z' in this mode
- then you will be in vi mode.
- 
- 
- File: vip,  Node: Vi Mode,  Next: Insert Mode,  Prev: Emacs Mode,  Up: Modes in VIP
- 
- Vi Mode
- -------
- 
-    This mode corresponds to Vi's command mode.  Most Vi commands work
- as they do in Vi.  You can go back to emacs mode by typing `C-z'.  You
- can enter insert mode, just as in Vi, by typing `i', `a' etc.
- 
- 
- File: vip,  Node: Insert Mode,  Next: Differences from Vi,  Prev: Vi Mode,  Up: Modes in VIP
- 
- Insert Mode
- -----------
- 
-    The key bindings in this mode is the same as in the emacs mode
- except for the following 4 keys.  So, you can move around in the buffer
- and change its content while you are in insert mode.
- 
- `ESC'
-      This key will take you back to vi mode.
- 
- `C-h'
-      Delete previous character.
- 
- `C-w'
-      Delete previous word.
- 
- `C-z'
-      Typing this key has the same effect as typing ESC in emacs mode.
-      Thus typing `C-z x' in insert mode will have the same effect as
-      typing `ESC x' in emacs mode.
- 
- 
- File: vip,  Node: Differences from Vi,  Next: Undoing,  Prev: Insert Mode,  Up: Survey
- 
- Differences from Vi
- ===================
- 
-    The major differences from Vi are explained below.
- 
- * Menu:
- 
- * Undoing::		You can undo more in VIP.
- * Changing::		Commands for changing the text.
- * Searching::		Search commands.
- * z Command::		You can now use zH, zM and zL as well as z- etc.
- * Counts::		Some Vi commands which do not accept a count now
- 			accept one.
- * Marking::		You can now mark the current point, beginning of
- 			the buffer etc.
- * Region Commands::	You can now give a region as an argument for delete
- 			commands etc.
- * New Commands::	Some new commands not available in Vi are added.
- * New Bindings::	Bindings of some keys are changed for the
- 			convenience of editing under Emacs.
- * Window Commands::	Commands for moving among windows etc.
- * Buffer Commands::	Commands for selecting buffers etc.
- * File Commands::	Commands for visiting files etc.
- * Misc Commands::	Other useful commands.
- 
- 
- File: vip,  Node: Undoing,  Next: Changing,  Prev: Differences from Vi,  Up: Differences from Vi
- 
- Undoing
- -------
- 
-    You can repeat undoing by the `.' key.  So, `u' will undo a single
- change, while `u . . .', for instance, will undo 4 previous changes.
- Undo is undoable as in Vi.  So the content of the buffer will be the
- same before and after `u u'.
- 
- 
- File: vip,  Node: Changing,  Next: Searching,  Prev: Undoing,  Up: Differences from Vi
- 
- Changing
- --------
- 
-    Some commands which change a small number of characters are executed
- slightly differently.  Thus, if point is at the beginning of a word
- `foo' and you wished to change it to `bar' by typing `c w', then VIP
- will prompt you for a new word in the minibuffer by the prompt `foo =>
- '.  You can then enter `bar' followed by RET or ESC to complete the
- command.  Before you enter RET or ESC you can abort the command by
- typing `C-g'.  In general, you can abort a partially formed command by
- typing `C-g'.
- 
- 
- File: vip,  Node: Searching,  Next: z Command,  Prev: Changing,  Up: Differences from Vi
- 
- Searching
- ---------
- 
-    As in Vi, searching is done by `/' and `?'.  The string will be
- searched literally by default.  To invoke a regular expression search,
- first execute the search command `/' (or `?') with empty search string.
- (I.e, type `/' followed by RET.) A search for empty string will toggle
- the search mode between vanilla search and regular expression search.
- You cannot give an offset to the search string.  (It is a limitation.)
- By default, search will wrap around the buffer as in Vi.  You can
- change this by rebinding the variable `vip-search-wrap-around'.  *Note
- Customization::, for how to do this.
- 
- 
- File: vip,  Node: z Command,  Next: Counts,  Prev: Searching,  Up: Differences from Vi
- 
- z Command
- ---------
- 
-    For those of you who cannot remember which of `z' followed by RET,
- `.' and `-' do what.  You can also use `z' followed by `H', `M' and `L'
- to place the current line in the Home (Middle, and Last) line of the
- window.
- 
- 
- File: vip,  Node: Counts,  Next: Marking,  Prev: z Command,  Up: Differences from Vi
- 
- Counts
- ------
- 
-    Some Vi commands which do not accept a count now accept one
- 
- `p'
- `P'
-      Given counts, text will be yanked (in Vi's sense) that many times.
-      Thus `3 p' is the same as `p p p'.
- 
- `o'
- `O'
-      Given counts, that many copies of text will be inserted. Thus `o a
-      b c ESC' will insert 3 lines of `abc' below the current line.
- 
- `/'
- `?'
-      Given a count N, N-th occurrence will be searched.
- 
- 
- File: vip,  Node: Marking,  Next: Region Commands,  Prev: Counts,  Up: Differences from Vi
- 
- Marking
- -------
- 
-    Typing an `m' followed by a lower case character CH marks the point
- to the register named CH as in Vi.  In addition to these, we have
- following key bindings for marking.
- 
- `m <'
-      Set mark at the beginning of buffer.
- 
- `m >'
-      Set mark at the end of buffer.
- 
- `m .'
-      Set mark at point (and push old mark on mark ring).
- 
- `m ,'
-      Jump to mark (and pop mark off the mark ring).
- 
- 
- File: vip,  Node: Region Commands,  Next: New Commands,  Prev: Marking,  Up: Differences from Vi
- 
- Region Commands
- ---------------
- 
-    Vi operators like `d', `c' etc. are usually used in combination with
- motion commands.  It is now possible to use current region as the
- argument to these operators.  (A "region" is a part of buffer delimited
- by point and mark.)  The key `r' is used for this purpose.  Thus `d r'
- will delete the current region.  If `R' is used instead of `r' the
- region will first be enlarged so that it will become the smallest
- region containing the original region and consisting of whole lines.
- Thus `m . d R' will have the same effect as `d d'.
- 
- 
- File: vip,  Node: New Commands,  Next: New Bindings,  Prev: Region Commands,  Up: Differences from Vi
- 
- Some New Commands
- -----------------
- 
-    Note that the keys below (except for `R') are not used in Vi.
- 
- `C-a'
-      Move point to the beginning of line.
- 
- `C-n'
-      If you have two or more windows in the screen, this key will move
-      point to the next window.
- 
- `C-o'
-      Insert a newline and leave point before it, and then enter insert
-      mode.
- 
- `C-r'
-      Backward incremental search.
- 
- `C-s'
-      Forward incremental search.
- 
- `C-c'
- `C-x'
- `ESC'
-      These keys will exit from vi mode and return to emacs mode
-      temporarily.  If you hit one of these keys, Emacs will be in emacs
-      mode and will believe that you hit that key in emacs mode. For
-      example, if you hit `C-x' followed by `2', then the current window
-      will be split into 2 and you will be in vi mode again.
- 
- `\'
-      Escape to emacs mode.  Hitting `\' will take you to emacs mode,
-      and you can execute a single Emacs command.  After executing the
-      Emacs command you will be in vi mode again.  You can give a count
-      before typing `\'.  Thus `5 \ *', as well as `\ C-u 5 *', will
-      insert `*****' before point.  Similarly `1 0 \ C-p' will move the
-      point 10 lines above the current line.
- 
- `K'
-      Kill current buffer if it is not modified.  Useful when you
-      selected a buffer which you did not want.
- 
- `Q'
- `R'
-      `Q' is for query replace and `R' is for replace.  By default,
-      string to be replaced are treated literally.  If you wish to do a
-      regular expression replace, first do replace with empty string as
-      the string to be replaced.  In this way, you can toggle between
-      vanilla and regular expression replacement.
- 
- `v'
- `V'
-      These keys are used to Visit files.  `v' will switch to a buffer
-      visiting file whose name can be entered in the minibuffer. `V' is
-      similar, but will use window different from the current window.
- 
- `#'
-      If followed by a certain character CH, it becomes an operator whose
-      argument is the region determined by the motion command that
-      follows.  Currently, CH can be one of `c', `C', `g', `q' and `s'.
- 
- `# c'
-      Change upper case characters in the region to lower case
-      (`downcase-region').
- 
- `# C'
-      Change lower case characters in the region to upper case. For
-      instance, `# C 3 w' will capitalize 3 words from the current point
-      (`upcase-region').
- 
- `# g'
-      Execute last keyboard macro for each line in the region
-      (`vip-global-execute').
- 
- `# q'
-      Insert specified string at the beginning of each line in the region
-      (`vip-quote-region').
- 
- `# s'
-      Check spelling of words in the region (`spell-region').
- 
- `*'
-      Call last keyboard macro.
- 
- 
- File: vip,  Node: New Bindings,  Next: Window Commands,  Prev: New Commands,  Up: Differences from Vi
- 
- New Key Bindings
- ----------------
- 
-    In VIP the meanings of some keys are entirely different from Vi.
- These key bindings are done deliberately in the hope that editing under
- Emacs will become easier.  It is however possible to rebind these keys
- to functions which behave similarly as in Vi.  *Note Customizing Key
- Bindings::, for details.
- 
- `C-g'
- `g'
-      In Vi, `C-g' is used to get information about the file associated
-      to the current buffer.  Here, `g' will do that, and `C-g' is used
-      to abort a command (this is for compatibility with emacs mode.)
- 
- `SPC'
- `RET'
-      Now these keys will scroll up and down the text of current window.
-      Convenient for viewing the text.
- 
- `s'
- `S'
-      They are used to switch to a specified buffer.  Useful for
-      switching to already existing buffer since buffer name completion
-      is provided.  Also a default buffer will be given as part of the
-      prompt, to which you can switch by just typing RET key.  `s' is
-      used to select buffer in the current window, while `S' selects
-      buffer in another window.
- 
- `C'
- `X'
-      These keys will exit from vi mode and return to emacs mode
-      temporarily.  If you type `C' (`X'), Emacs will be in emacs mode
-      and will believe that you have typed `C-c' (`C-x', resp.) in emacs
-      mode. Moreover, if the following character you type is an upper
-      case letter, then Emacs will believe that you have typed the
-      corresponding control character.  You will be in vi mode again
-      after the command is executed.  For example, typing `X S' in vi
-      mode is the same as typing `C-x C-s' in emacs mode.  You get the
-      same effect by typing `C-x C-s' in vi mode, but the idea here is
-      that you can execute useful Emacs commands without typing control
-      characters. For example, if you hit `X' (or `C-x') followed by
-      `2', then the current window will be split into 2 and you will be
-      in vi mode again.
- 
-    In addition to these, `ctl-x-map' is slightly modified:
- 
- `X 3'
- `C-x 3'
-      This is equivalent to `C-x 1 C-x 2' (1 + 2 = 3).
- 
- 
- File: vip,  Node: Window Commands,  Next: Buffer Commands,  Prev: New Bindings,  Up: Differences from Vi
- 
- Window Commands
- ---------------
- 
-    In this and following subsections, we give a summary of key bindings
- for basic functions related to windows, buffers and files.
- 
- `C-n'
-      Switch to next window.
- 
- `X 1'
- `C-x 1'
-      Delete other windows.
- 
- `X 2'
- `C-x 2'
-      Split current window into two windows.
- 
- `X 3'
- `C-x 3'
-      Show current buffer in two windows.
- 
- 
- File: vip,  Node: Buffer Commands,  Next: File Commands,  Prev: Window Commands,  Up: Differences from Vi
- 
- Buffer Commands
- ---------------
- 
- `s'
-      Switch to the specified buffer in the current window
-      (`vip-switch-to-buffer').
- 
- `S'
-      Switch to the specified buffer in another window
-      (`vip-switch-to-buffer-other-window').
- 
- `K'
-      Kill the current buffer if it is not modified.
- 
- `X S'
- `C-x C-s'
-      Save the current buffer in the file associated to the buffer.
- 
- 
- File: vip,  Node: File Commands,  Next: Misc Commands,  Prev: Buffer Commands,  Up: Differences from Vi
- 
- File Commands
- -------------
- 
- `v'
-      Visit specified file in the current window.
- 
- `V'
-      Visit specified file in another window.
- 
- `X W'
- `C-x C-w'
-      Write current buffer into the specified file.
- 
- `X I'
- `C-x C-i'
-      Insert specified file at point.
- 
- 
- File: vip,  Node: Misc Commands,  Next: Vi Commands,  Prev: File Commands,  Up: Differences from Vi
- 
- Miscellaneous Commands
- ----------------------
- 
- `X ('
- `C-x ('
-      Start remembering keyboard macro.
- 
- `X )'
- `C-x )'
-      Finish remembering keyboard macro.
- 
- `*'
-      Call last remembered keyboard macro.
- 
- `X Z'
- `C-x C-z'
-      Suspend Emacs.
- 
- `Z Z'
-      Exit Emacs.
- 
- `Q'
-      Query replace.
- 
- `R'
-      Replace.
- 
- 
- File: vip,  Node: Vi Commands,  Next: Numeric Arguments,  Prev: Misc Commands,  Up: Top
- 
- Vi Commands
- ***********
- 
-    This chapter describes Vi commands other than Ex commands
- implemented in VIP.  Except for the last section which discusses insert
- mode, all the commands described in this chapter are to be used in vi
- mode.
- 
- * Menu:
- 
- * Numeric Arguments::	Many commands accept numeric arguments
- * Important Keys::	Some very important keys.
- * Buffers and Windows::	Commands for handling buffers and windows.
- * Files::		Commands for handling files.
- * Viewing the Buffer::	How you can view the current buffer.
- * Mark Commands::	Marking positions in a buffer.
- * Motion Commands::	Commands for moving point.
- * Searching and Replacing::	Commands for searching and replacing.
- * Modifying Commands::	Commands for modifying the buffer.
- * Other Vi Commands::	Miscellaneous Commands.
- * Commands in Insert Mode::	Commands for entering insert mode.
- 
- 
- File: vip,  Node: Numeric Arguments,  Next: Important Keys,  Prev: Vi Commands,  Up: Vi Commands
- 
- Numeric Arguments
- =================
- 
-    Most Vi commands accept a "numeric argument" which can be supplied as
- a prefix to the commands.  A numeric argument is also called a "count".
- In many cases, if a count is given, the command is executed that many
- times.  For instance, `5 d d' deletes 5 lines while simple `d d'
- deletes a line.  In this manual the metavariable N will denote a count.
- 
- 
- File: vip,  Node: Important Keys,  Next: Buffers and Windows,  Prev: Numeric Arguments,  Up: Vi Commands
- 
- Important Keys
- ==============
- 
-    The keys `C-g' and `C-l' are unique in that their associated
- functions are the same in any of emacs, vi and insert mode.
- 
- `C-g'
-      Quit.  Cancel running or partially typed command (`keyboard-quit').
- 
- `C-l'
-      Clear the screen and reprint everything (`recenter').
- 
-    In Emacs many commands are bound to the key strokes that start with
- `C-x', `C-c' and ESC.  These commands can be accessed from vi mode as
- easily as from emacs mode.
- 
- `C-x'
- `C-c'
- `ESC'
-      Typing one of these keys have the same effect as typing it in
-      emacs mode.  Appropriate command will be executed according as the
-      keys you type after it.  You will be in vi mode again after the
-      execution of the command.  For instance, if you type `ESC <' (in
-      vi mode) then the cursor will move to the beginning of the buffer
-      and you will still be in vi mode.
- 
- `C'
- `X'
-      Typing one of these keys have the effect of typing the
-      corresponding control character in emacs mode.  Moreover, if you
-      type an upper case character following it, that character will
-      also be translated to the corresponding control character.  Thus
-      typing `X W' in vi mode is the same as typing `C-x C-w' in emacs
-      mode.  You will be in vi mode again after the execution of a
-      command.
- 
- `\'
-      Escape to emacs mode.  Hitting the `\' key will take you to emacs
-      mode, and you can execute a single Emacs command.  After executing
-      the Emacs command you will be in vi mode again.  You can give a
-      count before typing `\'.  Thus `5 \ +', as well as `\ C-u 5 +',
-      will insert `+++++' before point.
- 
- 
- File: vip,  Node: Buffers and Windows,  Next: Files,  Prev: Important Keys,  Up: Vi Commands
- 
- Buffers and Windows
- ===================
- 
-    In Emacs the text you edit is stored in a "buffer".  See GNU Emacs
- Manual, for details.  There is always one "selected" buffer which is
- called the "current buffer".
- 
-    You can see the contents of buffers through "windows" created by
- Emacs.  When you have multiple windows on the screen only one of them
- is selected.  Each buffer has a unique name, and each window has a mode
- line which shows the name of the buffer associated with the window and
- other information about the status of the buffer.  You can change the
- format of the mode line, but normally if you see `**' at the beginning
- of a mode line it means that the buffer is "modified".  If you write
- out the content of the buffer to a file, then the buffer will become
- not modified.  Also if you see `%%' at the beginning of the mode line,
- it means that the file associated with the buffer is write protected.
- 
-    We have the following commands related to windows and buffers.
- 
- `C-n'
-      Move cursor to the next-window (`vip-next-window').
- 
- `X 1'
-      Delete other windows and make the selected window fill the screen
-      (`delete-other-windows').
- 
- `X 2'
-      Split current window into two windows (`split-window-vertically').
- 
- `X 3'
-      Show current buffer in two windows.
- 
- `s BUFFER RET'
-      Select or create a buffer named BUFFER (`vip-switch-to-buffer').
- 
- `S BUFFER RET'
-      Similar but select a buffer named BUFFER in another window
-      (`vip-switch-to-buffer-other-window').
- 
- `K'
-      Kill the current buffer if it is not modified or if it is not
-      associated with a file
-      (`vip-kill-buffer').
- 
- `X B'
-      List the existing buffers (`list-buffers').
- 
-    As "buffer name completion" is provided, you have only to type in
- initial substring of the buffer name which is sufficient to identify it
- among names of existing buffers.  After that, if you hit TAB the rest
- of the buffer name will be supplied by the system, and you can confirm
- it by RET.  The default buffer name to switch to will also be prompted,
- and you can select it by giving a simple RET.  See GNU Emacs Manual for
- details of completion.
- 
- 
- File: vip,  Node: Files,  Next: Viewing the Buffer,  Prev: Buffers and Windows,  Up: Vi Commands
- 
- Files
- =====
- 
-    We have the following commands related to files.  They are used to
- visit, save and insert files.
- 
- `v FILE RET'
-      Visit specified file in the current window (`vip-find-file').
- 
- `V FILE RET'
-      Visit specified file in another window
-      (`vip-find-file-other-window').
- 
- `X S'
-      Save current buffer to the file associated with the buffer.  If no
-      file is associated with the buffer, the name of the file to write
-      out the content of the buffer will be asked in the minibuffer.
- 
- `X W FILE RET'
-      Write current buffer into a specified file.
- 
- `X I FILE RET'
-      Insert a specified file at point.
- 
- `g'
-      Give information on the file associated with the current buffer.
-      Tell you the name of the file associated with the buffer, the line
-      number of the current point and total line numbers in the buffer.
-      If no file is associated with the buffer, this fact will be
-      indicated by the null file name `""'.
- 
-    In Emacs, you can edit a file by "visiting" it.  If you wish to
- visit a file in the current window, you can just type `v'.  Emacs
- maintains the "default directory" which is specific to each buffer.
- Suppose, for instance, that the default directory of the current buffer
- is `/usr/masahiko/lisp/'.  Then you will get the following prompt in the
- minibuffer.
-      visit file: /usr/masahiko/lisp/
- 
- If you wish to visit, say, `vip.el' in this directory, then you can
- just type `vip.el' followed by RET.  If the file `vip.el' already
- exists in the directory, Emacs will visit that file, and if not, the
- file will be created.  Emacs will use the file name (`vip.el', in this
- case) as the name of the buffer visiting the file.  In order to make
- the buffer name unique, Emacs may append `<2>', `<3>' etc., to the
- buffer name.  As the "file name completion" is provided here, you can
- sometime save typing.  For instance, suppose there is only one file in
- the default directory whose name starts with `v', that is `vip.el'.
- Then if you just type `v TAB' then it will be completed to `vip.el'.
- Thus, in this case, you just have to type `v v TAB RET' to visit
- `/usr/masahiko/lisp/vip.el'.  Continuing the example, let us now
- suppose that you wished to visit the file
- `/usr/masahiko/man/vip.texinfo'.  Then to the same prompt which you get
- after you typed `v', you can enter `/usr/masahiko/man/vip.texinfo' or
- `../man/vip.texinfo' followed by RET.
- 
-    Use `V' instead of `v', if you wish to visit a file in another
- window.
- 
-    You can verify which file you are editing by typing `g'.  (You can
- also type `X B' to get nformation on other buffers too.)  If you type
- `g' you will get an information like below in the echo area:
-      "/usr/masahiko/man/vip.texinfo" line 921 of 1949
- 
-    After you edited the buffer (`vip.texinfo', in our example) for a
- while, you may wish to save it in a file.  If you wish to save it in
- the file associated with the buffer (`/usr/masahiko/man/vip.texinfo',
- in this case), you can just say `X S'.  If you wish to save it in
- another file, you can type `X W'.  You will then get a similar prompt
- as you get for `v', to which you can enter the file name.
- 
- 
- File: vip,  Node: Viewing the Buffer,  Next: Mark Commands,  Prev: Files,  Up: Vi Commands
- 
- Viewing the Buffer
- ==================
- 
-    In this and next section we discuss commands for moving around in the
- buffer.  These command do not change the content of the buffer.  The
- following commands are useful for viewing the content of the current
- buffer.
- 
- `SPC'
- `C-f'
-      Scroll text of current window upward almost full screen.  You can
-      go forward in the buffer by this command (`vip-scroll').
- 
- `RET'
- `C-b'
-      Scroll text of current window downward almost full screen.  You
-      can go backward in the buffer by this command (`vip-scroll-back').
- 
- `C-d'
-      Scroll text of current window upward half screen.  You can go down
-      in the buffer by this command (`vip-scroll-down').
- 
- `C-u'
-      Scroll text of current window downward half screen.  You can go up
-      in the buffer by this command (`vip-scroll-up').
- 
- `C-y'
-      Scroll text of current window upward by one line
-      (`vip-scroll-down-one').
- 
- `C-e'
-      Scroll text of current window downward by one line
-      (`vip-scroll-up-one').
- 
- You can repeat these commands by giving a count.  Thus, `2 SPC' has the
- same effect as `SPC SPC'.
- 
-    The following commands reposition point in the window.
- 
- `z H'
- `z RET'
-      Put point on the top (home) line in the window.  So the current
-      line becomes the top line in the window.  Given a count N, point
-      will be placed in the N-th line from top (`vip-line-to-top').
- 
- `z M'
- `z .'
-      Put point on the middle line in the window.  Given a count N,
-      point will be placed in the N-th line from the middle line
-      (`vip-line-to-middle').
- 
- `z L'
- `z -'
-      Put point on the bottom line in the window.  Given a count N,
-      point will be placed in the N-th line from bottom
-      (`vip-line-to-bottom').
- 
- `C-l'
-      Center point in window and redisplay screen (`recenter').
- 
- 
- File: vip,  Node: Mark Commands,  Next: Motion Commands,  Prev: Viewing the Buffer,  Up: Vi Commands
- 
- Mark Commands
- =============
- 
-    The following commands are used to mark positions in the buffer.
- 
- `m CH'
-      Store current point in the register CH.  CH must be a lower case
-      character between `a' and `z'.
- 
- `m <'
-      Set mark at the beginning of current buffer.
- 
- `m >'
-      Set mark at the end of current buffer.
- 
- `m .'
-      Set mark at point.
- 
- `m ,'
-      Jump to mark (and pop mark off the mark ring).
- 
-    Emacs uses the "mark ring" to store marked positions.  The commands
- `m <', `m >' and `m .' not only set mark but also add it as the latest
- element of the mark ring (replacing the oldest one).  By repeating the
- command ``m ,'' you can visit older and older marked positions.  You
- will eventually be in a loop as the mark ring is a ring.
- 
- 
- File: vip,  Node: Motion Commands,  Next: Searching and Replacing,  Prev: Mark Commands,  Up: Vi Commands
- 
- Motion Commands
- ===============
- 
-    Commands for moving around in the current buffer are collected here.
- These commands are used as an `argument' for the delete, change and
- yank commands to be described in the next section.
- 
- `h'
-      Move point backward by one character.  Signal error if point is at
-      the beginning of buffer, but (unlike Vi) do not complain otherwise
-      (`vip-backward-char').
- 
- `l'
-      Move point backward by one character.  Signal error if point is at
-      the end of buffer, but (unlike Vi) do not complain otherwise
-      (`vip-forward-char').
- 
- `j'
-      Move point to the next line keeping the current column.  If point
-      is on the last line of the buffer, a new line will be created and
-      point will move to that line (`vip-next-line').
- 
- `k'
-      Move point to the previous line keeping the current column
-      (`vip-next-line').
- 
- `+'
-      Move point to the next line at the first non-white character.  If
-      point is on the last line of the buffer, a new line will be
-      created and point will move to the beginning of that line
-      (`vip-next-line-at-bol').
- 
- `-'
-      Move point to the previous line at the first non-white character
-      (`vip-previous-line-at-bol').
- 
- If a count is given to these commands, the commands will be repeated
- that many times.
- 
- `0'
-      Move point to the beginning of line (`vip-beginning-of-line').
- 
- `^'
-      Move point to the first non-white character on the line
-      (`vip-bol-and-skip-white').
- 
- `$'
-      Move point to the end of line (`vip-goto-eol').
- 
- `N |'
-      Move point to the N-th column on the line (`vip-goto-col').
- 
- Except for the `|' command, these commands neglect a count.
- 
- `w'
-      Move point forward to the beginning of the next word
-      (`vip-forward-word').
- 
- `W'
-      Move point forward to the beginning of the next word, where a
-      "word" is considered as a sequence of non-white characters
-      (`vip-forward-Word').
- 
- `b'
-      Move point backward to the beginning of a word
-      (`vip-backward-word').
- 
- `B'
-      Move point backward to the beginning of a word, where a word is
-      considered as a sequence of non-white characters
-      (`vip-forward-Word').
- 
- `e'
-      Move point forward to the end of a word (`vip-end-of-word').
- 
- `E'
-      Move point forward to the end of a word, where a word is
-      considered as a sequence of non-white characters
-      (`vip-end-of-Word').
- 
- Here the meaning of the word `word' for the `w', `b' and `e' commands
- is determined by the "syntax table" effective in the current buffer.
- Each major mode has its syntax mode, and therefore the meaning of a
- word also changes as the major mode changes.  See GNU Emacs Manual for
- details of syntax table.
- 
- `H'
-      Move point to the beginning of the home (top) line of the window.
-      Given a count N, go to the N-th line from top (`vip-window-top').
- 
- `M'
-      Move point to the beginning of the middle line of the window.
-      Given a count N, go to the N-th line from the middle line
-      (`vip-window-middle').
- 
- `L'
-      Move point to the beginning of the lowest (bottom) line of the
-      window.  Given count, go to the N-th line from bottom
-      (`vip-window-bottom').
- 
- These commands can be used to go to the desired line visible on the
- screen.
- 
- `('
-      Move point backward to the beginning of the sentence
-      (`vip-backward-sentence').
- 
- `)'
-      Move point forward to the end of the sentence
-      (`vip-forward-sentence').
- 
- `{'
-      Move point backward to the beginning of the paragraph
-      (`vip-backward-paragraph').
- 
- `}'
-      Move point forward to the end of the paragraph
-      (`vip-forward-paragraph').
- 
- A count repeats the effect for these commands.
- 
- `G'
-      Given a count N, move point to the N-th line in the buffer on the
-      first non-white character.  Without a count, go to the end of the
-      buffer (`vip-goto-line').
- 
- `` `'
-      Exchange point and mark (`vip-goto-mark').
- 
- `` CH'
-      Move point to the position stored in the register CH.  CH must be
-      a lower case letter.
- 
- `' ''
-      Exchange point and mark, and then move point to the first non-white
-      character on the line (`vip-goto-mark-and-skip-white').
- 
- `' CH'
-      Move point to the position stored in the register CH and skip to
-      the first non-white character on the line.  CH must be a lower
-      case letter.
- 
- `%'
-      Move point to the matching parenthesis if point is looking at `(',
-      `)', `{', `}', `[' or `]'
-      (`vip-paren-match').
- 
- The command `G' mark point before move, so that you can return to the
- original point by `` `'.  The original point will also be stored in the
- mark ring.
- 
-    The following commands are useful for moving points on the line.  A
- count will repeat the effect.
- 
- `f CH'
-      Move point forward to the character CH on the line.  Signal error
-      if CH could not be found (`vip-find-char-forward').
- 
- `F CH'
-      Move point backward to the character CH on the line.  Signal error
-      if CH could not be found (`vip-find-char-backward').
- 
- `t CH'
-      Move point forward upto the character CH on the line.  Signal
-      error if CH could not be found (`vip-goto-char-forward').
- 
- `T CH'
-      Move point backward upto the character CH on the line.  Signal
-      error if CH could not be found (`vip-goto-char-backward').
- 
- `;'
-      Repeat previous `f', `t', `F' or `T' command (`vip-repeat-find').
- 
- `,'
-      Repeat previous `f', `t', `F' or `T' command, in the opposite
-      direction (`vip-repeat-find-opposite').
- 
- 
- File: vip,  Node: Searching and Replacing,  Next: Modifying Commands,  Prev: Motion Commands,  Up: Vi Commands
- 
- Searching and Replacing
- =======================
- 
-    Following commands are available for searching and replacing.
- 
- `/ STRING RET'
-      Search the first occurrence of the string STRING forward starting
-      from point.  Given a count N, the N-th occurrence of STRING will
-      be searched.  If the variable `vip-re-search' has value `t' then
-      "regular expression" search is done and the string matching the
-      regular expression STRING is found.  If you give an empty string
-      as STRING then the search mode will change from vanilla search to
-      regular expression search and vice versa (`vip-search-forward').
- 
- `? STRING RET'
-      Same as `/', except that search is done backward
-      (`vip-search-backward').
- 
- `n'
-      Search the previous search pattern in the same direction as before
-      (`vip-search-next').
- 
- `N'
-      Search the previous search pattern in the opposite direction
-      (`vip-search-Next').
- 
- `C-s'
-      Search forward incrementally.  See GNU Emacs Manual for details
-      (`isearch-forward').
- 
- `C-r'
-      Search backward incrementally (`isearch-backward').
- 
- `R STRING RET NEWSTRING'
-      There are two modes of replacement, "vanilla" and "regular
-      expression".  If the mode is vanilla you will get a prompt
-      `Replace string:', and if the mode is regular expression you will
-      ge a prompt `Replace regexp:'.  The mode is initially vanilla, but
-      you can toggle these modes by giving a null string as STRING.  If
-      the mode is vanilla, this command replaces every occurrence of
-      STRING with NEWSTRING.  If the mode is regular expression, STRING
-      is treated as a regular expression and every string matching the
-      regular expression is replaced with NEWSTRING
-      (`vip-replace-string').
- 
- `Q	STRING RET NEWSTRING'
-      Same as `R' except that you will be asked form confirmation before
-      each replacement
-      (`vip-query-replace').
- 
- `r CH'
-      Replace the character point is looking at by the character CH.
-      Give count, replace that many characters by CH
-      (`vip-replace-char').
- 
- The commands `/' and `?' mark point before move, so that you can return
- to the original point by `` `'.
- 
- 
- File: vip,  Node: Modifying Commands,  Next: Delete Commands,  Prev: Searching and Replacing,  Up: Vi Commands
- 
- Modifying Commands
- ==================
- 
-    In this section, commands for modifying the content of a buffer are
- described.  These commands affect the region determined by a motion
- command which is given to the commands as their argument.
- 
-    We classify motion commands into "point commands" and "line
- commands".  The point commands are as follows:
-      `h', `l', `0', `^', `$', `w', `W', `b', `B', `e', `E', `(', `)', `/', `?', ``', `f', `F', `t', `T', `%', `;', `,'
- 
- The line commands are as follows:
-      `j', `k', `+', `-', `H', `M', `L', `{', `}', `G', `''
- 
- If a point command is given as an argument to a modifying command, the
- region determined by the point command will be affected by the modifying
- command. On the other hand, if a line command is given as an argument
- to a modifying command, the region determined by the line command will
- be enlarged so that it will become the smallest region properly
- containing the region and consisting of whole lines (we call this
- process "expanding the region"), and then the enlarged region will be
- affected by the modifying command.
- 
- * Menu:
- 
- * Delete Commands::	Commands for deleting text.
- * Yank Commands::	Commands for yanking text in Vi's sense.
- * Put Back Commands::	Commands for putting back deleted/yanked text.
- * Change Commands::	Commands for changing text.
- * Repeating and Undoing Modifications::
- 
- 
- File: vip,  Node: Delete Commands,  Next: Yank Commands,  Prev: Modifying Commands,  Up: Modifying Commands
- 
- Delete Commands
- ---------------
- 
- `d MOTION-COMMAND'
-      Delete the region determined by the motion command MOTION-COMMAND.
- 
- For example, `d $' will delete the region between point and end of
- current line since `$' is a point command that moves point to end of
- line.  `d G' will delete the region between the beginning of current
- line and end of the buffer, since `G' is a line command.  A count given
- to the command above will become the count for the associated motion
- command.  Thus, `3 d w' will delete three words.
- 
-    It is also possible to save the deleted text into a register you
- specify.  For example, you can say `" t 3 d w' to delete three words
- and save it to register `t'.  The name of a register is a lower case
- letter between `a' and `z'.  If you give an upper case letter as an
- argument to a delete command, then the deleted text will be appended to
- the content of the register having the corresponding lower case letter
- as its name.  So, `" T d w' will delete a word and append it to
- register `t'.  Other modifying commands also accept a register name as
- their argument, and we will not repeat similar explanations.
- 
-    We have more delete commands as below.
- 
- `d d'
-      Delete a line.  Given a count N, delete N lines.
- 
- `d r'
-      Delete current region.
- 
- `d R'
-      Expand current region and delete it.
- 
- `D'
-      Delete to the end of a line (`vip-kill-line').
- 
- `x'
-      Delete a character after point.  Given N, delete N characters
-      (`vip-delete-char').
- 
- `DEL'
-      Delete a character before point.  Given N, delete N characters
-      (`vip-delete-backward-char').
- 
- 
- File: vip,  Node: Yank Commands,  Next: Put Back Commands,  Prev: Delete Commands,  Up: Modifying Commands
- 
- Yank Commands
- -------------
- 
-    Yank commands "yank" a text of buffer into a (usually anonymous)
- register.  Here the word `yank' is used in Vi's sense.  Thus yank
- commands do not alter the content of the buffer, and useful only in
- combination with commands that put back the yanked text into the buffer.
- 
- `y MOTION-COMMAND'
-      Yank the region determined by the motion command MOTION-COMMAND.
- 
- For example, `y $' will yank the text between point and the end of line
- into an anonymous register, while `"c y $' will yank the same text into
- register `c'.
- 
-    Use the following command to yank consecutive lines of text.
- 
- `y y'
- `Y'
-      Yank a line.  Given N, yank N lines (`vip-yank-line').
- 
- `y r'
-      Yank current region.
- 
- `y R'
-      Expand current region and yank it.
- 
- 
- File: vip,  Node: Put Back Commands,  Next: Change Commands,  Prev: Yank Commands,  Up: Modifying Commands
- 
- Put Back Commands
- -----------------
- 
-    Deleted or yanked texts can be put back into the buffer by the
- command below.
- 
- `p'
-      Insert, after the character point is looking at, most recently
-      deleted/yanked text from anonymous register. Given a register name
-      argument, the content of the named register will be put back.
-      Given a count, the command will be repeated that many times. This
-      command also checks if the text to put back ends with a new line
-      character, and if so the text will be put below the current line
-      (`vip-put-back').
- 
- `P'
-      Insert at point most recently deleted/yanked text from anonymous
-      register.  Given a register name argument, the content of the
-      named register will be put back.  Given a count, the command will
-      be repeated that many times.  This command also checks if the text
-      to put back ends with a new line character, and if so the text
-      will be put above the current line rather than at point
-      (`vip-Put-back').
- 
- Thus, `" c p' will put back the content of the register `c' into the
- buffer.  It is also possible to specify "number register" which is a
- numeral between `1' and `9'.  If the number register N is specified,
- N-th previously deleted/yanked text will be put back.  It is an error
- to specify a number register for the delete/yank commands.
- 
- 
- File: vip,  Node: Change Commands,  Next: Repeating and Undoing Modifications,  Prev: Put Back Commands,  Up: Modifying Commands
- 
- Change Commands
- ---------------
- 
-    Most commonly used change command takes the following form.
- 
- `c MOTION-COMMAND'
-      Replace the content of the region determined by the motion command
-      MOTION-COMMAND by the text you type.  If the motion command is a
-      point command then you will type the text into minibuffer, and if
-      the motion command is a line command then the region will be
-      deleted first and you can insert the text in INSERT MODE.
- 
- For example, if point is at the beginning of a word `foo' and you wish
- to change it to `bar', you can type `c w'.  Then, as `w' is a point
- command, you will get the prompt `foo =>' in the minibuffer, for which
- you can type `b a r RET' to complete the change command.
- 
- `c c'
-      Change a line.  Given a count, that many lines are changed.
- 
- `c r'
-      Change current region.
- 
- `c R'
-      Expand current region and change it.
- 
- 
- File: vip,  Node: Repeating and Undoing Modifications,  Next: Other Vi Commands,  Prev: Change Commands,  Up: Modifying Commands
- 
- Repeating and Undoing Modifications
- -----------------------------------
- 
-    VIP records the previous modifying command, so that it is easy to
- repeat it.  It is also very easy to undo changes made by modifying
- commands.
- 
- `u'
-      Undo the last change.  You can undo more by repeating undo by the
-      repeat command `.'.  For example, you can undo 5 previous changes
-      by typing `u....'.  If you type `uu', then the second `u' undoes
-      the first undo command (`vip-undo').
- 
- `.'
-      Repeat the last modifying command.  Given count N it becomes the
-      new count for the repeated command.  Otherwise, the count for the
-      last modifying command is used again (`vip-repeat').
- 
- 
- File: vip,  Node: Other Vi Commands,  Next: Commands in Insert Mode,  Prev: Repeating and Undoing Modifications,  Up: Vi Commands
- 
- Other Vi Commands
- =================
- 
-    Miscellaneous Vi commands are collected here.
- 
- `Z Z'
-      Exit Emacs.  If modified buffers exist, you will be asked whether
-      you wish to save them or not (`save-buffers-kill-emacs').
- 
- `! MOTION-COMMAND FORMAT-COMMAND'
- `N ! ! FORMAT-COMMAND'
-      The region determined by the motion command MOTION-COMMAND will be
-      given to the shell command FORMAT-COMMAND and the region will be
-      replaced by its output.  If a count is given, it will be passed to
-      MOTION-COMMAND.  For example, `3!Gsort' will sort the region
-      between point and the 3rd line.  If `!' is used instead of
-      MOTION-COMMAND then N lines will be processed by FORMAT-COMMAND
-      (`vip-command-argument').
- 
- `J'
-      Join two lines.  Given count, join that many lines.  A space will
-      be inserted at each junction (`vip-join-lines').
- 
- `< MOTION-COMMAND'
- `N < <'
-      Shift region determined by the motion command MOTION-COMMAND to
-      left by SHIFT-WIDTH (default is 8).  If `<' is used instead of
-      MOTION-COMMAND then shift N lines
-      (`vip-command-argument').
- 
- `> MOTION-COMMAND'
- `N > >'
-      Shift region determined by the motion command MOTION-COMMAND to
-      right by SHIFT-WIDTH (default is 8).  If `<' is used instead of
-      MOTION-COMMAND then shift N lines
-      (`vip-command-argument').
- 
- `= MOTION-COMMAND'
-      Indent region determined by the motion command MOTION-COMMAND.  If
-      `=' is used instead of MOTION-COMMAND then indent N lines
-      (`vip-command-argument').
- 
- `*'
-      Call last remembered keyboard macro.
- 
- `#'
-      A new vi operator. *Note New Commands::, for more details.
- 
-    The following keys are reserved for future extensions, and currently
- assigned to a function that just beeps (`vip-nil').
- 
-      &, @, U, [, ], _, q, ~
- 
-    VIP uses a special local keymap to interpret key strokes you enter
- in vi mode.  The following keys are bound to NIL in the keymap.
- Therefore, these keys are interpreted by the global keymap of Emacs.
- We give below a short description of the functions bound to these keys
- in the global keymap.  See GNU Emacs Manual for details.
- 
- `C-@'
-      Set mark and push previous mark on mark ring (`set-mark-command').
- 
- `TAB'
-      Indent line for current major mode (`indent-for-tab-command').
- 
- `LFD'
-      Insert a newline, then indent according to mode
-      (`newline-and-indent').
- 
- `C-k'
-      Kill the rest of the current line; before a newline, kill the
-      newline.  With a numeric argument, kill that many lines from
-      point.  Negative arguments kill lines backward (`kill-line').
- 
- `C-l'
-      Clear the screen and reprint everything (`recenter').
- 
- `N C-p'
-      Move cursor vertically up N lines (`previous-line').
- 
- `C-q'
-      Read next input character and insert it.  Useful for inserting
-      control characters
-      (`quoted-insert').
- 
- `C-r'
-      Search backward incrementally (`isearch-backward').
- 
- `C-s'
-      Search forward incrementally (`isearch-forward').
- 
- `N C-t'
-      Interchange characters around point, moving forward one character.
-      With count N, take character before point and drag it forward
-      past N other characters.  If no argument and at end of line, the
-      previous two characters are exchanged (`transpose-chars').
- 
- `N C-v'
-      Scroll text upward N lines.  If N is not given, scroll near full
-      screen (`scroll-up').
- 
- `C-w'
-      Kill between point and mark.  The text is save in the kill ring.
-      The command `P' or `p' can retrieve it from kill ring
-      (`kill-region').
- 
--- 0 ----
Index: emacs/info/vip-2
diff -c emacs/info/vip-2:1.1.1.2 emacs/info/vip-2:removed
*** emacs/info/vip-2:1.1.1.2	Mon Jul 22 01:53:06 1996
--- emacs/info/vip-2	Fri Aug  2 20:25:59 1996
***************
*** 1,649 ****
- This is Info file ../info/vip, produced by Makeinfo-1.55 from the input
- file vip.texi.
- 
- Distribution
- ************
- 
-    Copyright (C) 1987 Masahiko Sato.
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- File: vip,  Node: Commands in Insert Mode,  Next: Ex Commands,  Prev: Other Vi Commands,  Up: Vi Commands
- 
- Insert Mode
- ===========
- 
-    You can enter insert mode by one of the following commands.  In
- addition to these, you will enter insert mode if you give a change
- command with a line command as the motion command.  Insert commands are
- also modifying commands and you can repeat them by the repeat command
- `.' (`vip-repeat').
- 
- `i'
-      Enter insert mode at point (`vip-insert').
- 
- `I'
-      Enter insert mode at the first non white character on the line
-      (`vip-Insert').
- 
- `a'
-      Move point forward by one character and then enter insert mode
-      (`vip-append').
- 
- `A'
-      Enter insert mode at end of line (`vip-Append').
- 
- `o'
-      Open a new line below the current line and enter insert mode
-      (`vip-open-line').
- 
- `O'
-      Open a new line above the current line and enter insert mode
-      (`vip-Open-line').
- 
- `C-o'
-      Insert a newline and leave point before it, and then enter insert
-      mode
-      (`vip-open-line-at-point').
- 
-    Insert mode is almost like emacs mode.  Only the following 4 keys
- behave differently from emacs mode.
- 
- `ESC'
-      This key will take you back to vi mode (`vip-change-mode-to-vi').
- 
- `C-h'
-      Delete previous character (`delete-backward-char').
- 
- `C-w'
-      Delete previous word (`vip-delete-backward-word').
- 
- `C-z'
-      This key simulates ESC key in emacs mode.  For instance, typing
-      `C-z x' in insert mode iw the same as typing `ESC x' in emacs mode
-      (`vip-ESC').
- 
- You can also bind `C-h' to `help-command' if you like.  (*Note
- Customizing Key Bindings::, for details.)  Binding `C-h' to
- `help-command' has the effect of making the meaning of `C-h' uniform
- among emacs, vi and insert modes.
- 
-    When you enter insert mode, VIP records point as the start point of
- insertion, and when you leave insert mode the region between point and
- start point is saved for later use by repeat command etc.  Therefore,
- repeat command will not really repeat insertion if you move point by
- emacs commands while in insert mode.
- 
- 
- File: vip,  Node: Ex Commands,  Next: Ex Command Reference,  Prev: Commands in Insert Mode,  Up: Top
- 
- Ex Commands
- ***********
- 
-    In vi mode, you can execute an Ex command EX-COMMAND by typing:
-      `: EX-COMMAND RET'
-    Every Ex command follows the following pattern:
-      ADDRESS COMMAND `!' PARAMETERS COUNT FLAGS
- 
- where all parts are optional.  For the syntax of "address", the reader
- is referred to the reference manual of Ex.
- 
-    In the current version of VIP, searching by Ex commands is always
- "magic".  That is, search patterns are always treated as "regular
- expressions".  For example, a typical forward search would be invoked by
- `:/PAT/'.  If you wish to include `/' as part of PAT you must preceded
- it by `\'.  VIP strips off these `\''s before `/' and the resulting PAT
- becomes the actual search pattern.  Emacs provides a different and
- richer class or regular expressions than Vi/Ex, and VIP uses Emacs'
- regular expressions.  See GNU Emacs Manual for details of regular
- expressions.
- 
-    Several Ex commands can be entered in a line by separating them by a
- pipe character `|'.
- 
- * Menu:
- 
- * Ex Command Reference::	Explain all the Ex commands available in VIP.
- 
- 
- File: vip,  Node: Ex Command Reference,  Next: Customization,  Prev: Ex Commands,  Up: Ex Commands
- 
- Ex Command Reference
- ====================
- 
-    In this section we briefly explain all the Ex commands supported by
- VIP.  Most Ex commands expect ADDRESS as their argument, and they use
- default addresses if they are not explicitly given.  In the following,
- such default addresses will be shown in parentheses.
- 
-    Most command names can and preferably be given in abbreviated forms.
- In the following, optional parts of command names will be enclosed in
- brackets.  For example, `co[py]' will mean that copy command can be
- give as `co' or `cop' or `copy'.
- 
-    If COMMAND is empty, point will move to the beginning of the line
- specified by the ADDRESS.  If ADDRESS is also empty, point will move to
- the beginning of the current line.
- 
-    Some commands accept "flags" which are one of `p', `l' and `#'.  If
- FLAGS are given, the text affected by the commands will be displayed on
- a temporary window, and you will be asked to hit return to continue.
- In this way, you can see the text affected by the commands before the
- commands will be executed.  If you hit `C-g' instead of RET then the
- commands will be aborted.  Note that the meaning of FLAGS is different
- in VIP from that in Vi/Ex.
- 
- `(.,.) co[py] ADDR FLAGS'
- `(.,.) t ADDR FLAGS'
-      Place a copy of specified lines after ADDR.  If ADDR is `0', it
-      will be placed before the first line.
- 
- `(.,.) d[elete] REGISTER COUNT FLAGS'
-      Delete specified lines.  Text will be saved in a named REGISTER if
-      a lower case letter is given, and appended to a register if a
-      capital letter is given.
- 
- `e[dit] ! +ADDR FILE'
- `e[x] ! +ADDR FILE'
- `vi[sual] ! +ADDR FILE'
-      Edit a new file FILE in the current window.  The command will abort
-      if current buffer is modified, which you can override by giving
-      `!'.  If `+'ADDR is given, ADDR becomes the current line.
- 
- `file'
-      Give information about the current file.
- 
- `(1,$) g[lobal] ! /PAT/ CMDS'
- `(1,$) v /PAT/ CMDS'
-      Among specified lines first mark each line which matches the
-      regular expression PAT, and then execute CMDS on each marked line.
-      If `!' is given, CMDS will be executed on each line not matching
-      PAT.  `v' is same as `g!'.
- 
- `(.,.+1) j[oin] ! COUNT FLAGS'
-      Join specified lines into a line.  Without `!', a space character
-      will be inserted at each junction.
- 
- `(.) k CH'
- `(.) mar[k] CH'
-      Mark specified line by a lower case character CH.  Then the
-      addressing form `''CH will refer to this line.  No white space is
-      required between `k' and CH.  A white space is necessary between
-      `mark' and CH, however.
- 
- `map CH RHS'
-      Define a macro for vi mode.  After this command, the character CH
-      will be expanded to RHS in vi mode.
- 
- `(.,.) m[ove] ADDR'
-      Move specified lines after ADDR.
- 
- `(.) pu[t] REGISTER'
-      Put back previously deleted or yanked text.  If REGISTER is given,
-      the text saved in the register will be put back; otherwise, last
-      deleted or yanked text will be put back.
- 
- `q[uit] !'
-      Quit from Emacs.  If modified buffers with associated files exist,
-      you will be asked whether you wish to save each of them.  At this
-      point, you may choose not to quit, by hitting `C-g'.  If `!' is
-      given, exit from Emacs without saving modified buffers.
- 
- `(.) r[ead] FILE'
-      Read in the content of the file FILE after the specified line.
- 
- `(.) r[ead] ! COMMAND'
-      Read in the output of the shell command COMMAND after the specified
-      line.
- 
- `se[t]'
-      Set a variable's value.  *Note Customizing Constants::, for the
-      list of variables you can set.
- 
- `sh[ell]'
-      Run a subshell in a window.
- 
- `(.,.) s[ubstitute] /PAT/REPL/ OPTIONS COUNT FLAGS'
- `(.,.) & OPTIONS COUNT FLAGS'
-      On each specified line, the first occurrence of string matching
-      regular expression PAT is replaced by replacement pattern REPL.
-      Option characters are `g' and `c'.  If global option character `g'
-      appears as part of OPTIONS, all occurrences are substituted.  If
-      confirm option character `c' appears, you will be asked to give
-      confirmation before each substitution.  If `/PAT/REPL/' is
-      missing, the last substitution is repeated.
- 
- `st[op]'
-      Suspend Emacs.
- 
- `ta[g] TAG'
-      Find first definition of TAG.  If no TAG is given, previously
-      given TAG is used and next alternate definition is find.  By
-      default, the file `TAGS' in the current directory becomes the
-      "selected tags table".  You can select another tags table by `set'
-      command.  *Note Customizing Constants::, for details.
- 
- `und[o]'
-      Undo the last change.
- 
- `unm[ap] CH'
-      The macro expansion associated with CH is removed.
- 
- `ve[rsion]'
-      Tell the version number of VIP.
- 
- `(1,$) w[rite] ! FILE'
-      Write out specified lines into file FILE.  If no FILE is given,
-      text will be written to the file associated to the current buffer.
-      Unless `!' is given, if FILE is different from the file
-      associated to the current buffer and if the file FILE exists, the
-      command will not be executed.  Unlike Ex, FILE becomes the file
-      associated to the current buffer.
- 
- `(1,$) w[rite]>> FILE'
-      Write out specified lines at the end of file FILE.  FILE becomes
-      the file associated to the current buffer.
- 
- `(1,$) wq ! FILE'
-      Same as `write' and then `quit'.  If `!' is given, same as `write
-      !' then `quit'.
- 
- `(.,.) y[ank] REGISTER COUNT'
-      Save specified lines into register REGISTER.  If no register is
-      specified, text will be saved in an anonymous register.
- 
- `ADDR ! COMMAND'
-      Execute shell command COMMAND.  The output will be shown in a new
-      window.  If ADDR is given, specified lines will be used as standard
-      input to COMMAND.
- 
- `($) ='
-      Print the line number of the addressed line.
- 
- `(.,.) > COUNT FLAGS'
-      Shift specified lines to the right.  The variable `vip-shift-width'
-      (default value is 8) determines the amount of shift.
- 
- `(.,.) < COUNT FLAGS'
-      Shift specified lines to the left.  The variable `vip-shift-width'
-      (default value is 8) determines the amount of shift.
- 
- `(.,.) ~ OPTIONS COUNT FLAGS'
-      Repeat the previous `substitute' command using previous search
-      pattern as PAT for matching.
- 
-    The following Ex commands are available in Vi, but not implemented
- in VIP.
-      `abbreviate', `list', `next', `print', `preserve', `recover', `rewind', `source',
-      `unabbreviate', `xit', `z'
- 
- 
- File: vip,  Node: Customization,  Next: Customizing Constants,  Prev: Ex Command Reference,  Up: Top
- 
- Customization
- *************
- 
-    If you have a file called `.vip' in your home directory, then it
- will also be loaded when VIP is loaded.  This file is thus useful for
- customizing VIP.
- 
- * Menu:
- 
- * Customizing Constants::	How to change values of constants.
- * Customizing Key Bindings::	How to change key bindings.
- 
- 
- File: vip,  Node: Customizing Constants,  Next: Customizing Key Bindings,  Prev: Customization,  Up: Customization
- 
- Customizing Constants
- =====================
- 
-    An easy way to customize VIP is to change the values of constants
- used in VIP.  Here is the list of the constants used in VIP and their
- default values.
- 
- `vip-shift-width 8'
-      The number of columns shifted by `>' and `<' command.
- 
- `vip-re-replace nil'
-      If `t' then do regexp replace, if `nil' then do string replace.
- 
- `vip-search-wrap-around t'
-      If `t', search wraps around the buffer.
- 
- `vip-re-search nil'
-      If `t' then search is reg-exp search, if `nil' then vanilla search.
- 
- `vip-case-fold-search nil'
-      If `t' search ignores cases.
- 
- `vip-re-query-replace nil'
-      If `t' then do reg-exp replace in query replace.
- 
- `vip-open-with-indent nil'
-      If `t' then indent to the previous current line when open a new
-      line by `o' or `O' command.
- 
- `vip-tags-file-name "TAGS"'
-      The name of the file used as the tags table.
- 
- `vip-help-in-insert-mode nil'
-      If `t' then C-h is bound to `help-command' in insert mode, if
-      `nil' then it sis bound to `delete-backward-char'.
- 
- You can reset these constants in VIP by the Ex command `set'.  Or you
- can include a line like this in your `.vip' file:
-      (setq vip-case-fold-search t)
- 
- 
- File: vip,  Node: Customizing Key Bindings,  Prev: Customizing Constants,  Up: Customization
- 
- Customizing Key Bindings
- ========================
- 
-    VIP uses `vip-command-mode-map' as the "local keymap" for vi mode.
- For example, in vi mode, SPC is bound to the function `vip-scroll'.
- But, if you wish to make SPC and some other keys  behave like Vi, you
- can include the following lines in your `.vip' file.
- 
-      (define-key vip-command-mode-map "\C-g" 'vip-info-on-file)
-      (define-key vip-command-mode-map "\C-h" 'vip-backward-char)
-      (define-key vip-command-mode-map "\C-m" 'vip-next-line-at-bol)
-      (define-key vip-command-mode-map " " 'vip-forward-char)
-      (define-key vip-command-mode-map "g" 'vip-keyboard-quit)
-      (define-key vip-command-mode-map "s" 'vip-substitute)
-      (define-key vip-command-mode-map "C" 'vip-change-to-eol)
-      (define-key vip-command-mode-map "R" 'vip-change-to-eol)
-      (define-key vip-command-mode-map "S" 'vip-substitute-line)
-      (define-key vip-command-mode-map "X" 'vip-delete-backward-char)
- 
- Key Index
- *********
- 
- * Menu:
- 
- * 000 C-@ (set-mark-command):           Other Vi Commands.
- * 001 C-a (vip-beginning-of-line):      New Commands.
- * 002 C-b (vip-scroll-back):            Viewing the Buffer.
- * 003 C-c (vip-ctl-c):                  Important Keys.
- * 003 C-c (vip-ctl-c):                  New Commands.
- * 004 C-d (vip-scroll-up):              Viewing the Buffer.
- * 005 C-e (vip-scroll-up-one):          Viewing the Buffer.
- * 006 C-f (vip-scroll-back):            Viewing the Buffer.
- * 007 C-g (vip-keyboard-quit):          Changing.
- * 007 C-g (vip-keyboard-quit):          Important Keys.
- * 007 C-g (vip-keyboard-quit):          New Bindings.
- * 010 C-h (delete-backward-char) (insert mode): Commands in Insert Mode.
- * 010 C-h (vip-delete-backward-char) (insert mode): Insert Mode.
- * 011 TAB (indent-for-tab-command):     Other Vi Commands.
- * 012 LFD (newline-and-indent):         Other Vi Commands.
- * 013 C-k (kill-line):                  Other Vi Commands.
- * 014 C-l (recenter):                   Other Vi Commands.
- * 014 C-l (recenter):                   Important Keys.
- * 015 RET (vip-scroll-back):            New Bindings.
- * 015 RET (vip-scroll-back):            Viewing the Buffer.
- * 016 C-n (vip-next-window):            New Commands.
- * 016 C-n (vip-next-window):            Buffers and Windows.
- * 016 C-n (vip-next-window):            Window Commands.
- * 017 C-o (vip-open-line-at-point):     Commands in Insert Mode.
- * 017 C-o (vip-open-line-at-point):     New Commands.
- * 020 C-p (previous-line):              Other Vi Commands.
- * 021 C-q (quoted-insert):              Other Vi Commands.
- * 022 C-r (isearch-backward):           New Commands.
- * 022 C-r (isearch-backward):           Searching and Replacing.
- * 022 C-r (isearch-backward):           Other Vi Commands.
- * 023 C-s (isearch-forward):            Searching and Replacing.
- * 023 C-s (isearch-forward):            New Commands.
- * 023 C-s (isearch-forward):            Other Vi Commands.
- * 024 C-t (transpose-chars):            Other Vi Commands.
- * 025 C-u (vip-scroll-down):            Viewing the Buffer.
- * 026 C-v (scroll-up):                  Other Vi Commands.
- * 027 C-w (kill-region):                Other Vi Commands.
- * 027 C-w (vip-delete-backward-word) (insert mode): Insert Mode.
- * 027 C-w (vip-delete-backward-word) (insert mode): Commands in Insert Mode.
- * 0300 C-x (vip-ctl-x):                 Important Keys.
- * 0300 C-x (vip-ctl-x):                 New Commands.
- * 0301 C-x C-z (suspend-emacs):         Modes in VIP.
- * 031 C-y (vip-scroll-down-one):        Viewing the Buffer.
- * 032 C-z (vip-change-mode-to-vi):      Modes in VIP.
- * 032 C-z (vip-change-mode-to-vi):      Emacs Mode.
- * 032 C-z (vip-ESC) (insert mode):      Insert Mode.
- * 032 C-z (vip-ESC) (insert mode):      Commands in Insert Mode.
- * 033 ESC (vip-change-mode-to-vi) (insert mode): Insert Mode.
- * 033 ESC (vip-change-mode-to-vi) (insert mode): Commands in Insert Mode.
- * 033 ESC (vip-ESC):                    Important Keys.
- * 033 ESC (vip-ESC):                    New Commands.
- * 040 SPC (vip-scroll):                 New Bindings.
- * 040 SPC (vip-scroll):                 Viewing the Buffer.
- * 041 ! (vip-command-argument):         Other Vi Commands.
- * 042 " (vip-command-argument):         Delete Commands.
- * 0430 # (vip-command-argument):        New Commands.
- * 0431 # C (upcase-region):             New Commands.
- * 0432 # c (downcase-region):           New Commands.
- * 0432 # g (vip-global-execute):        New Commands.
- * 0432 # q (vip-quote-region):          New Commands.
- * 0432 # s (spell-region):              New Commands.
- * 044 $ (vip-goto-eol):                 Motion Commands.
- * 045 % (vip-paren-match):              Motion Commands.
- * 046 & (vip-nil):                      Other Vi Commands.
- * 047 ' (vip-goto-mark-and-skip-white): Motion Commands.
- * 050 ( (vip-backward-sentence):        Motion Commands.
- * 051 ) (vip-forward-sentence):         Motion Commands.
- * 052 * (vip-call-last-kbd-macro):      New Commands.
- * 052 * (vip-call-last-kbd-macro):      Other Vi Commands.
- * 052 * (vip-call-last-kbd-macro):      Misc Commands.
- * 053 + (vip-next-line-at-bol):         Motion Commands.
- * 054 , (vip-repeat-find-opposite):     Motion Commands.
- * 055 - (vip-previous-line-at-bol):     Motion Commands.
- * 056 . (vip-repeat):                   Undoing.
- * 056 . (vip-repeat):                   Repeating and Undoing Modifications.
- * 057 / (vip-search-forward):           Searching and Replacing.
- * 057 / (vip-search-forward):           Searching.
- * 057 / (vip-search-forward):           Counts.
- * 060 0 (vip-beginning-of-line):        Motion Commands.
- * 061 1 (numeric argument):             Numeric Arguments.
- * 062 2 (numeric argument):             Numeric Arguments.
- * 063 3 (numeric argument):             Numeric Arguments.
- * 064 4 (numeric argument):             Numeric Arguments.
- * 065 5 (numeric argument):             Numeric Arguments.
- * 066 6 (numeric argument):             Numeric Arguments.
- * 067 7 (numeric argument):             Numeric Arguments.
- * 068 8 (numeric argument):             Numeric Arguments.
- * 069 9 (numeric argument):             Numeric Arguments.
- * 072 : (vip-ex):                       Ex Commands.
- * 073 ; (vip-repeat-find):              Motion Commands.
- * 074 < (vip-command-argument):         Other Vi Commands.
- * 075 = (vip-command-argument):         Other Vi Commands.
- * 076 > (vip-command-argument):         Other Vi Commands.
- * 077 ? (vip-search-backward):          Searching and Replacing.
- * 077 ? (vip-search-backward):          Counts.
- * 077 ? (vip-search-backward):          Searching.
- * 100 @ (vip-nil):                      Other Vi Commands.
- * 101 A (vip-Append):                   Commands in Insert Mode.
- * 102 B (vip-backward-Word):            Motion Commands.
- * 103 C (vip-ctl-c-equivalent):         Important Keys.
- * 103 C (vip-ctl-c-equivalent):         New Bindings.
- * 104 D (vip-kill-line):                Delete Commands.
- * 105 E (vip-end-of-Word):              Motion Commands.
- * 106 F (vip-find-char-backward):       Motion Commands.
- * 107 G (vip-goto-line):                Motion Commands.
- * 110 H (vip-window-top):               Motion Commands.
- * 111 I (vip-Insert):                   Commands in Insert Mode.
- * 112 J (vip-join-lines):               Other Vi Commands.
- * 113 K (vip-kill-buffer):              Buffer Commands.
- * 113 K (vip-kill-buffer):              Buffers and Windows.
- * 113 K (vip-kill-buffer):              New Commands.
- * 114 L (vip-window-bottom):            Motion Commands.
- * 115 M (vip-window-middle):            Motion Commands.
- * 116 N (vip-search-Next):              Searching and Replacing.
- * 117 O (vip-Open-line):                Commands in Insert Mode.
- * 117 O (vip-Open-line):                Counts.
- * 120 P (vip-Put-back):                 Counts.
- * 120 P (vip-Put-back):                 Put Back Commands.
- * 121 Q (vip-query-replace):            Searching and Replacing.
- * 121 Q (vip-query-replace):            New Commands.
- * 122 R (vip-replace-string):           New Commands.
- * 122 R (vip-replace-string):           Searching and Replacing.
- * 123 S (vip-switch-to-buffer-other-window): Buffers and Windows.
- * 123 S (vip-switch-to-buffer-other-window): New Bindings.
- * 123 S (vip-switch-to-buffer-other-window): Buffer Commands.
- * 124 T (vip-goto-char-backward):       Motion Commands.
- * 125 U (vip-nil):                      Other Vi Commands.
- * 126 V (vip-find-file-other-window):   File Commands.
- * 126 V (vip-find-file-other-window):   Files.
- * 126 V (vip-find-file-other-window):   New Commands.
- * 127 W (vip-forward-Word):             Motion Commands.
- * 1300 X (vip-ctl-x-equivalent):        Important Keys.
- * 1300 X (vip-ctl-x-equivalent):        New Bindings.
- * 1301 X ( (start-kbd-macro):           Misc Commands.
- * 1301 X ) (end-kbd-macro):             Misc Commands.
- * 1301 X 1 (delete-other-windows):      Window Commands.
- * 1301 X 1 (delete-other-windows):      Buffers and Windows.
- * 1301 X 2 (split-window-vertically):   Window Commands.
- * 1301 X 2 (split-window-vertically):   Buffers and Windows.
- * 1301 X 3 (vip-buffer-in-two-windows): Window Commands.
- * 1301 X 3 (vip-buffer-in-two-windows): New Bindings.
- * 1301 X 3 (vip-buffer-in-two-windows): Buffers and Windows.
- * 1302 X B (list-buffers):              Buffers and Windows.
- * 1302 X I (insert-file):               Files.
- * 1302 X I (insert-file):               File Commands.
- * 1302 X S (save-buffer):               Files.
- * 1302 X S (save-buffer):               Buffer Commands.
- * 1302 X W (write-file):                File Commands.
- * 1302 X W (write-file):                Files.
- * 1302 X Z (suspend-emacs):             Misc Commands.
- * 131 Y (vip-yank-line):                Yank Commands.
- * 132 Z Z (save-buffers-kill-emacs):    Other Vi Commands.
- * 133 [ (vip-nil):                      Other Vi Commands.
- * 134 \ (vip-escape-to-emacs):          Important Keys.
- * 134 \ (vip-escape-to-emacs):          New Commands.
- * 135 ] (vip-nil):                      Other Vi Commands.
- * 136 ^ (vip-bol-and-skip-white):       Motion Commands.
- * 137 _ (vip-nil):                      Other Vi Commands.
- * 140 ` (vip-goto-mark):                Motion Commands.
- * 141 a (vip-append):                   Commands in Insert Mode.
- * 142 b (vip-backward-word):            Motion Commands.
- * 1430 c (vip-command-argument):        Change Commands.
- * 1431 c R:                             Change Commands.
- * 1432 c c:                             Change Commands.
- * 1432 c r:                             Change Commands.
- * 1440 d (vip-command-argument):        Delete Commands.
- * 1441 d R:                             Delete Commands.
- * 1442 d d:                             Delete Commands.
- * 1442 d r:                             Delete Commands.
- * 145 e (vip-end-of-word):              Motion Commands.
- * 146 f (vip-find-char-forward):        Motion Commands.
- * 147 g (vip-info-on-file):             New Bindings.
- * 147 g (vip-info-on-file):             Files.
- * 150 h (vip-backward-char):            Motion Commands.
- * 151 i (vip-insert):                   Commands in Insert Mode.
- * 152 j (vip-next-line):                Motion Commands.
- * 153 k (vip-previous-line):            Motion Commands.
- * 154 l (vip-forward-char):             Motion Commands.
- * 155 m (vip-mark-point):               Mark Commands.
- * 155 m (vip-mark-point):               Marking.
- * 156 n (vip-search-next):              Searching and Replacing.
- * 157 o (vip-open-line):                Commands in Insert Mode.
- * 157 o (vip-open-line):                Counts.
- * 160 p (vip-put-back):                 Put Back Commands.
- * 160 p (vip-put-back):                 Counts.
- * 161 q (vip-nil):                      Other Vi Commands.
- * 162 r (vip-replace-char):             Searching and Replacing.
- * 163 s (vip-switch-to-buffer):         New Bindings.
- * 163 s (vip-switch-to-buffer):         Buffers and Windows.
- * 163 s (vip-switch-to-buffer):         Buffer Commands.
- * 164 t (vip-goto-char-forward):        Motion Commands.
- * 165 u (vip-undo):                     Repeating and Undoing Modifications.
- * 165 u (vip-undo):                     Undoing.
- * 166 v (vip-find-file):                File Commands.
- * 166 v (vip-find-file):                Files.
- * 166 v (vip-find-file):                New Commands.
- * 167 w (vip-forward-word):             Motion Commands.
- * 170 x (vip-delete-char):              Delete Commands.
- * 1710 y (vip-command-argument):        Yank Commands.
- * 1711 y R:                             Yank Commands.
- * 1712 y r:                             Yank Commands.
- * 1712 y y (vip-yank-line):             Yank Commands.
- * 1721 z RET (vip-line-to-top):         Viewing the Buffer.
- * 1721 z RET (vip-line-to-top):         z Command.
- * 1722 z - (vip-line-to-bottom):        Viewing the Buffer.
- * 1722 z - (vip-line-to-bottom):        z Command.
- * 1722 z . (vip-line-to-middle):        z Command.
- * 1722 z . (vip-line-to-middle):        Viewing the Buffer.
- * 1723 z H (vip-line-to-top):           z Command.
- * 1723 z H (vip-line-to-top):           Viewing the Buffer.
- * 1723 z L (vip-line-to-bottom):        z Command.
- * 1723 z L (vip-line-to-bottom):        Viewing the Buffer.
- * 1723 z M (vip-line-to-middle):        z Command.
- * 1723 z M (vip-line-to-middle):        Viewing the Buffer.
- * 173 { (vip-backward-paragraph):       Motion Commands.
- * 174 | (vip-goto-col):                 Motion Commands.
- * 175 } (vip-forward-paragraph):        Motion Commands.
- * 176 ~ (vip-nil):                      Other Vi Commands.
- * 177 DEL (vip-delete-backward-char):   Delete Commands.
- 
- Concept Index
- *************
- 
- * Menu:
- 
- * address:                              Ex Commands.
- * buffer:                               Basic Concepts.
- * buffer:                               Buffers and Windows.
- * buffer name completion:               Buffers and Windows.
- * count:                                Numeric Arguments.
- * current buffer:                       Buffers and Windows.
- * default directory:                    Files.
- * emacs mode:                           Modes in VIP.
- * end (of buffer):                      Basic Concepts.
- * expanding (region):                   Modifying Commands.
- * file name completion:                 Files.
- * flag:                                 Ex Command Reference.
- * global keymap:                        Basic Concepts.
- * insert mode:                          Modes in VIP.
- * keymap:                               Basic Concepts.
- * line commands:                        Modifying Commands.
- * local keymap:                         Customizing Key Bindings.
- * local keymap:                         Basic Concepts.
- * looking at:                           Basic Concepts.
- * magic:                                Ex Commands.
- * mark:                                 Basic Concepts.
- * mark ring:                            Mark Commands.
- * mode:                                 Basic Concepts.
- * mode line:                            Modes in VIP.
- * modified (buffer):                    Buffers and Windows.
- * number register:                      Put Back Commands.
- * numeric arguments:                    Numeric Arguments.
- * point:                                Basic Concepts.
- * point commands:                       Modifying Commands.
- * region:                               Region Commands.
- * region:                               Basic Concepts.
- * regular expression:                   Ex Commands.
- * regular expression (replacement):     Searching and Replacing.
- * regular expression (search):          Searching and Replacing.
- * selected buffer:                      Buffers and Windows.
- * selected tags table:                  Ex Command Reference.
- * syntax table:                         Motion Commands.
- * tag:                                  Ex Command Reference.
- * text:                                 Basic Concepts.
- * vanilla (replacement):                Searching and Replacing.
- * vi mode:                              Modes in VIP.
- * visiting (a file):                    Files.
- * window:                               Buffers and Windows.
- * window:                               Basic Concepts.
- * word:                                 Motion Commands.
- * yank:                                 Yank Commands.
- 
- 
--- 0 ----
Index: emacs/info/viper
diff -c emacs/info/viper:1.1.1.1 emacs/info/viper:removed
*** emacs/info/viper:1.1.1.1	Mon Jul 22 01:53:07 1996
--- emacs/info/viper	Fri Aug  2 20:26:22 1996
***************
*** 1,89 ****
- This is Info file ../info/viper, produced by Makeinfo-1.55 from the
- input file viper.texi.
- 
-    %
- 
- Distribution
- ************
- 
- Copyright (C) 1991 Aamod Sane
- Copyright (C) 1994 Michael Kifer
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- Indirect:
- viper-1: 757
- viper-2: 46519
- viper-3: 82026
- viper-4: 128810
- 
- Tag Table:
- (Indirect)
- Node: Top757
- Node: Overview2923
- Node: Emacs Preliminaries3844
- Node: Loading Viper8767
- Node: States in Viper11493
- Node: Emacs State16088
- Node: Vi State17655
- Node: Insert State24028
- Node: Replace State27099
- Node: The Minibuffer28740
- Node: Multiple Files in Viper30379
- Node: Unimplemented Features33734
- Node: Improvements over Vi34483
- Node: Basics35501
- Node: Undo and Backups37936
- Node: History39092
- Node: Macros and Registers40685
- Node: Completion42354
- Node: Improved Search42775
- Node: Abbreviation Facilities44601
- Node: Movement and Markers45569
- Node: New Commands46519
- Node: Useful Packages52417
- Node: Customization54487
- Node: Rudimentary Changes55386
- Node: Keybindings67376
- Node: Packages that Change Keymaps76169
- Node: Viper Specials82026
- Node: Vi Macros97705
- Node: Commands109687
- Node: Groundwork110428
- Node: Text Handling113431
- Node: Move Commands113985
- Node: Marking117213
- Node: Appending Text118166
- Node: Editing in Insert State120481
- Node: Deleting Text121055
- Node: Changing Text122384
- Node: Search and Replace124674
- Node: Yanking126273
- Node: Undoing127179
- Node: Display127509
- Node: File and Buffer Handling128810
- Node: Mapping132278
- Node: Shell Commands133975
- Node: Options135512
- Node: Emacs Related Commands136976
- Node: Mouse-bound Commands137823
- Node: Acknowledgments138793
- Node: Key Index139255
- Node: Function Index151403
- Node: Variable Index157810
- Node: Package Index161131
- Node: Concept Index161718
- 
- End Tag Table
--- 0 ----
Index: emacs/info/viper-1
diff -c emacs/info/viper-1:1.1.1.1 emacs/info/viper-1:removed
*** emacs/info/viper-1:1.1.1.1	Mon Jul 22 01:53:08 1996
--- emacs/info/viper-1	Fri Aug  2 20:26:24 1996
***************
*** 1,1013 ****
- This is Info file ../info/viper, produced by Makeinfo-1.55 from the
- input file viper.texi.
- 
-    %
- 
- Distribution
- ************
- 
- Copyright (C) 1991 Aamod Sane
- Copyright (C) 1994 Michael Kifer
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- File: viper,  Node: Top,  Next: Overview,  Up: (DIR)
- 
- Viper
- *****
- 
-    We believe that one or more of the following statements are adequate
- descriptions:
- 
-      Viper Is a Package for Emacs Rebels;
-      it is a VI Plan for Emacs Rescue
-      and/or a venomous VI PERil.
- 
-    Technically speaking, Viper is a Vi emulation package for GNU Emacs
- 19 and XEmacs 19. Because of its reliance on minor mode keymaps, Viper
- will not work under Emacs 18. Viper implements most Vi and Ex commands.
- It gives you the best of both worlds: Vi keystrokes for editing
- combined with the GNU Emacs environment. Viper also fixes some common
- complaints with Vi commands.  This manual describes Viper,
- concentrating on the differences from Vi and new features of Viper.
- 
-    Viper is a new name for a package formerly known as VIP-19.  VIP-19,
- in turn, was based on VIP 3.5 by Masahiko Sato and VIP version 4.4 by
- Aamod Sane, and it tries to be compatible with these packages.
- 
-    Viper is intended to be usable without reading this manual -- the
- defaults are set to make Viper as close to Vi as possible.  At startup,
- Viper will try to set the most appropriate default environment for you,
- based on your familiarity with Emacs. It will also tell you the basic
- GNU Emacs window management commands to help you start immediately.
- 
-    Although this manual explains how to customize Viper, some basic
- familiarity with Emacs Lisp would be a plus.
- 
-    It is recommended that you read the Overview node. The other nodes
- may be visited as needed.
- 
-    Comments and bug reports are welcome.  `kifer@cs.emacs.edu' is the
- current address for Viper bug reports.  Please use the Ex command
- `:submitReport' for this purpose.
- 
- * Menu:
- 
- * Overview::			Must read to get started
- * Improvements over Vi::	New features, Improvements
- * Customization::		How to customize Viper
- * Commands::			Vi and Ex Commands
- 
- * Key Index::			Index of Vi and Ex Commands
- * Function Index::              Index of Viper Functions
- * Variable Index::              Index of Viper Variables
- * Package Index::               Index of Packages Mentioned in this Document
- * Concept Index::		Vi, Ex and Emacs concepts
- 
- * Acknowledgments::
- 
- 
- File: viper,  Node: Overview,  Next: Improvements over Vi,  Prev: Top,  Up: Top
- 
- Overview of Viper
- *****************
- 
-    Viper is a Vi emulation on top of Emacs. At the same time, Viper
- provides a virtually unrestricted access to Emacs facilities. Perfect
- compatibility with Vi is possible but not desirable. This chapter tells
- you about the Emacs ideas that you should know about, how to use Viper
- within Emacs and some incompatibilities.
- 
-    Viper was formerly known as VIP-19, which was a descendant of VIP
- 3.5 by Masahiko Sato and VIP 4.4 by Aamod Sane.
- 
- * Menu:
- 
- * Emacs Preliminaries::		Basic concepts in Emacs.
- * Loading Viper::			Loading and Preliminary Configuration.
- * States in Viper::		Viper has four states orthogonal to
- 				modes in Emacs.
- * The Minibuffer::		Command line in Emacs.
- * Multiple Files in Viper::	True multiple file handling.
- * Unimplemented Features::	That are unlikely to be implemented.
- 
- 
- File: viper,  Node: Emacs Preliminaries,  Next: Loading Viper,  Prev: Overview,  Up: Overview
- 
- Emacs Preliminaries
- ===================
- 
-    Emacs can edit several files at once. A file in Emacs is placed in a
- "buffer" that usually has the same name as the file. Buffers are also
- used for other purposes, such as shell interfaces, directory editing,
- etc.  *Note Directory Editor: (emacs)Dired, for an example.
- 
-    A buffer has a distinguished position called the "point".  A "point"
- is always between 2 characters, and is "looking at" the right hand
- character. The cursor is positioned on the right hand character. Thus,
- when the "point" is looking at the end-of-line, the cursor is on the
- end-of-line character, i.e. beyond the last character on the line. This
- is the default Emacs behavior.
- 
-    The default settings of Viper try to mimic the behavior of Vi,
- preventing the cursor from going beyond the last character on the line.
- By using Emacs commands directly (such as those bound to arrow keys),
- it is possible to get the cursor beyond the end-of-line. However, this
- won't (or shouldn't) happen if you restrict yourself to standard Vi
- keys, unless you modify the default editing style. *Note
- Customization::.
- 
-    In addition to the "point", there is another distinguished buffer
- position called the "mark". *Note Mark: (emacs)Mark, for more info on
- the mark. The text between the "point" and the "mark" is called the
- "region" of the buffer. For the Viper user, this simply means that in
- addition to the Vi textmarkers a-z, there is another marker called
- "mark". This is similar to the unnamed Vi marker used by the jump
- commands (" and "), which move the cursor to the position of the last
- absolute jump.  Viper provides access to the region in most text
- manipulation commands as `r' and `R' suffix to commands that operate on
- text regions, e.g., `dr' to delete region, etc.  *Note Basics::, for
- more info.
- 
-    Emacs divides the screen into tiled "windows". You can see the
- contents of a buffer through the window associated with the buffer.  The
- cursor of the screen is positioned on the character after "point".
- Every window has a "mode line" that displays information about the
- buffer.  You can change the format of the mode line, but normally if
- you see `**' at the beginning of a mode line it means that the buffer
- is "modified".  If you write out the contents of a buffer to a file,
- then the buffer will become not modified.  Also if you see `%%' at the
- beginning of the mode line, it means that the file associated with the
- buffer is write protected. The mode line will also show the buffer name
- and current major and minor modes (see below).  A special buffer called
- "Minibuffer" is displayed as the last line in a Minibuffer window. The
- Minibuffer window is used for command input output. Viper uses
- Minibuffer window for `/' and `:' commands.
- 
-    An Emacs buffer can have a "major mode" that customizes Emacs for
- editing text of a particular sort by changing the functionality of the
- keys.  Keys are defined using a "keymap" that records the bindings
- between keystrokes and functions. The "global keymap" is common to all
- the buffers.  Additionally, each buffer has its "local keymap" that
- determines the "mode" of the buffer.  If a function is bound to some
- key in the local keymap then that function will be executed when you
- type the key.  If no function is bound to a key in the local map,
- however, the function bound to the key in the global map will be
- executed. *Note Major Modes: (emacs)Major Modes, for more information.
- 
-    A buffer can also have a "minor mode". Minor modes are options that
- you can use or not. A buffer in `text-mode' can have `auto-fill-mode'
- as minor mode, which can be turned off or on at any time. In Emacs 19, a
- minor mode may have it own keymap, which overrides the local keymap when
- the minor mode is turned on.  For more information, *note Minor Modes:
- (emacs)Minor Modes.
- 
-    Viper is implemented as a collection of minor modes. Different minor
- modes are involved when Viper emulates Vi command mode, Vi insert mode,
- etc.  You can also turn Viper on and off at any time while in Vi
- command mode.  *Note States in Viper::, for more information.
- 
-    Emacs uses Control and Meta modifiers. These are denoted as C and M,
- e.g. `^Z' as `C-z' and `Meta-x' as `M-x'.  The Meta key is usually
- located on each side of the Space bar; it is used in a manner similar
- to the Control key, e.g., `M-x' means typing `x' while holding the Meta
- key down.  For keyboards that do not have a Meta key, ESC is used as
- Meta.  Thus `M-x' is typed as `ESC x'. Viper uses ESC to switch from
- Insert state to Vi state. Therefore Viper defines `_' as its Meta key
- in Vi state. *Note Vi State::, for more info.
- 
-    Emacs is structured as a lisp interpreter around a C core. Emacs keys
- cause lisp functions to be called. It is possible to call these
- functions directly, by typing `M-x function-name'.
- 
- 
- File: viper,  Node: Loading Viper,  Next: States in Viper,  Prev: Emacs Preliminaries,  Up: Overview
- 
- Loading Viper
- =============
- 
-    First, make sure that all six Viper files `viper*.el' are somewhere
- on Emacs "load path". The load path is a list of directories where Emacs
- looks for its Lisp code; it is similar to Unix environment variable
- PATH.  The load path is determined by the Lisp variable `load-path'.
- 
-    Type `C-h v load-path RET' to check the current load path of your
- Emacs. (Here and later, `RET' stands for carriage return.) If the files
- `viper*.el' are not in any directory on the load path, you should
- create your own directory and put it on the load path; then put
- `viper*.el' in that directory.  To put a new directory, say
- `~/emacslib', on your load path, add the following line at the
- beginning of your `~/.emacs' file:
-      (setq load-path (cons "~/emacslib" load-path))
-    It is recommended that you compile `viper.el' by running
-      make all
-    in the directory where Viper was unpacked. The best way to ensure
- that Viper is installed properly is to run
-      make install
-    in the directory where Viper was unpacked. See README in the Viper
- distribution for the details on which modifications to the make file
- may be necessary.
- 
-    Once Viper is settled on the load path, the most common way to load
- it automatically is to include the line:
- 
-      (require 'viper)
- 
- in your `~/.emacs' file.  The `.emacs' file is placed in your home
- directory and it will be executed every time you invoke Emacs.  Viper
- also uses the file `~/.vip' for Viper-specific customization.  If you
- wish to be in Vi command state whenever this is appropriate, you can
- include the following line in your `.vip':
-      (setq vip-always t)
- 
- (*Note Vi State::, for the explanation of Vi mode.)
- 
-    Once invoked, Viper will arrange to bring up Emacs buffers in Vi
- state whenever this makes sense.  *Note Packages that Change Keymaps::,
- to find out when forcing Vi command state on a buffer may be
- counter-productive.
- 
-    Even if your `.emacs' and `.vip' files do not contain any of the
- above lines, you can still load Viper and enter Vi state by typing the
- following from within Emacs:
- 
-      M-x load-library RET viper RET
-      M-x viper-mode
- 
- Ask your local Emacs administrator if this fails to work.
- 
-    When Emacs first comes up, if you have not specified a file on the
- command line, it will show the `*scratch*' buffer, in the `Lisp
- Interaction' mode. After you invoke Viper, you can start editing files
- by using `:e', `:vi', or `v' commands.  (*Note File and Buffer
- Handling::, for more information on `v' and other new commands that, in
- many cases, are more convenient than `:e', `:vi', and similar old-style
- Vi commands.)
- 
- 
- File: viper,  Node: States in Viper,  Next: The Minibuffer,  Prev: Loading Viper,  Up: Overview
- 
- States in Viper
- ===============
- 
-    Viper has four states, Emacs, Vi, Insert, and Replace.
- 
- `Emacs state'
-      This is the mode plain vanilla Emacs is normally in. After you
-      have loaded Viper, `C-z' will normally take you to Vi command
-      state. Another `C-z' will take you back to Emacs state.  This
-      toggle key can be changed, *note Customization::. You can also
-      type `M-x viper-mode' to change to Vi state.
- 
-      For users who chose to set their user level to 1 at Viper setup
-      time, switching to Emacs state is deliberately made harder in
-      order to not confuse the novice user. In this case, `C-z' will
-      either iconify Emacs (if Emacs runs as an application under X
-      Windows) or it will stop Emacs (if Emacs runs on a dumb terminal
-      or in an Xterm window).
- 
- `Vi state'
-      This is the Vi command mode. Any of the Vi commands, such as `i,
-      o, a', ..., will take you to Insert state. All Vi commands may be
-      used in this mode. Most Ex commands can also be used.  For a full
-      list of Ex commands supported by Viper, type `:' and then `TAB'.
-      To get help on any issue, including the Ex commands, type `:help'.
-      This will invoke Viper Info (if it is installed). Then typing `i'
-      will prompt you for a topic to search in the index. Note, to
-      search for Ex commands in the index, you should start them with a
-      "`:'", e.g., `:WW'.
- 
- `Insert state'
-      Insert state is the Vi insertion mode. `ESC' will take you back to
-      Vi state. Insert state editing can be done, including
-      auto-indentation. By default, Viper disables Emacs keybindings in
-      Insert state.
- 
- `Replace state'
-      Commands like `cw' invoke the Replace state. When you cross the
-      boundary of a replacement region (usually designated via a `$'
-      sign), it will automatically change to Insert state. You do not
-      have to worry about it. The key bindings remain practically the
-      same as in Insert state. If you type ESC, Viper will switch to Vi
-      command mode, terminating the replacement state.
- 
-    The modes are indicated on the "mode line" as <E>, <I>, <V>, and <R>,
- so that the multiple modes do not confuse you. Most of your editing can
- be done in Vi and Insert states. Viper will try to make all new buffers
- be in Vi state, but sometimes they may come up in Emacs state.  `C-z'
- will take you to Vi state in such a case.  In some major modes, like
- Dired, Info, Gnus, etc., you should not switch to Vi state (and Viper
- will not attempt to do so) because these modes are not intended for
- text editing and many of the Vi keys have special meaning there. If you
- plan to read news, browse directories, read mail, etc., from Emacs
- (which you should start doing soon!), you should learn about the
- meaning of the various keys in those special modes (typing `C-h m' in a
- buffer provides help with key bindings for the major mode of that
- buffer).
- 
-    If you switch to Vi in Dired or similar modes--no harm is done. It
- is just that the special keybindings provided by those modes will be
- temporarily overshadowed by Viper's bindings. Switching back to Viper's
- Emacs state will revive the environment provided by the current major
- mode.
- 
-    States in Viper are orthogonal to Emacs major modes, such as C mode
- or Dired mode. You can turn Viper on and off for any Emacs state. When
- Viper is turned on, Vi state can be used to move around. In Insert
- state, the bindings for these modes can be accessed.  For beginners
- (users at Viper levels 1 and 2), these bindings are suppressed in
- Insert state, so that new users are not confused by the Emacs states.
- Note that unless you allow Emacs bindings in Insert state, you cannot
- do many interesting things, like language sensitive editing. For the
- novice user (at Viper level 1), all major mode bindings are turned off
- in Vi state as well. This includes the bindings for key sequences that
- start with `C-c', which practically means that all major mode bindings
- are supported.  *Note Customization::, to find out how to allow Emacs
- keys in Insert state.
- 
- * Menu:
- 
- * Emacs State::		This is the state you should learn more about when
-                         you get up to speed with Viper.
- * Vi State::		Vi commands are executed in this state.
- * Insert State::	You can enter text, and also can do sophisticated
-                         editing if you know enough Emacs commands.
- * Replace State::	Like Insert mode, but it is invoked via the
-                         replacement commands, such as cw, C, R, etc.
- 
- 
- File: viper,  Node: Emacs State,  Next: Vi State,  Prev: States in Viper,  Up: States in Viper
- 
- Emacs State
- -----------
- 
-    You will be in this mode only by accident (hopefully). This is the
- state Emacs is normally in (imagine!!). Now leave it as soon as
- possible by typing `C-z'. The you will be in Vi state (sigh of relief)
- :-).
- 
-    Emacs state is actually a Viperism to denote all the major and minor
- modes (*Note Emacs Preliminaries::)  other than Viper that Emacs can be
- in. Emacs can have several modes, such as C mode for editing C
- programs, LaTeX mode for editing LaTeX documents, Dired for directory
- editing, etc. These are major modes, each with a different set of
- key-bindings. Viper states are orthogonal to these Emacs major modes.
- The presence of these language sensitive and other modes is a major win
- over Vi.  *Note Improvements over Vi::, for more.
- 
-    The bindings for these modes can be made available in the Viper
- Insert state as well as in Emacs state.  Unless you specify your user
- level as 1 (a novice), all major mode key sequences that start with
- `C-x' and `C-c' are also available in Vi state.  This is important
- because major modes designed for editing files, such as cc-mode or
- latex-mode, use key sequences that begin with `C-x' and `C-c'.
- 
-    There is also a key that lets you temporarily escape to Vi command
- state from Emacs state: typing `M-C-z' (or `ESC C-z') will let you
- execute a single Vi command while staying in Viper's Emacs state.  At
- present, this works only for 1-character Vi commands (and for some
- complex commands).
- 
- 
- File: viper,  Node: Vi State,  Next: Insert State,  Prev: Emacs State,  Up: States in Viper
- 
- Vi State
- --------
- 
-    This is the Vi command mode. When Viper is in Vi state, you will see
- the sign <V> in the mode line. Most keys will work as in Vi. The notable
- exceptions are:
- 
- `C-x'
-      `C-x' is used to invoke Emacs commands, mainly those that do window
-      management. `C-x 2' will split a window, `C-x 0' will close a
-      window. `C-x 1' will close all other windows. `C-xb' is used to
-      switch buffers in a window, and `C-xo' to move through windows.
-      These are about the only necessary keystrokes.  For the rest, see
-      GNU Emacs Manual.
- 
- `C-c'
-      For user levels 2 and higher, this key serves as a prefix key for
-      the key sequences used by various major modes. For users at Viper
-      level 1, `C-c' simply beeps.
- 
- `C-g and C-]'
-      These are the Emacs `quit' keys.  There will be cases where you
-      will have to use `C-g' to quit. Similarly, `C-]' is used to exit
-      `Recursive Edits' in Emacs for which there is no comparable Vi
-      functionality and no key-binding. Recursive edits are indicated by
-      `[]' brackets framing the modes on the mode line.  *Note Recursive
-      Edit: (emacs)Recursive Edit.  At user level 1, `C-g' is bound to
-      `vip-info-on-file' function instead.
- 
- `Underscore'
-      Viper uses `ESC' as a switch between Insert and Vi states. Emacs
-      uses `ESC' for Meta. We need a Meta key to call the Meta key
-      functions such as `M-x function name'. The underscore key, `_',
-      was chosen, since it is the only reasonable, free Vi key left.
-      Thus, in Vi state, to get `M-x', you should type `_x' (if the
-      keyboard has no Meta key).  It is possible to use `ESC' as Meta,
-      but then you cannot press `ESC' multiple times in Vi state. *Note
-      Customization::, to find out how to rebind ESC to be Meta.
- 
- Other differences are mostly improvements. The ones you should know
- about are:
- 
- `Undo'
-      `u' will undo. Undo can be repeated by the `.' key. Undo itself
-      can be undone. Another `u' will change the direction. The presence
-      of repeatable undo means that `U', undoing lines, is not very
-      important. Therefore, `U' also calls `vip-undo'.
- 
- `Counts'
-      Most commands, `~', `[[', `p', `/', ..., etc., take counts.
- 
- `Regexps'
-      Viper uses Emacs Regular Expressions for searches. These are a
-      superset of Vi regular expressions, excepting the change-of-case
-      escapes `\u', `\L', ..., etc. *Note Regular Expressions:
-      (emacs)Regular Expressions, for details.  Files specified to `:e'
-      use `csh' regular expressions (globbing, wildcards, what have you).
-      However, the function `vip-toggle-search-style', bound to `C-c /',
-      lets the user switch from search with regular expressions to plain
-      vanilla search and vice versa. It also lets one switch from
-      case-sensitive search to case-insensitive and back.  *Note Viper
-      Specials::, for more details.
- 
- `Ex commands'
-      The current working directory of a buffer is automatically
-      inserted in the minibuffer if you type `:e' then space.  Absolute
-      filenames are required less often in Viper.  For path names, Emacs
-      uses a convention that is slightly different from that of Unix.
-      It is designed to minimize the need for deleting path names that
-      Emacs provides in its prompts. (This is usually convenient, but
-      occasionally the prompt may suggest a wrong path name for you.) If
-      you see a prompt `/usr/foo/' and you wish to edit the file
-      `~/.vip', you don't have to erase the prompt. Instead, simply
-      continue typing what you need. Emacs will interpret
-      `/usr/foo/~/.vip' correctly. Similarly, if the prompt is `~/foo/'
-      and you need to get to `/bar/file', keep typing. Emacs interprets
-      `~/foo//bar/' as `/bar/file', since when it sees `//', it
-      understands that `~/foo/' is to be discarded.
- 
-      The command `:cd' will change the default directory for the
-      current buffer. The command `:e' will interpret the filename
-      argument in `csh'. *Note Customization::, if you want to change
-      the default shell.  The command `:next' takes counts from `:args',
-      so that `:rew' is obsolete. Also, `:args' will show only the
-      invisible files (i.e., those that are not currently seen in Emacs
-      windows).
- 
-      When applicable, Ex commands support file completion and history.
-      This means that by typing a partial file name and then `TAB',
-      Emacs will try to complete the name or it will offer a menu of
-      possible completions.  This works similarly to Tcsh and extends
-      the behavior of Csh. While Emacs is waiting for a file name, you
-      can type `M-p' to get the previous file name you typed. Repeatedly
-      typing `M-p' and `M-n' will let you browse through the file
-      history.
- 
-      Like file names, partially typed Ex commands can be completed by
-      typing `TAB', and Viper keeps the history of Ex commands. After
-      typing `:', you can browse through the previously entered Ex
-      commands by typing `M-p' and `M-n'.  Viper tries to rationalize
-      when it puts Ex commands on the history list.  For instance, if
-      you typed `:w! foo', only `:w!'  will be placed on the history
-      list. This is because the last history element is the default that
-      can be invoked simply by typing `: RET'. If `:w! foo' were placed
-      on the list, it would be all to easy to override valuable data in
-      another file. Reconstructing the full command, `:w!  foo', from
-      the history is still not that hard, since Viper has a separate
-      history for file names. By typing `: M-p', you will get `:w!' in
-      the Minibuffer. Then, repeated `M-p' will get you through the file
-      history, inserting one file name after another.
- 
-      In contrast to `:w! foo', if the command were `:r foo', the entire
-      command will appear in the history list. This is because having
-      `:r' alone as a default is meaningless, since this command
-      requires a file argument.
- 
- As Vi, Viper's destructive commands can be re-executed by typing ``.''.
- However, in addition, Viper keeps track of the history of such
- commands. This history can be perused by typing `C-c M-p' and `C-c M-n'.
- Having found the appropriate command, it can be then executed by typing
- ``.''.  *Note Improvements over Vi::, for more information.
- 
- 
- File: viper,  Node: Insert State,  Next: Replace State,  Prev: Vi State,  Up: States in Viper
- 
- Insert State
- ------------
- 
-    To avoid confusing the beginner (at Viper level 1 and 2), Viper
- makes only the standard Vi keys available in Insert state. The
- implication is that Emacs major modes cannot be used Insert state.  It
- is strongly recommended that as soon as you are comfortable, make the
- Emacs state bindings visible (by changing your user level to 3 or
- higher).  *Note Customization::, to see how to do this.
- 
-    Once this is done, it is possible to do quite a bit of editing in
- Insert state. For instance, Emacs has a "yank" command, `C-y', which is
- similar to Vi's `p'. However, unlike `p', `C-y' can be used in Insert
- state of Viper. Emacs also has a kill ring where it keeps pieces of
- text you deleted while editing buffers. The command `M-y' is used to
- delete the text previously put back by Emacs' `C-y' or by Vi's `p'
- command and reinsert text that was placed on the kill-ring earlier.
- 
-    This works both in Vi and Insert states.  In Vi state, `M-y' is a
- much better alternative to the usual Vi's way of recovering the 10
- previously deleted chunks of text. In Insert state, you can use this as
- follows. Suppose you deleted a piece of text and now you need to
- re-insert it while editing in Insert mode. The key `C-y' will put back
- the most recently deleted chunk. If this is not what you want, type
- `M-y' repeatedly and, hopefully, you will find the chunk you want.
- 
-    Finally, in Insert and Replace states, Viper provides the history of
- pieces of text inserted in previous insert or replace commands.  These
- strings of text can be recovered by repeatedly typing `C-c M-p' or `C-c
- M-n' while in Insert or Replace state. (This feature is disabled in the
- minibuffer: the above keys are usually bound to other histories, which
- are more appropriate in the minibuffer.)
- 
-    You can call Meta functions from Insert state. The Vi-to-Emacs
- toggle key, normally `C-z', is bound to Meta in Insert state. Thus
- `M-x' is typed as `C-zx'. The key `_' will now insert itself--it is not
- a Meta key in Insert state. (It is well understood that switching Meta
- keys around is inconvenient. However, there seems to be no way around
- this problem, short of changing Vi ESC key to something else. *Note
- Customization::, for the information on `vip-ESC-key', which can be
- used to free up `ESC' and designate some other key to do escape from
- Insert state to Vi state.)
- 
-    Other Emacs commands that are useful in Insert state are `C-e' and
- `C-a', which move the cursor to the end and the beginning of the
- current line, respectively. You can also use `M-f' and `M-b', which
- move the cursor forward (or backward) one word.  If your display has a
- Meta key, these functions are invoked by holding the Meta key and then
- typing `f' and `b', respectively. On displays without the Meta key,
- these functions are invoked by typing `C-z f' and `C-z b' (`C-z'
- simulates the Meta key in Insert state, as explained above).
- 
-    When Viper is in Insert state, you will see <I> in the mode line.
- 
- 
- File: viper,  Node: Replace State,  Prev: Insert State,  Up: States in Viper
- 
- Replace State
- -------------
- 
-    This state is entered through Vi replacement commands, such as `C',
- `cw', etc., or by typing `R'. In Replace state, Viper puts <R> in the
- mode line to let you know which state is in effect. If Replace state is
- entered through `R', Viper stays in that state until the user hits ESC.
- If this state is entered via the other replacement commands, then
- Replace state is in effect until you hit `ESC' or until you cross the
- rightmost boundary of the replacement region. In the latter case, Viper
- changes its state from Replace to Insert (which you will notice by the
- change in the mode line).
- 
-    Since Viper runs under Emacs, it is possible to switch between
- buffers while in Replace state. You can also move the cursor using the
- arrow keys (even on dumb terminals!) and the mouse. Because of this
- freedom (which is unattainable in regular Vi), it is possible to take
- the cursor outside the replacement region. (This may be necessary for
- several reasons, including the need to enable text selection and
- region-setting with the mouse.)
- 
-    The issue then arises as to what to do when the user hits the ESC
- key. In Vi, this would cause the text between cursor and the end of the
- replacement region to be deleted. But what if, as is possible in Viper,
- the cursor is not inside the replacement region?
- 
-    To solve the problem, Viper keeps track of the last cursor position
- while it was still inside the replacement region. So, in the above
- situation, Viper would delete text between this position and the end of
- the replacement region.
- 
- 
- File: viper,  Node: The Minibuffer,  Next: Multiple Files in Viper,  Prev: States in Viper,  Up: Overview
- 
- The Minibuffer
- ==============
- 
-    The Minibuffer is where commands are entered in. Editing can be done
- by commands from Insert state, namely:
- 
- `C-h'
-      Backspace
- 
- `C-w'
-      Delete Word
- 
- `C-u'
-      Erase line
- 
- `C-v'
-      Quote the following character
- 
- `RET'
-      Execute command
- 
- `C-g and C-]'
-      Emacs quit and abort keys. These may be necessary. *Note Vi
-      State::, for an explanation.
- 
- `M-p and M-n'
-      These keys are bound to functions that peruse minibuffer history.
-      The precise history to be perused depends on the context. It may
-      be the history of search strings, Ex commands, file names, etc.
- 
-    Most of the Emacs keys are functional in the Minibuffer.  While in
- the Minibuffer, Viper tries to make editing resemble Vi's behavior when
- the latter is waiting for the user to type an Ex command. In
- particular, you can use the regular Vi commands to edit the Minibuffer.
- You can switch between the Vi state and Insert state at will, and even
- use the replace mode.  Initially, the Minibuffer comes up in Insert
- state.
- 
-    Some users prefer plain Emacs bindings in the Minibuffer. To this
- end, set `vip-vi-style-in-minibuffer' to `nil' in `.vip'.  *Note
- Customization::, to learn how to do this.
- 
-    When the Minibuffer changes Viper states, you will notice that the
- appearance of the text there changes as well. This is useful because
- the Minibuffer has no mode line to tell which Vi state it is in.  The
- appearance of the text in the Minibuffer can be changed.  *Note Viper
- Specials::, for more details.
- 
- 
- File: viper,  Node: Multiple Files in Viper,  Next: Unimplemented Features,  Prev: The Minibuffer,  Up: Overview
- 
- Multiple Files in Viper
- =======================
- 
-    Viper can edit multiple files. This means, for example that you
- never need to suffer through `No write since last change' errors.  Some
- Viper elements are common over all the files.
- 
- `Textmarkers'
-      Textmarkers remember *files and positions*.  If you set marker `a'
-      in file `foo', start editing file `bar' and type `'a', then *YOU
-      WILL SWITCH TO FILE `foo'*. You can see the contents of a
-      textmarker using the Viper command `[<a-z>' where <a-z> are the
-      textmarkers, e.g., `[a' to view marker `a' .
- 
- `Repeated Commands'
-      Command repetitions are common over files. Typing `!!' will repeat
-      the last `!' command whichever file it was issued from.  Typing
-      `.' will repeat the last command from any file, and searches will
-      repeat the last search. Ex commands can be repeated by typing
-      `:RET'.  Note: in some rare cases, that `:RET' may do something
-      dangerous.  However, usually its effect can be undone by typing
-      `u'.
- 
- `Registers'
-      Registers are common to files. Also, text yanked with `y' can be
-      put back (`p') into any file. The Viper command `]<a-z>', where
-      <a-z> are the registers, can be used to look at the contents of a
-      register, e.g., type `]a' to view register `a'.
- 
-      There is one difference in text deletion that you should be aware
-      of. This difference comes from Emacs and was adopted in Viper
-      because we find it very useful. In Vi, if you delete a line, say,
-      and then another line, these two deletions are separated and are
-      put back separately if you use the `p' command. In Emacs (and
-      Viper), successive series of deletions that are *not interrupted*
-      by other commands are lumped together, so the deleted text gets
-      accumulated and can be put back as one chunk. If you want to break
-      a sequence of deletions so that the newly deleted text could be
-      put back separately from the previously deleted text, you should
-      perform a non-deleting action, e.g., move the cursor one character
-      in any direction.
- 
- `Absolute Filenames'
-      The current directory name for a file is automatically prepended
-      to the file name in any `:e', `:r', `:w', etc., command (in Emacs,
-      each buffer has a current directory).  This directory is inserted
-      in the Minibuffer once you type space after `:e, r', etc. Viper
-      also supports completion of file names and Ex commands (`TAB'),
-      and it keeps track of command and file history (`M-p', `M-n').
-      Absolute filenames are required less often in Viper.
- 
-      You should be aware that Emacs interprets `/foo/bar//bla' as
-      `/bla' and `/foo/~/bar' as `~/bar'. This is designed to minimize
-      the need for erasing path names that Emacs suggests in its
-      prompts, if a suggested path name is not what you wanted.
- 
-      The command `:cd' will change the default directory for the
-      current Emacs buffer. The Ex command `:e' will interpret the
-      filename argument in `csh', by default. *Note Customization::, if
-      you want to change this.
- 
- Currently undisplayed files can be listed using the `:ar' command.  The
- command `:n' can be given counts from the `:ar' list to switch to other
- files.
- 
- 
- File: viper,  Node: Unimplemented Features,  Prev: Multiple Files in Viper,  Up: Overview
- 
- Unimplemented Features
- ======================
- 
-    Unimplemented features include:
- 
-    * `:ab' and `:una' are not implemented.  Both `:map' and `:ab' are
-      considered obsolete, since Emacs has much more powerful facilities
-      for defining keyboard macros and abbreviations.
- 
-    * `:set option?' is not implemented. The current `:set' can also be
-      used to set Emacs variables.
- 
-    * `:se list' requires modification of the display code for Emacs, so
-      it is not implemented.  A useful alternative is `cat -t -e file'.
-      Unfortunately, it cannot be used directly inside Emacs, since
-      Emacs will obdurately change `^I' back to normal tabs.
- 
- 
- File: viper,  Node: Improvements over Vi,  Next: Customization,  Prev: Overview,  Up: Top
- 
- Improvements over Vi
- ********************
- 
-    Some common problems with Vi and Ex have been solved in Viper. This
- includes better implementation of existing commands, new commands, and
- the facilities provided by Emacs.
- 
- * Menu:
- 
- * Basics::		    Basic Viper differences, Multi-file effects.
- * Undo and Backups::	    Multiple undo, auto-save, backups and changes
- * History::		    History for Ex and Vi commands.
- * Macros and Registers::    Keyboard Macros (extended ".") @reg execution.
- * Completion::		    Filename and Command Completion for Ex.
- * Improved Search::	    Incremental Search and Buffer Content Search.
- * Abbreviation Facilities:: Normal Abbrevs, Templates, and Dynamic Abbrevs.
- * Movement and Markers::    Screen Editor movements, viewing textmarkers.
- * New Commands::	    Commands that do not exist in Vi.
- * Useful Packages::         A Sampling of some Emacs packages, and things
- 			    you should know about.
- 
- 
- File: viper,  Node: Basics,  Next: Undo and Backups,  Prev: Improvements over Vi,  Up: Improvements over Vi
- 
- Basics
- ======
- 
-    The Vi command set is based on the idea of combining motion commands
- with other commands. The motion command is used as a text region
- specifier for other commands.  We classify motion commands into "point
- commands" and "line commands".
- 
-    The point commands are:
- 
-      `h', `l', `0',  `$', `w', `W', `b', `B', `e', `E', `(', `)', `/',
-      `?', ``', `f', `F', `t', `T', `%', `;', `,', `^'
- 
-    The line commands are:
- 
-      `j', `k', `+', `-', `H', `M', `L', `{', `}', `G', `'',  `[[',
-      `]]', `[]'
- 
- If a point command is given as an argument to a modifying command, the
- region determined by the point command will be affected by the modifying
- command. On the other hand, if a line command is given as an argument
- to a modifying command, the region determined by the line command will
- be enlarged so that it will become the smallest region properly
- containing the region and consisting of whole lines (we call this
- process "expanding the region"), and then the enlarged region will be
- affected by the modifying command.  Text Deletion Commands (*Note
- Deleting Text::), Change commands (*Note Changing Text::), even Shell
- Commands (*Note Shell Commands::) use these commands to describe a
- region of text to operate on.  Thus, type `dw' to delete a word, `>}'
- to shift a paragraph, or `!'afmt' to format a region from `point' to
- textmarker `a'.
- 
-    Viper adds the region specifiers `r' and `R'. Emacs has a special
- marker called "mark". The text-area between the current cursor position
- "point" and the "mark" is called the "region".  `r' specifies the raw
- region and `R' is the expanded region (i.e., the minimal contiguous
- chunk of full lines that contains the raw region).  `dr' will now
- delete the region, `>r' will shift it, etc.  `r,R' are not motion
- commands, however. The special mark is set by `m.' and other commands.
- *Note Marking::, for more info.
- 
-    Viper also adds counts to most commands for which it would make
- sense.
- 
-    In the Overview chapter, some Multiple File issues were discussed
- (*Note Multiple Files in Viper::). In addition to the files, Emacs has
- buffers. These can be seen in the `:args' list and switched using
- `:next' if you type `:set ex-cycle-through-non-files t', or specify
- `(setq ex-cycle-through-non-files t)' in your `.vip' file. *Note
- Customization::, for details.
- 
- 
- File: viper,  Node: Undo and Backups,  Next: History,  Prev: Basics,  Up: Improvements over Vi
- 
- Undo and Backups
- ================
- 
-    Viper provides multiple undo. The number of undo's and the size is
- limited by the machine. The Viper command `u' does an undo. Undo can be
- repeated by typing `.' (a period). Another `u' will undo the undo, and
- further `.' will repeat it. Typing `u' does the first undo, and changes
- the direction.
- 
-    Since the undo size is limited, Viper can create backup files and
- auto-save files. It will normally do this automatically. It is possible
- to have numbered backups, etc. For details, *note Backup and Auto-Save:
- (emacs)Backup.
- 
-    The results of the 9 previous changes are available in the 9 numeric
- registers, as in Vi. The extra goody is the ability to *view* these
- registers, in addition to being able to access them through `p' and
- `M-y' (*Note Insert State::, for details.) The Viper command `]
- register' will display the contents of any register, numeric or
- alphabetical. The related command `[ textmarker' will show the text
- around the textmarker. `register' and `textmarker' can be any letters
- from a through z.
- 
- 
- File: viper,  Node: History,  Next: Macros and Registers,  Prev: Undo and Backups,  Up: Improvements over Vi
- 
- History
- =======
- 
-    History is provided for Ex commands, Vi searches, file names, pieces
- of text inserted in earlier commands that use Insert or Replace state,
- and for destructive commands in Vi state. These are useful for fixing
- those small typos that screw up searches and `:s', and for eliminating
- routine associated with repeated typing of file names or pieces of text
- that need to be inserted frequently.  At the `:' or `/' prompts in the
- Minibuffer, you can do the following:
- 
- `M-p and M-n'
-      To move to previous and next history items. This causes the history
-      items to appear on the command line, where you can edit them, or
-      simply type Return to execute.
- 
- `M-r and M-s'
-      To search backward and forward through the history.
- 
- `RET'
-      Type RET to accept a default (which is displayed in the prompt).
- 
-    The history of insertions  can be perused by typing `C-c M-p' and
- `C-c M-n' while in Insert or Replace state.  The history of destructive
- Vi commands can be perused via the same keys when Viper is in Vi state.
- *Note Viper Specials::, for details.
- 
-    All Ex commands have a file history. For instance, typing `:e', space
- and then `M-p' will bring up the name of the previously typed file
- name. Repeatedly typing `M-p', `M-n', etc., will let you browse through
- the file history.
- 
-    Similarly, commands that have to do with switching buffers have a
- buffer history, and commands that expect strings or regular expressions
- keep a history on those items.
- 
- 
- File: viper,  Node: Macros and Registers,  Next: Completion,  Prev: History,  Up: Improvements over Vi
- 
- Macros and Registers
- ====================
- 
-    Viper facilitates the use of Emacs-style keyboard macros. `@#' will
- start a macro definition.  As you type, the commands will be executed,
- and remembered (This is called "learn mode" in some editors.)
- `@register' will complete the macro, putting it into `register', where
- `register' is any character from `a' through `z'. Then you can execute
- this macro using `@register'. It is, of course, possible to yank some
- text into a register and execute it using `@register'. Typing `@@',
- `@RET', or `@LF' will execute the last macro that was executed using
- `@register'.
- 
-    Viper will automatically lowercase the register, so that pressing the
- `SHIFT' key for `@' will not create problems. This is for `@' macros
- and `"p' *only*. In the case of `y', `"Ayy' will append to *register
- a*. For `[,],',`', it is an error to use a Uppercase register name.
- 
-    The contents of a register can be seen by `]register'. (`[textmarker'
- will show the contents of a textmarker).
- 
-    The last keyboard macro can also be executed using `*', and it can
- be yanked into a register using `@!register'.  This is useful for Emacs
- style keyboard macros defined using `C-x(' and `C-x)'. Emacs keyboard
- macros have more capabilities.  *Note Keyboard Macros: (emacs)Keyboard
- Macros, for details.
- 
-    Keyboard Macros allow an interesting form of Query-Replace:
- `/pattern' or `n' to go to the next pattern (the query), followed by a
- Keyboard Macro execution `@@' (the replace).
- 
-    Viper also provides Vi-style macros. *Note Vi Macros::, for details.
- 
- 
- File: viper,  Node: Completion,  Next: Improved Search,  Prev: Macros and Registers,  Up: Improvements over Vi
- 
- Completion
- ==========
- 
-    Completion is done when you type `TAB'. The Emacs completer does not
- grok wildcards in filenames. Once you type a wildcard, the completer
- will no longer work for that path.  Remember that Emacs interprets a
- file name of the form `/foo//bar' as `/bar' and `/foo/~/bar' as `~/bar'.
- 
- 
- File: viper,  Node: Improved Search,  Next: Abbreviation Facilities,  Prev: Completion,  Up: Improvements over Vi
- 
- Improved Search
- ===============
- 
-    Viper provides buffer search, the ability to search the buffer for a
- region under the cursor. You have to turn this on by calling
- 
-      (vip-buffer-search-enable)
- 
- Then, the key `g' will take movement commands like `w,/', etc., to find
- a region and search for the contents of this region. This command is
- very useful to search for variable names, etc., in a program. The
- search can be repeated by `n', or reversed by `N'.
- 
-    Emacs provides incremental search. As you type the string in, the
- cursor will move to the next match. You can snarf words from the buffer
- as you go along. Incremental Search is normally bound to `C-s' and
- `C-r'. *Note Customization::, to find out how to change the bindings of
- `C-r or C-s'.  For details, *note Incremental Search:
- (emacs)Incremental Search.
- 
-    Viper also provides a query replace function that prompts through the
- Minibuffer. It is invoked by the `Q' key in Vi state.
- 
-    On a window display, Viper supports mouse search, i.e., you can
- search for a word by clicking on it. *Note Viper Specials::, for
- details.
- 
-    Finally, on a window display, Viper highlights search patterns as it
- finds them. This is done through what is known as *faces* in Emacs. The
- variable that controls how search patterns are highlighted is
- `vip-search-face'.  If you don't want any highlighting at all, put
-      (copy-face 'default 'vip-search-face)
- 
- in `~/.vip'. If you want to change how patterns are highlighted, you
- will have to set the variable `vip-search-face' to some other face,
- such as `highlight'. If none of the existing faces fits the bill, you
- may have to create your own. Further details on faces can be found in
- the Emacs Lisp Manual.
- 
- 
- File: viper,  Node: Abbreviation Facilities,  Next: Movement and Markers,  Prev: Improved Search,  Up: Improvements over Vi
- 
- Abbreviation Facilities
- =======================
- 
-    It is possible in Emacs to define abbrevs based on the contents of
- the buffer.  Sophisticated templates can be defined using the Emacs
- abbreviation facilities. *Note Abbreviations: (emacs)Abbrevs, for
- details.
- 
-    Emacs also provides Dynamic Abbreviations. Given a partial word,
- Emacs will search the buffer to find an extension for this word. For
- instance, one can type `Abbreviations' by typing `A', followed by a
- keystroke that completed the `A' to `Abbreviations'. Repeated typing
- will search further back in the buffer, so that one could get `Abbrevs'
- by repeating the keystroke, which appears earlier in the text. Emacs
- binds this to `ESC /', so you will have to find a key and bind the
- function `dabbrev-expand' to that key.  Facilities like this make Vi's
- `:ab' command obsolete.
- 
- 
- File: viper,  Node: Movement and Markers,  Next: New Commands,  Prev: Abbreviation Facilities,  Up: Improvements over Vi
- 
- Movement and Markers
- ====================
- 
-    Viper can be set free from the line-limited movements in Vi, such as
- `l' refusing to move beyond the line, `ESC' moving one character back,
- etc. These derive from Ex, which is a line editor. If your `.vip'
- contains
- 
-      `(setq vip-ex-style-motion nil)'
- 
- the motion will be a true screen editor motion. One thing you must then
- watch out for is that it is possible to be on the end-of-line character.
- The keys `x' and `%' will still work correctly, i.e., as if they were
- on the last character.
- 
-    Textmarkers in Viper remember the file and the position, so that you
- can switch files by simply doing `'a'. If you set up a regimen for using
- Textmarkers, this is very useful. Contents of textmarkers can be viewed
- by `[marker'. (Contents of registers can be viewed by `]register').
- 
--- 0 ----
Index: emacs/info/viper-2
diff -c emacs/info/viper-2:1.1.1.1 emacs/info/viper-2:removed
*** emacs/info/viper-2:1.1.1.1	Mon Jul 22 01:53:08 1996
--- emacs/info/viper-2	Fri Aug  2 20:27:04 1996
***************
*** 1,834 ****
- This is Info file ../info/viper, produced by Makeinfo-1.55 from the
- input file viper.texi.
- 
-    %
- 
- Distribution
- ************
- 
- Copyright (C) 1991 Aamod Sane
- Copyright (C) 1994 Michael Kifer
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- File: viper,  Node: New Commands,  Next: Useful Packages,  Prev: Movement and Markers,  Up: Improvements over Vi
- 
- New Commands
- ============
- 
-    These commands have no Vi analogs.
- 
- `C-x, C-c'
-      `C-x' will exit from Vi state and return to Emacs state
-      *temporarily*. If you hit one of these keys, Emacs will believe
-      that you hit that key in Emacs state. For example, if you hit `C-x'
-      followed by `2', then the current window will be split into 2 and
-      you will be in Vi state again. Except for novice users, `C-c' is
-      also set to temporarily escape to Emacs and execute a command from
-      the current major mode.  `ESC' will do the same, if you configure
-      ESC as Meta by setting `vip-no-multiple-ESC' to nil in `.vip'.
-      *Note Customization::. `C-z' in Insert state will make Emacs think
-      `Meta' has been hit.
- 
- `\'
-      Escape to Emacs to execute a single Emacs command. For instance, `\
-      ESC' will act like a Meta key.
- 
- `Q'
-      `Q' is for query replace.  By default, each string to be replaced
-      is treated as regular expressions. You can use `(setq
-      vip-re-query-replace nil)' in your `.emacs' file to turn this off.
-      (For normal searches, `:se nomagic' will work. Note that `:se
-      nomagic' turns Regexps off completely, unlike Vi).
- 
- `v'
- `V'
- `C-v'
-      These keys are used to visit files.  `v' will switch to a buffer
-      visiting file whose name can be entered in the Minibuffer. `V' is
-      similar, but will use a window different from the current window.
-      `C-v' is like `V', except that a new frame (X window) will be used
-      instead of a new Emacs window.
- 
- `#'
-      If followed by a certain character CH, it becomes an operator whose
-      argument is the region determined by the motion command that
-      follows (indicated as <move>).  Currently, CH can be one of `c',
-      `C', `g', `q', and `s'. For instance, `#qr' will prompt you for a
-      string and then prepend this string to each line in the buffer.
- 
- `# c'
-      Change upper case characters in the region to lower case
-      (`downcase-region').  Emacs command `M-l' does the same for words.
- 
- `# C'
-      Change lower case characters in the region to upper case. For
-      instance, `# C 3 w' will capitalize 3 words from the current point
-      (`upcase-region').  Emacs command `M-l' does the same for words.
- 
- `# g'
-      Execute last keyboard macro for each line in the region
-      (`vip-global-execute').
- 
- `# q'
-      Insert specified string at the beginning of each line in the region
-      (`vip-quote-region').
- 
- `# s'
-      Check spelling of words in the region (`spell-region').  The
-      function used for spelling is determined from the variable
-      `vip-spell-function'.
- 
- `*'
-      Call last keyboard macro.
- 
- `m .'
-      Set mark at point and push old mark off the ring
- 
- `m<'
- `m>'
-      Set mark at beginning and end of buffer, respectively.
- 
- `m,'
-      Jump to mark and pop mark off the ring. *Note Mark: (emacs)Mark,
-      for more info.
- 
- `] register'
-      View contents of register
- 
- `[ textmarker'
-      View filename and position of textmarker
- 
- `@#'
- `@register'
- `@!'
-      Begin/end keyboard macro. @register has a different meaning when
-      used after a `@#'. *Note Macros and Registers::, for details
- 
- `[]'
-      Go to end of heading.
- 
- `g <*movement command*>'
-      Search buffer for text delimited by movement command. The canonical
-      example is `gw' to search for word under the cursor.  *Note
-      Improved Search::, for details.
- 
- `_'
-      Meta key when in Vi state.*Note Vi State::, for an explanation.
- 
- `C-g and C-]'
-      Quit and Abort Recursive edit. These may be necessary on occasion.
-      *Note Vi State::, for a reason.
- 
- `C-c g'
-      Hitting `C-c' followed by `g' will display the information on the
-      current buffer. This is the same as hitting  `C-g' in Vi, but, as
-      explained above, `C-g' is needed for other purposes in Emacs.
- 
- `C-c /'
-      Without a prefix argument, this command toggles
-      case-sensitive/case-insensitive search modes and plain
-      vanilla/regular expression search. With the prefix argument 1,
-      i.e., `1 C-c /', this toggles case-sensitivity; with the prefix
-      argument 2, toggles plain vanilla search and search using regular
-      expressions. *Note Viper Specials::, for alternative ways to invoke
-      this function.
- 
- `M-p and M-n'
-      In the Minibuffer, these commands navigate through the minibuffer
-      histories, such as the history of search strings, Ex commands, etc.
- 
- `C-c M-p and C-c M-n'
-      In Insert or Replace state, these commands let  the user peruse
-      the history of insertion strings used in previous insert or replace
-      commands. Try to hit `C-c M-p' or `C-c M-n' repeatedly and see what
-      happens. *Note Viper Specials::, for more.
- 
-      In Vi state, these commands let the user peruse the history of
-      Vi-style destructive commands, such as `dw', `J', `a', etc.  By
-      repeatedly typing `C-c M-p' or `C-c M-n' you will cycle Viper
-      through the recent history of Vi commands, displaying the commands
-      one by one. Once an appropriate command is found, it can be
-      executed by typing ``.''.
- 
-      Since typing `C-c M-p' is tedious, it is more convenient to bind an
-      appropriate function to a function key on the keyboard and use
-      that key.  *Note Viper Specials::, for details.
- 
- `Ex commands'
-      The commands `:args', `:next', `:pre' behave differently. `:pwd'
-      exists to get current directory.  The commands `:b' and `:B'
-      switch buffers around. *Note File and Buffer Handling::, for
-      details.  There are also the new commands `:RelatedFile' and
-      `PreviousRelatedFile' (which abbreviate to `R' and `P',
-      respectively. *Note Viper Specials::, for details.
- 
-    Apart from the new commands, many old commands have been enhanced.
- Most notably, Vi style macros are much more powerful in Viper than in
- Vi. *Note Vi Macros::, for details.
- 
- 
- File: viper,  Node: Useful Packages,  Prev: New Commands,  Up: Improvements over Vi
- 
- Useful Packages
- ===============
- 
-    Some Emacs packages are mentioned here as an aid to the new Viper
- user, to indicate what Viper is capable of.  A vast number comes with
- the standard Emacs distribution, and many more exist on the net and on
- the archives.
- 
-    This manual also mentions some Emacs features a new user should know
- about. The details of these are found in the GNU Emacs Manual.
- 
-    The features first. For details, look up the Emacs Manual.
- 
- `Make'
-      Makes and Compiles can be done from the editor. Error messages
-      will be parsed and you can move to the error lines.
- 
- `Shell'
-      You can talk to Shells from inside the editor. Your entire shell
-      session can be treated as a file.
- 
- `Mail'
-      Mail can be read from and sent within the editor. Several
-      sophisticated packages exist.
- 
- `Language Sensitive Editing'
-      Editing modes are written for most computer  languages in
-      existence. By controlling indentation, they catch punctuation
-      errors.
- 
-    The packages, below, represents a drop in the sea of special-purpose
- packages that come with standard distribution of Emacs 19.
- 
- `Transparent FTP'
-      `ange-ftp.el' can ftp from the editor to files on other machines
-      transparent to the user.
- 
- `RCS Interfaces'
-      `vc.el' for doing RCS commands from inside the editor
- 
- `Directory Editor'
-      `dired.el' for editing contents of directories and for navigating
-      in the file system.
- 
- `Syntactic Highlighting'
-      `hilit19.el' and `font-lock.el' for automatic highlighting various
-      parts of a buffer using different fonts and colors.
- 
- `Saving Emacs Configuration'
-      `desktop.el' for saving/restoring configuration on Emacs
-      exit/startup.
- 
- `Spell Checker'
-      `ispell.el' for spell checking the buffer, words, regions, etc.
- 
- `File and Buffer Comparison'
-      `ediff.el' for finding differences between files and for applying
-      patches.
- 
- Emacs Lisp archives exist on `archive.cis.ohio-state.edu' and
- `wuarchive.wustl.edu'
- 
- 
- File: viper,  Node: Customization,  Next: Commands,  Prev: Improvements over Vi,  Up: Top
- 
- Customization
- *************
- 
-    Customization can be done in 2 ways.
- 
-    * Elisp code in a `.vip' file in your home directory. Viper loads
-      `.vip' just before it does the binding for mode hooks. This is the
-      recommended method.
- 
-    * Elisp code in your `.emacs' file before and after the `(require
-      'viper)' line. This method is not recommended, unless you are know
-      what you are doing.
- 
- Emacs customization is done in Emacs Lisp. For the common cases,
- examples are provided that you can use directly.
- 
- * Menu:
- 
- * Rudimentary Changes::		 Simple constant definitions.
- * Keybindings::			 Enabling Emacs Keys, Rebinding keys, etc.
- * Packages that Change Keymaps:: How to deal with such beasts.
- * Viper Specials::		 Special Viper commands.
- * Vi Macros::           	 How to do Vi style macros.
- 
- 
- File: viper,  Node: Rudimentary Changes,  Next: Keybindings,  Prev: Customization,  Up: Customization
- 
- Rudimentary Changes
- ===================
- 
-    An easy way to customize Viper is to change the values of constants
- used in Viper.  Here is the list of the constants used in Viper and
- their default values. The corresponding :se command is also indicated.
- (The symbols `t' and `nil' represent "true" and "false" in Lisp).
- 
-    Viper supports both the abbreviated Vi variable names and their full
- names. Variable completion is done on full names only. `TAB' and `SPC'
- complete variable names. Typing `=' will complete the name and then
- will prompt for a value, if applicable. For instance, `:se auSPC' will
- complete the command to `:set autoindent'; `:se taSPC' will complete
- the command and prompt further like this: `:set tabstop = '.  However,
- typing `:se tsSPC' will produce a "No match" message because `ts' is an
- abbreviation for `tabstop' and Viper supports completion on full names
- only. However, you can still hit `RET' or `=', which will complete the
- command like this: `:set ts = ' and Viper will be waiting for you to
- type a value for the tabstop variable.  To get the full list of Vi
- variables, type `:se SPC TAB'.
- 
- `vip-auto-indent nil'
- `:se ai (:se autoindent)'
-      If `t' then enable auto indentation.  by `o' or `O' command.
- 
- `vip-case-fold-search nil'
- `:se ic (:se ignorecase)'
-      If `t' search ignores cases.
- 
- `vip-re-search nil'
- `:se magic'
-      If `t' then search is reg-exp search, if `nil' then vanilla search.
- 
- `buffer-read-only'
- `:se ro (:se readonly)'
-      Set current buffer to read only. To change globally put
-      `(setq-default buffer-read-only t)' in your `.emacs' file.
- 
- `blink-matching-paren t'
- `:se sm (:se showmatch)'
-      Show matching parens by blinking cursor.
- 
- `tab-width t (default setting, via `setq-default')'
- `:se ts=value (:se tabstop=value)'
-      Set tab width to value for all buffers where the tab is not yet
-      set locally (see next), including the new buffers. Note that
-      typing `TAB' normally doesn't insert the tab, since this key is
-      usually bound to text-formatting function,
-      `indent-for-tab-command' (which facilitates programming and
-      document writing). Instead, the tab is inserted via the command
-      `vip-insert-tab', which is bound to `S-tab' (shift + tab).
- 
-      On some non-windowing terminals, Shift doesn't modify the `TAB'
-      key, so `S-tab' behaves as if it were `TAB'. In such a case, you
-      will have to bind `vip-insert-tab' to some other convenient key.
- 
- `tab-width t (local setting via `setq')'
- `:se tab-stop-local=value'
-      Like `:se ts', except that `tab-width' is set only for the current
-      buffer; it will have no effect on other buffers.
- 
- `vip-shift-width 8'
- `:se sw=value  (:se shiftwidth=value)'
-      The number of columns shifted by `>' and `<' commands.
- 
- `vip-search-wrap-around t'
- `:se ws (:se wrapscan)'
-      If `t', search wraps around the end/beginning of buffer.
- 
- `vip-tags-file-name "TAGS"'
-      The name of the file used as the tag table.
- 
- `vip-re-query-replace nil'
-      If `t', use reg-exp replace in query replace.
- 
- `vip-want-ctl-h-help nil'
-      If `t', `C-h' is bound to `help-command'; if `nil', it is bound to
-      `delete-backward-char'.
- 
- `vip-vi-style-in-minibuffer t'
-      If `t', Viper provides a high degree of compatibility with Vi
-      insert mode when you type text in the Minibuffer; if `nil', typing
-      in the Minibuffer feels like plain Emacs.
- 
- `vip-no-multiple-ESC t'
-      If you set this to `nil', you can use `ESC' as Meta in Vi state.
-      Normally, this is not necessary, since graphical displays have
-      separate Meta keys (usually on each side of the space bar). On a
-      dumb terminal, Viper sets this variable to `twice', which is
-      almost like `nil', except that double `ESC' beeps. This, too, lets
-      ESC to be used as a Meta.
- 
- `vip-keysequence-delay 140'
-      Escape sequences separated by this much delay are interpreted as
-      command, ignoring the special meaning of ESC in VI. The default is
-      suitable for most terminals. However, if your terminal is
-      extremely slow, you might want to increase this slightly. You will
-      know if your terminal is slow if the ESC key sequences emitted by
-      the arrow keys are interpreted as separately typed characters (and
-      thus the arrow keys won't work).  Making this value too large will
-      slow you down, so exercise restraint.
- 
- `vip-ex-style-motion t'
-      Set this to `nil', if you want `l,h' to cross lines, etc. *Note
-      Movement and Markers::, for more info.
- 
- `vip-ex-style-editing-in-insert t'
-      Set this to to `nil', if you want `ESC' to not move back and `C-h'
-      to not stop at the beginning of a line in Insert state.
- 
- `vip-always t'
-      Leave it to Viper to decide when a buffer must be brought up in Vi
-      state, Insert state, or Emacs state. This heuristics works well in
-      virtually all cases.  This option must be set before Viper is
-      loaded or in the `.vip' file.
- 
- `vip-custom-file-name "~/.vip"'
-      Change this if you want. Must be set in `.emacs' (not `.vip'!)
-      before Viper is loaded. Note that you have to set it as a string
-      inside double quotes.
- 
- `vip-info-file-name "viper"'
-      The name prefix for Viper Info files. By default, the info files
-      are `viper', `viper-1', etc.
- 
- `vip-spell-function 'ispell-region'
-      Function used by the command `#c<move>' to spell.
- 
- `ex-find-file-shell "csh"'
-      Shell used to interpret filenames. If you have problems with Csh,
-      change to something else. Note that you have to set it as a string
-      inside double quotes.
- 
- `ex-cycle-other-window t'
-      If `t', `:n' and `:b' will cycle through files in another window,
-      if one exists.
- 
- `ex-cycle-through-non-files nil'
-      `:n' does not normally cycle through buffers. Set this to get
-      buffers also.
- 
- `vip-automatic-iso-accents nil'
-      If `t', ISO accents will be turned on in insert/replace Viper
-      states and turned off in Vi state. This is useful for editing text
-      in European languages.
- 
- `vip-want-emacs-keys-in-insert'
-      This is set to `nil' for user levels 1 and 2 and to `t' for user
-      levels 3 and 4. Users who specify level 5 are allowed to set this
-      variable as they please (the default for this level is `t'). If
-      set to `nil', complete Vi compatibility is provided in Insert
-      state. This is really not recommended, as this precludes you from
-      using language-specific features provided by the major modes.
- 
- `vip-want-emacs-keys-in-vi'
-      This is set to `nil' for user level 1 and to `t' for user levels
-      2-4.  At level 5, users are allowed to set this variable as they
-      please (the default for this level is `t').  If set to `nil',
-      complete Vi compatibility is provided in Vi command state. Setting
-      this to `nil' is really a bad idea, unless you are a novice, as
-      this precludes the use of language-specific features provided by
-      the major modes.
- 
- `vip-keep-point-on-repeat t'
-      If `t', point is not moved when the user repeats the previous
-      command by typing `.'  This is very useful for doing repeated
-      changes with the `.' key.
- 
- `vip-repeat-from-history-key 'f1'
-      Prefix key used to invoke the macros `f1 1' and `f1 2' that repeat
-      the second-last and the third-last destructive command.  Both
-      these macros are bound (as Viper macros) to
-      `vip-repeat-from-history', which checks the second key by which it
-      is invoked to see which of the previous commands to invoke. Viper
-      binds `f1 1' and `f1 2' only, but the user can bind more in
-      `~/.vip'. *Note Vi Macros::, for how to do this.
- 
- `vip-keep-point-on-undo nil'
-      If `t', Viper tries to not move point when undoing commands.
-      Instead, it will briefly move the cursor to the place where change
-      has taken place. However, if the undone piece of text is not seen
-      in window, then point will be moved to the place where the change
-      took place.  Set it to `t' and see if you like it better.
- 
- `vip-delete-backwards-in-replace nil'
-      If `t', DEL key will delete characters while moving the cursor
-      backwards.  If `nil', the cursor will move backwards without
-      deleting anything.
- 
- `vip-replace-overlay-face 'vip-replace-overlay-face'
-      On a graphical display, Viper highlights replacement regions
-      instead of putting a `$' at the end. This variable controls the so
-      called "face" used to highlight the region.
- 
-      By default, `vip-replace-overlay-face' underlines the replacement
-      on monochrome displays and highlights it with color on  color
-      displays.  If you know something about Emacs faces and don't like
-      how Viper highlights replacement regions, you can change this
-      variable to specify a new face name. (Emacs faces are described in
-      the Emacs Lisp reference.) On a color display, the following
-      customization method is usually most effective:
-           (set-face-foreground vip-replace-overlay-face "DarkSlateBlue")
-           (set-face-background vip-replace-overlay-face "yellow")
-      For a complete list of colors available to you, evaluate the
-      expression `(x-defined-colors)'. (Type it in the buffer `*scratch*'
-      and then hit the `C-j' key.
- 
- `vip-replace-overlay-cursor-color  "Red"'
-      Cursor color when it is inside the replacement region.  This has
-      effect only on color displays and only when Emacs runs as an X
-      application.
- 
- `vip-replace-region-end-delimiter "$"'
-      A string used to mark the end of replacement regions.  It is used
-      only with TTYs or if `vip-use-replace-region-delimiters' is
-      non-nil.
- 
- `vip-replace-region-start-delimiter  ""'
-      A string used to mark the beginning of replacement regions.  It is
-      used only with TTYs or if `vip-use-replace-region-delimiters' is
-      non-nil.
- 
- `vip-use-replace-region-delimiters'
-      If non-nil, Viper will always use
-      `vip-replace-region-end-delimiter' and
-      `vip-replace-region-start-delimiter' to delimit replacement
-      regions, even on color displays (where this is unnecessary). By
-      default, this variable is non-nil only on TTYs or monochrome
-      displays.
- 
- `vip-toggle-key "\C-z"'
-      Specifies the key used to switch from Emacs to Vi and back.  Must
-      be set in `.vip' or prior to loading Viper. This variable can't be
-      changed interactively after Viper is loaded.
- 
- `vip-ESC-key "\e"'
-      Specifies the key used to escape from Insert/Replace states to Vi.
-      Must be set in `.vip' or prior to loading Viper. This variable
-      cannot be changed interactively after Viper is loaded.
- 
- `vip-buffer-search-char ?g'
-      Key used for buffer search. *Note Viper Specials::, for details.
- 
- `vip-surrounding-word-function 'vip-surrounding-word'
-      The value of this variable is a function name that is used to
-      determine what constitutes a word clicked upon by the mouse. This
-      is used by mouse search and insert.
- 
- `vip-search-face 'vip-search-face'
-      Variable that controls how search patterns are highlighted when
-      they are found.
- 
- `vip-vi-state-hooks nil'
-      List of parameterless functions to be run just after entering the
-      Vi command state.
- 
- `vip-insert-state-hooks nil'
-      Same for Insert state. This hook is also run after entering
-      Replace state.
- 
- `vip-replace-state-hooks  nil'
-      List of (parameterless) functions called just after entering
-      Replace state (and after all `vip-insert-state-hooks').
- 
- `vip-emacs-state-hooks nil'
-      List of (parameterless) functions called just after switching from
-      Vi state to Emacs state.
- 
- `vip-load-hooks nil'
-      List of (parameterless) functions called just after loading Viper.
-      This is the last chance to do customization before Viper is up and
-      running.
- 
- You can reset some of these constants in Viper with the Ex command
- `:set' (when so indicated in the table).  Or you can include a line
- like this in your `.vip' file:
-      (setq vip-case-fold-search t)
- 
- 
- File: viper,  Node: Keybindings,  Next: Packages that Change Keymaps,  Prev: Rudimentary Changes,  Up: Customization
- 
- Keybindings
- ===========
- 
-    Viper lets you define hot keys, i.e., you can associate keyboard keys
- such as F1, Help, PgDn, etc., with Emacs Lisp functions (that may
- already exist or that you will write). Each key has a "preferred form"
- in Emacs. For instance, the Up key's preferred form is [up], the Help
- key's preferred form is [help], and the Undo key has the preferred form
- [f14].  You can find out the preferred form of a key by typing `M-x
- describe-key-briefly' and then typing the key you want to know about.
- 
-    Under X Windows, every keyboard key emits its preferred form, so you
- can just type
- 
-      (global-set-key [f11] 'calendar)			; L1, Stop
-      (global-set-key [f14] 'undo)				; L4, Undo
- 
- to bind L1 so it will invoke the Emacs Calendar and to bind L4 so it
- will undo changes.  However, on a dumb terminal or in an Xterm window,
- even the standard arrow keys may not emit the right signals for Emacs
- to understand. To let Emacs know about those keys, you will have to
- find out which key sequences they emit by typing `C-q' and then the key
- (you should switch to Emacs state first). Then you can bind those
- sequences to their preferred forms using `function-key-map' as follows:
- 
-      (cond ((string= (getenv "TERM") "xterm")
-             (define-key function-key-map "\e[192z" [f11])	; L1
-             (define-key function-key-map "\e[195z" [f14])	; L4, Undo
- 
-    The above illustrates how to do this for Xterm. On VT100, you would
- have to replace "xterm" with "vt100" and also change the key sequences
- (the same key may emit different sequences on different types of
- terminals).
- 
-    The above keys are global, so they are overwritten by the local maps
- defined by the major modes and by Viper itself. Therefore, if you wish
- to change a binding set by a major mode or by Viper, read this.
- 
-    Viper users who wish to specify their own key bindings should be
- concerned only with the following three keymaps:
- `vip-vi-global-user-map' for Vi state commands,
- `vip-insert-global-user-map' for Insert state commands, and
- `vip-emacs-global-user-map' for Emacs state commands (note: customized
- bindings for Emacs state made to `vip-emacs-global-user-map' are *not*
- inherited by Insert state).
- 
-    For more information on Viper keymaps, see the header of the file
- `viper.el'.  If you wish to change a Viper binding, you can use the
- `define-key' command, to modify `vip-vi-global-user-map',
- `vip-insert-global-user-map', and `vip-emacs-global-user-map', as
- explained below. Each of these key maps affects the corresponding Viper
- state.  The keymap `vip-vi-global-user-map' also affects Viper's
- Replace state.
- 
- If you want to bind a key, say `C-v', to the function that scrolls page
- down and to make `0' display information on the current buffer, putting
- this in `.vip' will do the trick in Vi state:
-      (define-key vip-vi-global-user-map "\C-v" 'scroll-down)
- 
- To set a key globally,
-      (define-key vip-emacs-global-user-map "\C-c m" 'smail)
-      (define-key vip-vi-global-user-map "0" 'vip-info-on-file)
- 
- Note, however, that this binding may be overwritten by other keymaps,
- since the global keymap has the lowest priority.  To make sure that
- nothing will override a binding in Emacs state, you can write this:
-      (define-key vip-emacs-global-user-map "\C-c m" 'smail)
- 
- To customize the binding for `C-h' in Insert state:
-      (define-key vip-insert-global-user-map "\C-h" 'my-del-backwards-function)
- 
- Each Emacs command key calls some lisp function. If you have enabled the
- Help, (*Note Rudimentary Changes::) `C-h k' will show you the function
- for each specific key; `C-h b' will show all bindings, and `C-h m' will
- provide information on the major mode in effect. If Help is not
- enabled, you can still get help in Vi state by prefixing the above
- commands with `\', e.g., `\ C-h k' (or you can use the Help menu in the
- menu bar, if Emacs runs under X Windows).
- 
-    Viper users can also change bindings on a per major mode basis.  As
- with global bindings, this can be done separately for each of the three
- main Viper states.  To this end, Viper provides the function
- `vip-modify-major-mode'.
- 
-    To modify keys in Emacs state for `my-favorite-major-mode', the user
- needs to create a sparse keymap, say, `my-fancy-map', bind whatever
- keys necessary in that keymap, and put
- 
-      (vip-modify-major-mode 'dired-mode 'emacs-state my-fancy-map)
- 
- in `~/.vip'. To do the same in Vi and Insert states, one should use
- `vi-state' and `insert-state'. Changes in Insert state are also in
- effect in Replace state.  For instance, suppose that the user wants to
- use `dd' in Vi state under Dired mode to delete files, `u' to unmark
- files, etc. The following code in `~/.vip' will then do the job:
- 
-      (setq my-dired-modifier-map (make-sparse-keymap))
-      (define-key my-dired-modifier-map "dd" 'dired-flag-file-deletion)
-      (define-key my-dired-modifier-map "u" 'dired-unmark)
-      (vip-modify-major-mode 'dired-mode 'vi-state my-dired-modifier-map)
- 
-    A Vi purist may want to modify Emacs state under Dired mode so that
- `k', `l', etc., will move around in directory buffers, as in Vi.
- Although this is not recommended, as these keys are bound to useful
- Dired functions, the trick can be accomplished via the following code:
- 
-      (setq my-dired-vi-purist-map (make-sparse-keymap))
-      (define-key my-dired-vi-purist-map "k" 'vip-previous-line)
-      (define-key my-dired-vi-purist-map "l" 'vip-forward-char)
-      (vip-modify-major-mode 'dired-mode 'emacs-state my-dired-vi-purist-map)
- 
-    Similar effect can be achieved by defining Vi keyboard macros using
- the Ex commands `:map' and `:map!'. The difference is that multi-key Vi
- macros do not override the keys they are bound to, unless these keys are
- typed in quick succession. So, with macros, one can use the normal keys
- alongside with the macros. If per-mode modifications are needed, the
- user can try both ways and see which one is more convenient.  *Note Vi
- Macros::, for details.
- 
-    Note: in major modes that come up in *Emacs state* by default, the
- aforesaid modifications may not take place immediately (but only after
- the buffer switches to some other Viper state and then back to Emacs
- state).  To avoid this, one should add `vip-change-state-to-emacs' to an
- appropriate hook of that major mode. (Check the function
- `vip-set-hooks' in `viper.el' for examples.)  However, if you have set
- `vip-always' to `t', chances are that you won't need to perform the
- above procedure, because Viper will take care of most useful defaults.
- 
-    Finally, Viper has a facility that lets the user define per-buffer
- bindings, i.e., bindings that are in effect in some specific buffers
- only. Unlike per-mode bindings described above, per-buffer bindings can
- be defined based on considerations other than the major mode.  This is
- done via the function `vip-add-local-keys', which lets one specify
- bindings that should be in effect in the current buffer only and for a
- specific Viper state. For instance,
-      (vip-add-local-keys 'vi-state '(("ZZ" . TeX-command-master)
-                                      ("ZQ" . vip-save-kill-buffer)))
- 
- redefines `ZZ' to invoke `TeX-command-master' in `vi-state' and `ZQ' to
- save-then-kill the current buffer. These bindings take effect only in
- the buffer where this command is executed. The typical use of this
- function is to execute the above expression from within a function that
- is included in a hook to some major mode. For instance, the above
- expression could be called from a function, `my-tex-init', which may be
- added to `tex-mode-hook' as follows:
-      (add-hook 'tex-mode-hook 'my-tex-init)
- 
- When TeX mode starts, the hook is executed and the above Lisp
- expression is evaluated. Then, the bindings for `ZZ' and `ZQ' are
- changed in Vi command mode for all buffers in TeX mode.
- 
-    Another useful application is to bind `ZZ' to `send-mail' in the
- Mail mode buffers (the specifics of this depend on which mail package
- you are using, `rmail', `mh-e', `vm', etc.  For instance, here is how
- to do this for `mh-e', the Emacs interface to MH:
-      (defun mh-add-vi-keys ()
-        "Set up ZZ for MH-e and XMH."
-        (vip-add-local-keys 'vi-state '(("ZZ" . mh-send-letter))))
-      (add-hook 'mh-letter-mode-hook 'mh-add-vi-keys)
- 
-    You can also use `vip-add-local-keys' to set per buffer bindings in
- Insert state and Emacs state by passing as a parameter the symbols
- `'insert-state' and `'emacs-state', respectively.  As with global
- bindings, customized local bindings done to Emacs state are not
- inherited by Insert state.
- 
-    So much about Viper-specific bindings.  *Note Customization:
- (emacs)Customization, and the Emacs quick reference card for the
- general info on key bindings in Emacs.
- 
- 
- File: viper,  Node: Packages that Change Keymaps,  Next: Viper Specials,  Prev: Keybindings,  Up: Customization
- 
- Packages that Change Keymaps
- ----------------------------
- 
-    Viper is designed to coexist with all major and minor modes of
- Emacs. This means that bindings set by those modes are generally
- available with Viper (unless you explicitly prohibit them by setting
- `vip-want-emacs-keys-in-vi' and `vip-want-emacs-keys-in-insert' to
- `nil').  If `vip-always' is set to `t', Viper will try to bring each
- buffer in the a Viper state that is most appropriate for that buffer.
- Usually, this would be the Vi state, but sometimes it could be the
- Insert state or the Emacs state.
- 
-    Some major mode bindings will necessarily be overwritten by Viper.
- Indeed, in Vi state, most of the 1-character keys are used for Vi-style
- editing.  This usually causes no problems because most packages
- designed for editing files typically do not bind such keys. Instead,
- they use key sequences that start with `C-x' and `C-c'. This is why it
- was so important for us to free up `C-x' and `C-c'.  It is common for
- language-specific major modes to bind `TAB' and `LFD' (the line feed)
- keys to various formatting functions. This is extremely useful, but may
- require some getting used to for a Vi user. If you decide that this
- feature is not for you, you can re-bind these keys as explained earlier
- (*Note Customization::).
- 
-    Binding for `TAB' is one of the most unusual aspects of Viper for
- many novice users.  In Emacs, `TAB' is used to format text and
- programs, and is extremely useful. For instance, hitting `TAB' causes
- the current line to be re-indented in accordance with the context.  In
- programming, this is very important, since improper automatic
- indentation would immediately alert the programmer to a possible error.
- For instance, if a `)' or a `"' is missing somewhere above the current
- line, `TAB' is likely to mis-indent the line.
- 
-    For this reason, Viper doesn't change the standard Emacs binding of
- `TAB', thereby sacrificing Vi compatibility (except for users at level
- 1). Instead, in Viper, the key `S-tab' (shift+ tab) is chosen to
- emulate Vi's `TAB'.
- 
-    We should note that on some non-windowing terminals, Shift doesn't
- modify the `TAB' key, so `S-tab' behaves as if it were `TAB'. In such a
- case, you will have to bind `vip-insert-tab' to some other convenient
- key.
- 
-    Some packages, notably Dired, Gnus, Info, etc., attach special
- meaning to common keys like `SPC', `x', `d', `v', and others. This
- means that Vi command state is inappropriate for working with these
- packages. Fortunately, these modes operate on read-only buffers and are
- designed not for editing files, but for special-purpose browsing,
- reading news, mail, etc., and Vi commands are meaningless in these
- situations. For this reason, Viper doesn't force Vi state on such major
- modes.  Rather, it brings them in Emacs state. You can switch to Vi
- state by typing `C-z' if, for instance, you want to do Vi-style search
- in a buffer (although, usually, incremental search, which is bound to
- `C-s', is sufficient in these situations). But you should then switch
- back to Emacs state if you plan to continue using these major modes
- productively. You can also switch to Vi temporarily, to execute one
- 1-character command. This is done by typing `M-C-z' (or `ESC C-z').
- This facility cannot execute several complex Vi commands, such as `dw',
- `de', etc.
- 
-    It is also possible to harness some major modes, even though they
- may bind common keys to specialized commands. Harnessing can make sense
- for modes that bind only a small number of common keys.  For instance,
- if `vip-always' is set to `t' in your `~/.vip' file, Viper will harness
- the Shell mode by changing the bindings for `C-m' and `C-d' using
- `vip-add-local-keys' described in section on customization (*Note
- Customization::). In general, there is no single recipe for harnessing
- modes. It can be as simple as adding the function `viper-mode' to a
- hook associated with the mode, or it can be more complex, as in the
- case of Shell mode and Emerge. Take a look at `vip-set-hooks' function
- for some examples.
- 
-    Conversely, it may be the case that most of the major modes harnessed
- by `vip-set-hooks' function fit your working style, except one or two
- cases. In this case, you may still be able to set `vip-always' to `t'
- and then remove a hook that forces Vi command state. For instance, to
- unharness `lisp-interaction-mode', you can put the following line in
- your `.emacs' (not `.vip'!) file after `(require 'viper)':
-      (remove-hook 'lisp-interaction-mode-hook 'viper-mode)
- 
-    In some rare cases, some minor modes may override certain essential
- bindings in Vi command state.  This is not really catastrophic because
- this may happen only in the beginning, when the minor mode kicks in.
- Switching to Insert state and then back to Vi state will correct the
- situation.  Viper knows about several such minor modes and takes care
- of them, so that the above trick won't be necessary.  If you find that
- some minor mode, e.g., `nasty-mode.el' interferes with Viper, putting
- the following in `.vip' should fix the problem:
-      (vip-harness-minor-mode "nasty-mode")
- 
- The argument to `vip-harness-minor-mode' is the name of the file for the
- offending minor mode with the suffixes `.el' and `.elc' removed.
- 
-    It may be tricky, however, to find out which minor mode is at fault.
- The only guidance here is to look into the file that defines the minor
- mode you are suspecting, say `nasty-mode.el', and see if it has a
- variable called `nasty-mode-map'. Then check if there is a statement of
- the form
-      (define-key nasty-mode-map key function)
- 
- that binds the misbehaving keys. If so, use the above line to harness
- `nasty-mode'. If your suspicion is wrong, no harm is done if you
- harness a minor mode that doesn't need to be harnessed.
- 
--- 0 ----
Index: emacs/info/viper-3
diff -c emacs/info/viper-3:1.1.1.1 emacs/info/viper-3:removed
*** emacs/info/viper-3:1.1.1.1	Mon Jul 22 01:53:09 1996
--- emacs/info/viper-3	Fri Aug  2 20:27:35 1996
***************
*** 1,1291 ****
- This is Info file ../info/viper, produced by Makeinfo-1.55 from the
- input file viper.texi.
- 
-    %
- 
- Distribution
- ************
- 
- Copyright (C) 1991 Aamod Sane
- Copyright (C) 1994 Michael Kifer
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- File: viper,  Node: Viper Specials,  Next: Vi Macros,  Prev: Packages that Change Keymaps,  Up: Customization
- 
- Viper Specials
- ==============
- 
-    Viper extends Vi with a number of useful features. This includes
- various search functions, histories of search strings, Ex commands,
- insertions, and Vi's destructive commands. In addition, Viper supports
- file name completion and history, completion of Ex commands and
- variables, and many other features. Some of these features are
- explained in detail elsewhere in this document. Other features are
- explained here.
- 
- `(vip-buffer-search-enable)'
- `vip-buffer-search-char ?g'
-      Enable buffer search.  The key binding can also be changed by
-      redefining `vip-buffer-search-char'.
- 
- `vip-toggle-search-style'
-      This function, bound to `C-c /', lets one toggle case-sensitive and
-      case-insensitive search, and also switch between plain vanilla
-      search and search via regular expressions. Without the prefix
-      argument, the user is asked which mode to toggle. With prefix
-      argument 1, this toggles case-sensitivity. With prefix argument 2,
-      regular expression/vanilla search will be toggled.
- 
-      However, we found that the most convenient way to toggle these
-      options is to bind a Vi macro to bind `//' to toggles case
-      sensitivity and to `///' to toggles vanilla search. Thus, quickly
-      hitting `/' twice will switch Viper from case sensitive search to
-      case-insensitive. Repeating this once again will restore the
-      original state. Likewise, quickly hitting `/' three times will
-      switch you from vanila-style search to search via regular
-      expressions.  If you hit something other than `/' after the first
-      `/' or if the second `/' doesn't follow quickly enough, then Viper
-      will issue the usual prompt `/' and will wait for input, as usual
-      in Vi.  If you don't like this behavior, you can "unrecord" these
-      macros in your `~/.vip' file.  *Note Vi Macros::, for more
-      information on Vi macros.
- 
- `vip-heading-start'
- `vip-heading-end'
-      Regular Expressions for `[[' and `]]'. Note that Emacs defines
-      Regexps for paragraphs and sentences. *Note Paragraphs and
-      Sentences: (emacs)Paragraphs, for details.
- 
- `M-x vip-set-expert-level'
-      Change your user level interactively.
- 
- `vip-smart-suffix-list  '("" "tex" "c" "cc" "el" "p")'
-      Viper supports Emacs-style file completion when it prompts the
-      user for a file name. However, in many cases, the same directory
-      may contain files with identical prefix but different suffixes,
-      e.g., prog.c, prog.o, paper.tex, paper.dvi. In such cases,
-      completion will stop at the `.'.  If the above variable is a list
-      of strings representing suffixes, Viper will try these suffixes in
-      the order listed and will check if the corresponding file exists.
- 
-      For instance, if completion stopped at `paper.' and the user typed
-      RET, then Viper will check if the files `paper.', `paper.tex',
-      `paper.c', etc., exist.  It will take the first such file. If no
-      file exists, Viper will give a chance to complete the file name by
-      typing the appropriate suffix. If `paper.' was the intended file
-      name, hitting return will accept it.
- 
-      To turn this feature off, set the above variable to `nil'.
- 
- `vip-insertion-ring-size  14'
-      Viper remembers what was previously inserted in Insert and Replace
-      states.  Several such recent insertions are kept in a special ring
-      of strings of size `vip-insertion-ring-size'.  If you enter Insert
-      or Replace state you can reinsert strings from this ring by typing
-      `C-c M-p' or `C-c M-n'. The former will search the ring in the
-      direction of older insertions, and the latter will search in the
-      direction of newer insertions. Hitting `C-c M-p' or `C-c M-n' in
-      succession will undo the previous insertion from the ring and
-      insert the next item on the ring. If a larger ring size is needed,
-      change the value of the above variable in the `~/.vip' file.
- 
-      Since typing these sequences of keys may be tedious, it is
-      suggested that the user should bind a function key, such as `f31',
-      as follows:
-           (define-key vip-insert-global-user-map [f31]
-                       'vip-insert-prev-from-insertion-ring)
-      This binds `f31' (which is usually `R11' on a Sun workstation) to
-      the function that inserts the previous string in the insertion
-      history.  To rotate the history in the opposite direction, you can
-      either bind an unused key to `vip-insert-next-from-insertion-ring'
-      or hit any digit (1 to 9) then `f31'.
- 
-      One should not bind the above functions to `M-p' or `M-n', since
-      this will interfere with the Minibuffer histories and, possibly,
-      other major modes.
- 
- `vip-command-ring-size  14'
-      Viper keeps track of the recent history of destructive commands,
-      such as `dw', `i', etc.  In Vi state, the most recent command can
-      be re-executed by hitting ``.'', as in Vi.  However, repeated
-      typing `C-c M-p' will cause Viper to show the previous destructive
-      commands in the minibuffer. Subsequent hitting ``.'' will execute
-      the command that was displayed last.  The key `C-c M-n' will cycle
-      through the command history in the opposite direction.  Since
-      typing `C-c M-p' may be tedious, it is more convenient to bind an
-      appropriate function to an unused function key on the keyboard and
-      use that key. For instance, the following
-           (define-key vip-vi-global-user-map [f31]
-                       'vip-prev-destructive-command)
-      binds the key `f31' (which is usually `R11' on a Sun workstation)
-      to the function that searches the command history in the direction
-      of older commands. To search in the opposite direction, you can
-      either bind an unused key to `vip-next-destructive-command' or hit
-      any digit (1 to 9) then `f31'.
- 
-      One should not bind the above functions to `M-p' or `M-n', since
-      this will interfere with the Minibuffer histories and, possibly,
-      other major modes.
- 
- `vip-minibuffer-vi-face  'vip-minibuffer-vi-face'
- `vip-minibuffer-insert-face  'vip-minibuffer-insert-face'
- `vip-minibuffer-emacs-face  'vip-minibuffer-emacs-face'
-      These faces control the appearance of the minibuffer text in the
-      corresponding Viper states. For heavy-duty customization, consult
-      the Lisp Reference to Emacs. You can also take a look how these
-      faces are defined in `viper.el'.
- 
-      However, on a color workstation, the following method usually
-      suffices:
-           (set-face-foreground vip-minibuffer-vi-face "blue")
-           (set-face-background vip-minibuffer-emacs-face "orchid")
-      This will make a blue foreground in the Minibuffer when it is in Vi
-      state; its background will turn to orchid when it switches to
-      Emacs state.
- 
-      Note that only the text you type in is affected by the above faces.
-      Prompts and Minibuffer messages are not affected.
- 
-      Purists who do not like adornments in the minibuffer can always
-      zap them by putting
-           (copy-face 'default 'vip-minibuffer-vi-face)
-           (copy-face 'default 'vip-minibuffer-insert-face)
-           (copy-face 'default 'vip-minibuffer-emacs-face)
-      in the `~/.vip' file. However, in that case, the user will not
-      have any indication of the current Viper state in the minibuffer.
-      (This is important if the user accidentally switches to another
-      Viper state by typing `ESC' or `C-z'.
- 
-    Viper provides some support for multi-file documents and programs.
- If a document consists of several files we can designate one of them as
- a master and put the following at the end of that file:
-      ;;; Local Variables:
-      ;;; eval: (vip-setup-master-buffer "file1" "file2" "file3" "file5" "file5")
-      ;;; End:
- 
- where `file1' to `file5' are names of files related to the master file.
- Next time, when the master file is visited, the command
- `vip-setup-master-buffer' will be evaluated and the above files will be
- associated with the master file. Then, the new Ex command
- `:RelatedFile' (abbr. `:R') will display files 1 to 5 one after
- another, so you can edit them. If a file is not in any Emacs buffer, it
- will be visited.  The command `PreviousRelatedFile' (abbr., `:P') goes
- through the file list in the opposite direction.
- 
-    These commands are akin to `:n' and `:N', but they allow the user to
- focus on relevant files only.
- 
-    Note that only the master file needs to have the aforementioned
- block of commands. Also, ";;;" above can be replaced by some other
- markers. Semicolon is good for Lisp programs, since it is considered a
- comment designator there. For LaTeX, this could be "%%%", and for C the
- above block should be commented out.
- 
-    Even though these commands are sometimes useful, they are no
- substitute for the powerful *tag table* facility of Emacs. Viper's
- `:tag' command in a primitive interface to Emacs tags. *Note Tags:
- (emacs)Tags, for more information on tags.
- 
-    The following two commands are normally bound to a mouse click and
- are part of Viper. They work only if Emacs runs as an application under
- X Windows (or under some other window system for which a port of GNU
- Emacs 19 is available). Clicking the mouse when Emacs is invoked in an
- Xterm window (using `emacs -nw') will do no good.
- 
- `S-mouse-1 (Emacs)'
- `meta button1up (XEmacs)'
-      Holding Shift and clicking mouse button 1 (or holding Meta key and
-      clicking, if in XEmacs) will initiate search for a region under
-      the mouse pointer (defined below).  This command can take a prefix
-      argument, which indicates the occurrence of the pattern to search
-      for.
- 
-      Note: Viper binds this mouse action only if it is not already
-      bound to something else. If you want to use this feature and
-      `S-mouse-1' is already used for something else, you can rebind
-      mouse-search as follows:
-           (global-set-key [M-mouse-1] 'vip-mouse-click-search-word)
-           (global-set-key [M-down-mouse-1] 'vip-mouse-catch-frame-switch)
-      This would bind mouse search to the action invoked by pressing the
-      Meta key and clicking mouse button 1. Note: if
-      `vip-mouse-click-search-word' is bound to an action, then
-      `vip-mouse-catch-frame-switch' must be bound to a down-action, as
-      shown in the above example.
- 
-      In XEmacs, you can change bindings as follows:
-           (global-set-key [(meta shift button1up)]
-                           'vip-mouse-click-search-word)
-           (global-set-key [(meta shift button1)]
-                           'vip-mouse-catch-frame-switch)
-      if, say, you prefer to hold both meta and shift while clicking.
-      The reason why Viper uses different bindings for Emacs and XEmacs
-      is because these two incarnations of Emacs have different default
-      bindings for mouse actions.
- 
-      Like in Emacs, there are special rules for binding these
-      functions: the first must be bound to a button-up event while the
-      second must be bound to a button-event (which is XEmacs'
-      equivalent of a down-mouse event).  Also, in Emacs, the
-      double-click action for the same button (`double-S-mouse-1', if
-      the above default binding is used) should not be bound (or it
-      should be bound to the same function,
-      `vip-mouse-click-search-word').
- 
-      The region that is chosen as a pattern to search for is determined
-      as follows. If search is invoked via a single click, Viper chooses
-      the region that lies between the beginning of the "word" under the
-      pointer ("word" is understood in Vi sense) and the end of that
-      word.  The only difference with Vi's words is that in Lisp major
-      modes `-' is considered an alphanumeric symbol. This is done for
-      the convenience of working with Lisp symbols, which often have an
-      `-' in them.  Also, if you click on a non-alphanumeric character
-      that is not a word separator (in Vi) then this character will also
-      be considered alphanumeric, provided that it is adjacent (from
-      either side) to an alphanumeric character.  This useful feature
-      gives added control over the patterns selected by the mouse click.
- 
-      On a double-click, the region is determined by the beginning of
-      the current Vi's "Word" (i.e., the largest non-separator chunk of
-      text) and the End of that "Word" (as determined by the `E'
-      command).
- 
- `S-mouse-2 (Emacs)'
- `meta button2up (XEmacs)'
-      Holding Shift and clicking button 2 (or holding Meta key and
-      clicking, if in XEmacs) of the mouse will insert the region
-      surrounding the mouse pointer.  The rules defining this region are
-      the same as for mouse-search.  This command takes an optional
-      prefix argument, which indicates how many such regions to snarf
-      from the buffer and insert.
- 
-      Note: Viper binds this mouse action only if it not already bound to
-      something else. If you want to use this feature and `S-mouse-2' is
-      already used for something else, you can rebind mouse-insert as
-      follows:
-           (global-set-key [M-mouse-2] 'vip-mouse-click-insert-word)
-           (global-set-key [M-down-mouse-2] 'vip-mouse-catch-frame-switch)
-      In XEmacs, you can change the bindings as follows:
-           (global-set-key [(meta shift button2up)]
-                           'vip-mouse-click-insert-word)
-           (global-set-key [(meta shift button2)]
-                           'vip-mouse-catch-frame-switch)
- 
- `vip-multiclick-timeout'
-      This variable controls the rate at which double-clicking must
-      occur for the purpose of mouse search and mouse insert. By
-      default, this is set to `double-click-time' in Emacs and to 500
-      milliseconds in XEmacs.
- 
-    Note: The above functions search and insert in the selected window of
- the latest active frame. This means that you can click in another
- window or another frame and have search or insertion done in the frame
- and window you just left.  This lets one use these functions in a
- multi-frame configuration.  However, this may require some getting used
- to. For instance, if you are typing in a frame, A, and then move the
- mouse to frame B and click to invoke mouse search, search (or
- insertion) will be performed in frame A. To perform search/insertion in
- frame B, you will first have to shift focus there, which doesn't happen
- until you type a character or perform some other action in frame
- B--mouse search doesn't shift focus (in XEmacs, to shift focus to frame
- B, you will have to select this frame with a mouse, by clicking.
- 
-    If you decide that you don't like the above feature and always want
- search/insertion be performed in the frame where the click occurs, don't
- bind (and unbind, if necessary) `vip-mouse-catch-frame-switch' from the
- mouse event it is bound to.
- 
-    Mouse search is integrated with Vi-style search, so you can repeat
- it with `n' and `N'. It should be also noted that, while
- case-sensitivity of search in Viper is controlled by the variable
- `vip-case-fold-search', the case of mouse search is controlled by the
- Emacs variable `case-fold-search', which may be set differently from
- `vip-case-fold-search'. Therefore, case-sensitivity of mouse search may
- be different from that of the usual Vi-style search.
- 
-    Finally, if the way Viper determines the word to be searched for or
- to be inserted is not what you want, there is a variable,
- `vip-surrounding-word-function', which can be changed to indicate
- another function for snarfing words out of the buffer. The catch is that
- you will then have to write such a function and make it known to your
- Emacs. The function `vip-surrounding-word' in `viper.el' can be used as
- a guiding example.
- 
- 
- File: viper,  Node: Vi Macros,  Prev: Viper Specials,  Up: Customization
- 
- Vi Macros
- =========
- 
-    Viper supports much enhanced Vi-style macros and also facilitates
- the use of Emacs-style macros.  To define a temporary macro, it is
- generally more convenient to use Emacs keyboard macro facility. Emacs
- keyboard macros are usually defined anonymously, and the latest macro
- can be executed by typing `C-x e' (or `*', if Viper is in Vi state). If
- you need to use several temporary macros, Viper lets you save them to a
- register (a lowercase letter); such macros can then be executed by
- typing `@a' in Vi state (if a macro was previously saved in register
- `a').  *Note Macros and Registers::, for details.
- 
-    If, however, you need to use a macro regularly, it must be given a
- permanent name and saved. Emacs manual explains how to do this, but
- invocation of named Emacs macros is quite different from Vi's. First,
- invocation of permanent Emacs macros takes time because of the extra
- keys.  Second, binding such macros to function keys, for fast access,
- hogs valuable real estate on the keyboard.
- 
-    Vi-style macros are better in that respect, since Vi lets the user
- overload the meaning of key sequences: keys typed in fast succession
- are treated specially, if this key sequence is bound to a macro.
- 
-    Viper provides keyboard macros through the usual Ex commands, `:map'
- and `:map!'. Vi-style macros are much more powerful in Viper than they
- are in the original Vi and in other emulators. This is because Viper
- implements an enhanced vi-style interface to the powerful Emacs
- keyboard macro facility.
- 
-    First, any Emacs command can be executed while defining a macro, not
- just the Vi commands. In particular, the user can invoke Emacs commands
- via `M-x command-name' or by pressing various function keys on the
- keyboard. One can even use the mouse, although this is usually not
- useful and is not recommended (and macros defined with the use of the
- mouse cannot be saved in command history and in the startup file, for
- future use).
- 
-    Macros defined by mixing Vi and Emacs commands are represented as
- vectors. So, don't be confused when you see one (usually through the
- history of Ex commands). For instance, if `gg' is defined by typing
- `l', the up-arrow key and `M-x next-line', its definition will look as
- follows in Emacs (in XEmacs, it looks slightly different, see below):
- 
-      [l up (meta x) n e x t - l i n e return]
- 
-    Second, Viper macros are defined in a WYSIWYG style. This means that
- commands are executed as you type them, so you can see precisely what
- is being defined.  Third, macros can be bound to arbitrary sequences of
- keys, not just to printable keys. For instance, one can define a macro
- that will be invoked by hitting `f1' then `f2' function keys. (The keys
- `delete' and `backspace' are excluded; also, a macro invocation
- sequence can't start with ESC.) Fourth, in Viper, one can define macros
- that are specific to a given buffer, a given major mode, or macros that
- are defined for all buffers.  In fact, the same macro name can have
- several different definitions: one global, several definitions for
- various major modes, and definitions for various specific buffers.
- Buffer-specific definitions override mode-specific definitions, which,
- in turn, override global definitions.
- 
-    As if all that is not enough, Viper (through its interface to Emacs
- macros) lets the user define keyboard macros that ask for confirmation
- or even prompt the user for input and then continue. To do this, one
- should type `C-x q' (for confirmation) or `C-u C-x q' (for prompt).
- For details, *note Customization: (emacs)Kbd Macro Query.
- 
-    When the user finishes defining a macro (which is done by typing
- `C-x)' -- a departure from Vi), you will be asked whether you want this
- macro to be global, mode-specific, or buffer-specific. You will also be
- given a chance to save the macro in your `~/.vip' file.  This is the
- easiest way to save a macro and make it permanently available. If you
- work your startup files with bare hands, here is how Viper saves the
- above macro so that it will be available in Viper's Insert state (and
- Replace state) in buffer `my-buf' only:
- 
-       (vip-record-kbd-macro "gg" 'insert-state
-              [l up (meta x) n e x t - l i n e return]
-              "my-buf")
- 
- To do the same for Vi state and all buffers with the major mode
- `cc-mode', use:
- 
-       (vip-record-kbd-macro "gg" 'vi-state
-              [l up (meta x) n e x t - l i n e return]
-              'cc-mode)
- 
- Both macro names and macro definitions are vectors of symbols that
- denote keys on the keyboard. Some keys, like `\', ` ', or digit-keys
- must be escaped with a backslash. Modified keys are represented as
- lists. For instance, holding Meta and Control and pressing `f4' is
- represented as `(control meta f4)'.  If all members of a vectors are
- printable characters (or sequences, such as `\e', `\t', for ESC and
- TAB), then they can also be represented as strings:
- 
-       (vip-record-kbd-macro "aa" 'vi-state  "aaa\e"  "my-buffer")
- 
- Thus, typing `aa' fast in Vi state will switch Viper to Insert state
- (due to the first `a'), insert `aa', and then it will switch back to Vi
- state. All this will take effect only in the buffer named `my-buffer'.
- 
-    Note that the last argument to `vip-record-kbd-macro' must be either
- a string (a buffer name), a symbol representing a major mode, or `t';
- the latter says that the macro is to be defined for all buffers (which
- is how macros are defined in original Vi).
- 
-    For convenience, Viper also lets you define Vi-style macros in its
- Emacs state. There is no Ex command, like `:map' and `:map!' for doing
- this, but the user can include such a macro in the `~/.vip' file. The
- only thing is that the `vip-record-kbd-macro' command should specify
- `'emacs-state' instead of `'vi-state' or `'insert-state'.
- 
-    If an error occurs during macro definition, Emacs aborts the
- process, and it must be repeated. This is analogous to Vi, except that
- in Vi the user doesn't know there is an error until the macro is
- actually run. All that means that in order for a definition to be
- successful, the user must do some simple planning of the process in
- advance, to avoid errors.  For instance, if you want to map `gg' to
- `llll' in Vi state, you must make sure that there is enough room on the
- current line. Since `l' moves the cursor forward, it may signal an
- error on reaching the end of line, which will abort the definition.
- 
-    These precautions are necessary only when defining macros; they will
- help avoid the need to redo the job. When macros are actually run, an
- error during the execution will simply terminate the current execution
- (but the macro will remain mapped).
- 
-    A macro name can be a string of characters or a vector of keys.  The
- latter makes it possible to define macros bound to, say, double-hitting
- on a function key, such as `up' or `f12'.  This is very useful if you
- run out of function keys on your keyboard; it makes Viper macro
- facility a *keyboard doubler*, so to speak.
- 
-    Elsewhere (*Note Keybindings::, for details), we review the standard
- Emacs mechanism for binding function keys to commands.  For instance,
- 
-      (global-set-key [f12] 'repeat-complex-command)
- 
- binds the key f12 to the Emacs function that repeats the last minibuffer
- command. Under Viper, however, you may still use this key for additional
- purposes, if you bind, say, a double-hitting action for that key to some
- other function. Emacs doesn't allow the user to do that, but Viper does
- this through its keyboard macro facility. To do this, type `:map '
- first. When you are asked to enter a macro name, hit f12 twice,
- followed by RET or SPC.
- 
-    Emacs will now start the mapping process by actually executing Vi
- and Emacs commands, so that you could see what will happen each time the
- macro is executed. Suppose now we wanted to bind the key sequence `f12
- f12' to the command `eval-last-sexp'. To accomplish this, we can type
- `M-x eval-last-sexp' followed by `C-x )'.  If you answer positively to
- Viper's offer to save this macro in `~/.vip' for future uses, the
- following will be inserted in that file:
- 
-      (vip-record-kbd-macro [f16 f16] 'vi-state
-               [(meta x) e v a l - l a s t - s e x p]
-               'lisp-interaction-mode)
- 
-    To illustrate the above point, Viper provides two canned macros,
- which, by default, are bound to `[f1 \1]' and `[f1 \2]' (invoked by
- typing `f1' then `1' and `2', respectively).  These macros are useful
- shortcuts to Viper's command ring history.  The first macro will
- execute the second-last destructive command (the last one is executed
- by `.', as usual). The second macro executes the third-last command.
- 
-    If you need to go deeper into the command history, you will have to
- use other commands, as described earlier in this section; or you can
- bind, say, `f1 \3' like this:
- 
-      (vip-record-kbd-macro [f1 \3] 'vi-state
-                            [(meta x) r e p e a t - f r o m - h i s t o r y]
-                            t)
- 
-    Note that even though the macro uses the function key `f1', the key
- is actually free and can still be bound to some Emacs function via
- `define-key' or `global-set-key'.
- 
-    Viper allows the user to define macro names that are prefixes of
- other macros.  For instance, one can define `[[' and `[[[[' to be
- macros.  If you type the exact sequence of such keys and then pause,
- Viper will execute the right macro. However, if you don't pause and,
- say, type `[[[[text' then the conflict is resolved as follows. If only
- one of the key sequences, `[[' or `[[[[' has a definition applicable to
- the current buffer, then, in fact, there is no conflict and the right
- macro will be chosen. If both have applicable definitions, then the
- first one found will be executed. Usually this is the macro with a
- shorter name. So, in our case, `[[[[text' will cause the macro `[[' to
- be executed twice and then the remaining keys, `t e x t', will be
- processed.
- 
-    When defining macros using `:map' or `:map!', the user enters the
- actually keys to be used to invoke the macro. For instance, you should
- hit the actual key `f6' if it is to be part of a macro name; you do
- *not* write `f 6'. When entering keys, Viper displays them as strings or
- vectors (e.g., "abc" or [f6 f7 a]). The same holds for unmapping.
- Hitting TAB while typing a macro name in the `:unmap' or `:unmap!'
- command will cause name completion. Completions are displayed as
- strings or vectors.  However, as before, you don't actually type """,
- "[", or "]" that appear in the completions. These are meta-symbols that
- indicate whether the corresponding macro name is a vector or a string.
- 
-    One last difference from Vi: Vi-style keyboard macros cannot be
- defined in terms of other Vi-style keyboard macros (but named Emacs
- macros are OK).  More precisely, while defining or executing a macro,
- the special meaning of key sequences (as Vi macros) is ignored.  This
- is because it is all too easy to create an infinite loop in this way.
- Since Viper macros are much more powerful than Vi's it is impossible to
- detect such loops. In practice, this is not really a limitation but,
- rather, a feature.
- 
-    We should also note that Vi macros are disabled in the Minibuffer,
- which helps keep some potential troubles away.
- 
-    The rate at which the user must type keys in order for them to be
- recognized as a timeout macro is controlled by the variable
- `vip-fast-keyseq-timeout', which is set to 200 milliseconds, by default.
- 
-    Viper macros defined in `~/.vip' can be shared between Emacs and
- XEmacs.  However, macros defined via function keys may need to have
- separate definitions for a window display and for dumb terminals (or for
- xterm windows). The reason for this is that hitting function keys
- results in different events on window displays and on terminals.
- 
-    Finally, Viper provides a function that conveniently displays all
- macros currently defined. To see all macros along with their
- definitions, type `M-x vip-describe-kbd-macros'.
- 
- 
- File: viper,  Node: Commands,  Prev: Customization,  Up: Top
- 
-    Top
- 
- Commands
- ********
- 
-    This section is a semi-automatically bowdlerized version of the Vi
- reference created by
- `maart@cs.vu.nl' and others. It can be found on the Vi archives. Very
- little has been changed for Viper.
- 
- * Menu:
- 
- * Groundwork::			Textual Conventions and Viper basics
- * Text Handling::		Moving, Editing, Undoing.
- * Display::			Scrolling.
- * File and Buffer Handling::	Editing, Writing and Quitting.
- * Mapping::			Mapping Keys, Keyboard Macros
- * Shell Commands::		Accessing Shell Commands, Processing Text
- * Options::			Ex options, the `:set' commands
- * Emacs Related Commands::	Meta Keys, Windows
- * Mouse-bound Commands::        Search and insertion of text
- 
- 
- File: viper,  Node: Groundwork,  Next: Text Handling,  Prev: Commands,  Up: Commands
- 
- Groundwork
- ==========
- 
-    The VI command set is based on the idea of combining motion commands
- with other commands. The motion command is used as a text region
- specifier for other commands.  We classify motion commands into "point
- commands" and "line commands".
- 
-    The point commands are:
- 
-      `h', `l', `0',  `$', `w', `W', `b', `B', `e', `E', `(', `)', `/',
-      `?', ``', `f', `F', `t', `T', `%', `;', `,', `^'
- 
-    The line commands are:
- 
-      `j', `k', `+', `-', `H', `M', `L', `{', `}', `G', `'',  `[[',
-      `]]', `[]'
- 
- Text Deletion Commands (*Note Deleting Text::), Change commands (*Note
- Changing Text::), even Shell Commands (*Note Shell Commands::) use
- these commands to describe a region of text to operate on.
- 
-    Viper adds two region descriptors, `r' and `R'. These describe the
- Emacs regions (*Note Basics::), but they are not movement commands.
- 
-    The command description uses angle brackets `<>' to indicate
- metasyntactic variables, since the normal conventions of using simple
- text can be confusing with Viper where the commands themselves are
- characters. Watch out where `<' shift commands and `<count>' are
- mentioned together!!!
- 
-    `<move>' refers to the above movement commands, and `<a-z>' refers
- to registers or textmarkers from `a' to `z'. Note that the `<move>'  is
- described by full move commands, that is to say they will take counts,
- and otherwise behave like normal move commands.  `<address>' refers to
- Ex line addresses, which include
- 
- `. <No address>'
-      Current line
- 
- `.+n .-n'
-      Add or subtract for current line
- 
- `number'
-      Actual line number, use `.=' to get the line number
- 
- `'<a-z>'
-      Textmarker
- 
- `$'
-      Last line
- 
- `x,y'
-      Where x and y are one of the above
- 
- `%'
-      For the whole file, same as (1,$).
- 
- `/pat/'
- `?pat?'
-      Next or previous line with pattern pat
- 
-    Note that `%' is used in Ex commands to mean current file. If you
- want a `%' in your command, it must be escaped as `\%'.  Similarly, `#'
- expands to the previous file. The previous file is the first file in
- `:args' listing. This defaults to previous window in the VI sense if
- you have one window only.
- 
- Others like `<args> -- arguments', `<cmd> -- command' etc.  should be
- fairly obvious.
- 
- Common characters referred to include:
- 
- `<sp>'
-      Space
- 
- `<ht>'
-      Tab
- 
- `<lf>'
-      Linefeed
- 
- `<esc>'
-      Escape
- 
- `<cr>'
-      Return, Enter
- 
-    We also use `word' for alphanumeric/non-alphanumeric words, and
- `WORD' for whitespace delimited words. `char' refers to any ASCII
- character, `CHAR' to non-whitespace character.  Brackets `[]' indicate
- optional parameters; `<count>' also optional, usually defaulting to 1.
- Brackets are elided for `<count>' to eschew obfuscation.
- 
-    The usual Emacs convention is used to indicate Control Characters,
- i.e C-h for Control-h. *Do not confuse this to mean the separate
- characters C - h!!!* The `^' is itself, never used to indicate a
- Control character.
- 
- 
- File: viper,  Node: Text Handling,  Next: Display,  Prev: Groundwork,  Up: Commands
- 
- Text Handling
- =============
- 
- * Menu:
- 
- * Move Commands::		Moving, Searching
- * Marking::		        Textmarkers in Viper and the Emacs Mark.
- * Appending Text::		Text insertion, Shifting, Putting
- * Editing in Insert State::	Autoindent, Quoting etc.
- * Deleting Text::		Deleting
- * Changing Text::		Changing, Replacement, Joining
- * Search and Replace::		Searches, Query Replace, Pattern Commands
- * Yanking::			Yanking, Viewing Registers
- * Undoing::			Multiple Undo, Backups
- 
- 
- File: viper,  Node: Move Commands,  Next: Marking,  Up: Text Handling
- 
- Move Commands
- -------------
- 
- `<count>  h  C-h'
-      <count> chars to the left.
- 
- `<count>  j  <lf> C-n'
-      <count> lines downward.
- 
- `<count>  l  <sp>'
-      <count> chars to the right.
- 
- `<count>  k  C-p'
-      <count> lines upward.
- 
- `<count>  $'
-      To the end of line <count> from the cursor.
- 
- `<count>  ^'
-      To the first CHAR <count> - 1 lines lower.
- 
- `<count>  -'
-      To the first CHAR <count> lines higher.
- 
- `<count>  +  <cr>'
-      To the first CHAR <count> lines lower.
- 
- `0'
-      To the first char of the line.
- 
- `<count> |'
-      To column <count>
- 
- `<count>  f<char>'
-      <count> <char>s to the right (find).
- 
- `<count>  t<char>'
-      Till before <count> <char>s to the right.
- 
- `<count>  F<char>'
-      <count> <char>s to the left.
- 
- `<count>  T<char>'
-      Till after <count> <char>s to the left.
- 
- `<count>  ;'
-      Repeat latest `f t F T' <count> times.
- 
- `<count>  ,'
-      Repeat latest `f t F T' <count> times in opposite direction.
- 
- `<count>  w'
-      <count> words forward.
- 
- `<count>  W'
-      <count> WORDS forward.
- 
- `<count>  b'
-      <count> words backward.
- 
- `<count>  B'
-      <count> WORDS backward.
- 
- `<count>  e'
-      To the end of word <count> forward.
- 
- `<count>  E'
-      To the end of WORD <count> forward.
- 
- `<count>  G'
-      Go to line <count> (default end-of-file).
- 
- `<count>  H'
-      To line <count> from top of the screen (home).
- 
- `<count>  L'
-      To line <count> from bottom of the screen (last).
- 
- `M'
-      To the middle line of the screen.
- 
- `<count>  )'
-      <count> sentences forward.
- 
- `<count>  ('
-      <count> sentences backward.
- 
- `<count>  }'
-      <count> paragraphs forward.
- 
- `<count>  {'
-      <count> paragraphs backward.
- 
- `<count>  ]]'
-      To the <count>th heading.
- 
- `<count>  [['
-      To the <count>th previous heading.
- 
- `<count>  []'
-      To the end of <count>th heading.
- 
- `m<a-z>'
-      Mark the cursor position with a letter.
- 
- ``<a-z>'
-      To the mark.
- 
- `'<a-z>'
-      To the first CHAR of the line with the mark.
- 
- `[<a-z>'
-      Show contents of textmarker.
- 
- `]<a-z>'
-      Show contents of register.
- 
- ```'
-      To the cursor position before the latest absolute jump (of which
-      are examples `/' and `G').
- 
- `'''
-      To the first CHAR of the line on which the cursor was placed
-      before the latest absolute jump.
- 
- `<count>  /<string>'
-      To the <count>th occurrence of <string>.
- 
- `<count>  /<cr>'
-      To the <count>th occurrence of <string> from previous `/ or ?'.
- 
- `<count>  ?<string>'
-      To the <count>th previous occurrence of <string>.
- 
- `<count>  ?<cr>'
-      To the <count>th previous occurrence of <string> from previous `?
-      or /'.
- 
- `n'
-      Repeat latest `/' `?' (next).
- 
- `N'
-      Repeat latest search in opposite direction.
- 
- `C-c /'
-      Without a prefix argument, this command toggles
-      case-sensitive/case-insensitive search modes and plain
-      vanilla/regular expression search. With the prefix argument 1,
-      i.e., `1 C-c /', this toggles case-sensitivity; with the prefix
-      argument 2, toggles plain vanilla search and search using regular
-      expressions. *Note Viper Specials::, for alternative ways to invoke
-      this function.
- 
- `%'
-      Find the next bracket and go to its match.
- 
- 
- File: viper,  Node: Marking,  Next: Appending Text,  Prev: Move Commands,  Up: Text Handling
- 
- Marking
- -------
- 
-    Emacs mark is referred to in the region specifiers `r' and `R'.
- *Note Emacs Preliminaries:: and *note Basics::. for explanation. Also
- see *Note Mark: (emacs)Mark, for an explanation of the Emacs mark ring.
- 
- `m<a-z>'
-      Mark the current file and position with the specified letter.
- 
- `m .'
-      Set the Emacs mark (*Note Emacs Preliminaries::) at point.
- 
- `m <'
-      Set the Emacs mark at beginning of buffer.
- 
- `m >'
-      Set the Emacs mark at end of buffer.
- 
- `m ,'
-      Jump to the Emacs mark.
- 
- `:mark <char>'
-      Mark position with text marker named <char>. This is an Ex command.
- 
- `:k <char>'
-      Same as `:mark'.
- 
- ```'
-      Exchange point and mark.
- 
- `'''
-      Exchange point and mark and go to the first CHAR on line.
- 
- `'<a-z>'
-      Go to specified Viper mark.
- 
- `'
-      Go to specified Viper mark and go to the first CHAR on line.
- 
- 
- File: viper,  Node: Appending Text,  Next: Editing in Insert State,  Prev: Marking,  Up: Text Handling
- 
- Appending Text
- --------------
- 
-    *Note Options:: to see how to change tab and shiftwidth size. See
- the GNU Emacs manual, or try `C-ha tabs' (If you have turned Emacs help
- on).  Check out the variable `indent-tabs-mode' to put in just spaces.
- Also see options for word-wrap.
- 
- `<count>  a'
-      <count> times after the cursor.
- 
- `<count>  A'
-      <count> times at the end of line.
- 
- `<count>  i'
-      <count> times before the cursor (insert).
- 
- `<count>  I'
-      <count> times before the first CHAR of the line
- 
- `<count>  o'
-      On a new line below the current (open).  The count is only useful
-      on a slow terminal.
- 
- `<count>  O'
-      On a new line above the current.  The count is only useful on a
-      slow terminal.
- 
- `<count>  ><move>'
-      Shift the lines described by <count><move> one shiftwidth to the
-      right (layout!).
- 
- `<count>  >>'
-      Shift <count> lines one shiftwidth to the right.
- 
- `<count>  ["<a-z1-9>]p'
-      Put the contents of the (default undo) buffer <count> times after
-      the cursor. The register will be automatically downcased.
- 
- `<count>  ["<a-z1-9>]P'
-      Put the contents of the (default undo) buffer <count> times before
-      the cursor. The register will
- 
- `[<a-z>'
-      Show contents of textmarker.
- 
- `]<a-z>'
-      Show contents of register.
- 
- `<count>  .'
-      Repeat previous command <count> times. For destructive commands as
-      well as undo.
- 
- `f1 1 and f1 2'
-      While `.' repeats the last destructive command, these two macros
-      repeat the second-last and the third-last destructive commands.
-      *Note Vi Macros::, for more information on Vi macros.
- 
- `C-c M-p and C-c M-n'
-      In Vi state, these commands help peruse the history of Vi's
-      destructive commands.  Successive typing of `C-c M-p' causes Viper
-      to search the history in the direction of older commands, while
-      hitting `C-c M-n' does so in reverse order. Each command in the
-      history is displayed in the Monibuffer. The displayed command can
-      then be executed by typing ``.''.
- 
-      Since typing the above sequences of keys may be tedious, the
-      functions doing the perusing can be bound to unused keyboard keys
-      in the `~/.vip' file. *Note Viper Specials::, for details.
- 
- 
- File: viper,  Node: Editing in Insert State,  Next: Deleting Text,  Prev: Appending Text,  Up: Text Handling
- 
- Editing in Insert State
- -----------------------
- 
-    Minibuffer can be edited similarly to Insert state, and you can
- switch between Insert/Replace/Vi states at will.  Some users prefer
- plain Emacs feel in the Minibuffer. To this end, set
- VIP-VI-STYLE-IN-MINIBUFFER to `nil'.
- 
- `C-v'
-      Deprive the next char of its special meaning (quoting).
- 
- `C-h'
-      One char back.
- 
- `C-w'
-      One word back.
- 
- `C-u'
-      Back to the begin of the change on the current line.
- 
- 
- File: viper,  Node: Deleting Text,  Next: Changing Text,  Prev: Editing in Insert State,  Up: Text Handling
- 
- Deleting Text
- -------------
- 
-    There is one difference in text deletion that you should be aware
- of. This difference comes from Emacs and was adopted in Viper because
- we find it very useful. In Vi, if you delete a line, say, and then
- another line, these two deletions are separated and are put back
- separately if you use the `p' command. In Emacs (and Viper), successive
- series of deletions that are *not interrupted* by other commands are
- lumped together, so the deleted text gets accumulated and can be put
- back as one chunk. If you want to break a sequence of deletions so that
- the newly deleted text could be put back separately from the previously
- deleted text, you should perform a non-deleting action, e.g., move the
- cursor one character in any direction.
- 
- `<count>  x'
-      Delete <count> chars under and after the cursor.
- 
- `<count>  X'
-      Delete <count> chars before the cursor.
- 
- `<count>  d<move>'
-      Delete from point to endpoint of <count><move>.
- 
- `<count>  dd'
-      Delete <count> lines.
- 
- `D'
-      The rest of the line.
- 
- `<count>  <<move>'
-      Shift the lines described by <count><move> one shiftwidth to the
-      left (layout!).
- 
- `<count>  <<'
-      Shift <count> lines one shiftwidth to the left.
- 
- 
- File: viper,  Node: Changing Text,  Next: Search and Replace,  Prev: Deleting Text,  Up: Text Handling
- 
- Changing Text
- -------------
- 
- `<count>  r<char>'
-      Replace <count> chars by <char> - no <esc>.
- 
- `<count>  R'
-      Overwrite the rest of the line, appending change COUNT - 1 times.
- 
- `<count>  s'
-      Substitute <count> chars.
- 
- `<count>  S'
-      Change <count> lines.
- 
- `<count>  c<move>'
-      Change from begin to endpoint of <count><move>.
- 
- `<count>  cc'
-      Change <count> lines.
- 
- `<count>  C'
-      The rest of the line and <count> - 1 next lines.
- 
- `<count>  =<move>'
-      Reindent the region described by move.
- 
- `<count>  ~'
-      Switch lower and upper cases.
- 
- `<count>  J'
-      Join <count> lines (default 2).
- 
- `:[x,y]s/<p>/<r>/<f>'
-      Substitute (on lines x through y) the pattern <p> (default the
-      last pattern) with <r>.  Useful flags <f> are `g' for `global'
-      (i.e. change every non-overlapping occurrence of <p>) and `c' for
-      `confirm' (type `y' to confirm a particular substitution, else `n'
-      ).  Instead of `/' any punctuation CHAR unequal to <space> <tab>
-      and <lf> can be used as delimiter.
- 
- `:[x,y]copy [z]'
-      Copy text between `x' and `y' to the position after `z'.
- 
- `:[x,y]t [z]'
-      Same as `:copy'.
- 
- `:[x,y]move [z]'
-      Move text between `x' and `y' to the position after `z'.
- 
- `&'
-      Repeat latest Ex substitute command, e.g.  `:s/wrong/good'.
- 
- `C-c /'
-      Toggle case-sensitive search. With prefix argument, toggle
-      vanilla/regular expression search.
- 
- `#c<move>'
-      Change upper case characters in the region to lower case.
- 
- `#C<move>'
-      Change lower case characters in the region to upper case.
- 
- `#q<move>'
-      Insert specified string at the beginning of each line in the region
- 
- `C-c M-p and C-c M-n'
-      In Insert and Replace states, these keys are bound to commands
-      that peruse the history of the text previously inserted in other
-      insert or replace commands. By repeatedly typing `C-c M-p' or `C-c
-      M-n', you will cause Viper to insert these previously used strings
-      one by one.  When a new string is inserted, the previous one is
-      deleted.
- 
-      In Vi state, these keys are bound to functions that peruse the
-      history of destructive Vi commands.  *Note Viper Specials::, for
-      details.
- 
- 
- File: viper,  Node: Search and Replace,  Next: Yanking,  Prev: Changing Text,  Up: Text Handling
- 
- Search and Replace
- ------------------
- 
-    *Note Groundwork::, for Ex address syntax. *Note Options:: to see
- how to get literal (non-regular-expression) search and how to stop
- search from wrapping around.
- 
- `<count>  /<string>'
-      To the <count>th occurrence of <string>.
- 
- `<count>  ?<string>'
-      To the <count>th previous occurrence of <string>.
- 
- `<count>  g<move>'
-      Search for the text described by move. (off by default)
- 
- `n'
-      Repeat latest `/' `?' (next).
- 
- `N'
-      Idem in opposite direction.
- 
- `%'
-      Find the next bracket and go to its match
- 
- `:[x,y]g/<string>/<cmd>'
-      Search globally [from line x to y] for <string> and execute the Ex
-      <cmd> on each occurrence.
- 
- `:[x,y]v/<string>/<cmd>'
-      Execute <cmd> on the lines that don't match.
- 
- `#g<move>'
-      Execute the last keyboard macro for each line in the region.
-      *Note Macros and Registers::, for more info.
- 
- `Q'
-      Query Replace.
- 
- `:ta <name>'
-      Search in the tags file where <name> is defined (file, line), and
-      go to it.
- 
- `:[x,y]s/<p>/<r>/<f>'
-      Substitute (on lines x through y) the pattern <p> (default the last
-      pattern) with <r>.  Useful flags <f> are `g' for `global' (i.e.
-      change every non-overlapping occurrence of <p>) and `c' for
-      `confirm' (type `y' to confirm a particular substitution, else
-      `n').  Instead of `/' any punctuation CHAR unequal to <space>
-      <tab> and <lf> can be used as delimiter.
- 
- `&'
-      Repeat latest Ex substitute command, e.g. `:s/wrong/good'.
- 
- 
- File: viper,  Node: Yanking,  Next: Undoing,  Prev: Search and Replace,  Up: Text Handling
- 
- Yanking
- -------
- 
- `<count>  y<move>'
-      Yank from begin to endpoint of <count><move>.
- 
- `<count>  "<a-z>y<move>'
-      Yank from begin to endpoint of <count><move> to register.
- 
- `<count>  "<A-Z>y<move>'
-      Yank from begin to endpoint of <count><move> and append to
-      register.
- 
- `<count>  yy'
-      <count> lines.
- 
- `<count>  Y'
-      Idem (should be equivalent to `y$' though).
- 
- `m<a-z>'
-      Mark the cursor position with a letter.
- 
- `[<a-z>'
-      Show contents of textmarker.
- 
- `]<a-z>'
-      Show contents of register.
- 
- `<count>  ["<a-z1-9>]p'
-      Put the contents of the (default undo) buffer <count> times after
-      the cursor. The register will be automatically downcased.
- 
- `<count>  ["<a-z1-9>]P'
-      Put the contents of the (default undo) buffer <count> times before
-      the cursor. The register will
- 
- 
- File: viper,  Node: Undoing,  Prev: Yanking,  Up: Text Handling
- 
- Undoing
- -------
- 
- `u U'
-      Undo the latest change.
- 
- `.'
-      Repeat undo.
- 
- `:q!'
-      Quit Vi without writing.
- 
- `:e!'
-      Re-edit a messed-up file.
- 
- `:rec'
-      Recover file from autosave. Viper also creates backup files that
-      have a `~' appended to them.
- 
- 
- File: viper,  Node: Display,  Next: File and Buffer Handling,  Prev: Text Handling,  Up: Commands
- 
- Display
- =======
- 
- `C-g'
-      At user level 1, give file name, status, current line number and
-      relative position.
-      At user levels 2 and higher, abort the current command.
- 
- `C-c g'
-      Give file name, status, current line number and relative position
-      - all user levels.
- 
- `C-l'
-      Refresh the screen.
- 
- `<count> C-e'
-      Expose <count> more lines at bottom, cursor stays put (if
-      possible).
- 
- `<count> C-y'
-      Expose <count> more lines at top, cursor stays put (if possible).
- 
- `<count> C-d'
-      Scroll <count> lines downward (default the number of the previous
-      scroll; initialization: half a page).
- 
- `<count> C-u'
-      Scroll <count> lines upward (default the number of the previous
-      scroll; initialization: half a page).
- 
- `<count> C-f'
-      <count> pages forward.
- 
- `<count> C-b'
-      <count> pages backward (in older versions `C-b' only works without
-      count).
- 
- `<count> z<cr>'
- `zH'
-      Put line <count> at the top of the window (default the current
-      line).
- 
- `<count> z-'
- `zL'
-      Put line <count> at the bottom of the window (default the current
-      line).
- 
- `<count> z.'
- `zM'
-      Put line <count> in the center of the window (default the current
-      line).
- 
--- 0 ----
Index: emacs/info/viper-4
diff -c emacs/info/viper-4:1.1.1.1 emacs/info/viper-4:removed
*** emacs/info/viper-4:1.1.1.1	Mon Jul 22 01:53:09 1996
--- emacs/info/viper-4	Fri Aug  2 20:28:16 1996
***************
*** 1,1039 ****
- This is Info file ../info/viper, produced by Makeinfo-1.55 from the
- input file viper.texi.
- 
-    %
- 
- Distribution
- ************
- 
- Copyright (C) 1991 Aamod Sane
- Copyright (C) 1994 Michael Kifer
- 
-    Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
- 
-    Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided that
- the entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- 
-    Permission is granted to copy and distribute translations of this
- manual into another language, under the same conditions as for modified
- versions.
- 
- 
- File: viper,  Node: File and Buffer Handling,  Next: Mapping,  Prev: Display,  Up: Commands
- 
- File and Buffer Handling
- ========================
- 
-    In all file handling commands, space should be typed before entering
- the file name. If you need  to type a modifier, such as `>>' or `!',
- don't put any space between the command and the modifier.
- 
- `:q'
-      Quit buffer except if modified.
- 
- `:q!'
-      Quit buffer without checking. In Viper, these two commands are
-      identical. Confirmation is required if exiting modified buffers
-      that visit files.
- 
- `:susp'
- `:stop'
-      Suspend Viper
- 
- `:[x,y] w'
-      Write the file.
- 
- `:[x,y] w <name>'
-      Write to the file <name>.
- 
- `:[x,y] w>> <name>'
-      Append the buffer to the file <name>.  There should be no space
-      between `w' and `>>'. Type space after the `>>' and see what
-      happens.
- 
- `:w! <name>'
-      Overwrite the file <name>. In Viper, `:w' and `:w!' are identical.
-      Confirmation is required for writing to an existing file (if this
-      is not the file the buffer is visiting) or to a read-only file.
- 
- `:x,y w <name>'
-      Write lines x through y to the file <name>.
- 
- `:wq'
-      Write the file and kill buffer.
- 
- `:r <file> [<file> ...]'
-      Read file into a buffer, inserting its contents after the current
-      line.
- 
- `:xit'
-      Same as `:wq'.
- 
- `:W'
-      Save unsaved buffers, asking for confirmation.
- 
- `:WW'
-      Like `W', but without asking for confirmation.
- 
- `ZZ'
-      Save current buffer and kill it. If user level is 1, then save all
-      files and kill Emacs. Killing Emacs is the wrong way to use it, so
-      you should switch to  higher user levels as soon as possible.
- 
- `:x [<file>]'
-      Save and kill buffer.
- 
- `:x! [<file>]'
-      `:w![<file>]' and `:q'.
- 
- `:pre'
-      Preserve the file - autosave buffers.
- 
- `:rec'
-      Recover file from autosave.
- 
- `:f'
-      Print file name and lines.
- 
- `:cd [<dir>]'
-      Set the working directory to <dir> (default home directory).
- 
- `:pwd'
-      Print present working directory.
- 
- `:e [+<cmd>] <files>'
-      Edit files. If no filename is given, edit the file visited by the
-      current buffer. If buffer was modified or the file changed on
-      disk, ask for confirmation. Unlike Vi, Viper allows `:e' to take
-      multiple arguments.  The first file is edited the same way as in
-      Vi. The rest are visited in the usual Emacs way.
- 
- `:e! [+<cmd>] <files>'
-      Re-edit file. If no filename, reedit current file.  In Viper,
-      unlike Vi, `e!' is identical to `:e'. In both cases, the user is
-      asked to confirm if there is a danger of discarding changes to a
-      buffer.
- 
- `:q!'
-      Quit Vi without writing.
- 
- `C-^'
-      Edit the alternate (normally the previous) file.
- 
- `:rew'
-      Obsolete
- 
- `:args'
-      List files not shown anywhere with counts for next
- 
- `:n [count]  [+<cmd>] [<files>]'
-      Edit <count> file, or edit files. The count comes from :args.
- 
- `:N [count] [+<cmd>] [<files>]'
-      Like `:n', but the meaning of the variable EX-CYCLE-OTHER-WINDOW
-      is reversed.
- 
- `:b'
-      Switch to another buffer. If EX-CYCLE-OTHER-WINDOW is `t', switch
-      in another window. Buffer completion is supported.
- 
- `:B'
-      Like `:b', but the meaning of EX-CYCLE-OTHER-WINDOW is reversed.
- 
- `:<address>r <name>'
-      Read the file <name> into the buffer after the line <address>.
- 
- `v, V, C-v'
-      Edit a file in current or another window, or in another frame.
-      File name is typed in Minibuffer. File completion and history are
-      supported.
- 
- 
- File: viper,  Node: Mapping,  Next: Shell Commands,  Prev: File and Buffer Handling,  Up: Commands
- 
- Mapping
- =======
- 
- `:map <string>'
-      Start defining a Vi-style keyboard macro.   For instance, typing
-      `:map www' followed by `:!wc %' and then typing `C-x )'  will
-      cause `www' to run wc on  current file (Vi replaces `%' with the
-      current file name).
- 
- `C-x )'
-      Finish defining a keyboard macro.   In Viper, this command
-      completes the process of defining all keyboard macros, whether
-      they are Emacs-style or Vi-style.  This is a departure from Vi,
-      needed to allow WYSIWYG mapping of keyboard macros and to permit
-      the use of function keys and arbitrary Emacs functions in the
-      macros.
- 
- `:unmap <string>'
-      Deprive <string> of its mappings in Vi state.
- 
- `:map! <string>'
-      Map a macro for Insert state.
- 
- `:unmap! <string>'
-      Deprive <string> of its mapping in Insert state (see `:unmap').
- 
- `@<a-z>'
-      In Vi state,  execute the contents of register as a command.
- 
- `@@'
-      In Vi state,  repeat last register command.
- 
- `@#'
-      In Vi state,  begin keyboard macro. End with @<a-z>. This will
-      put the macro in the proper register. Register will  be
-      automatically downcased.   *Note Macros and Registers::, for more
-      info.
- 
- `@!<a-z>'
-      In Vi state,  yank anonymous macro to register
- 
- `*'
-      In Vi state,  execute anonymous macro (defined by C-x( and C-x )).
- 
- `C-x e'
-      Like `*', but works in all Viper states.
- 
- `#g<move>'
-      Execute the last keyboard macro for each line in the region.
-      *Note Macros and Registers::, for more info.
- 
- `[<a-z>'
-      Show contents of textmarker.
- 
- `]<a-z>'
-      Show contents of register.
- 
- 
- File: viper,  Node: Shell Commands,  Next: Options,  Prev: Mapping,  Up: Commands
- 
- Shell Commands
- ==============
- 
-    Note that % is used in Ex commands to mean current file. If you want
- a % in your command, it must be escaped as `\%'.  However if % is the
- first character, it stands as the address for the whole file.
- Similarly, `#' expands to the previous file. The previous file is the
- first file in `:args' listing. This defaults to the previous file in
- the VI sense if you have one window.
- 
- `:sh'
-      Execute a subshell in another window
- 
- `:[x,y]!<cmd>'
-      Execute a shell <cmd> [on lines x through y; % is replace by
-      current file, \% is changed to %
- 
- `:[x,y]!! [<args>]'
-      Repeat last shell command [and append <args>].
- 
- `:!<cmd>'
-      Just execute command and display result in a buffer.
- 
- `:!! <args>'
-      Repeat last shell command and append <args>
- 
- `<count> !<move><cmd>'
-      The shell executes <cmd>, with standard input the lines described
-      by <count><move>, next the standard output replaces those lines
-      (think of `cb', `sort', `nroff', etc.).
- 
- `<count> !!<cmd>'
-      Give <count> lines as standard input to the shell <cmd>, next let
-      the standard output replace those lines.
- 
- `:[x,y] w !<cmd>'
-      Let lines x to y be standard input for <cmd> (notice the <sp>
-      between `w' and `!').
- 
- `:<address>r !<cmd>'
-      Put the output of <cmd> after the line <address> (default current).
- 
- `:<address>r <name>'
-      Read the file <name> into the buffer after the line <address>
-      (default current).
- 
- 
- File: viper,  Node: Options,  Next: Emacs Related Commands,  Prev: Shell Commands,  Up: Commands
- 
- Options
- =======
- 
- `ai'
-      autoindent - In append mode after a <cr> the cursor will move
-      directly below the first CHAR on the previous line.
- 
- `ic'
-      ignorecase - No distinction between upper and lower cases when
-      searching.
- 
- `magic'
-      Regular expressions used in searches; nomagic means no regexps.
- 
- `ro'
-      readonly - The file is not to be changed.  If the user attempts to
-      write to this file, confirmation will be requested.
- 
- `sh=<string>'
-      shell - The program to be used for shell escapes (default `$SHELL'
-      (default `/bin/sh')).
- 
- `sw=<count>'
-      shiftwidth - Gives the shiftwidth (default 8 positions).
- 
- `sm'
-      showmatch - Whenever you append a `)', Vi shows its match if it's
-      on the same page; also with `{' and `}'.  If there's no match, Vi
-      will beep.
- 
- `ts=<count>'
-      tabstop - The length of a <ht>; warning: this is only IN the
-      editor, outside of it <ht>s have their normal length (default 8
-      positions).
- 
- `wm=<count>'
-      wrapmargin - In append mode Vi automatically puts a <lf> whenever
-      there is a <sp> or <ht> within <wm> columns from the right margin.
- 
- `ws'
-      wrapscan - When searching, the end is considered `stuck' to the
-      begin of the file.
- 
- `:set <option>'
-      Turn <option> on.
- 
- `:set no<option>'
-      Turn <option> off.
- 
- `:set <option>=<value>'
-      Set <option> to <value>.
- 
- 
- File: viper,  Node: Emacs Related Commands,  Prev: Options,  Up: Commands
- 
- Emacs Related Commands
- ======================
- 
- `_'
-      Begin Meta command in Vi state. Most often used as _x (M-x).
- 
- `C-z'
-      Begin Meta command in Insert state.
- 
- `C-z'
-      Switch between Emacs and Vi states.
- 
- `C-x0'
-      Close Window
- 
- `C-x1'
-      Close Other Windows
- 
- `C-x2'
-      Split Window
- 
- `C-xo'
-      Move among windows
- 
- `C-xC-f'
-      Emacs find-file, useful in Insert state
- 
- `C-y'
-      Put back the last killed text. Similar to Vi's `p', but also works
-      in Insert and Replace state. This command doesn't work in Vi
-      command state, since this binding is taken for something else.
- 
- `M-y'
-      Undoes the last `C-y' and puts another kill from the kill ring.
-      Using this command, you can try may different kills until you find
-      the one you need.
- 
- 
- File: viper,  Node: Mouse-bound Commands,  Up: Commands
- 
- Mouse-bound Commands
- ====================
- 
-    The following two mouse actions are normally bound to to special
- search and insert commands in of Viper:
- 
- `S-mouse-1 (Emacs)'
- `meta button1up (XEmacs)'
-      Holding Shift (or Meta, if XEmacs) and clicking mouse button 1 will
-      initiate search for a region under the mouse pointer.  This
-      command can take a prefix argument. Note: Viper sets this binding
-      only if this mouse action is not already bound to something else.
-      *Note Viper Specials::, for more information.
- 
- `S-mouse-2 (Emacs)'
- `meta button2up (XEmacs)'
-      Holding Shift (or Meta, if XEmacs) and clicking button 2 of the
-      mouse will insert a region surrounding the mouse pointer.  This
-      command can also take a prefix argument.  Note: Viper sets this
-      binding only if this mouse action is not already bound to
-      something else.  *Note Viper Specials::, for more details.
- 
- 
- File: viper,  Node: Acknowledgments,  Up: Top
- 
- Acknowledgments
- ***************
- 
-    Viper is a new name for a package formerly known as VIP-19.  VIP-19
- was based on the original VIP package by Masahiko Sato and on its
- enhancement, VIP 4.4, by Aamod Sane. This manual is an adaptation of
- the manual for VIP 4.4, which, in turn, was based on Sato's manual for
- VIP 3.5.
- 
-    Many contributors on the net pointed out bugs and suggested a number
- of useful features.
- 
- 
- File: viper,  Node: Key Index,  Next: Function Index,  Up: Top
- 
- Key Index
- *********
- 
- * Menu:
- 
- * <a-z>:                                Groundwork.
- * <address>:                            Groundwork.
- * <args>:                               Groundwork.
- * <cmd>:                                Groundwork.
- * <move>:                               Groundwork.
- * "<a-z1-9>p:                           Yanking.
- * "<a-z1-9>P:                           Appending Text.
- * "<a-z1-9>P:                           Yanking.
- * "<a-z1-9>p:                           Appending Text.
- * "<A-Z>y<move>:                        Yanking.
- * "<a-z>y<move>:                        Yanking.
- * #C<move>:                             New Commands.
- * #c<move>:                             Changing Text.
- * #c<move>:                             New Commands.
- * #C<move>:                             Changing Text.
- * #g<move>:                             Search and Replace.
- * #g<move>:                             Mapping.
- * #g<move>:                             New Commands.
- * #q<move> :                            Changing Text.
- * #q<move>:                             New Commands.
- * #s<move>:                             New Commands.
- * #:                                    New Commands.
- * $:                                    Move Commands.
- * %:                                    Move Commands.
- * %:                                    Search and Replace.
- * &:                                    Changing Text.
- * &:                                    Search and Replace.
- * ":                                    Move Commands.
- * ":                                    Marking.
- * '<a-z>:                               Marking.
- * '<a-z>:                               Move Commands.
- * (:                                    Move Commands.
- * ):                                    Move Commands.
- * *:                                    New Commands.
- * *:                                    Mapping.
- * +:                                    Move Commands.
- * ,:                                    Move Commands.
- * -:                                    Move Commands.
- * .:                                    Appending Text.
- * .:                                    Undoing.
- * /<cr>:                                Move Commands.
- * /<string>:                            Move Commands.
- * /<string>:                            Search and Replace.
- * 0:                                    Move Commands.
- * ;:                                    Move Commands.
- * <<move>:                              Deleting Text.
- * <<:                                   Deleting Text.
- * <cr>:                                 Move Commands.
- * <lf>:                                 Move Commands.
- * <sp>:                                 Move Commands.
- * =<move>:                              Changing Text.
- * ><move>:                              Appending Text.
- * >>:                                   Appending Text.
- * ?<cr>:                                Move Commands.
- * ?<string>:                            Search and Replace.
- * ?<string>:                            Move Commands.
- * @!<a-z>:                              Mapping.
- * @!:                                   New Commands.
- * @#:                                   Mapping.
- * @#:                                   New Commands.
- * @<a-z>:                               New Commands.
- * @<a-z>:                               Mapping.
- * @@:                                   Mapping.
- * {:                                    Move Commands.
- * }:                                    Move Commands.
- * a:                                    Appending Text.
- * A:                                    Appending Text.
- * B:                                    Move Commands.
- * b:                                    Move Commands.
- * C-b:                                  Display.
- * C-c /:                                Move Commands.
- * C-c /:                                Vi State.
- * C-c /:                                New Commands.
- * C-c g:                                New Commands.
- * C-c M-n:                              Changing Text.
- * C-c M-n:                              New Commands.
- * C-c M-n:                              Appending Text.
- * C-c M-p:                              Appending Text.
- * C-c M-p:                              Changing Text.
- * C-c M-p:                              New Commands.
- * C-c:                                  New Commands.
- * C-c:                                  Vi State.
- * C-d:                                  Display.
- * C-e:                                  Display.
- * C-f:                                  Display.
- * C-g:                                  Vi State.
- * C-g:                                  New Commands.
- * C-g:                                  Display.
- * C-h:                                  Move Commands.
- * C-l:                                  Display.
- * C-n:                                  Move Commands.
- * C-p:                                  Move Commands.
- * C-u:                                  Editing in Insert State.
- * C-u:                                  Display.
- * C-v:                                  Editing in Insert State.
- * C-v:                                  New Commands.
- * C-w:                                  Editing in Insert State.
- * C-x0:                                 Emacs Related Commands.
- * C-x1:                                 Emacs Related Commands.
- * C-x2:                                 Emacs Related Commands.
- * C-xC-f:                               Emacs Related Commands.
- * C-xo:                                 Emacs Related Commands.
- * C-x:                                  New Commands.
- * C-x:                                  Vi State.
- * C-y:                                  Display.
- * C-y:                                  Emacs Related Commands.
- * C-z:                                  Emacs Related Commands.
- * C-z:                                  States in Viper.
- * C-z:                                  Emacs State.
- * C-z:                                  Emacs Related Commands.
- * C-z:                                  States in Viper.
- * C-]:                                  New Commands.
- * C-]:                                  Vi State.
- * C-^:                                  File and Buffer Handling.
- * c<move>:                              Changing Text.
- * cc:                                   Changing Text.
- * C:                                    Changing Text.
- * d<move>:                              Deleting Text.
- * dd:                                   Deleting Text.
- * D:                                    Deleting Text.
- * ESC:                                  States in Viper.
- * E:                                    Move Commands.
- * e:                                    Move Commands.
- * f<char>:                              Move Commands.
- * F<char>:                              Move Commands.
- * g<move>:                              Search and Replace.
- * G:                                    Move Commands.
- * H:                                    Move Commands.
- * h:                                    Move Commands.
- * i:                                    States in Viper.
- * i:                                    Appending Text.
- * J:                                    Changing Text.
- * j:                                    Move Commands.
- * k:                                    Move Commands.
- * l:                                    Move Commands.
- * L:                                    Move Commands.
- * m,:                                   Marking.
- * M-n:                                  New Commands.
- * M-p:                                  New Commands.
- * M-y:                                  Emacs Related Commands.
- * m.:                                   Marking.
- * m<a-z>:                               Move Commands.
- * m<a-z>:                               Marking.
- * m<a-z>:                               Yanking.
- * m<:                                   Marking.
- * m>:                                   Marking.
- * meta button1up:                       Viper Specials.
- * meta button1up:                       Mouse-bound Commands.
- * meta button2up:                       Mouse-bound Commands.
- * meta button2up:                       Viper Specials.
- * M:                                    Move Commands.
- * n:                                    Search and Replace.
- * N:                                    Search and Replace.
- * n:                                    Move Commands.
- * N:                                    Move Commands.
- * O:                                    Appending Text.
- * o:                                    Appending Text.
- * P:                                    Yanking.
- * p:                                    Appending Text.
- * P:                                    Appending Text.
- * p:                                    Yanking.
- * Q:                                    New Commands.
- * Q:                                    Search and Replace.
- * r<char>:                              Changing Text.
- * R:                                    Changing Text.
- * S-mouse-1:                            Mouse-bound Commands.
- * S-mouse-1:                            Viper Specials.
- * S-mouse-2:                            Mouse-bound Commands.
- * S-mouse-2:                            Viper Specials.
- * s:                                    Changing Text.
- * S:                                    Changing Text.
- * t<char>:                              Move Commands.
- * T<char>:                              Move Commands.
- * u:                                    Undoing.
- * U:                                    Undoing.
- * u:                                    Vi State.
- * V:                                    New Commands.
- * V:                                    File and Buffer Handling.
- * v:                                    New Commands.
- * v:                                    File and Buffer Handling.
- * W:                                    Move Commands.
- * w:                                    Move Commands.
- * x:                                    Deleting Text.
- * X:                                    Deleting Text.
- * y<move>:                              Yanking.
- * yank:                                 Yanking.
- * yy:                                   Yanking.
- * Y:                                    Yanking.
- * z-:                                   Display.
- * z.:                                   Display.
- * z<cr>:                                Display.
- * z<cr>:                                Display.
- * zH:                                   Display.
- * zL:                                   Display.
- * zM:                                   Display.
- * ZZ:                                   File and Buffer Handling.
- * [<a-z>:                               New Commands.
- * [<a-z>:                               Move Commands.
- * [<a-z>:                               Yanking.
- * [<a-z>:                               Appending Text.
- * [<a-z>:                               Mapping.
- * [[:                                   Move Commands.
- * []:                                   Move Commands.
- * []:                                   New Commands.
- * \:                                    New Commands.
- * ]<a-z>:                               Move Commands.
- * ]<a-z>:                               New Commands.
- * ]<a-z>:                               Yanking.
- * ]<a-z>:                               Mapping.
- * ]<a-z>:                               Appending Text.
- * ]]:                                   Move Commands.
- * ^:                                    Move Commands.
- * _:                                    Vi State.
- * _:                                    New Commands.
- * _:                                    Emacs Related Commands.
- * `<a-z>:                               Move Commands.
- * `<a-z>:                               Marking.
- * ":                                    Move Commands.
- * ":                                    Marking.
- * |:                                    Move Commands.
- * ~:                                    Changing Text.
- 
- 
- File: viper,  Node: Function Index,  Next: Variable Index,  Prev: Key Index,  Up: Top
- 
- Function Index
- **************
- 
- * Menu:
- 
- * add-hook:                             Packages that Change Keymaps.
- * remove-hook:                          Packages that Change Keymaps.
- * vip-add-local-keys:                   Keybindings.
- * vip-buffer-search-enable:             Viper Specials.
- * vip-describe-kbd-macros:              Vi Macros.
- * vip-harness-minor-mode:               Packages that Change Keymaps.
- * vip-modify-major-mode:                Keybindings.
- * vip-mouse-click-insert-word:          Viper Specials.
- * vip-mouse-click-search-word:          Viper Specials.
- * vip-set-expert-level:                 Viper Specials.
- * vip-set-hooks:                        Packages that Change Keymaps.
- * viper-mode:                           Packages that Change Keymaps.
- * !!<cmd>:                              Shell Commands.
- * !<cmd>:                               Shell Commands.
- * !<move><cmd>:                         Shell Commands.
- * :!! <args>:                           Shell Commands.
- * :!<cmd>:                              Shell Commands.
- * :<address>r !<cmd>:                   Shell Commands.
- * :<address>r <name>:                   Shell Commands.
- * :args:                                New Commands.
- * :args:                                File and Buffer Handling.
- * :cd [<dir>]:                          File and Buffer Handling.
- * :copy [z]:                            Changing Text.
- * :e [<files>]:                         File and Buffer Handling.
- * :e! [<files>]:                        File and Buffer Handling.
- * :e!:                                  Undoing.
- * :edit [<files>]:                      File and Buffer Handling.
- * :edit! [<files>]:                     File and Buffer Handling.
- * :f:                                   File and Buffer Handling.
- * :g/<string>/<cmd>:                    Search and Replace.
- * :global/<string>/<cmd>:               Search and Replace.
- * :k:                                   Marking.
- * :map <char> <seq>:                    Mapping.
- * :map! <char> <seq>:                   Mapping.
- * :map:                                 Keybindings.
- * :mark:                                Marking.
- * :move [z]:                            Changing Text.
- * :n [<count> | <file>]:                File and Buffer Handling.
- * :n:                                   New Commands.
- * :PreviousRelatedFile:                 Viper Specials.
- * :PreviousRelatedFile:                 New Commands.
- * :pre:                                 New Commands.
- * :pre:                                 File and Buffer Handling.
- * :pwd:                                 New Commands.
- * :pwd:                                 File and Buffer Handling.
- * :q!:                                  Undoing.
- * :q!:                                  File and Buffer Handling.
- * :quit!:                               File and Buffer Handling.
- * :quit:                                File and Buffer Handling.
- * :q:                                   File and Buffer Handling.
- * :read:                                File and Buffer Handling.
- * :rec:                                 File and Buffer Handling.
- * :rec:                                 Undoing.
- * :RelatedFile:                         New Commands.
- * :RelatedFile:                         Viper Specials.
- * :rew:                                 File and Buffer Handling.
- * :r:                                   File and Buffer Handling.
- * :s/<p>/<r>/<f>:                       Changing Text.
- * :set <option>=<value>:                Options.
- * :set <option>:                        Options.
- * :set ai:                              Options.
- * :set autoindent:                      Options.
- * :set ic:                              Options.
- * :set ignorecase:                      Options.
- * :set magic:                           Options.
- * :set no<option>:                      Options.
- * :set readonly:                        Options.
- * :set ro:                              Options.
- * :set sh=<string>:                     Options.
- * :set shell=<string>:                  Options.
- * :set shiftwidth=<count>:              Options.
- * :set showmatch:                       Options.
- * :set sm:                              Options.
- * :set sw=<count>:                      Options.
- * :set tab-stop-local=<count>:          Options.
- * :set tabstop=<count>:                 Options.
- * :set ts=<count>:                      Options.
- * :set wm=<count>:                      Options.
- * :set wrapmargin=<count>:              Options.
- * :set wrapscan:                        Options.
- * :set ws:                              Options.
- * :set:                                 Rudimentary Changes.
- * :sh:                                  Shell Commands.
- * :stop:                                File and Buffer Handling.
- * :substitute/<p>/<r>/<f>:              Changing Text.
- * :substitute/<p>/<r>/<f>:              Search and Replace.
- * :susp:                                File and Buffer Handling.
- * :t [z]:                               Changing Text.
- * :tag <name>:                          Search and Replace.
- * :unmap <char>:                        Mapping.
- * :unmap! <char>:                       Mapping.
- * :v/<string>/<cmd>:                    Search and Replace.
- * :w !<cmd>:                            Shell Commands.
- * :w <file>:                            File and Buffer Handling.
- * :w >> <file>:                         File and Buffer Handling.
- * :w! <file>:                           File and Buffer Handling.
- * :wq:                                  File and Buffer Handling.
- * :write <file>:                        File and Buffer Handling.
- * :write >> <file>:                     File and Buffer Handling.
- * :write! <file>:                       File and Buffer Handling.
- * :Write:                               File and Buffer Handling.
- * :WWrite:                              File and Buffer Handling.
- * :WWrite:                              File and Buffer Handling.
- * :WW:                                  File and Buffer Handling.
- * :W:                                   File and Buffer Handling.
- * :x!:                                  File and Buffer Handling.
- * :x,y w !<cmd>:                        Shell Commands.
- * :x:                                   File and Buffer Handling.
- * :yank:                                Yanking.
- 
- 
- File: viper,  Node: Variable Index,  Next: Package Index,  Prev: Function Index,  Up: Top
- 
- Variable Index
- **************
- 
- * Menu:
- 
- * buffer-read-only:                     Rudimentary Changes.
- * ex-cycle-other-window:                Rudimentary Changes.
- * ex-cycle-through-non-files:           Rudimentary Changes.
- * ex-find-file-shell:                   Rudimentary Changes.
- * function-key-map:                     Keybindings.
- * vip-always:                           Packages that Change Keymaps.
- * vip-always:                           Rudimentary Changes.
- * vip-auto-indent:                      Rudimentary Changes.
- * vip-automatic-iso-accents:            Rudimentary Changes.
- * vip-buffer-search-char:               Rudimentary Changes.
- * vip-case-fold-search:                 Rudimentary Changes.
- * vip-command-ring-size:                Viper Specials.
- * vip-custom-file-name:                 Rudimentary Changes.
- * vip-delete-backwards-in-replace:      Rudimentary Changes.
- * vip-emacs-global-user-map:            Keybindings.
- * vip-emacs-state-hooks:                Rudimentary Changes.
- * vip-ESC-key:                          Rudimentary Changes.
- * vip-ex-style-editing-in-insert:       Rudimentary Changes.
- * vip-ex-style-motion:                  Rudimentary Changes.
- * vip-fast-keyseq-timeout:              Vi Macros.
- * vip-info-file-name:                   Rudimentary Changes.
- * vip-insert-global-user-map:           Keybindings.
- * vip-insert-state-hooks:               Rudimentary Changes.
- * vip-insertion-ring-size:              Viper Specials.
- * vip-keep-point-on-repeat:             Rudimentary Changes.
- * vip-keep-point-on-undo:               Rudimentary Changes.
- * vip-keysequence-delay:                Rudimentary Changes.
- * vip-multiclick-timeout:               Viper Specials.
- * vip-no-multiple-ESC:                  Rudimentary Changes.
- * vip-re-query-replace:                 Rudimentary Changes.
- * vip-re-search:                        Rudimentary Changes.
- * vip-replace-overlay-face:             Rudimentary Changes.
- * vip-replace-region-end-symbol:        Rudimentary Changes.
- * vip-replace-region-start-symbol:      Rudimentary Changes.
- * vip-replace-state-hooks:              Rudimentary Changes.
- * vip-search-face:                      Improved Search.
- * vip-search-face:                      Rudimentary Changes.
- * vip-search-wrap-around:               Rudimentary Changes.
- * vip-shift-width:                      Rudimentary Changes.
- * vip-smart-suffix-list:                Viper Specials.
- * vip-spell-function:                   Rudimentary Changes.
- * vip-spell-function:                   New Commands.
- * vip-surrounding-word-function:        Rudimentary Changes.
- * vip-tags-file-name:                   Rudimentary Changes.
- * vip-toggle-key:                       Rudimentary Changes.
- * vip-vi-global-user-map:               Keybindings.
- * vip-vi-state-hooks:                   Rudimentary Changes.
- * vip-vi-style-in-minibuffer:           Rudimentary Changes.
- * vip-want-ctl-h-help:                  Rudimentary Changes.
- * vip-want-emacs-keys-in-insert:        Packages that Change Keymaps.
- * vip-want-emacs-keys-in-insert:        Rudimentary Changes.
- * vip-want-emacs-keys-in-vi:            Packages that Change Keymaps.
- * vip-want-emacs-keys-in-vi:            Rudimentary Changes.
- 
- 
- File: viper,  Node: Package Index,  Next: Concept Index,  Prev: Variable Index,  Up: Top
- 
- Package Index
- *************
- 
- * Menu:
- 
- * ange-ftp.el:                          Useful Packages.
- * desktop.el:                           Useful Packages.
- * dired.el:                             Useful Packages.
- * ediff.el:                             Useful Packages.
- * font-lock.el:                         Useful Packages.
- * hilit19.el:                           Useful Packages.
- * ispell.el:                            Useful Packages.
- * vc.el:                                Useful Packages.
- 
- 
- File: viper,  Node: Concept Index,  Prev: Package Index,  Up: Top
- 
- Concept Index
- *************
- 
- * Menu:
- 
- * # (Previous file):                    Groundwork.
- * # (Previous file):                    Shell Commands.
- * % (Current file):                     Shell Commands.
- * % (Current file):                     Groundwork.
- * % (Ex address):                       Shell Commands.
- * % (Ex address):                       Groundwork.
- * .emacs:                               Customization.
- * .vip:                                 Customization.
- * <a-z>:                                Groundwork.
- * <address>:                            Groundwork.
- * <args>:                               Groundwork.
- * <cmd>:                                Groundwork.
- * <cr>:                                 Groundwork.
- * <esc>:                                Groundwork.
- * <ht>:                                 Groundwork.
- * <lf>:                                 Groundwork.
- * <move>:                               Groundwork.
- * <sp>:                                 Groundwork.
- * abbrevs:                              Abbreviation Facilities.
- * absolute paths:                       Multiple Files in Viper.
- * appending:                            Appending Text.
- * auto fill:                            Options.
- * auto save:                            Undo and Backups.
- * autoindent:                           Options.
- * backup files:                         Undoing.
- * backup files:                         Undo and Backups.
- * buffer:                               Emacs Preliminaries.
- * buffer (modified):                    Emacs Preliminaries.
- * buffer information:                   Emacs Preliminaries.
- * buffer search:                        Improved Search.
- * C-c and Viper:                        Packages that Change Keymaps.
- * case and searching:                   Options.
- * case-insensitive search:              Vi State.
- * case-insensitive search:              Move Commands.
- * case-insensitive search:              New Commands.
- * case-sensitive search:                New Commands.
- * case-sensitive search:                Vi State.
- * case-sensitive search:                Move Commands.
- * changing case:                        New Commands.
- * changing case:                        Changing Text.
- * changing tab width:                   Options.
- * char:                                 Groundwork.
- * CHAR:                                 Groundwork.
- * column movement:                      Move Commands.
- * Command history:                      New Commands.
- * command line:                         Emacs Preliminaries.
- * Command ring:                         New Commands.
- * compiling:                            Useful Packages.
- * completion:                           Completion.
- * Control keys:                         Emacs Preliminaries.
- * customization:                        Customization.
- * cut and paste:                        Yanking.
- * describing regions:                   Basics.
- * desktop:                              Useful Packages.
- * Destructive command history:          Viper Specials.
- * Destructive command ring:             Viper Specials.
- * dired:                                Useful Packages.
- * dynamic abbrevs:                      Abbreviation Facilities.
- * ediff:                                Useful Packages.
- * Emacs state:                          States in Viper.
- * Emacs state:                          Emacs State.
- * email:                                Useful Packages.
- * end (of buffer):                      Emacs Preliminaries.
- * end (of line):                        Emacs Preliminaries.
- * Ex addresses:                         Groundwork.
- * Ex commands:                          Vi State.
- * Ex commands:                          States in Viper.
- * Ex style motion:                      Movement and Markers.
- * expanding (region):                   Basics.
- * font-lock:                            Useful Packages.
- * global keymap:                        Emacs Preliminaries.
- * headings:                             Viper Specials.
- * headings:                             Move Commands.
- * hilit19:                              Useful Packages.
- * history:                              History.
- * incremental search:                   Improved Search.
- * initialization:                       Customization.
- * Insert state:                         Editing in Insert State.
- * Insert state:                         States in Viper.
- * Insert state:                         Insert State.
- * inserting:                            Appending Text.
- * Insertion history:                    New Commands.
- * Insertion ring:                       New Commands.
- * Insertion ring:                       Viper Specials.
- * interactive shell:                    Useful Packages.
- * ispell:                               Useful Packages.
- * joining lines:                        Changing Text.
- * keybindings:                          Mapping.
- * keybindings:                          Keybindings.
- * keyboard macros:                      New Commands.
- * keyboard macros:                      Macros and Registers.
- * keymap:                               Emacs Preliminaries.
- * keymapping:                           Mapping.
- * keymaps:                              Keybindings.
- * last keyboard macro:                  Macros and Registers.
- * layout:                               Options.
- * line commands:                        Groundwork.
- * line commands:                        Basics.
- * line editor motion:                   Movement and Markers.
- * literal searching:                    Options.
- * local keymap:                         Emacs Preliminaries.
- * looking at:                           Emacs Preliminaries.
- * macros:                               Macros and Registers.
- * mail:                                 Useful Packages.
- * major mode:                           Emacs Preliminaries.
- * make:                                 Useful Packages.
- * managing multiple files:              Multiple Files in Viper.
- * mark:                                 Emacs Preliminaries.
- * markers:                              Multiple Files in Viper.
- * markers:                              Move Commands.
- * markers:                              Undo and Backups.
- * marking:                              Marking.
- * matching parens:                      Move Commands.
- * matching parens:                      Options.
- * Meta key:                             Vi State.
- * Meta key:                             Emacs Preliminaries.
- * Meta key:                             Insert State.
- * Minibuffer:                           The Minibuffer.
- * Minibuffer:                           History.
- * Minibuffer:                           Emacs Preliminaries.
- * minor mode:                           Emacs Preliminaries.
- * mode:                                 Emacs Preliminaries.
- * mode line:                            Emacs Preliminaries.
- * mode line:                            States in Viper.
- * mouse:                                Viper Specials.
- * mouse search:                         Improved Search.
- * movement commands:                    Basics.
- * movement commands:                    Move Commands.
- * movements:                            Groundwork.
- * Multifile documents and programs:     Viper Specials.
- * multiple files:                       File and Buffer Handling.
- * multiple files:                       Multiple Files in Viper.
- * multiple undo:                        Vi State.
- * paragraphs:                           Move Commands.
- * paragraphs:                           Viper Specials.
- * paren matching:                       Move Commands.
- * paren matching:                       Options.
- * paste:                                Appending Text.
- * paste:                                Yanking.
- * point:                                Emacs Preliminaries.
- * point commands:                       Basics.
- * point commands:                       Groundwork.
- * put:                                  Appending Text.
- * query replace:                        Improved Search.
- * query replace:                        New Commands.
- * quoting regions:                      Changing Text.
- * r and R region specifiers:            Groundwork.
- * r and R region specifiers:            Basics.
- * RCS:                                  Useful Packages.
- * readonly files:                       Options.
- * region:                               Emacs Preliminaries.
- * region:                               Basics.
- * region specification:                 Basics.
- * register execution:                   Macros and Registers.
- * register execution:                   New Commands.
- * registers:                            Macros and Registers.
- * registers:                            Undo and Backups.
- * registers:                            Multiple Files in Viper.
- * regular expressions:                  Vi State.
- * Replace state:                        States in Viper.
- * Replace state:                        Replace State.
- * scrolling:                            Display.
- * searching:                            Move Commands.
- * searching:                            Options.
- * sections:                             Move Commands.
- * sections:                             Viper Specials.
- * sentences:                            Move Commands.
- * sentences:                            Viper Specials.
- * setting variables:                    Rudimentary Changes.
- * shell:                                Useful Packages.
- * shell:                                Options.
- * shell commands:                       Shell Commands.
- * shifting text:                        Options.
- * shifting text:                        Deleting Text.
- * substitution:                         Changing Text.
- * tabbing:                              Options.
- * text:                                 Emacs Preliminaries.
- * text processing:                      Search and Replace.
- * textmarkers:                          Multiple Files in Viper.
- * textmarkers:                          Movement and Markers.
- * textmarkers:                          Move Commands.
- * textmarkers:                          Undo and Backups.
- * transparent ftp:                      Useful Packages.
- * undo:                                 Undo and Backups.
- * undo:                                 Vi State.
- * undo:                                 Undoing.
- * vanilla search:                       New Commands.
- * vanilla search:                       Move Commands.
- * vanilla search:                       Vi State.
- * variables for customization:          Rudimentary Changes.
- * version maintenance:                  Useful Packages.
- * Vi macros:                            Vi Macros.
- * Vi options:                           Options.
- * Vi state:                             Vi State.
- * Vi state:                             States in Viper.
- * viewing registers and markers:        Undo and Backups.
- * viewing registers and markers:        Macros and Registers.
- * Viper and C-c:                        Packages that Change Keymaps.
- * Viper as minor mode:                  Emacs Preliminaries.
- * window:                               Emacs Preliminaries.
- * word search:                          Improved Search.
- * word wrap:                            Options.
- * words:                                Groundwork.
- * WORDS:                                Groundwork.
- 
- 
--- 0 ----
Index: emacs/lib-src/Makefile.in.in
diff -c emacs/lib-src/Makefile.in.in:1.1.1.2 emacs/lib-src/Makefile.in.in:1.5
*** emacs/lib-src/Makefile.in.in:1.1.1.2	Mon Jul 22 01:48:25 1996
--- emacs/lib-src/Makefile.in.in	Thu Aug  1 03:45:20 1996
***************
*** 95,101 ****
  UTILITIES= wakeup profile digest-doc \
  	sorted-doc movemail cvtmail fakemail yow emacsserver hexl timer
  
! DONT_INSTALL= test-distrib make-docfile
  
  # Like UTILITIES, but they're not system-dependent, and should not be
  #  deleted by the distclean target.
--- 95,101 ----
  UTILITIES= wakeup profile digest-doc \
  	sorted-doc movemail cvtmail fakemail yow emacsserver hexl timer
  
! DONT_INSTALL= test-distrib make-docfile makeinfo texindex
  
  # Like UTILITIES, but they're not system-dependent, and should not be
  #  deleted by the distclean target.
***************
*** 329,334 ****
--- 329,340 ----
  
  make-docfile: ${srcdir}/make-docfile.c
  	$(CC) ${ALL_CFLAGS} ${srcdir}/make-docfile.c $(LOADLIBES) -o make-docfile
+ 
+ makeinfo: ${srcdir}/makeinfo.c $(GETOPTDEPS) ../src/config.h
+ 	$(CC) ${ALL_CFLAGS} ${srcdir}/makeinfo.c $(GETOPTOBJS) $(LOADLIBES) -o makeinfo
+ 
+ texindex: ${srcdir}/texindex.c $(GETOPTDEPS) ../src/config.h
+ 	$(CC) ${ALL_CFLAGS} ${srcdir}/texindex.c $(GETOPTOBJS) $(LOADLIBES) -o texindex
  
  digest-doc: ${srcdir}/digest-doc.c
  	$(CC) ${ALL_CFLAGS} ${srcdir}/digest-doc.c $(LOADLIBES) -o digest-doc 
Index: emacs/lib-src/elc.update
diff -c /dev/null emacs/lib-src/elc.update:1.3
*** /dev/null	Fri Aug  2 20:29:02 1996
--- emacs/lib-src/elc.update	Thu Aug  1 18:27:30 1996
***************
*** 0 ****
--- 1,363 ----
+ #! /bin/sh
+ 
+ FORCE='[ -f $i ] || '
+ if [ $1"x" = "forcex" ]; then
+   FORCE=''
+ fi
+ 
+ # to build this list execute the following in emacs-root/lisp
+ # ls -1 **/*.elc | sed 's/^/          /' |copy
+ ELCFILES="
+           abbrev.elc
+           abbrevlist.elc
+           ada-mode.elc
+           add-log.elc
+           advice.elc
+           allout.elc
+           ange-ftp.elc
+           appt.elc
+           apropos.elc
+           arc-mode.elc
+           array.elc
+           asm-mode.elc
+           assoc.elc
+           auto-show.elc
+           autoinsert.elc
+           autoload.elc
+           avoid.elc
+           awk-mode.elc
+           backquote.elc
+           bib-mode.elc
+           bibtex.elc
+           blackbox.elc
+           bookmark.elc
+           buff-menu.elc
+           byte-opt.elc
+           byte-run.elc
+           bytecomp.elc
+           c-mode.elc
+           cal-dst.elc
+           cal-french.elc
+           cal-mayan.elc
+           cal-menu.elc
+           cal-x.elc
+           calendar.elc
+           case-table.elc
+           cc-mode.elc
+           cdl.elc
+           chistory.elc
+           cl-compat.elc
+           cl-extra.elc
+           cl-indent.elc
+           cl-macs.elc
+           cl-seq.elc
+           cl-specs.elc
+           cl.elc
+           cmacexp.elc
+           cmuscheme.elc
+           comint.elc
+           compare-w.elc
+           compile.elc
+           complete.elc
+           completion.elc
+           cookie1.elc
+           cplus-md.elc
+           cpp.elc
+           cust-print.elc
+           dabbrev.elc
+           debug.elc
+           delsel.elc
+           derived.elc
+           desktop.elc
+           diary-ins.elc
+           diary-lib.elc
+           diff.elc
+           dired-aux.elc
+           dired-x.elc
+           dired.elc
+           disass.elc
+           disp-table.elc
+           dissociate.elc
+           docref.elc
+           doctor.elc
+           dos-fns.elc
+           double.elc
+           dunnet.elc
+           easymenu.elc
+           ebuff-menu.elc
+           echistory.elc
+           edebug.elc
+           ediff-diff.elc
+           ediff-init.elc
+           ediff-merg.elc
+           ediff-util.elc
+           ediff-wind.elc
+           ediff.elc
+           edmacro.elc
+           edt-lk201.elc
+           edt-mapper.elc
+           edt-pc.elc
+           edt-vt100.elc
+           edt.elc
+           ehelp.elc
+           electric.elc
+           elp.elc
+           emacsbug.elc
+           emerge.elc
+           enriched.elc
+           env.elc
+           etags.elc
+           eval-reg.elc
+           f90.elc
+           facemenu.elc
+           faces.elc
+           fast-lock.elc
+           files.elc
+           fill.elc
+           find-dired.elc
+           find-file.elc
+           find-gc.elc
+           finder-inf.elc
+           finder.elc
+           float-sup.elc
+           float.elc
+           flow-ctrl.elc
+           foldout.elc
+           font-lock.elc
+           format.elc
+           forms.elc
+           fortran.elc
+           frame.elc
+           gnus-uu.elc
+           gnus.elc
+           gnusmail.elc
+           gnusmisc.elc
+           gnuspost.elc
+           gomoku.elc
+           gud.elc
+           hanoi.elc
+           help-macro.elc
+           help.elc
+           helper.elc
+           hexl.elc
+           hideif.elc
+           hideshow.elc
+           hilit19.elc
+           hippie-exp.elc
+           holidays.elc
+           icomplete.elc
+           icon.elc
+           ielm.elc
+           imenu.elc
+           indent.elc
+           inf-lisp.elc
+           info.elc
+           informat.elc
+           isearch.elc
+           iso-acc.elc
+           iso-ascii.elc
+           iso-cvt.elc
+           iso-insert.elc
+           iso-swed.elc
+           iso-syntax.elc
+           iso-transl.elc
+           ispell.elc
+           ispell4.elc
+           jka-compr.elc
+           kermit.elc
+           ledit.elc
+           levents.elc
+           life.elc
+           lisp-mnt.elc
+           lisp-mode.elc
+           lisp.elc
+           lmenu.elc
+           loadhist.elc
+           lpr.elc
+           ls-lisp.elc
+           lselect.elc
+           lucid.elc
+           lunar.elc
+           macros.elc
+           mail-extr.elc
+           mail-hist.elc
+           mail-utils.elc
+           mailabbrev.elc
+           mailalias.elc
+           mailpost.elc
+           makefile.elc
+           makeinfo.elc
+           makesum.elc
+           man.elc
+           map-ynp.elc
+           meese.elc
+           menu-bar.elc
+           metamail.elc
+           mh-comp.elc
+           mh-e.elc
+           mh-funcs.elc
+           mh-mime.elc
+           mh-pick.elc
+           mh-seq.elc
+           mh-utils.elc
+           mhspool.elc
+           misc.elc
+           mlconvert.elc
+           mldrag.elc
+           mlsupport.elc
+           modula2.elc
+           mouse-sel.elc
+           mouse.elc
+           mpuz.elc
+           msb.elc
+           nnspool.elc
+           nntp.elc
+           noutline.elc
+           novice.elc
+           nroff-mode.elc
+           ns-compat.elc
+           ns-gdb.elc
+           ns-icon.elc
+           ns-menu-bar.elc
+           ns-scroll-bar.elc
+           ns-syntax.elc
+           options.elc
+           outline.elc
+           page-ext.elc
+           page.elc
+           paragraphs.elc
+           paren.elc
+           pascal.elc
+           pc-mode.elc
+           perl-mode.elc
+           picture.elc
+           pp.elc
+           profile.elc
+           prolog.elc
+           ps-print.elc
+           rcompile.elc
+           rect.elc
+           refbib.elc
+           refer.elc
+           regi.elc
+           register.elc
+           replace.elc
+           reporter.elc
+           reposition.elc
+           resume.elc
+           rfc822.elc
+           ring.elc
+           rlogin.elc
+           rmail.elc
+           rmailedit.elc
+           rmailkwd.elc
+           rmailmsc.elc
+           rmailout.elc
+           rmailsort.elc
+           rmailsum.elc
+           rnews.elc
+           rnewspost.elc
+           rot13.elc
+           rsz-mini.elc
+           s-region.elc
+           saveplace.elc
+           scheme.elc
+           scribe.elc
+           scroll-bar.elc
+           select.elc
+           sendmail.elc
+           server.elc
+           sgml-mode.elc
+           sh-script.elc
+           shadowfile.elc
+           shell.elc
+           simple.elc
+           simula.elc
+           skeleton.elc
+           solar.elc
+           sort.elc
+           soundex.elc
+           spell.elc
+           spook.elc
+           startup.elc
+           studly.elc
+           subr.elc
+           supercite.elc
+           swedish.elc
+           tabify.elc
+           talk.elc
+           tar-mode.elc
+           tcl-mode.elc
+           tcp.elc
+           telnet.elc
+           tempo.elc
+           term.elc
+           term/apollo.elc
+           term/bg-mouse.elc
+           term/news.elc
+           term/ns-win.elc
+           term/pc-win.elc
+           term/sun-mouse.elc
+           term/sun.elc
+           term/sup-mouse.elc
+           term/tvi970.elc
+           term/vt100-led.elc
+           term/vt100.elc
+           term/vt200.elc
+           term/wyse50.elc
+           term/x-win.elc
+           term/xterm.elc
+           terminal.elc
+           tex-mode.elc
+           texinfmt.elc
+           texinfo.elc
+           texnfo-upd.elc
+           text-mode.elc
+           thingatpt.elc
+           time-stamp.elc
+           time.elc
+           timer.elc
+           timezone.elc
+           tmm.elc
+           tpu-edt.elc
+           tpu-extras.elc
+           tpu-mapper.elc
+           tq.elc
+           trace.elc
+           two-column.elc
+           type-break.elc
+           uncompress.elc
+           underline.elc
+           undigest.elc
+           unrmail.elc
+           unused.elc
+           upd-copyr.elc
+           userlock.elc
+           vc-hooks.elc
+           vc.elc
+           vi.elc
+           view.elc
+           vip.elc
+           viper-ex.elc
+           viper-keym.elc
+           viper-macs.elc
+           viper-mous.elc
+           viper-util.elc
+           viper.elc
+           vms-patch.elc
+           vms-pmail.elc
+           vmsproc.elc
+           vmsx.elc
+           vt100-led.elc
+           window.elc
+           winnt.elc
+           ws-mode.elc
+           x-apollo.elc
+           x-menu.elc
+           xscheme.elc
+           yow.elc
+ 	  "
+ 
+ for i in $ELCFILES; do
+   eval $FORCE "(touch -t 0101000080 $i && echo $i)"
+ done
Index: emacs/lib-src/getdate.c
diff -c emacs/lib-src/getdate.c:1.1.1.2 emacs/lib-src/getdate.c:removed
*** emacs/lib-src/getdate.c:1.1.1.2	Mon Jul 22 01:47:56 1996
--- emacs/lib-src/getdate.c	Fri Aug  2 20:29:14 1996
***************
*** 1,1922 ****
- 
- /*  A Bison parser, made from getdate.y with Bison version GNU Bison version 1.22
-   */
- 
- #define YYBISON 1  /* Identify Bison output.  */
- 
- #define	tAGO	258
- #define	tDAY	259
- #define	tDAYZONE	260
- #define	tID	261
- #define	tMERIDIAN	262
- #define	tMINUTE_UNIT	263
- #define	tMONTH	264
- #define	tMONTH_UNIT	265
- #define	tSEC_UNIT	266
- #define	tSNUMBER	267
- #define	tUNUMBER	268
- #define	tZONE	269
- #define	tDST	270
- 
- #line 1 "getdate.y"
- 
- /*
- **  Originally written by Steven M. Bellovin <smb@research.att.com> while
- **  at the University of North Carolina at Chapel Hill.  Later tweaked by
- **  a couple of people on Usenet.  Completely overhauled by Rich $alz
- **  <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
- **  send any email to Rich.
- **
- **  This grammar has 10 shift/reduce conflicts.
- **
- **  This code is in the public domain and has no copyright.
- */
- /* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
- /* SUPPRESS 288 on yyerrlab *//* Label unused */
- 
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
- 
- /* Since the code of getdate.y is not included in the Emacs executable
-    itself, there is no need to #define static in this file.  Even if
-    the code were included in the Emacs executable, it probably
-    wouldn't do any harm to #undef it here; this will only cause
-    problems if we try to write to a static variable, which I don't
-    think this code needs to do.  */
- #ifdef emacs
- #undef static
- #endif
- 
- #include <stdio.h>
- #include <ctype.h>
- 
- #if	defined (vms)
- #include <types.h>
- #include <time.h>
- #else
- #include <sys/types.h>
- #ifdef TIME_WITH_SYS_TIME
- #include <sys/time.h>
- #include <time.h>
- #else
- #ifdef HAVE_SYS_TIME_H
- #include <sys/time.h>
- #else
- #include <time.h>
- #endif
- #endif
- 
- #ifdef timezone
- #undef timezone /* needed for sgi */
- #endif
- 
- #if defined (HAVE_SYS_TIMEB_H)
- #include <sys/timeb.h>
- #else
- 
- /* get_date uses the obsolete `struct timeb' in its interface!  FIXME.
-    Since some systems don't have it, we define it here;
-    callers must do likewise.  */
- struct timeb
-   {
-     time_t		time;		/* Seconds since the epoch	*/
-     unsigned short	millitm;	/* Field not used		*/
-     short		timezone;	/* Minutes west of GMT		*/
-     short		dstflag;	/* Field not used		*/
- };
- #endif /* defined (HAVE_SYS_TIMEB_H) */
- 
- #endif	/* defined (vms) */
- 
- #if defined (STDC_HEADERS) || defined (USG)
- #include <string.h>
- #endif
- 
- /* Some old versions of bison generate parsers that use bcopy.
-    That loses on systems that don't provide the function, so we have
-    to redefine it here.  */
- #if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
- #define bcopy(from, to, len) memcpy ((to), (from), (len))
- #endif
- 
- extern struct tm	*gmtime ();
- extern struct tm	*localtime ();
- 
- #define yyparse getdate_yyparse
- #define yylex getdate_yylex
- #define yyerror getdate_yyerror
- 
- static int yylex ();
- static int yyerror ();
- 
- #define EPOCH		1970
- #define HOUR(x)		((time_t)(x) * 60)
- #define SECSPERDAY	(24L * 60L * 60L)
- 
- #define MAX_BUFF_LEN    128   /* size of buffer to read the date into */
- 
- /*
- **  An entry in the lexical lookup table.
- */
- typedef struct _TABLE {
-     const char	*name;
-     int		type;
-     time_t	value;
- } TABLE;
- 
- 
- /*
- **  Daylight-savings mode:  on, off, or not yet known.
- */
- typedef enum _DSTMODE {
-     DSTon, DSToff, DSTmaybe
- } DSTMODE;
- 
- /*
- **  Meridian:  am, pm, or 24-hour style.
- */
- typedef enum _MERIDIAN {
-     MERam, MERpm, MER24
- } MERIDIAN;
- 
- 
- /*
- **  Global variables.  We could get rid of most of these by using a good
- **  union as the yacc stack.  (This routine was originally written before
- **  yacc had the %union construct.)  Maybe someday; right now we only use
- **  the %union very rarely.
- */
- static char	*yyInput;
- static DSTMODE	yyDSTmode;
- static time_t	yyDayOrdinal;
- static time_t	yyDayNumber;
- static int	yyHaveDate;
- static int	yyHaveDay;
- static int	yyHaveRel;
- static int	yyHaveTime;
- static int	yyHaveZone;
- static time_t	yyTimezone;
- static time_t	yyDay;
- static time_t	yyHour;
- static time_t	yyMinutes;
- static time_t	yyMonth;
- static time_t	yySeconds;
- static time_t	yyYear;
- static MERIDIAN	yyMeridian;
- static time_t	yyRelMonth;
- static time_t	yyRelSeconds;
- 
- 
- #line 151 "getdate.y"
- typedef union {
-     time_t		Number;
-     enum _MERIDIAN	Meridian;
- } YYSTYPE;
- 
- #ifndef YYLTYPE
- typedef
-   struct yyltype
-     {
-       int timestamp;
-       int first_line;
-       int first_column;
-       int last_line;
-       int last_column;
-       char *text;
-    }
-   yyltype;
- 
- #define YYLTYPE yyltype
- #endif
- 
- #include <stdio.h>
- 
- #ifndef __cplusplus
- #ifndef __STDC__
- #define const
- #endif
- #endif
- 
- 
- 
- #define	YYFINAL		52
- #define	YYFLAG		-32768
- #define	YYNTBASE	19
- 
- #define YYTRANSLATE(x) ((unsigned)(x) <= 270 ? yytranslate[x] : 29)
- 
- static const char yytranslate[] = {     0,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,    17,     2,     2,    18,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,    16,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
-      6,     7,     8,     9,    10,    11,    12,    13,    14,    15
- };
- 
- #if YYDEBUG != 0
- static const short yyprhs[] = {     0,
-      0,     1,     4,     6,     8,    10,    12,    14,    16,    19,
-     24,    29,    36,    43,    45,    47,    50,    52,    55,    58,
-     62,    68,    72,    76,    79,    84,    87,    91,    94,    96,
-     99,   102,   104,   107,   110,   112,   115,   118,   120,   122,
-    123
- };
- 
- static const short yyrhs[] = {    -1,
-     19,    20,     0,    21,     0,    22,     0,    24,     0,    23,
-      0,    25,     0,    27,     0,    13,     7,     0,    13,    16,
-     13,    28,     0,    13,    16,    13,    12,     0,    13,    16,
-     13,    16,    13,    28,     0,    13,    16,    13,    16,    13,
-     12,     0,    14,     0,     5,     0,    14,    15,     0,     4,
-      0,     4,    17,     0,    13,     4,     0,    13,    18,    13,
-      0,    13,    18,    13,    18,    13,     0,    13,    12,    12,
-      0,    13,     9,    12,     0,     9,    13,     0,     9,    13,
-     17,    13,     0,    13,     9,     0,    13,     9,    13,     0,
-     26,     3,     0,    26,     0,    13,     8,     0,    12,     8,
-      0,     8,     0,    12,    11,     0,    13,    11,     0,    11,
-      0,    12,    10,     0,    13,    10,     0,    10,     0,    13,
-      0,     0,     7,     0
- };
- 
- #endif
- 
- #if YYDEBUG != 0
- static const short yyrline[] = { 0,
-    165,   166,   169,   172,   175,   178,   181,   184,   187,   193,
-    199,   206,   212,   222,   226,   230,   237,   241,   245,   251,
-    255,   260,   266,   272,   276,   281,   285,   292,   296,   299,
-    302,   305,   308,   311,   314,   317,   320,   323,   328,   355,
-    358
- };
- 
- static const char * const yytname[] = {   "$","error","$illegal.","tAGO","tDAY",
- "tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT",
- "tSNUMBER","tUNUMBER","tZONE","tDST","':'","','","'/'","spec","item","time",
- "zone","day","date","rel","relunit","number","o_merid",""
- };
- #endif
- 
- static const short yyr1[] = {     0,
-     19,    19,    20,    20,    20,    20,    20,    20,    21,    21,
-     21,    21,    21,    22,    22,    22,    23,    23,    23,    24,
-     24,    24,    24,    24,    24,    24,    24,    25,    25,    26,
-     26,    26,    26,    26,    26,    26,    26,    26,    27,    28,
-     28
- };
- 
- static const short yyr2[] = {     0,
-      0,     2,     1,     1,     1,     1,     1,     1,     2,     4,
-      4,     6,     6,     1,     1,     2,     1,     2,     2,     3,
-      5,     3,     3,     2,     4,     2,     3,     2,     1,     2,
-      2,     1,     2,     2,     1,     2,     2,     1,     1,     0,
-      1
- };
- 
- static const short yydefact[] = {     1,
-      0,    17,    15,    32,     0,    38,    35,     0,    39,    14,
-      2,     3,     4,     6,     5,     7,    29,     8,    18,    24,
-     31,    36,    33,    19,     9,    30,    26,    37,    34,     0,
-      0,     0,    16,    28,     0,    23,    27,    22,    40,    20,
-     25,    41,    11,     0,    10,     0,    40,    21,    13,    12,
-      0,     0
- };
- 
- static const short yydefgoto[] = {     1,
-     11,    12,    13,    14,    15,    16,    17,    18,    45
- };
- 
- static const short yypact[] = {-32768,
-      0,    -1,-32768,-32768,     4,-32768,-32768,    25,    11,    -8,
- -32768,-32768,-32768,-32768,-32768,-32768,    21,-32768,-32768,     9,
- -32768,-32768,-32768,-32768,-32768,-32768,   -10,-32768,-32768,    16,
-     19,    24,-32768,-32768,    26,-32768,-32768,-32768,    18,    13,
- -32768,-32768,-32768,    27,-32768,    28,    -6,-32768,-32768,-32768,
-     38,-32768
- };
- 
- static const short yypgoto[] = {-32768,
- -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    -5
- };
- 
- 
- #define	YYLAST		42
- 
- 
- static const short yytable[] = {    51,
-     42,    36,    37,     2,     3,    49,    33,     4,     5,     6,
-      7,     8,     9,    10,    24,    19,    20,    25,    26,    27,
-     28,    29,    30,    34,    42,    35,    31,    38,    32,    43,
-     46,    39,    21,    44,    22,    23,    40,    52,    41,    47,
-     48,    50
- };
- 
- static const short yycheck[] = {     0,
-      7,    12,    13,     4,     5,    12,    15,     8,     9,    10,
-     11,    12,    13,    14,     4,    17,    13,     7,     8,     9,
-     10,    11,    12,     3,     7,    17,    16,    12,    18,    12,
-     18,    13,     8,    16,    10,    11,    13,     0,    13,    13,
-     13,    47
- };
- /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
- #line 3 "/usr/local/lib/bison.simple"
- 
- /* Skeleton output parser for bison,
-    Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
- 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 1, or (at your option)
-    any later version.
- 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
- 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
- 
- 
- #ifndef alloca
- #ifdef __GNUC__
- #define alloca __builtin_alloca
- #else /* not GNU C.  */
- #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
- #include <alloca.h>
- #else /* not sparc */
- #if defined (MSDOS) && !defined (__TURBOC__)
- #include <malloc.h>
- #else /* not MSDOS, or __TURBOC__ */
- #if defined(_AIX)
- #include <malloc.h>
-  #pragma alloca
- #else /* not MSDOS, __TURBOC__, or _AIX */
- #ifdef __hpux
- #ifdef __cplusplus
- extern "C" {
- void *alloca (unsigned int);
- };
- #else /* not __cplusplus */
- void *alloca ();
- #endif /* not __cplusplus */
- #endif /* __hpux */
- #endif /* not _AIX */
- #endif /* not MSDOS, or __TURBOC__ */
- #endif /* not sparc.  */
- #endif /* not GNU C.  */
- #endif /* alloca not defined.  */
- 
- /* This is the parser code that is written into each bison parser
-   when the %semantic_parser declaration is not specified in the grammar.
-   It was written by Richard Stallman by simplifying the hairy parser
-   used when %semantic_parser is specified.  */
- 
- /* Note: there must be only one dollar sign in this file.
-    It is replaced by the list of actions, each action
-    as one case of the switch.  */
- 
- #define yyerrok		(yyerrstatus = 0)
- #define yyclearin	(yychar = YYEMPTY)
- #define YYEMPTY		-2
- #define YYEOF		0
- #define YYACCEPT	return(0)
- #define YYABORT 	return(1)
- #define YYERROR		goto yyerrlab1
- /* Like YYERROR except do call yyerror.
-    This remains here temporarily to ease the
-    transition to the new meaning of YYERROR, for GCC.
-    Once GCC version 2 has supplanted version 1, this can go.  */
- #define YYFAIL		goto yyerrlab
- #define YYRECOVERING()  (!!yyerrstatus)
- #define YYBACKUP(token, value) \
- do								\
-   if (yychar == YYEMPTY && yylen == 1)				\
-     { yychar = (token), yylval = (value);			\
-       yychar1 = YYTRANSLATE (yychar);				\
-       YYPOPSTACK;						\
-       goto yybackup;						\
-     }								\
-   else								\
-     { yyerror ("syntax error: cannot back up"); YYERROR; }	\
- while (0)
- 
- #define YYTERROR	1
- #define YYERRCODE	256
- 
- #ifndef YYPURE
- #define YYLEX		yylex()
- #endif
- 
- #ifdef YYPURE
- #ifdef YYLSP_NEEDED
- #define YYLEX		yylex(&yylval, &yylloc)
- #else
- #define YYLEX		yylex(&yylval)
- #endif
- #endif
- 
- /* If nonreentrant, generate the variables here */
- 
- #ifndef YYPURE
- 
- int	yychar;			/*  the lookahead symbol		*/
- YYSTYPE	yylval;			/*  the semantic value of the		*/
- 				/*  lookahead symbol			*/
- 
- #ifdef YYLSP_NEEDED
- YYLTYPE yylloc;			/*  location data for the lookahead	*/
- 				/*  symbol				*/
- #endif
- 
- int yynerrs;			/*  number of parse errors so far       */
- #endif  /* not YYPURE */
- 
- #if YYDEBUG != 0
- int yydebug;			/*  nonzero means print parse trace	*/
- /* Since this is uninitialized, it does not stop multiple parsers
-    from coexisting.  */
- #endif
- 
- /*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
- 
- #ifndef	YYINITDEPTH
- #define YYINITDEPTH 200
- #endif
- 
- /*  YYMAXDEPTH is the maximum size the stacks can grow to
-     (effective only if the built-in stack extension method is used).  */
- 
- #if YYMAXDEPTH == 0
- #undef YYMAXDEPTH
- #endif
- 
- #ifndef YYMAXDEPTH
- #define YYMAXDEPTH 10000
- #endif
- 
- /* Prevent warning if -Wstrict-prototypes.  */
- #ifdef __GNUC__
- int yyparse (void);
- #endif
- 
- #if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
- #define __yy_bcopy(FROM,TO,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
- #else				/* not GNU C or C++ */
- #ifndef __cplusplus
- 
- /* This is the most reliable way to avoid incompatibilities
-    in available built-in functions on various systems.  */
- static void
- __yy_bcopy (from, to, count)
-      char *from;
-      char *to;
-      int count;
- {
-   register char *f = from;
-   register char *t = to;
-   register int i = count;
- 
-   while (i-- > 0)
-     *t++ = *f++;
- }
- 
- #else /* __cplusplus */
- 
- /* This is the most reliable way to avoid incompatibilities
-    in available built-in functions on various systems.  */
- static void
- __yy_bcopy (char *from, char *to, int count)
- {
-   register char *f = from;
-   register char *t = to;
-   register int i = count;
- 
-   while (i-- > 0)
-     *t++ = *f++;
- }
- 
- #endif
- #endif
- 
- #line 184 "/usr/local/lib/bison.simple"
- 
- /* The user can define YYPARSE_PARAM as the name of an argument to be passed
-    into yyparse.  The argument should have type void *.
-    It should actually point to an object.
-    Grammar actions can access the variable by casting it
-    to the proper pointer type.  */
- 
- #ifdef YYPARSE_PARAM
- #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
- #else
- #define YYPARSE_PARAM
- #define YYPARSE_PARAM_DECL
- #endif
- 
- int
- yyparse(YYPARSE_PARAM)
-      YYPARSE_PARAM_DECL
- {
-   register int yystate;
-   register int yyn;
-   register short *yyssp;
-   register YYSTYPE *yyvsp;
-   int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
-   int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
- 
-   short	yyssa[YYINITDEPTH];	/*  the state stack			*/
-   YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
- 
-   short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
-   YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
- 
- #ifdef YYLSP_NEEDED
-   YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
-   YYLTYPE *yyls = yylsa;
-   YYLTYPE *yylsp;
- 
- #define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
- #else
- #define YYPOPSTACK   (yyvsp--, yyssp--)
- #endif
- 
-   int yystacksize = YYINITDEPTH;
- 
- #ifdef YYPURE
-   int yychar;
-   YYSTYPE yylval;
-   int yynerrs;
- #ifdef YYLSP_NEEDED
-   YYLTYPE yylloc;
- #endif
- #endif
- 
-   YYSTYPE yyval;		/*  the variable used to return		*/
- 				/*  semantic values from the action	*/
- 				/*  routines				*/
- 
-   int yylen;
- 
- #if YYDEBUG != 0
-   if (yydebug)
-     fprintf(stderr, "Starting parse\n");
- #endif
- 
-   yystate = 0;
-   yyerrstatus = 0;
-   yynerrs = 0;
-   yychar = YYEMPTY;		/* Cause a token to be read.  */
- 
-   /* Initialize stack pointers.
-      Waste one element of value and location stack
-      so that they stay on the same level as the state stack.
-      The wasted elements are never initialized.  */
- 
-   yyssp = yyss - 1;
-   yyvsp = yyvs;
- #ifdef YYLSP_NEEDED
-   yylsp = yyls;
- #endif
- 
- /* Push a new state, which is found in  yystate  .  */
- /* In all cases, when you get here, the value and location stacks
-    have just been pushed. so pushing a state here evens the stacks.  */
- yynewstate:
- 
-   *++yyssp = yystate;
- 
-   if (yyssp >= yyss + yystacksize - 1)
-     {
-       /* Give user a chance to reallocate the stack */
-       /* Use copies of these so that the &'s don't force the real ones into memory. */
-       YYSTYPE *yyvs1 = yyvs;
-       short *yyss1 = yyss;
- #ifdef YYLSP_NEEDED
-       YYLTYPE *yyls1 = yyls;
- #endif
- 
-       /* Get the current used size of the three stacks, in elements.  */
-       int size = yyssp - yyss + 1;
- 
- #ifdef yyoverflow
-       /* Each stack pointer address is followed by the size of
- 	 the data in use in that stack, in bytes.  */
- #ifdef YYLSP_NEEDED
-       /* This used to be a conditional around just the two extra args,
- 	 but that might be undefined if yyoverflow is a macro.  */
-       yyoverflow("parser stack overflow",
- 		 &yyss1, size * sizeof (*yyssp),
- 		 &yyvs1, size * sizeof (*yyvsp),
- 		 &yyls1, size * sizeof (*yylsp),
- 		 &yystacksize);
- #else
-       yyoverflow("parser stack overflow",
- 		 &yyss1, size * sizeof (*yyssp),
- 		 &yyvs1, size * sizeof (*yyvsp),
- 		 &yystacksize);
- #endif
- 
-       yyss = yyss1; yyvs = yyvs1;
- #ifdef YYLSP_NEEDED
-       yyls = yyls1;
- #endif
- #else /* no yyoverflow */
-       /* Extend the stack our own way.  */
-       if (yystacksize >= YYMAXDEPTH)
- 	{
- 	  yyerror("parser stack overflow");
- 	  return 2;
- 	}
-       yystacksize *= 2;
-       if (yystacksize > YYMAXDEPTH)
- 	yystacksize = YYMAXDEPTH;
-       yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
-       __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
-       yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
-       __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
- #ifdef YYLSP_NEEDED
-       yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
-       __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
- #endif
- #endif /* no yyoverflow */
- 
-       yyssp = yyss + size - 1;
-       yyvsp = yyvs + size - 1;
- #ifdef YYLSP_NEEDED
-       yylsp = yyls + size - 1;
- #endif
- 
- #if YYDEBUG != 0
-       if (yydebug)
- 	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
- #endif
- 
-       if (yyssp >= yyss + yystacksize - 1)
- 	YYABORT;
-     }
- 
- #if YYDEBUG != 0
-   if (yydebug)
-     fprintf(stderr, "Entering state %d\n", yystate);
- #endif
- 
-   goto yybackup;
-  yybackup:
- 
- /* Do appropriate processing given the current state.  */
- /* Read a lookahead token if we need one and don't already have one.  */
- /* yyresume: */
- 
-   /* First try to decide what to do without reference to lookahead token.  */
- 
-   yyn = yypact[yystate];
-   if (yyn == YYFLAG)
-     goto yydefault;
- 
-   /* Not known => get a lookahead token if don't already have one.  */
- 
-   /* yychar is either YYEMPTY or YYEOF
-      or a valid token in external form.  */
- 
-   if (yychar == YYEMPTY)
-     {
- #if YYDEBUG != 0
-       if (yydebug)
- 	fprintf(stderr, "Reading a token: ");
- #endif
-       yychar = YYLEX;
-     }
- 
-   /* Convert token to internal form (in yychar1) for indexing tables with */
- 
-   if (yychar <= 0)		/* This means end of input. */
-     {
-       yychar1 = 0;
-       yychar = YYEOF;		/* Don't call YYLEX any more */
- 
- #if YYDEBUG != 0
-       if (yydebug)
- 	fprintf(stderr, "Now at end of input.\n");
- #endif
-     }
-   else
-     {
-       yychar1 = YYTRANSLATE(yychar);
- 
- #if YYDEBUG != 0
-       if (yydebug)
- 	{
- 	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
- 	  /* Give the individual parser a way to print the precise meaning
- 	     of a token, for further debugging info.  */
- #ifdef YYPRINT
- 	  YYPRINT (stderr, yychar, yylval);
- #endif
- 	  fprintf (stderr, ")\n");
- 	}
- #endif
-     }
- 
-   yyn += yychar1;
-   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
-     goto yydefault;
- 
-   yyn = yytable[yyn];
- 
-   /* yyn is what to do for this token type in this state.
-      Negative => reduce, -yyn is rule number.
-      Positive => shift, yyn is new state.
-        New state is final state => don't bother to shift,
-        just return success.
-      0, or most negative number => error.  */
- 
-   if (yyn < 0)
-     {
-       if (yyn == YYFLAG)
- 	goto yyerrlab;
-       yyn = -yyn;
-       goto yyreduce;
-     }
-   else if (yyn == 0)
-     goto yyerrlab;
- 
-   if (yyn == YYFINAL)
-     YYACCEPT;
- 
-   /* Shift the lookahead token.  */
- 
- #if YYDEBUG != 0
-   if (yydebug)
-     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
- #endif
- 
-   /* Discard the token being shifted unless it is eof.  */
-   if (yychar != YYEOF)
-     yychar = YYEMPTY;
- 
-   *++yyvsp = yylval;
- #ifdef YYLSP_NEEDED
-   *++yylsp = yylloc;
- #endif
- 
-   /* count tokens shifted since error; after three, turn off error status.  */
-   if (yyerrstatus) yyerrstatus--;
- 
-   yystate = yyn;
-   goto yynewstate;
- 
- /* Do the default action for the current state.  */
- yydefault:
- 
-   yyn = yydefact[yystate];
-   if (yyn == 0)
-     goto yyerrlab;
- 
- /* Do a reduction.  yyn is the number of a rule to reduce with.  */
- yyreduce:
-   yylen = yyr2[yyn];
-   if (yylen > 0)
-     yyval = yyvsp[1-yylen]; /* implement default value of the action */
- 
- #if YYDEBUG != 0
-   if (yydebug)
-     {
-       int i;
- 
-       fprintf (stderr, "Reducing via rule %d (line %d), ",
- 	       yyn, yyrline[yyn]);
- 
-       /* Print the symbols being reduced, and their result.  */
-       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
- 	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
-       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
-     }
- #endif
- 
- 
-   switch (yyn) {
- 
- case 3:
- #line 169 "getdate.y"
- {
- 	    yyHaveTime++;
- 	;
-     break;}
- case 4:
- #line 172 "getdate.y"
- {
- 	    yyHaveZone++;
- 	;
-     break;}
- case 5:
- #line 175 "getdate.y"
- {
- 	    yyHaveDate++;
- 	;
-     break;}
- case 6:
- #line 178 "getdate.y"
- {
- 	    yyHaveDay++;
- 	;
-     break;}
- case 7:
- #line 181 "getdate.y"
- {
- 	    yyHaveRel++;
- 	;
-     break;}
- case 9:
- #line 187 "getdate.y"
- {
- 	    yyHour = yyvsp[-1].Number;
- 	    yyMinutes = 0;
- 	    yySeconds = 0;
- 	    yyMeridian = yyvsp[0].Meridian;
- 	;
-     break;}
- case 10:
- #line 193 "getdate.y"
- {
- 	    yyHour = yyvsp[-3].Number;
- 	    yyMinutes = yyvsp[-1].Number;
- 	    yySeconds = 0;
- 	    yyMeridian = yyvsp[0].Meridian;
- 	;
-     break;}
- case 11:
- #line 199 "getdate.y"
- {
- 	    yyHour = yyvsp[-3].Number;
- 	    yyMinutes = yyvsp[-1].Number;
- 	    yyMeridian = MER24;
- 	    yyDSTmode = DSToff;
- 	    yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60);
- 	;
-     break;}
- case 12:
- #line 206 "getdate.y"
- {
- 	    yyHour = yyvsp[-5].Number;
- 	    yyMinutes = yyvsp[-3].Number;
- 	    yySeconds = yyvsp[-1].Number;
- 	    yyMeridian = yyvsp[0].Meridian;
- 	;
-     break;}
- case 13:
- #line 212 "getdate.y"
- {
- 	    yyHour = yyvsp[-5].Number;
- 	    yyMinutes = yyvsp[-3].Number;
- 	    yySeconds = yyvsp[-1].Number;
- 	    yyMeridian = MER24;
- 	    yyDSTmode = DSToff;
- 	    yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60);
- 	;
-     break;}
- case 14:
- #line 222 "getdate.y"
- {
- 	    yyTimezone = yyvsp[0].Number;
- 	    yyDSTmode = DSToff;
- 	;
-     break;}
- case 15:
- #line 226 "getdate.y"
- {
- 	    yyTimezone = yyvsp[0].Number;
- 	    yyDSTmode = DSTon;
- 	;
-     break;}
- case 16:
- #line 231 "getdate.y"
- {
- 	    yyTimezone = yyvsp[-1].Number;
- 	    yyDSTmode = DSTon;
- 	;
-     break;}
- case 17:
- #line 237 "getdate.y"
- {
- 	    yyDayOrdinal = 1;
- 	    yyDayNumber = yyvsp[0].Number;
- 	;
-     break;}
- case 18:
- #line 241 "getdate.y"
- {
- 	    yyDayOrdinal = 1;
- 	    yyDayNumber = yyvsp[-1].Number;
- 	;
-     break;}
- case 19:
- #line 245 "getdate.y"
- {
- 	    yyDayOrdinal = yyvsp[-1].Number;
- 	    yyDayNumber = yyvsp[0].Number;
- 	;
-     break;}
- case 20:
- #line 251 "getdate.y"
- {
- 	    yyMonth = yyvsp[-2].Number;
- 	    yyDay = yyvsp[0].Number;
- 	;
-     break;}
- case 21:
- #line 255 "getdate.y"
- {
- 	    yyMonth = yyvsp[-4].Number;
- 	    yyDay = yyvsp[-2].Number;
- 	    yyYear = yyvsp[0].Number;
- 	;
-     break;}
- case 22:
- #line 260 "getdate.y"
- {
- 	    /* ISO 8601 format.  yyyy-mm-dd.  */
- 	    yyYear = yyvsp[-2].Number;
- 	    yyMonth = -yyvsp[-1].Number;
- 	    yyDay = -yyvsp[0].Number;
- 	;
-     break;}
- case 23:
- #line 266 "getdate.y"
- {
- 	    /* e.g. 17-JUN-1992.  */
- 	    yyDay = yyvsp[-2].Number;
- 	    yyMonth = yyvsp[-1].Number;
- 	    yyYear = -yyvsp[0].Number;
- 	;
-     break;}
- case 24:
- #line 272 "getdate.y"
- {
- 	    yyMonth = yyvsp[-1].Number;
- 	    yyDay = yyvsp[0].Number;
- 	;
-     break;}
- case 25:
- #line 276 "getdate.y"
- {
- 	    yyMonth = yyvsp[-3].Number;
- 	    yyDay = yyvsp[-2].Number;
- 	    yyYear = yyvsp[0].Number;
- 	;
-     break;}
- case 26:
- #line 281 "getdate.y"
- {
- 	    yyMonth = yyvsp[0].Number;
- 	    yyDay = yyvsp[-1].Number;
- 	;
-     break;}
- case 27:
- #line 285 "getdate.y"
- {
- 	    yyMonth = yyvsp[-1].Number;
- 	    yyDay = yyvsp[-2].Number;
- 	    yyYear = yyvsp[0].Number;
- 	;
-     break;}
- case 28:
- #line 292 "getdate.y"
- {
- 	    yyRelSeconds = -yyRelSeconds;
- 	    yyRelMonth = -yyRelMonth;
- 	;
-     break;}
- case 30:
- #line 299 "getdate.y"
- {
- 	    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
- 	;
-     break;}
- case 31:
- #line 302 "getdate.y"
- {
- 	    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
- 	;
-     break;}
- case 32:
- #line 305 "getdate.y"
- {
- 	    yyRelSeconds += yyvsp[0].Number * 60L;
- 	;
-     break;}
- case 33:
- #line 308 "getdate.y"
- {
- 	    yyRelSeconds += yyvsp[-1].Number;
- 	;
-     break;}
- case 34:
- #line 311 "getdate.y"
- {
- 	    yyRelSeconds += yyvsp[-1].Number;
- 	;
-     break;}
- case 35:
- #line 314 "getdate.y"
- {
- 	    yyRelSeconds++;
- 	;
-     break;}
- case 36:
- #line 317 "getdate.y"
- {
- 	    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
- 	;
-     break;}
- case 37:
- #line 320 "getdate.y"
- {
- 	    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
- 	;
-     break;}
- case 38:
- #line 323 "getdate.y"
- {
- 	    yyRelMonth += yyvsp[0].Number;
- 	;
-     break;}
- case 39:
- #line 328 "getdate.y"
- {
- 	    if (yyHaveTime && yyHaveDate && !yyHaveRel)
- 		yyYear = yyvsp[0].Number;
- 	    else {
- 		if (yyvsp[0].Number>10000) {
- 		    yyHaveDate++;
- 		    yyDay= (yyvsp[0].Number)%100;
- 		    yyMonth= (yyvsp[0].Number/100)%100;
- 		    yyYear = yyvsp[0].Number/10000;
- 		}
- 		else {
- 		    yyHaveTime++;
- 		    if (yyvsp[0].Number < 100) {
- 			yyHour = yyvsp[0].Number;
- 			yyMinutes = 0;
- 		    }
- 		    else {
- 		    	yyHour = yyvsp[0].Number / 100;
- 		    	yyMinutes = yyvsp[0].Number % 100;
- 		    }
- 		    yySeconds = 0;
- 		    yyMeridian = MER24;
- 	        }
- 	    }
- 	;
-     break;}
- case 40:
- #line 355 "getdate.y"
- {
- 	    yyval.Meridian = MER24;
- 	;
-     break;}
- case 41:
- #line 358 "getdate.y"
- {
- 	    yyval.Meridian = yyvsp[0].Meridian;
- 	;
-     break;}
- }
-    /* the action file gets copied in in place of this dollarsign */
- #line 480 "/usr/local/lib/bison.simple"
- 
-   yyvsp -= yylen;
-   yyssp -= yylen;
- #ifdef YYLSP_NEEDED
-   yylsp -= yylen;
- #endif
- 
- #if YYDEBUG != 0
-   if (yydebug)
-     {
-       short *ssp1 = yyss - 1;
-       fprintf (stderr, "state stack now");
-       while (ssp1 != yyssp)
- 	fprintf (stderr, " %d", *++ssp1);
-       fprintf (stderr, "\n");
-     }
- #endif
- 
-   *++yyvsp = yyval;
- 
- #ifdef YYLSP_NEEDED
-   yylsp++;
-   if (yylen == 0)
-     {
-       yylsp->first_line = yylloc.first_line;
-       yylsp->first_column = yylloc.first_column;
-       yylsp->last_line = (yylsp-1)->last_line;
-       yylsp->last_column = (yylsp-1)->last_column;
-       yylsp->text = 0;
-     }
-   else
-     {
-       yylsp->last_line = (yylsp+yylen-1)->last_line;
-       yylsp->last_column = (yylsp+yylen-1)->last_column;
-     }
- #endif
- 
-   /* Now "shift" the result of the reduction.
-      Determine what state that goes to,
-      based on the state we popped back to
-      and the rule number reduced by.  */
- 
-   yyn = yyr1[yyn];
- 
-   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
-   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-     yystate = yytable[yystate];
-   else
-     yystate = yydefgoto[yyn - YYNTBASE];
- 
-   goto yynewstate;
- 
- yyerrlab:   /* here on detecting error */
- 
-   if (! yyerrstatus)
-     /* If not already recovering from an error, report this error.  */
-     {
-       ++yynerrs;
- 
- #ifdef YYERROR_VERBOSE
-       yyn = yypact[yystate];
- 
-       if (yyn > YYFLAG && yyn < YYLAST)
- 	{
- 	  int size = 0;
- 	  char *msg;
- 	  int x, count;
- 
- 	  count = 0;
- 	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
- 	  for (x = (yyn < 0 ? -yyn : 0);
- 	       x < (sizeof(yytname) / sizeof(char *)); x++)
- 	    if (yycheck[x + yyn] == x)
- 	      size += strlen(yytname[x]) + 15, count++;
- 	  msg = (char *) malloc(size + 15);
- 	  if (msg != 0)
- 	    {
- 	      strcpy(msg, "parse error");
- 
- 	      if (count < 5)
- 		{
- 		  count = 0;
- 		  for (x = (yyn < 0 ? -yyn : 0);
- 		       x < (sizeof(yytname) / sizeof(char *)); x++)
- 		    if (yycheck[x + yyn] == x)
- 		      {
- 			strcat(msg, count == 0 ? ", expecting `" : " or `");
- 			strcat(msg, yytname[x]);
- 			strcat(msg, "'");
- 			count++;
- 		      }
- 		}
- 	      yyerror(msg);
- 	      free(msg);
- 	    }
- 	  else
- 	    yyerror ("parse error; also virtual memory exceeded");
- 	}
-       else
- #endif /* YYERROR_VERBOSE */
- 	yyerror("parse error");
-     }
- 
-   goto yyerrlab1;
- yyerrlab1:   /* here on error raised explicitly by an action */
- 
-   if (yyerrstatus == 3)
-     {
-       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
- 
-       /* return failure if at end of input */
-       if (yychar == YYEOF)
- 	YYABORT;
- 
- #if YYDEBUG != 0
-       if (yydebug)
- 	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
- #endif
- 
-       yychar = YYEMPTY;
-     }
- 
-   /* Else will try to reuse lookahead token
-      after shifting the error token.  */
- 
-   yyerrstatus = 3;		/* Each real token shifted decrements this */
- 
-   goto yyerrhandle;
- 
- yyerrdefault:  /* current state does not do anything special for the error token. */
- 
- #if 0
-   /* This is wrong; only states that explicitly want error tokens
-      should shift them.  */
-   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
-   if (yyn) goto yydefault;
- #endif
- 
- yyerrpop:   /* pop the current state because it cannot handle the error token */
- 
-   if (yyssp == yyss) YYABORT;
-   yyvsp--;
-   yystate = *--yyssp;
- #ifdef YYLSP_NEEDED
-   yylsp--;
- #endif
- 
- #if YYDEBUG != 0
-   if (yydebug)
-     {
-       short *ssp1 = yyss - 1;
-       fprintf (stderr, "Error: state stack now");
-       while (ssp1 != yyssp)
- 	fprintf (stderr, " %d", *++ssp1);
-       fprintf (stderr, "\n");
-     }
- #endif
- 
- yyerrhandle:
- 
-   yyn = yypact[yystate];
-   if (yyn == YYFLAG)
-     goto yyerrdefault;
- 
-   yyn += YYTERROR;
-   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
-     goto yyerrdefault;
- 
-   yyn = yytable[yyn];
-   if (yyn < 0)
-     {
-       if (yyn == YYFLAG)
- 	goto yyerrpop;
-       yyn = -yyn;
-       goto yyreduce;
-     }
-   else if (yyn == 0)
-     goto yyerrpop;
- 
-   if (yyn == YYFINAL)
-     YYACCEPT;
- 
- #if YYDEBUG != 0
-   if (yydebug)
-     fprintf(stderr, "Shifting error token, ");
- #endif
- 
-   *++yyvsp = yylval;
- #ifdef YYLSP_NEEDED
-   *++yylsp = yylloc;
- #endif
- 
-   yystate = yyn;
-   goto yynewstate;
- }
- #line 363 "getdate.y"
- 
- 
- /* Month and day table. */
- static TABLE const MonthDayTable[] = {
-     { "january",	tMONTH,  1 },
-     { "february",	tMONTH,  2 },
-     { "march",		tMONTH,  3 },
-     { "april",		tMONTH,  4 },
-     { "may",		tMONTH,  5 },
-     { "june",		tMONTH,  6 },
-     { "july",		tMONTH,  7 },
-     { "august",		tMONTH,  8 },
-     { "september",	tMONTH,  9 },
-     { "sept",		tMONTH,  9 },
-     { "october",	tMONTH, 10 },
-     { "november",	tMONTH, 11 },
-     { "december",	tMONTH, 12 },
-     { "sunday",		tDAY, 0 },
-     { "monday",		tDAY, 1 },
-     { "tuesday",	tDAY, 2 },
-     { "tues",		tDAY, 2 },
-     { "wednesday",	tDAY, 3 },
-     { "wednes",		tDAY, 3 },
-     { "thursday",	tDAY, 4 },
-     { "thur",		tDAY, 4 },
-     { "thurs",		tDAY, 4 },
-     { "friday",		tDAY, 5 },
-     { "saturday",	tDAY, 6 },
-     { NULL }
- };
- 
- /* Time units table. */
- static TABLE const UnitsTable[] = {
-     { "year",		tMONTH_UNIT,	12 },
-     { "month",		tMONTH_UNIT,	1 },
-     { "fortnight",	tMINUTE_UNIT,	14 * 24 * 60 },
-     { "week",		tMINUTE_UNIT,	7 * 24 * 60 },
-     { "day",		tMINUTE_UNIT,	1 * 24 * 60 },
-     { "hour",		tMINUTE_UNIT,	60 },
-     { "minute",		tMINUTE_UNIT,	1 },
-     { "min",		tMINUTE_UNIT,	1 },
-     { "second",		tSEC_UNIT,	1 },
-     { "sec",		tSEC_UNIT,	1 },
-     { NULL }
- };
- 
- /* Assorted relative-time words. */
- static TABLE const OtherTable[] = {
-     { "tomorrow",	tMINUTE_UNIT,	1 * 24 * 60 },
-     { "yesterday",	tMINUTE_UNIT,	-1 * 24 * 60 },
-     { "today",		tMINUTE_UNIT,	0 },
-     { "now",		tMINUTE_UNIT,	0 },
-     { "last",		tUNUMBER,	-1 },
-     { "this",		tMINUTE_UNIT,	0 },
-     { "next",		tUNUMBER,	2 },
-     { "first",		tUNUMBER,	1 },
- /*  { "second",		tUNUMBER,	2 }, */
-     { "third",		tUNUMBER,	3 },
-     { "fourth",		tUNUMBER,	4 },
-     { "fifth",		tUNUMBER,	5 },
-     { "sixth",		tUNUMBER,	6 },
-     { "seventh",	tUNUMBER,	7 },
-     { "eighth",		tUNUMBER,	8 },
-     { "ninth",		tUNUMBER,	9 },
-     { "tenth",		tUNUMBER,	10 },
-     { "eleventh",	tUNUMBER,	11 },
-     { "twelfth",	tUNUMBER,	12 },
-     { "ago",		tAGO,	1 },
-     { NULL }
- };
- 
- /* The timezone table. */
- /* Some of these are commented out because a time_t can't store a float. */
- static TABLE const TimezoneTable[] = {
-     { "gmt",	tZONE,     HOUR ( 0) },	/* Greenwich Mean */
-     { "ut",	tZONE,     HOUR ( 0) },	/* Universal (Coordinated) */
-     { "utc",	tZONE,     HOUR ( 0) },
-     { "wet",	tZONE,     HOUR ( 0) },	/* Western European */
-     { "bst",	tDAYZONE,  HOUR ( 0) },	/* British Summer */
-     { "wat",	tZONE,     HOUR ( 1) },	/* West Africa */
-     { "at",	tZONE,     HOUR ( 2) },	/* Azores */
- #if	0
-     /* For completeness.  BST is also British Summer, and GST is
-      * also Guam Standard. */
-     { "bst",	tZONE,     HOUR ( 3) },	/* Brazil Standard */
-     { "gst",	tZONE,     HOUR ( 3) },	/* Greenland Standard */
- #endif
- #if 0
-     { "nft",	tZONE,     HOUR (3.5) },	/* Newfoundland */
-     { "nst",	tZONE,     HOUR (3.5) },	/* Newfoundland Standard */
-     { "ndt",	tDAYZONE,  HOUR (3.5) },	/* Newfoundland Daylight */
- #endif
-     { "ast",	tZONE,     HOUR ( 4) },	/* Atlantic Standard */
-     { "adt",	tDAYZONE,  HOUR ( 4) },	/* Atlantic Daylight */
-     { "est",	tZONE,     HOUR ( 5) },	/* Eastern Standard */
-     { "edt",	tDAYZONE,  HOUR ( 5) },	/* Eastern Daylight */
-     { "cst",	tZONE,     HOUR ( 6) },	/* Central Standard */
-     { "cdt",	tDAYZONE,  HOUR ( 6) },	/* Central Daylight */
-     { "mst",	tZONE,     HOUR ( 7) },	/* Mountain Standard */
-     { "mdt",	tDAYZONE,  HOUR ( 7) },	/* Mountain Daylight */
-     { "pst",	tZONE,     HOUR ( 8) },	/* Pacific Standard */
-     { "pdt",	tDAYZONE,  HOUR ( 8) },	/* Pacific Daylight */
-     { "yst",	tZONE,     HOUR ( 9) },	/* Yukon Standard */
-     { "ydt",	tDAYZONE,  HOUR ( 9) },	/* Yukon Daylight */
-     { "hst",	tZONE,     HOUR (10) },	/* Hawaii Standard */
-     { "hdt",	tDAYZONE,  HOUR (10) },	/* Hawaii Daylight */
-     { "cat",	tZONE,     HOUR (10) },	/* Central Alaska */
-     { "ahst",	tZONE,     HOUR (10) },	/* Alaska-Hawaii Standard */
-     { "nt",	tZONE,     HOUR (11) },	/* Nome */
-     { "idlw",	tZONE,     HOUR (12) },	/* International Date Line West */
-     { "cet",	tZONE,     -HOUR (1) },	/* Central European */
-     { "met",	tZONE,     -HOUR (1) },	/* Middle European */
-     { "mewt",	tZONE,     -HOUR (1) },	/* Middle European Winter */
-     { "mest",	tDAYZONE,  -HOUR (1) },	/* Middle European Summer */
-     { "mesz",	tDAYZONE,  -HOUR (1) },	/* Middle European Summer */
-     { "swt",	tZONE,     -HOUR (1) },	/* Swedish Winter */
-     { "sst",	tDAYZONE,  -HOUR (1) },	/* Swedish Summer */
-     { "fwt",	tZONE,     -HOUR (1) },	/* French Winter */
-     { "fst",	tDAYZONE,  -HOUR (1) },	/* French Summer */
-     { "eet",	tZONE,     -HOUR (2) },	/* Eastern Europe, USSR Zone 1 */
-     { "bt",	tZONE,     -HOUR (3) },	/* Baghdad, USSR Zone 2 */
- #if 0
-     { "it",	tZONE,     -HOUR (3.5) },/* Iran */
- #endif
-     { "zp4",	tZONE,     -HOUR (4) },	/* USSR Zone 3 */
-     { "zp5",	tZONE,     -HOUR (5) },	/* USSR Zone 4 */
- #if 0
-     { "ist",	tZONE,     -HOUR (5.5) },/* Indian Standard */
- #endif
-     { "zp6",	tZONE,     -HOUR (6) },	/* USSR Zone 5 */
- #if	0
-     /* For completeness.  NST is also Newfoundland Standard, and SST is
-      * also Swedish Summer. */
-     { "nst",	tZONE,     -HOUR (6.5) },/* North Sumatra */
-     { "sst",	tZONE,     -HOUR (7) },	/* South Sumatra, USSR Zone 6 */
- #endif	/* 0 */
-     { "wast",	tZONE,     -HOUR (7) },	/* West Australian Standard */
-     { "wadt",	tDAYZONE,  -HOUR (7) },	/* West Australian Daylight */
- #if 0
-     { "jt",	tZONE,     -HOUR (7.5) },/* Java (3pm in Cronusland!) */
- #endif
-     { "cct",	tZONE,     -HOUR (8) },	/* China Coast, USSR Zone 7 */
-     { "jst",	tZONE,     -HOUR (9) },	/* Japan Standard, USSR Zone 8 */
- #if 0
-     { "cast",	tZONE,     -HOUR (9.5) },/* Central Australian Standard */
-     { "cadt",	tDAYZONE,  -HOUR (9.5) },/* Central Australian Daylight */
- #endif
-     { "east",	tZONE,     -HOUR (10) },	/* Eastern Australian Standard */
-     { "eadt",	tDAYZONE,  -HOUR (10) },	/* Eastern Australian Daylight */
-     { "gst",	tZONE,     -HOUR (10) },	/* Guam Standard, USSR Zone 9 */
-     { "nzt",	tZONE,     -HOUR (12) },	/* New Zealand */
-     { "nzst",	tZONE,     -HOUR (12) },	/* New Zealand Standard */
-     { "nzdt",	tDAYZONE,  -HOUR (12) },	/* New Zealand Daylight */
-     { "idle",	tZONE,     -HOUR (12) },	/* International Date Line East */
-     {  NULL  }
- };
- 
- /* Military timezone table. */
- static TABLE const MilitaryTable[] = {
-     { "a",	tZONE,	HOUR (  1) },
-     { "b",	tZONE,	HOUR (  2) },
-     { "c",	tZONE,	HOUR (  3) },
-     { "d",	tZONE,	HOUR (  4) },
-     { "e",	tZONE,	HOUR (  5) },
-     { "f",	tZONE,	HOUR (  6) },
-     { "g",	tZONE,	HOUR (  7) },
-     { "h",	tZONE,	HOUR (  8) },
-     { "i",	tZONE,	HOUR (  9) },
-     { "k",	tZONE,	HOUR ( 10) },
-     { "l",	tZONE,	HOUR ( 11) },
-     { "m",	tZONE,	HOUR ( 12) },
-     { "n",	tZONE,	HOUR (- 1) },
-     { "o",	tZONE,	HOUR (- 2) },
-     { "p",	tZONE,	HOUR (- 3) },
-     { "q",	tZONE,	HOUR (- 4) },
-     { "r",	tZONE,	HOUR (- 5) },
-     { "s",	tZONE,	HOUR (- 6) },
-     { "t",	tZONE,	HOUR (- 7) },
-     { "u",	tZONE,	HOUR (- 8) },
-     { "v",	tZONE,	HOUR (- 9) },
-     { "w",	tZONE,	HOUR (-10) },
-     { "x",	tZONE,	HOUR (-11) },
-     { "y",	tZONE,	HOUR (-12) },
-     { "z",	tZONE,	HOUR (  0) },
-     { NULL }
- };
- 
- 
- 
- 
- /* ARGSUSED */
- static int
- yyerror (s)
-     char	*s;
- {
-   return 0;
- }
- 
- 
- static time_t
- ToSeconds (Hours, Minutes, Seconds, Meridian)
-     time_t	Hours;
-     time_t	Minutes;
-     time_t	Seconds;
-     MERIDIAN	Meridian;
- {
-   if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
-     return -1;
-   switch (Meridian) {
-   case MER24:
-     if (Hours < 0 || Hours > 23)
-       return -1;
-     return (Hours * 60L + Minutes) * 60L + Seconds;
-   case MERam:
-     if (Hours < 1 || Hours > 12)
-       return -1;
-     if (Hours == 12)
-       Hours = 0;
-     return (Hours * 60L + Minutes) * 60L + Seconds;
-   case MERpm:
-     if (Hours < 1 || Hours > 12)
-       return -1;
-     if (Hours == 12)
-       Hours = 0;
-     return ((Hours + 12) * 60L + Minutes) * 60L + Seconds;
-   default:
-     abort ();
-   }
-   /* NOTREACHED */
- }
- 
- 
- static time_t
- Convert (Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
-     time_t	Month;
-     time_t	Day;
-     time_t	Year;
-     time_t	Hours;
-     time_t	Minutes;
-     time_t	Seconds;
-     MERIDIAN	Meridian;
-     DSTMODE	DSTmode;
- {
-   static int DaysInMonth[12] = {
-     31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
-   };
-   time_t	tod;
-   time_t	Julian;
-   int		i;
- 
-   if (Year < 0)
-     Year = -Year;
-   if (Year < 100)
-     Year += 1900;
-   DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
-     ? 29 : 28;
-   if (Year < EPOCH || Year > 1999
-       || Month < 1 || Month > 12
-       /* Lint fluff:  "conversion from long may lose accuracy" */
-       || Day < 1 || Day > DaysInMonth[(int)--Month])
-     return -1;
- 
-   for (Julian = Day - 1, i = 0; i < Month; i++)
-     Julian += DaysInMonth[i];
-   for (i = EPOCH; i < Year; i++)
-     Julian += 365 + (i % 4 == 0);
-   Julian *= SECSPERDAY;
-   Julian += yyTimezone * 60L;
-   if ((tod = ToSeconds (Hours, Minutes, Seconds, Meridian)) < 0)
-     return -1;
-   Julian += tod;
-   if (DSTmode == DSTon
-       || (DSTmode == DSTmaybe && localtime (&Julian)->tm_isdst))
-     Julian -= 60 * 60;
-   return Julian;
- }
- 
- 
- static time_t
- DSTcorrect (Start, Future)
-     time_t	Start;
-     time_t	Future;
- {
-   time_t	StartDay;
-   time_t	FutureDay;
- 
-   StartDay = (localtime (&Start)->tm_hour + 1) % 24;
-   FutureDay = (localtime (&Future)->tm_hour + 1) % 24;
-   return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
- }
- 
- 
- static time_t
- RelativeDate (Start, DayOrdinal, DayNumber)
-     time_t	Start;
-     time_t	DayOrdinal;
-     time_t	DayNumber;
- {
-   struct tm	*tm;
-   time_t	now;
- 
-   now = Start;
-   tm = localtime (&now);
-   now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
-   now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
-   return DSTcorrect (Start, now);
- }
- 
- 
- static time_t
- RelativeMonth (Start, RelMonth)
-     time_t	Start;
-     time_t	RelMonth;
- {
-   struct tm	*tm;
-   time_t	Month;
-   time_t	Year;
- 
-   if (RelMonth == 0)
-     return 0;
-   tm = localtime (&Start);
-   Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
-   Year = Month / 12;
-   Month = Month % 12 + 1;
-   return DSTcorrect (Start,
- 		     Convert (Month, (time_t)tm->tm_mday, Year,
- 			      (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
- 			      MER24, DSTmaybe));
- }
- 
- 
- static int
- LookupWord (buff)
-     char		*buff;
- {
-   register char	*p;
-   register char	*q;
-   register const TABLE	*tp;
-   int			i;
-   int			abbrev;
- 
-   /* Make it lowercase. */
-   for (p = buff; *p; p++)
-     if (isupper (*p))
-       *p = tolower (*p);
- 
-   if (strcmp (buff, "am") == 0 || strcmp (buff, "a.m.") == 0) {
-     yylval.Meridian = MERam;
-     return tMERIDIAN;
-   }
-   if (strcmp (buff, "pm") == 0 || strcmp (buff, "p.m.") == 0) {
-     yylval.Meridian = MERpm;
-     return tMERIDIAN;
-   }
- 
-   /* See if we have an abbreviation for a month. */
-   if (strlen (buff) == 3)
-     abbrev = 1;
-   else if (strlen (buff) == 4 && buff[3] == '.') {
-     abbrev = 1;
-     buff[3] = '\0';
-   }
-   else
-     abbrev = 0;
- 
-   for (tp = MonthDayTable; tp->name; tp++) {
-     if (abbrev) {
-       if (strncmp (buff, tp->name, 3) == 0) {
- 	yylval.Number = tp->value;
- 	return tp->type;
-       }
-     }
-     else if (strcmp (buff, tp->name) == 0) {
-       yylval.Number = tp->value;
-       return tp->type;
-     }
-   }
- 
-   for (tp = TimezoneTable; tp->name; tp++)
-     if (strcmp (buff, tp->name) == 0) {
-       yylval.Number = tp->value;
-       return tp->type;
-     }
- 
-   if (strcmp (buff, "dst") == 0) 
-     return tDST;
- 
-   for (tp = UnitsTable; tp->name; tp++)
-     if (strcmp (buff, tp->name) == 0) {
-       yylval.Number = tp->value;
-       return tp->type;
-     }
- 
-   /* Strip off any plural and try the units table again. */
-   i = strlen (buff) - 1;
-   if (buff[i] == 's') {
-     buff[i] = '\0';
-     for (tp = UnitsTable; tp->name; tp++)
-       if (strcmp (buff, tp->name) == 0) {
- 	yylval.Number = tp->value;
- 	return tp->type;
-       }
-     buff[i] = 's';		/* Put back for "this" in OtherTable. */
-   }
- 
-   for (tp = OtherTable; tp->name; tp++)
-     if (strcmp (buff, tp->name) == 0) {
-       yylval.Number = tp->value;
-       return tp->type;
-     }
- 
-   /* Military timezones. */
-   if (buff[1] == '\0' && isalpha (*buff)) {
-     for (tp = MilitaryTable; tp->name; tp++)
-       if (strcmp (buff, tp->name) == 0) {
- 	yylval.Number = tp->value;
- 	return tp->type;
-       }
-   }
- 
-   /* Drop out any periods and try the timezone table again. */
-   for (i = 0, p = q = buff; *q; q++)
-     if (*q != '.')
-       *p++ = *q;
-     else
-       i++;
-   *p = '\0';
-   if (i)
-     for (tp = TimezoneTable; tp->name; tp++)
-       if (strcmp (buff, tp->name) == 0) {
- 	yylval.Number = tp->value;
- 	return tp->type;
-       }
- 
-   return tID;
- }
- 
- 
- static int
- yylex ()
- {
-   register char	c;
-   register char	*p;
-   char		buff[20];
-   int			Count;
-   int			sign;
- 
-   for ( ; ; ) {
-     while (isspace (*yyInput))
-       yyInput++;
- 
-     if (isdigit (c = *yyInput) || c == '-' || c == '+') {
-       if (c == '-' || c == '+') {
- 	sign = c == '-' ? -1 : 1;
- 	if (!isdigit (*++yyInput))
- 	  /* skip the '-' sign */
- 	  continue;
-       }
-       else
- 	sign = 0;
-       for (yylval.Number = 0; isdigit (c = *yyInput++); )
- 	yylval.Number = 10 * yylval.Number + c - '0';
-       yyInput--;
-       if (sign < 0)
- 	yylval.Number = -yylval.Number;
-       return sign ? tSNUMBER : tUNUMBER;
-     }
-     if (isalpha (c)) {
-       for (p = buff; isalpha (c = *yyInput++) || c == '.'; )
- 	if (p < &buff[sizeof buff - 1])
- 	  *p++ = c;
-       *p = '\0';
-       yyInput--;
-       return LookupWord (buff);
-     }
-     if (c != '(')
-       return *yyInput++;
-     Count = 0;
-     do {
-       c = *yyInput++;
-       if (c == '\0')
- 	return c;
-       if (c == '(')
- 	Count++;
-       else if (c == ')')
- 	Count--;
-     } while (Count > 0);
-   }
- }
- 
- #define TM_YEAR_ORIGIN 1900
- 
- /* Yield A - B, measured in seconds.  */
- static long
- difftm (a, b)
-      struct tm *a, *b;
- {
-   int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
-   int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
-   long days = (
- 	       /* difference in day of year */
- 	       a->tm_yday - b->tm_yday
- 	       /* + intervening leap days */
- 	       +  ((ay >> 2) - (by >> 2))
- 	       -  (ay/100 - by/100)
- 	       +  ((ay/100 >> 2) - (by/100 >> 2))
- 	       /* + difference in years * 365 */
- 	       +  (long)(ay-by) * 365
- 	       );
-   return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
- 	      + (a->tm_min - b->tm_min))
- 	  + (a->tm_sec - b->tm_sec));
- }
- 
- time_t
- get_date (p, now)
-     char		*p;
-     struct timeb	*now;
- {
-   struct tm		*tm, gmt;
-   struct timeb	ftz;
-   time_t		Start;
-   time_t		tod;
- 
-   yyInput = p;
-   if (now == NULL) {
-     now = &ftz;
-     (void)time (&ftz.time);
- 
-     if (! (tm = gmtime (&ftz.time)))
-       return -1;
-     gmt = *tm;			/* Make a copy, in case localtime modifies *tm.  */
- 
-     if (! (tm = localtime (&ftz.time)))
-       return -1;
- 	
-     ftz.timezone = difftm (&gmt, tm) / 60;
-     if (tm->tm_isdst)
-       ftz.timezone += 60;
-   }
- 
-   tm = localtime (&now->time);
-   yyYear = tm->tm_year;
-   yyMonth = tm->tm_mon + 1;
-   yyDay = tm->tm_mday;
-   yyTimezone = now->timezone;
-   yyDSTmode = DSTmaybe;
-   yyHour = 0;
-   yyMinutes = 0;
-   yySeconds = 0;
-   yyMeridian = MER24;
-   yyRelSeconds = 0;
-   yyRelMonth = 0;
-   yyHaveDate = 0;
-   yyHaveDay = 0;
-   yyHaveRel = 0;
-   yyHaveTime = 0;
-   yyHaveZone = 0;
- 
-   if (yyparse ()
-       || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
-     return -1;
- 
-   if (yyHaveDate || yyHaveTime || yyHaveDay) {
-     Start = Convert (yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
- 		     yyMeridian, yyDSTmode);
-     if (Start < 0)
-       return -1;
-   }
-   else {
-     Start = now->time;
-     if (!yyHaveRel)
-       Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec;
-   }
- 
-   Start += yyRelSeconds;
-   Start += RelativeMonth (Start, yyRelMonth);
- 
-   if (yyHaveDay && !yyHaveDate) {
-     tod = RelativeDate (Start, yyDayOrdinal, yyDayNumber);
-     Start += tod;
-   }
- 
-   /* Have to do *something* with a legitimate -1 so it's distinguishable
-    * from the error return value.  (Alternately could set errno on error.) */
-   return Start == -1 ? 0 : Start;
- }
- 
- 
- #if	defined (TEST)
- 
- /* ARGSUSED */
- int
- main (ac, av)
-     int		ac;
-     char	*av[];
- {
-   char buff[MAX_BUFF_LEN + 1];
-   time_t d;
- 
-   (void)printf ("Enter date, or blank line to exit.\n\t> ");
-   (void)fflush (stdout);
- 
-   buff[MAX_BUFF_LEN] = 0;
-   while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0]) {
-     d = get_date (buff, (struct timeb *)NULL);
-     if (d == -1)
-       (void)printf ("Bad format - couldn't convert.\n");
-     else
-       (void)printf ("%s", ctime (&d));
-     (void)printf ("\t> ");
-     (void)fflush (stdout);
-   }
-   exit (0);
-   /* NOTREACHED */
- }
- #endif	/* defined (TEST) */
--- 0 ----
Index: emacs/lib-src/make-docfile.c
diff -c emacs/lib-src/make-docfile.c:1.1.1.2 emacs/lib-src/make-docfile.c:1.3
*** emacs/lib-src/make-docfile.c:1.1.1.2	Mon Jul 22 01:48:07 1996
--- emacs/lib-src/make-docfile.c	Wed Jul 31 01:32:51 1996
***************
*** 18,26 ****
  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The arguments given to this program are all the C and Lisp source files
!  of GNU Emacs.  .elc and .el and .c files are allowed.
!  A .o file can also be specified; the .c file it was made from is used.
!  This helps the makefile pass the correct list of files.
  
   The results, which go to standard output or to a file
   specified with -a or -o (-a to append, -o to start from nothing),
--- 18,27 ----
  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The arguments given to this program are all the C and Lisp source files
!  of GNU Emacs.  .elc and .el and .c files are allowed.  A .o file can also
!  be specified; the .c file it was made from is used.  If this doesn't exist
!  the .m file it was made from is used instead.  This helps the makefile
!  pass the correct list of files.
  
   The results, which go to standard output or to a file
   specified with -a or -o (-a to append, -o to start from nothing),
***************
*** 35,40 ****
--- 36,42 ----
  #include <../src/config.h>
  
  #include <stdio.h>
+ #include <errno.h>
  #ifdef MSDOS
  #include <fcntl.h>
  #endif /* MSDOS */
***************
*** 322,331 ****
      }
  }
  
! /* Read through a c file.  If a .o file is named,
!    the corresponding .c file is read instead.
!    Looks for DEFUN constructs such as are defined in ../src/lisp.h.
!    Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED.  */
  
  int
  scan_c_file (filename, mode)
--- 324,334 ----
      }
  }
  
! /* Read through a c file.  If a .o file is named, the corresponding .c file
!    is read instead.  If it does not exits, the corresponding .m file is
!    read instead.  Looks for DEFUN constructs such as are defined in
!    ../src/lisp.h.  Accepts any word starting DEF... so it finds DEFSIMPLE
!    and DEFPRED.  */
  
  int
  scan_c_file (filename, mode)
***************
*** 344,349 ****
--- 347,359 ----
      filename[strlen (filename) - 1] = 'c';
  
    infile = fopen (filename, mode);
+ 
+   /* If .c file does not exist, try opening a .m file.  */
+   if (infile == NULL && errno == ENOENT)
+     {
+       filename[strlen (filename) - 1] = 'm';
+       infile = fopen (filename, "r");
+     }
  
    /* No error if non-ex input file */
    if (infile == NULL)
Index: emacs/lib-src/makeinfo.c
diff -c /dev/null emacs/lib-src/makeinfo.c:1.2
*** /dev/null	Fri Aug  2 20:30:04 1996
--- emacs/lib-src/makeinfo.c	Wed Jul 31 01:32:55 1996
***************
*** 0 ****
--- 1,9287 ----
+ /* Makeinfo -- convert texinfo format files into info files.
+ 
+    Copyright (C) 1987, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
+    This file is part of GNU Info.
+ 
+    Makeinfo is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY.  No author or distributor accepts
+    responsibility to anyone for the consequences of using it or for
+    whether it serves any particular purpose or works at all, unless he
+    says so in writing.  Refer to the GNU Emacs General Public License
+    for full details.
+ 
+    Everyone is granted permission to copy, modify and redistribute
+    Makeinfo, but only under the conditions described in the GNU Emacs
+    General Public License.   A copy of this license is supposed to
+    have been given to you along with GNU Emacs so you can know your
+    rights and responsibilities.  It should be in a file named COPYING.
+    Among other things, the copyright notice and this notice must be
+    preserved on all copies.  */
+ 
+ #ifdef HAVE_CONFIG_H
+ #include <config.h>
+ #endif
+ 
+ /* This is Makeinfo version 1.64.  If you change the version number of
+    Makeinfo, please change it here and at the lines reading:
+ 
+     int major_version = 1;
+     int minor_version = 64;
+ 
+    in the code below.
+ 
+    Makeinfo is authored by Brian Fox (bfox@ai.mit.edu). */
+ 
+ /* You can change some of the behaviour of Makeinfo by changing the
+    following defines: */
+ 
+ /* Define INDENT_PARAGRAPHS_IN_TABLE if you want the paragraphs which
+    appear within an @table, @ftable, or @itemize environment to have
+    standard paragraph indentation.  Without this, such paragraphs have
+    no starting indentation. */
+ /* #define INDENT_PARAGRAPHS_IN_TABLE */
+ 
+ /* Define DEFAULT_INDENTATION_INCREMENT as an integer which is the amount
+    that @example should increase indentation by.  This incremement is used
+    for all insertions which indent the enclosed text. */
+ #define DEFAULT_INDENTATION_INCREMENT 5
+ 
+ /* Define PARAGRAPH_START_INDENT to be the amount of indentation that
+    the first lines of paragraphs receive by default, where no other
+    value has been specified.  Users can change this value on the command
+    line, with the --paragraph-indent option, or within the texinfo file,
+    with the @paragraphindent command. */
+ #define PARAGRAPH_START_INDENT 3
+ 
+ /* Define DEFAULT_PARAGRAPH_SPACING as the number of blank lines that you
+    wish to appear between paragraphs.  A value of 1 creates a single blank
+    line between paragraphs.  Paragraphs are defined by 2 or more consecutive
+    newlines in the input file (i.e., one or more blank lines). */
+ #define DEFAULT_PARAGRAPH_SPACING 1
+ 
+ /* Define HAVE_MACROS to enable the macro facility of TeXinfo.  Using this
+    facility, users can create their own command procedures with arguments. */
+ #define HAVE_MACROS
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Include File Declarations       	    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Indent #pragma so that older Cpp's don't try to parse it. */
+ #if defined (_AIX)
+  # pragma alloca
+ #endif /* _AIX */
+ 
+ #include <stdio.h>
+ #include <sys/types.h>
+ #include <ctype.h>
+ #include <sys/stat.h>
+ #include <pwd.h>
+ #include <errno.h>
+ 
+ #if defined (HAVE_VARARGS_H)
+ #include <varargs.h>
+ #endif /* HAVE_VARARGS_H */
+ #include "getopt.h"
+ 
+ #if defined (HAVE_UNISTD_H)
+ #include <unistd.h>
+ #endif /* HAVE_UNISTD_H */
+ 
+ #if defined (VMS)
+ #include <perror.h>
+ #endif
+ 
+ #if defined (HAVE_STRING_H)
+ #include <string.h>
+ #else
+ #include <strings.h>
+ #endif /* !HAVE_STRING_H */
+ 
+ #if defined (TM_IN_SYS_TIME)
+ #include <sys/time.h>
+ #else
+ #include <time.h>
+ #endif /* !TM_IN_SYS_TIME */
+ 
+ #if defined (HAVE_SYS_FCNTL_H)
+ #include <sys/fcntl.h>
+ #else
+ #include <fcntl.h>
+ #endif /* !HAVE_SYS_FCNTL_H */
+ 
+ #if defined (HAVE_SYS_FILE_H)
+ #include <sys/file.h>
+ #endif /* HAVE_SYS_FILE_H */
+ 
+ #if defined (__GNUC__)
+ #define alloca __builtin_alloca
+ #else
+ #if defined(HAVE_ALLOCA_H)
+ #include <alloca.h>
+ #else /* !HAVE_ALLOCA_H */
+ #if !defined (_AIX)
+ extern char *alloca ();
+ #endif /* !_AIX */
+ #endif /* !HAVE_ALLOCA_H */
+ #endif /* !__GNUC__ */
+ 
+ void *xmalloc (), *xrealloc ();
+ #if defined (__osf__)
+ extern void *malloc (), *realloc ();
+ #endif /* __osf__ */
+ 
+ char **get_brace_args ();
+ int array_len ();
+ void free_array ();
+ static void isolate_nodename ();
+ 
+ #if !defined (HAVE_MEMMOVE)
+ #  define memmove(dst, src, len) bcopy (src, dst, len)
+ #endif
+ 
+ /* Non-zero means that we are currently hacking the insides of an
+    insertion which would use a fixed width font. */
+ static int in_fixed_width_font = 0;
+ 
+ /* Non-zero means that start_paragraph () MUST be called before we pay
+    any attention to close_paragraph () calls. */
+ int must_start_paragraph = 0;
+ 
+ /* Non-zero means a string is in execution, as opposed to a file. */
+ static int executing_string = 0;
+ 
+ #if defined (HAVE_MACROS)
+ /* If non-NULL, this is an output stream to write the full macro expansion
+    of the input text to.  The resultant file is another texinfo file, but
+    missing @include, @infoinclude, @macro, and macro invocations.  Instead,
+    all of the text is placed within the file. */
+ FILE *macro_expansion_output_stream = (FILE *)NULL;
+ 
+ /* Here is a structure used to remember input text strings and offsets
+    within them. */
+ typedef struct {
+   char *pointer;		/* Pointer to the input text. */
+   int offset;			/* Offset of the last character output. */
+ } ITEXT;
+ 
+ static ITEXT **itext_info = (ITEXT **)NULL;
+ static int itext_size = 0;
+ 
+ /* Non-zero means to inhibit the writing of macro expansions to the output
+    stream.  This is used in special cases where the output has already been
+    written. */
+ int me_inhibit_expansion = 0;
+ 
+ ITEXT *remember_itext ();
+ void forget_itext (), me_append_before_this_command ();
+ void append_to_expansion_output (), write_region_to_macro_output ();
+ void maybe_write_itext (), me_execute_string ();
+ #endif /* HAVE_MACROS */
+ 
+ /* Some systems don't declare this function in pwd.h. */
+ struct passwd *getpwnam ();
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			      Global Defines  			    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Error levels */
+ #define NO_ERROR 0
+ #define SYNTAX	 2
+ #define FATAL	 4
+ 
+ /* C's standard macros don't check to make sure that the characters being
+    changed are within range.  So I have to check explicitly. */
+ 
+ /* GNU Library doesn't have toupper().  Until GNU gets this fixed, I will
+    have to do it. */
+ #ifndef toupper
+ #define toupper(c) ((c) - 32)
+ #endif
+ 
+ #define coerce_to_upper(c) ((islower(c) ? toupper(c) : (c)))
+ #define coerce_to_lower(c) ((isupper(c) ? tolower(c) : (c)))
+ 
+ #define control_character_bit 0x40 /* %01000000, must be off. */
+ #define meta_character_bit 0x080/* %10000000, must be on.  */
+ #define CTL(c) ((c) & (~control_character_bit))
+ #define UNCTL(c) coerce_to_upper(((c)|control_character_bit))
+ #define META(c) ((c) | (meta_character_bit))
+ #define UNMETA(c) ((c) & (~meta_character_bit))
+ 
+ #define whitespace(c) (((c) == '\t') || ((c) == ' '))
+ #define sentence_ender(c) ((c) == '.' || (c) == '?' || (c) == '!')
+ #define cr_or_whitespace(c) (((c) == '\t') || ((c) == ' ') || ((c) == '\n'))
+ 
+ #ifndef isletter
+ #define isletter(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z'))
+ #endif
+ 
+ #ifndef isupper
+ #define isupper(c) ((c) >= 'A' && (c) <= 'Z')
+ #endif
+ 
+ #ifndef isdigit
+ #define isdigit(c)  ((c) >= '0' && (c) <= '9')
+ #endif
+ 
+ #ifndef digit_value
+ #define digit_value(c) ((c) - '0')
+ #endif
+ 
+ #define member(c, s) (strchr (s, c) != NULL)
+ 
+ #define COMMAND_PREFIX '@'
+ 
+ /* Stuff for splitting large files. */
+ #define SPLIT_SIZE_THRESHOLD 70000  /* What's good enough for Stallman... */
+ #define DEFAULT_SPLIT_SIZE 50000    /* Is probably good enough for me. */
+ int splitting = 1;		    /* Always true for now. */
+ 
+ typedef void COMMAND_FUNCTION (); /* So I can say COMMAND_FUNCTION *foo; */
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			    Global Variables			    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Global pointer to argv[0]. */
+ char *progname;
+ 
+ /* The current input file state. */
+ char *input_filename;
+ char *input_text;
+ int size_of_input_text;
+ int input_text_offset;
+ int line_number;
+ 
+ #define curchar() input_text[input_text_offset]
+ 
+ #define command_char(c) ((!whitespace(c)) && \
+ 			 ((c) != '\n') && \
+ 			 ((c) != '{') && \
+ 			 ((c) != '}') && \
+ 			 ((c) != '='))
+ 
+ #define skip_whitespace() while (input_text_offset != size_of_input_text \
+ 				 && whitespace(curchar()))\
+   input_text_offset++
+ 
+ #define skip_whitespace_and_newlines() \
+   do { \
+    while (input_text_offset != size_of_input_text \
+ 	  && (whitespace (curchar ()) \
+ 	      || (curchar () == '\n'))) \
+       { \
+ 	 if (curchar () == '\n') \
+ 	   line_number++; \
+ 	 input_text_offset++; \
+       } \
+    } while (0)
+ 
+ /* Return non-zero if STRING is the text at input_text + input_text_offset,
+    else zero. */
+ #define looking_at(string) \
+   (strncmp (input_text + input_text_offset, string, strlen (string)) == 0)
+ 
+ /* And writing to the output. */
+ 
+ /* The output file name. */
+ char *output_filename = (char *)NULL;
+ char *pretty_output_filename;
+ 
+ /* Name of the output file that the user elected to pass on the command line.
+    Such a name overrides any name found with the @setfilename command. */
+ char *command_output_filename = (char *)NULL;
+ 
+ /* A colon separated list of directories to search for files included
+    with @include.  This can be controlled with the `-I' option to makeinfo. */
+ char *include_files_path = (char *)NULL;
+ 
+ /* Current output stream. */
+ FILE *output_stream;
+ 
+ /* Position in the output file. */
+ int output_position;
+ 
+ /* Output paragraph buffer. */
+ unsigned char *output_paragraph;
+ 
+ /* Offset into OUTPUT_PARAGRAPH. */
+ int output_paragraph_offset;
+ 
+ /* The output paragraph "cursor" horizontal position. */
+ int output_column = 0;
+ 
+ /* Non-zero means output_paragraph contains text. */
+ int paragraph_is_open = 0;
+ 
+ #define INITIAL_PARAGRAPH_SPACE 5000
+ int paragraph_buffer_len = INITIAL_PARAGRAPH_SPACE;
+ 
+ /* Filling.. */
+ /* Non-zero indicates that filling will take place on long lines. */
+ int filling_enabled = 1;
+ 
+ /* Non-zero means that words are not to be split, even in long lines.  This
+    gets changed for cm_w (). */
+ int non_splitting_words = 0;
+ 
+ /* Non-zero indicates that filling a line also indents the new line. */
+ int indented_fill = 0;
+ 
+ /* The column at which long lines are broken. */
+ int fill_column = 72;
+ 
+ /* The amount of indentation to apply at the start of each line. */
+ int current_indent = 0;
+ 
+ /* The amount of indentation to add at the starts of paragraphs.
+    0 means don't change existing indentation at paragraph starts.
+    > 0 is amount to indent new paragraphs by.
+    < 0 means indent to column zero by removing indentation if necessary.
+ 
+    This is normally zero, but some people prefer paragraph starts to be
+    somewhat more indented than paragraph bodies.  A pretty value for
+    this is 3. */
+ int paragraph_start_indent = PARAGRAPH_START_INDENT;
+ 
+ /* Non-zero means that the use of paragraph_start_indent is inhibited.
+    @example uses this to line up the left columns of the example text.
+    A negative value for this variable is incremented each time it is used.
+    @noindent uses this to inhibit indentation for a single paragraph.  */
+ int inhibit_paragraph_indentation = 0;
+ 
+ /* Indentation that is pending insertion.  We have this for hacking lines
+    which look blank, but contain whitespace.  We want to treat those as
+    blank lines. */
+ int pending_indent = 0;
+ 
+ /* The amount that indentation increases/decreases by. */
+ int default_indentation_increment = DEFAULT_INDENTATION_INCREMENT;
+ 
+ /* Non-zero indicates that indentation is temporarily turned off. */
+ int no_indent = 1;
+ 
+ /* Non-zero means forcing output text to be flushright. */
+ int force_flush_right = 0;
+ 
+ /* Non-zero means that the footnote style for this document was set on
+    the command line, which overrides any other settings. */
+ int footnote_style_preset = 0;
+ 
+ /* Non-zero means that we automatically number footnotes that have no
+    specified marker. */
+ int number_footnotes = 1;
+ 
+ /* The current footnote number in this node.  Each time a new node is
+    started this is reset to 1. */
+ int current_footnote_number = 1;
+ 
+ /* Command name in the process of being hacked. */
+ char *command;
+ 
+ /* The index in our internal command table of the currently
+    executing command. */
+ int command_index;
+ 
+ /* A search string which is used to find a line defining a node. */
+ char node_search_string[] =
+   { '\n', COMMAND_PREFIX, 'n', 'o', 'd', 'e', ' ', '\0' };
+ 
+ /* A search string which is used to find a line defining a menu. */
+ char menu_search_string[] =
+   { '\n', COMMAND_PREFIX, 'm', 'e', 'n', 'u', '\0' };
+ 
+ /* A search string which is used to find the first @setfilename. */
+ char setfilename_search[] =
+   { COMMAND_PREFIX,
+       's', 'e', 't', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\0' };
+ 
+ /* A stack of file information records.  If a new file is read in with
+    "@input", we remember the old input file state on this stack. */
+ typedef struct fstack
+ {
+   struct fstack *next;
+   char *filename;
+   char *text;
+   int size;
+   int offset;
+   int line_number;
+ } FSTACK;
+ 
+ FSTACK *filestack = (FSTACK *) NULL;
+ 
+ /* Stuff for nodes. */
+ /* The current nodes node name. */
+ char *current_node = (char *)NULL;
+ 
+ /* The current nodes section level. */
+ int current_section = 0;
+ 
+ /* The filename of the current input file.  This is never freed. */
+ char *node_filename = (char *)NULL;
+ 
+ /* What we remember for each node. */
+ typedef struct tentry
+ {
+   struct tentry *next_ent;
+   char *node;		/* name of this node. */
+   char *prev;		/* name of "Prev:" for this node. */
+   char *next;		/* name of "Next:" for this node. */
+   char *up;		/* name of "Up:" for this node.   */
+   int position;		/* output file position of this node. */
+   int line_no;		/* defining line in source file. */
+   char *filename;	/* The file that this node was found in. */
+   int touched;		/* non-zero means this node has been referenced. */
+   int flags;		/* Room for growth.  Right now, contains 1 bit. */
+ } TAG_ENTRY;
+ 
+ /* If node-a has a "Next" for node-b, but node-b has no "Prev" for node-a,
+    we turn on this flag bit in node-b's tag entry.  This means that when
+    it is time to validate node-b, we don't report an additional error
+    if there was no "Prev" field. */
+ #define PREV_ERROR 0x1
+ #define NEXT_ERROR 0x2
+ #define UP_ERROR   0x4
+ #define NO_WARN	   0x8
+ #define IS_TOP 	   0x10
+ 
+ TAG_ENTRY *tag_table = (TAG_ENTRY *) NULL;
+ 
+ #if defined (HAVE_MACROS)
+ #define ME_RECURSE	0x01
+ #define ME_QUOTE_ARG	0x02
+ 
+ /* Macro definitions for user-defined commands. */
+ typedef struct {
+   char *name;			/* Name of the macro. */
+   char **arglist;		/* Args to replace when executing. */
+   char *body;			/* Macro body. */
+   char *source_file;		/* File where this macro is defined. */
+   int source_lineno;		/* Line number within FILENAME. */
+   int inhibited;		/* Non-zero means make find_macro () fail. */
+   int flags;			/* ME_RECURSE, ME_QUOTE_ARG, etc. */
+ } MACRO_DEF;
+ 
+ void add_macro (), execute_macro ();
+ MACRO_DEF *find_macro (), *delete_macro ();
+ #endif /* HAVE_MACROS */
+ 
+ /* Menu reference, *note reference, and validation hacking. */
+ 
+ /* The various references that we know about. */
+ enum reftype
+ {
+   menu_reference, followed_reference
+ };
+ 
+ /* A structure to remember references with.  A reference to a node is
+    either an entry in a menu, or a cross-reference made with [px]ref. */
+ typedef struct node_ref
+ {
+   struct node_ref *next;
+   char *node;			/* Name of node referred to. */
+   char *containing_node;	/* Name of node containing this reference. */
+   int line_no;			/* Line number where the reference occurs. */
+   int section;			/* Section level where the reference occurs. */
+   char *filename;		/* Name of file where the reference occurs. */
+   enum reftype type;		/* Type of reference, either menu or note. */
+ } NODE_REF;
+ 
+ /* The linked list of such structures. */
+ NODE_REF *node_references = (NODE_REF *) NULL;
+ 
+ /* Flag which tells us whether to examine menu lines or not. */
+ int in_menu = 0;
+ 
+ /* Non-zero means that we have seen "@top" once already. */
+ int top_node_seen = 0;
+ 
+ /* Non-zero means that we have seen a non-"@top" node already. */
+ int non_top_node_seen = 0;
+ 
+ /* Flags controlling the operation of the program. */
+ 
+ /* Default is to notify users of bad choices. */
+ int print_warnings = 1;
+ 
+ /* Default is to check node references. */
+ int validating = 1;
+ 
+ /* Non-zero means do not output "Node: Foo" for node separations. */
+ int no_headers = 0;
+ 
+ /* Number of errors that we tolerate on a given fileset. */
+ int max_error_level = 100;
+ 
+ /* Maximum number of references to a single node before complaining. */
+ int reference_warning_limit = 1000;
+ 
+ /* Non-zero means print out information about what is going on when it
+    is going on. */
+ int verbose_mode = 0;
+ 
+ /* Non-zero means to be relaxed about the input file.  This is useful when
+    we can successfully format the input, but it doesn't strictly match our
+    somewhat pedantic ideas of correctness.  Right now, it affects what
+    @table and @itemize do without arguments. */
+ int allow_lax_format = 0;
+ 
+ /* The list of commands that we hack in texinfo.  Each one
+    has an associated function.  When the command is encountered in the
+    text, the associated function is called with START as the argument.
+    If the function expects arguments in braces, it remembers itself on
+    the stack.  When the corresponding close brace is encountered, the
+    function is called with END as the argument. */
+ 
+ #define START 0
+ #define END 1
+ 
+ typedef struct brace_element
+ {
+   struct brace_element *next;
+   COMMAND_FUNCTION *proc;
+   int pos, line;
+ } BRACE_ELEMENT;
+ 
+ BRACE_ELEMENT *brace_stack = (BRACE_ELEMENT *) NULL;
+ 
+ /* Forward declarations. */
+ #if !defined (HAVE_STRDUP)
+ extern char *strdup ();
+ #endif /* HAVE_STRDUP */
+ 
+ void print_version_info ();
+ void usage ();
+ void push_node_filename (), pop_node_filename ();
+ void remember_error ();
+ void convert_from_stream (), convert_from_file (), convert_from_loaded_file ();
+ void init_internals (), init_paragraph (), init_brace_stack ();
+ void init_insertion_stack (), init_indices ();
+ void init_tag_table (), write_tag_table (), write_tag_table_internal ();
+ void validate_file (), validate_other_references (), split_file ();
+ void free_node_references (), do_enumeration (), handle_variable ();
+ void handle_variable_internal ();
+ void execute_string ();
+ void normalize_node_name ();
+ void undefindex (), top_defindex (), gen_defindex ();
+ void define_user_command ();
+ void free_pending_notes (), output_pending_notes ();
+ 
+ void reader_loop (), read_command ();
+ void remember_brace (), remember_brace_1 ();
+ void pop_and_call_brace (), discard_braces ();
+ void add_word_args (), add_word (), add_char (), insert (), flush_output ();
+ void close_paragraph_with_lines (), close_paragraph ();
+ void ignore_blank_line ();
+ void do_flush_right_indentation ();
+ void start_paragraph (), indent ();
+ 
+ void insert_self (), cm_ignore_line ();
+ 
+ void
+   cm_asterisk (), cm_dots (), cm_bullet (), cm_TeX (),
+   cm_copyright (), cm_code (), cm_samp (), cm_file (), cm_kbd (),
+   cm_key (), cm_ctrl (), cm_var (), cm_dfn (), cm_emph (), cm_strong (),
+   cm_cite (), cm_italic (), cm_bold (), cm_roman (), cm_title (), cm_w (),
+   cm_refill (), cm_titlefont ();
+ 
+ void
+   cm_chapter (), cm_unnumbered (), cm_appendix (), cm_top (),
+   cm_section (), cm_unnumberedsec (), cm_appendixsec (),
+   cm_subsection (), cm_unnumberedsubsec (), cm_appendixsubsec (),
+   cm_subsubsection (), cm_unnumberedsubsubsec (), cm_appendixsubsubsec (),
+   cm_heading (), cm_chapheading (), cm_subheading (), cm_subsubheading (),
+   cm_majorheading (), cm_raisesections (), cm_lowersections ();
+ 
+ /* All @defxxx commands map to cm_defun (). */
+ void cm_defun ();
+ 
+ void
+   cm_node (), cm_menu (), cm_xref (), cm_ftable (), cm_vtable (), cm_pxref (),
+   cm_inforef (), cm_quotation (), cm_display (), cm_itemize (),
+   cm_enumerate (), cm_table (), cm_itemx (), cm_noindent (), cm_setfilename (),
+   cm_br (), cm_sp (), cm_page (), cm_group (), cm_center (), cm_include (),
+   cm_bye (), cm_item (), cm_end (), cm_infoinclude (), cm_ifinfo (),
+   cm_kindex (), cm_cindex (), cm_findex (), cm_pindex (), cm_vindex (),
+   cm_tindex (), cm_asis (), cm_synindex (), cm_printindex (), cm_minus (),
+   cm_footnote (), cm_force_abbreviated_whitespace (), cm_example (),
+   cm_smallexample (), cm_lisp (), cm_format (), cm_exdent (), cm_defindex (),
+   cm_defcodeindex (), cm_sc (), cm_result (), cm_expansion (), cm_equiv (),
+   cm_print (), cm_error (), cm_point (), cm_today (), cm_flushleft (),
+   cm_flushright (), cm_smalllisp (), cm_finalout (), cm_math (),
+   cm_cartouche (), cm_ignore_sentence_ender ();
+ 
+ /* Conditionals. */
+ void cm_set (), cm_clear (), cm_ifset (), cm_ifclear ();
+ void cm_value (), cm_ifeq ();
+ 
+ #if defined (HAVE_MACROS)
+ /* Define a user-defined command which is simple substitution. */
+ void cm_macro (), cm_unmacro ();
+ #endif /* HAVE_MACROS */
+ 
+ /* Options. */
+ void cm_paragraphindent (), cm_footnotestyle ();
+ 
+ /* Internals. */
+ void do_nothing (), command_name_condition ();
+ void misplaced_brace (), cm_obsolete ();
+ 
+ typedef struct
+ {
+   char *name;
+   COMMAND_FUNCTION *proc;
+   int argument_in_braces;
+ } COMMAND;
+ 
+ /* Stuff for defining commands on the fly. */
+ COMMAND **user_command_array = (COMMAND **) NULL;
+ int user_command_array_len = 0;
+ 
+ #define NO_BRACE_ARGS 0
+ #define BRACE_ARGS 1
+ 
+ static COMMAND CommandTable[] = {
+   { "!", cm_ignore_sentence_ender, NO_BRACE_ARGS },
+   { "'", insert_self, NO_BRACE_ARGS },
+   { "*", cm_asterisk, NO_BRACE_ARGS },
+   { ".", cm_ignore_sentence_ender, NO_BRACE_ARGS },
+   { ":", cm_force_abbreviated_whitespace, NO_BRACE_ARGS },
+   { "?", cm_ignore_sentence_ender, NO_BRACE_ARGS },
+   { "|", do_nothing, NO_BRACE_ARGS },
+   { "@", insert_self, NO_BRACE_ARGS },
+   { " ", insert_self, NO_BRACE_ARGS },
+   { "\n", insert_self, NO_BRACE_ARGS },
+   { "TeX", cm_TeX, BRACE_ARGS },
+   { "`", insert_self, NO_BRACE_ARGS },
+   { "appendix", cm_appendix, NO_BRACE_ARGS },
+   { "appendixsection", cm_appendixsec, NO_BRACE_ARGS },
+   { "appendixsec", cm_appendixsec, NO_BRACE_ARGS },
+   { "appendixsubsec", cm_appendixsubsec, NO_BRACE_ARGS },
+   { "appendixsubsubsec", cm_appendixsubsubsec, NO_BRACE_ARGS },
+   { "asis", cm_asis, BRACE_ARGS },
+   { "b", cm_bold, BRACE_ARGS },
+   { "br", cm_br, NO_BRACE_ARGS },
+   { "bullet", cm_bullet, BRACE_ARGS },
+   { "bye", cm_bye, NO_BRACE_ARGS },
+   { "c", cm_ignore_line, NO_BRACE_ARGS },
+   { "cartouche", cm_cartouche, NO_BRACE_ARGS },
+   { "center", cm_center, NO_BRACE_ARGS },
+   { "chapheading", cm_chapheading, NO_BRACE_ARGS },
+   { "chapter", cm_chapter, NO_BRACE_ARGS },
+   { "cindex", cm_cindex, NO_BRACE_ARGS },
+   { "cite", cm_cite, BRACE_ARGS },
+   { "clear", cm_clear, NO_BRACE_ARGS },
+   { "code", cm_code, BRACE_ARGS },
+   { "comment", cm_ignore_line, NO_BRACE_ARGS },
+   { "contents", do_nothing, NO_BRACE_ARGS },
+   { "copyright", cm_copyright, BRACE_ARGS },
+   { "ctrl", cm_ctrl, BRACE_ARGS },
+   { "defcodeindex", cm_defcodeindex, NO_BRACE_ARGS },
+   { "defindex", cm_defindex, NO_BRACE_ARGS },
+   { "dfn", cm_dfn, BRACE_ARGS },
+ 
+ /* The `def' commands. */
+   { "deffn", cm_defun, NO_BRACE_ARGS },
+   { "deffnx", cm_defun, NO_BRACE_ARGS },
+   { "defun", cm_defun, NO_BRACE_ARGS },
+   { "defunx", cm_defun, NO_BRACE_ARGS },
+   { "defmac", cm_defun, NO_BRACE_ARGS },
+   { "defmacx", cm_defun, NO_BRACE_ARGS },
+   { "defspec", cm_defun, NO_BRACE_ARGS },
+   { "defspecx", cm_defun, NO_BRACE_ARGS },
+   { "defvr", cm_defun, NO_BRACE_ARGS },
+   { "defvrx", cm_defun, NO_BRACE_ARGS },
+   { "defvar", cm_defun, NO_BRACE_ARGS },
+   { "defvarx", cm_defun, NO_BRACE_ARGS },
+   { "defopt", cm_defun, NO_BRACE_ARGS },
+   { "defoptx", cm_defun, NO_BRACE_ARGS },
+   { "deftypefn", cm_defun, NO_BRACE_ARGS },
+   { "deftypefnx", cm_defun, NO_BRACE_ARGS },
+   { "deftypefun", cm_defun, NO_BRACE_ARGS },
+   { "deftypefunx", cm_defun, NO_BRACE_ARGS },
+   { "deftypevr", cm_defun, NO_BRACE_ARGS },
+   { "deftypevrx", cm_defun, NO_BRACE_ARGS },
+   { "deftypevar", cm_defun, NO_BRACE_ARGS },
+   { "deftypevarx", cm_defun, NO_BRACE_ARGS },
+   { "defcv", cm_defun, NO_BRACE_ARGS },
+   { "defcvx", cm_defun, NO_BRACE_ARGS },
+   { "defivar", cm_defun, NO_BRACE_ARGS },
+   { "defivarx", cm_defun, NO_BRACE_ARGS },
+   { "defop", cm_defun, NO_BRACE_ARGS },
+   { "defopx", cm_defun, NO_BRACE_ARGS },
+   { "defmethod", cm_defun, NO_BRACE_ARGS },
+   { "defmethodx", cm_defun, NO_BRACE_ARGS },
+   { "deftypemethod", cm_defun, NO_BRACE_ARGS },
+   { "deftypemethodx", cm_defun, NO_BRACE_ARGS },
+   { "deftp", cm_defun, NO_BRACE_ARGS },
+   { "deftpx", cm_defun, NO_BRACE_ARGS },
+ /* The end of the `def' commands. */
+ 
+   { "display", cm_display, NO_BRACE_ARGS },
+   { "dots", cm_dots, BRACE_ARGS },
+   { "dmn", do_nothing, BRACE_ARGS },
+   { "emph", cm_emph, BRACE_ARGS },
+   { "end", cm_end, NO_BRACE_ARGS },
+   { "enumerate", cm_enumerate, NO_BRACE_ARGS },
+   { "equiv", cm_equiv, BRACE_ARGS },
+   { "error", cm_error, BRACE_ARGS },
+   { "example", cm_example, NO_BRACE_ARGS },
+   { "exdent", cm_exdent, NO_BRACE_ARGS },
+   { "expansion", cm_expansion, BRACE_ARGS },
+   { "file", cm_file, BRACE_ARGS },
+   { "findex", cm_findex, NO_BRACE_ARGS },
+   { "finalout", do_nothing, NO_BRACE_ARGS },
+   { "flushleft", cm_flushleft, NO_BRACE_ARGS },
+   { "flushright", cm_flushright, NO_BRACE_ARGS },
+   { "format", cm_format, NO_BRACE_ARGS },
+   { "ftable", cm_ftable, NO_BRACE_ARGS },
+   { "group", cm_group, NO_BRACE_ARGS },
+   { "heading", cm_heading, NO_BRACE_ARGS },
+   { "headings", cm_ignore_line, NO_BRACE_ARGS },
+   { "i", cm_italic, BRACE_ARGS },
+   { "iappendix", cm_appendix, NO_BRACE_ARGS },
+   { "iappendixsection", cm_appendixsec, NO_BRACE_ARGS },
+   { "iappendixsec", cm_appendixsec, NO_BRACE_ARGS },
+   { "iappendixsubsec", cm_appendixsubsec, NO_BRACE_ARGS },
+   { "iappendixsubsubsec", cm_appendixsubsubsec, NO_BRACE_ARGS },
+   { "ichapter", cm_chapter, NO_BRACE_ARGS },
+   { "ifclear", cm_ifclear, NO_BRACE_ARGS },
+   { "ifeq", cm_ifeq, NO_BRACE_ARGS },
+   { "ifhtml", command_name_condition, NO_BRACE_ARGS },
+   { "ifinfo", cm_ifinfo, NO_BRACE_ARGS },
+   { "ifset", cm_ifset, NO_BRACE_ARGS },
+   { "iftex", command_name_condition, NO_BRACE_ARGS },
+   { "ignore", command_name_condition, NO_BRACE_ARGS },
+   { "include", cm_include, NO_BRACE_ARGS },
+   { "inforef", cm_inforef, BRACE_ARGS },
+   { "input", cm_include, NO_BRACE_ARGS },
+   { "isection", cm_section, NO_BRACE_ARGS },
+   { "isubsection", cm_subsection, NO_BRACE_ARGS },
+   { "isubsubsection", cm_subsubsection, NO_BRACE_ARGS },
+   { "item", cm_item, NO_BRACE_ARGS },
+   { "itemize", cm_itemize, NO_BRACE_ARGS },
+   { "itemx", cm_itemx, NO_BRACE_ARGS },
+   { "iunnumbered", cm_unnumbered, NO_BRACE_ARGS },
+   { "iunnumberedsec", cm_unnumberedsec, NO_BRACE_ARGS },
+   { "iunnumberedsubsec", cm_unnumberedsubsec, NO_BRACE_ARGS },
+   { "iunnumberedsubsubsec", cm_unnumberedsubsubsec, NO_BRACE_ARGS },
+   { "kbd", cm_kbd, BRACE_ARGS },
+   { "key", cm_key, BRACE_ARGS },
+   { "kindex", cm_kindex, NO_BRACE_ARGS },
+   { "lowersections", cm_lowersections, NO_BRACE_ARGS },
+   { "lisp", cm_lisp, NO_BRACE_ARGS },
+ #if defined (HAVE_MACROS)
+   { "macro", cm_macro, NO_BRACE_ARGS },
+ #endif
+   { "majorheading", cm_majorheading, NO_BRACE_ARGS },
+   { "math", cm_math, BRACE_ARGS },
+   { "medbreak", cm_br, NO_BRACE_ARGS },
+   { "menu", cm_menu, NO_BRACE_ARGS },
+   { "minus", cm_minus, BRACE_ARGS },
+   { "need", cm_ignore_line, NO_BRACE_ARGS },
+   { "node", cm_node, NO_BRACE_ARGS },
+   { "noindent", cm_noindent, NO_BRACE_ARGS },
+   { "nwnode", cm_node, NO_BRACE_ARGS },
+   { "overfullrule", cm_ignore_line, NO_BRACE_ARGS },
+   { "page", do_nothing, NO_BRACE_ARGS },
+   { "pindex", cm_pindex, NO_BRACE_ARGS },
+   { "point", cm_point, BRACE_ARGS },
+   { "print", cm_print, BRACE_ARGS },
+   { "printindex", cm_printindex, NO_BRACE_ARGS },
+   { "pxref", cm_pxref, BRACE_ARGS },
+   { "quotation", cm_quotation, NO_BRACE_ARGS },
+   { "r", cm_roman, BRACE_ARGS },
+   { "raisesections", cm_raisesections, NO_BRACE_ARGS },
+   { "ref", cm_xref, BRACE_ARGS },
+   { "refill", cm_refill, NO_BRACE_ARGS },
+   { "result", cm_result, BRACE_ARGS },
+   { "samp", cm_samp, BRACE_ARGS },
+   { "sc", cm_sc, BRACE_ARGS },
+   { "section", cm_section, NO_BRACE_ARGS },
+   { "set", cm_set, NO_BRACE_ARGS },
+   { "setchapternewpage", cm_ignore_line, NO_BRACE_ARGS },
+   { "setchapterstyle", cm_ignore_line, NO_BRACE_ARGS },
+   { "setfilename", cm_setfilename, NO_BRACE_ARGS },
+   { "settitle", cm_ignore_line, NO_BRACE_ARGS },
+   { "shortcontents", do_nothing, NO_BRACE_ARGS },
+   { "shorttitlepage", cm_ignore_line, NO_BRACE_ARGS },
+   { "smallbook", cm_ignore_line, NO_BRACE_ARGS },
+   { "smallbreak", cm_br, NO_BRACE_ARGS },
+   { "smallexample", cm_smallexample, NO_BRACE_ARGS },
+   { "smalllisp", cm_smalllisp, NO_BRACE_ARGS },
+   { "sp", cm_sp, NO_BRACE_ARGS },
+   { "strong", cm_strong, BRACE_ARGS },
+   { "subheading", cm_subheading, NO_BRACE_ARGS },
+   { "subsection", cm_subsection, NO_BRACE_ARGS },
+   { "subsubheading", cm_subsubheading, NO_BRACE_ARGS },
+   { "subsubsection", cm_subsubsection, NO_BRACE_ARGS },
+   { "summarycontents", do_nothing, NO_BRACE_ARGS },
+   { "syncodeindex", cm_synindex, NO_BRACE_ARGS },
+   { "synindex", cm_synindex, NO_BRACE_ARGS },
+   { "t", cm_title, BRACE_ARGS },
+   { "table", cm_table, NO_BRACE_ARGS },
+   { "tex", command_name_condition, NO_BRACE_ARGS },
+   { "tindex", cm_tindex, NO_BRACE_ARGS },
+   { "titlefont", cm_titlefont, BRACE_ARGS },
+   { "titlepage", command_name_condition, NO_BRACE_ARGS },
+   { "titlespec", command_name_condition, NO_BRACE_ARGS },
+   { "today", cm_today, BRACE_ARGS },
+   { "top", cm_top, NO_BRACE_ARGS  },
+ #if defined (HAVE_MACROS)
+   { "unmacro", cm_unmacro, NO_BRACE_ARGS },
+ #endif
+   { "unnumbered", cm_unnumbered, NO_BRACE_ARGS },
+   { "unnumberedsec", cm_unnumberedsec, NO_BRACE_ARGS },
+   { "unnumberedsubsec", cm_unnumberedsubsec, NO_BRACE_ARGS },
+   { "unnumberedsubsubsec", cm_unnumberedsubsubsec, NO_BRACE_ARGS },
+   { "value", cm_value, BRACE_ARGS },
+   { "var", cm_var, BRACE_ARGS },
+   { "vindex", cm_vindex, NO_BRACE_ARGS },
+   { "vtable", cm_vtable, NO_BRACE_ARGS },
+   { "w", cm_w, BRACE_ARGS },
+   { "xref", cm_xref, BRACE_ARGS },
+   { "{", insert_self, NO_BRACE_ARGS },
+   { "}", insert_self, NO_BRACE_ARGS },
+ 
+   /* Some obsoleted commands. */
+   { "infotop", cm_obsolete, NO_BRACE_ARGS },
+   { "infounnumbered", cm_obsolete, NO_BRACE_ARGS },
+   { "infounnumberedsec", cm_obsolete, NO_BRACE_ARGS },
+   { "infounnumberedsubsec", cm_obsolete, NO_BRACE_ARGS },
+   { "infounnumberedsubsubsec", cm_obsolete, NO_BRACE_ARGS },
+   { "infoappendix", cm_obsolete, NO_BRACE_ARGS },
+   { "infoappendixsec", cm_obsolete, NO_BRACE_ARGS },
+   { "infoappendixsubsec", cm_obsolete, NO_BRACE_ARGS },
+   { "infoappendixsubsubsec", cm_obsolete, NO_BRACE_ARGS },
+   { "infochapter", cm_obsolete, NO_BRACE_ARGS },
+   { "infosection", cm_obsolete, NO_BRACE_ARGS },
+   { "infosubsection", cm_obsolete, NO_BRACE_ARGS },
+   { "infosubsubsection", cm_obsolete, NO_BRACE_ARGS },
+ 
+   /* Now @include does what this was supposed to. */
+   { "infoinclude", cm_infoinclude, NO_BRACE_ARGS },
+   { "footnote", cm_footnote, NO_BRACE_ARGS}, /* self-arg eater */
+   { "footnotestyle", cm_footnotestyle, NO_BRACE_ARGS },
+   { "paragraphindent", cm_paragraphindent, NO_BRACE_ARGS },
+ 
+   {(char *) NULL, (COMMAND_FUNCTION *) NULL}, NO_BRACE_ARGS};
+ 
+ int major_version = 1;
+ int minor_version = 64;
+ 
+ struct option long_options[] =
+ {
+   { "error-limit", 1, 0, 'e' },			/* formerly -el */
+   { "fill-column", 1, 0, 'f' },			/* formerly -fc */
+   { "footnote-style", 1, 0, 's' },		/* formerly -ft */
+   { "no-headers", 0, &no_headers, 1 },		/* Do not output Node: foo */
+   { "no-pointer-validate", 0, &validating, 0 }, /* formerly -nv */
+   { "no-validate", 0, &validating, 0 },		/* formerly -nv */
+   { "no-split", 0, &splitting, 0 },		/* formerly -ns */
+   { "no-warn", 0, &print_warnings, 0 },		/* formerly -nw */
+ #if defined (HAVE_MACROS)
+   { "macro-expand", 1, 0, 'E' },
+ #endif /* HAVE_MACROS */
+   { "number-footnotes", 0, &number_footnotes, 1 },
+   { "no-number-footnotes", 0, &number_footnotes, 0 },
+   { "output", 1, 0, 'o' },
+   { "paragraph-indent", 1, 0, 'p' },		/* formerly -pi */
+   { "reference-limit", 1, 0, 'r' },		/* formerly -rl */
+   { "verbose", 0, &verbose_mode, 1 },		/* formerly -verbose */
+   { "help", 0, 0, 'h' },
+   { "version", 0, 0, 'V' },
+   {NULL, 0, NULL, 0}
+ };
+ 
+ /* Values for calling handle_variable_internal (). */
+ #define SET	1
+ #define CLEAR	2
+ #define IFSET	3
+ #define IFCLEAR	4
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Main ()  Start of code  		    */
+ /*					        		    */
+ /* **************************************************************** */
+ 
+ /* For each file mentioned in the command line, process it, turning
+    texinfo commands into wonderfully formatted output text. */
+ int
+ main (argc, argv)
+      int argc;
+      char **argv;
+ {
+   extern int errors_printed;
+   char *filename_part ();
+   int c, ind;
+   int reading_from_stdin = 0;
+ 
+   /* The name of this program is the last filename in argv[0]. */
+   progname = filename_part (argv[0]);
+ 
+   /* Parse argument flags from the input line. */
+   while ((c = getopt_long
+ 	  (argc, argv,
+ #if defined (HAVE_MACROS)
+ 	   "D:E:U:I:f:o:p:e:r:s:V",
+ #else
+ 	   "D:U:I:f:o:p:e:r:s:V",
+ #endif /* !HAVE_MACROS */
+ 	   long_options, &ind))
+ 	 != EOF)
+     {
+       if (c == 0 && long_options[ind].flag == 0)
+ 	c = long_options[ind].val;
+ 
+       switch (c)
+ 	{
+ 	  /* User specified variable to set or clear? */
+ 	case 'D':
+ 	case 'U':
+ 	  handle_variable_internal ((c == 'D') ? SET : CLEAR, optarg);
+ 	  break;
+ 
+ #if defined (HAVE_MACROS)
+ 	  /* Use specified a macro expansion output file? */
+ 	case 'E':
+ 	  if (!macro_expansion_output_stream)
+ 	    {
+ 	      macro_expansion_output_stream = fopen (optarg, "w");
+ 	      if (!macro_expansion_output_stream)
+ 		error ("Couldn't open macro expansion output \"%s\"", optarg);
+ 	    }
+ 	  else
+ 	    error ("Cannot specify more than one macro expansion output");
+ 	  break;
+ #endif /* HAVE_MACROS */
+ 
+ 	  /* User specified include file path? */
+ 	case 'I':
+ 	  if (!include_files_path)
+ 	    include_files_path = strdup (".");
+ 
+ 	  include_files_path = (char *)
+ 	    xrealloc (include_files_path,
+ 		      2 + strlen (include_files_path) + strlen (optarg));
+ 	  strcat (include_files_path, ":");
+ 	  strcat (include_files_path, optarg);
+ 	  break;
+ 
+ 	  /* User specified fill_column? */
+ 	case 'f':
+ 	  if (sscanf (optarg, "%d", &fill_column) != 1)
+ 	    usage (stderr, FATAL);
+ 	  break;
+ 
+ 	  /* User specified output file? */
+ 	case 'o':
+ 	  command_output_filename = strdup (optarg);
+ 	  break;
+ 
+ 	  /* User specified paragraph indent (paragraph_start_index)? */
+ 	case 'p':
+ 	  if (set_paragraph_indent (optarg) < 0)
+ 	    usage (stderr, FATAL);
+ 	  break;
+ 
+ 	  /* User specified error level? */
+ 	case 'e':
+ 	  if (sscanf (optarg, "%d", &max_error_level) != 1)
+ 	    usage (stderr, FATAL);
+ 	  break;
+ 
+ 	  /* User specified reference warning limit? */
+ 	case 'r':
+ 	  if (sscanf (optarg, "%d", &reference_warning_limit) != 1)
+ 	    usage (stderr, FATAL);
+ 	  break;
+ 
+ 	  /* User specified footnote style? */
+ 	case 's':
+ 	  if (set_footnote_style (optarg) < 0)
+ 	    usage (stderr, FATAL);
+ 	  footnote_style_preset = 1;
+ 	  break;
+ 
+ 	case 'h':
+ 	  usage (stdout, NO_ERROR);
+ 	  break;
+ 
+ 	  /* User requested version info? */
+ 	case 'V':
+ 	  print_version_info ();
+ 	  exit (NO_ERROR);
+ 	  break;
+ 
+ 	case '?':
+ 	  usage (stderr, FATAL);
+ 	  break;
+ 	}
+     }
+ 
+   if (optind == argc)
+     {
+       /* Check to see if input is a file.  If so, process that. */
+       if (!isatty (fileno (stdin)))
+ 	reading_from_stdin = 1;
+       else
+ 	usage (stderr, FATAL);
+     }
+ 
+   /* If the user has specified --no-headers, this should imply --no-split.
+      Do that here.  I think it might also imply that we should ignore the
+      setfilename at the top of the file, but this might break some FSF things,
+      so I will hold off on that. */
+   if (no_headers)
+     {
+       splitting = 0;
+ 
+       /* If the user has not specified an output file, then use stdout by
+ 	 default. */
+       if (!command_output_filename)
+ 	command_output_filename = strdup ("-");
+     }
+ 
+   if (verbose_mode)
+     print_version_info ();
+ 
+   /* Remaining arguments are file names of texinfo files.
+      Convert them, one by one. */
+   if (!reading_from_stdin)
+     {
+       while (optind != argc)
+ 	convert_from_file (argv[optind++]);
+     }
+   else
+     convert_from_stream (stdin, "stdin");
+ 
+   if (errors_printed)
+     return (SYNTAX);
+   else
+     return (NO_ERROR);
+ }
+ 
+ /* Display the version info of this invocation of Makeinfo. */
+ void
+ print_version_info ()
+ {
+   printf ("This is GNU Makeinfo version %d.%d, from texinfo-3.7.\n",
+ 	  major_version, minor_version);
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Generic Utilities			    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ #if !defined (HAVE_STRDUP)
+ char *
+ strdup (string)
+      char *string;
+ {
+   char *result;
+ 
+   result = (char *)xmalloc (1 + strlen (string));
+   strcpy (result, string);
+ 
+   return (result);
+ }
+ #endif /* !HAVE_STRDUP */
+ 
+ static void
+ memory_error (callers_name, bytes_wanted)
+      char *callers_name;
+      int bytes_wanted;
+ {
+   char printable_string[80];
+ 
+   sprintf (printable_string,
+ 	   "Virtual memory exhausted in %s ()!  Needed %d bytes.",
+ 	   callers_name, bytes_wanted);
+ 
+   error (printable_string);
+   abort ();
+ }
+ 
+ /* Just like malloc, but kills the program in case of fatal error. */
+ void *
+ xmalloc (nbytes)
+      unsigned int nbytes;
+ {
+   void *temp = (void *) malloc (nbytes);
+ 
+   if (nbytes && temp == (void *)NULL)
+     memory_error ("xmalloc", nbytes);
+ 
+   return (temp);
+ }
+ 
+ /* Like realloc (), but barfs if there isn't enough memory. */
+ void *
+ xrealloc (pointer, nbytes)
+      void *pointer;
+      unsigned int nbytes;
+ {
+   void *temp;
+ 
+   if (!pointer)
+     temp = (void *)xmalloc (nbytes);
+   else
+     temp = (void *)realloc (pointer, nbytes);
+ 
+   if (nbytes && !temp)
+     memory_error ("xrealloc", nbytes);
+ 
+   return (temp);
+ }
+ 
+ /* Tell the user how to use this program.
+    Print the message to STREAM, and then exit with EXIT_VALUE. */
+ void
+ usage (stream, exit_value)
+      FILE *stream;
+      int exit_value;
+ {
+   fprintf (stream, "Usage: %s [options] texinfo-file...\n\
+ \n\
+ This program accepts as input files of texinfo commands and text\n\
+ and outputs a file suitable for reading with GNU Info.\n\
+ \n\
+ Options:\n\
+ `-I DIR'              add DIR to the directory search list for including\n\
+                       files with the `@include' command.\n\
+ -D VAR                define a variable, as with `@set'.\n\
+ -U VAR                undefine a variable, as with `@clear'.\n\
+ -E MACRO-OFILE	    process macros, and output texinfo source code for TeX.\n\
+ --no-validate         suppress node cross reference validation.\n\
+ --no-warn             suppress warning messages (errors are still output).\n\
+ --no-split            suppress the splitting of large files.\n\
+ --no-headers          suppress the output of Node: Foo headers.\n\
+ --verbose             print information about what is being done.\n\
+ --version             print the version number of Makeinfo.\n\
+ --output FILE or -o FILE\n\
+                       specify the output file.  When you specify the\n\
+                       output file in this way, any `@setfilename' in the\n\
+                       input file is ignored.\n\
+ --paragraph-indent NUM\n\
+                       set the paragraph indent to NUM (default %d).\n\
+ --fill-column NUM     set the filling column to NUM (default %d).\n\
+ --error-limit NUM     set the error limit to NUM (default %d).\n\
+ --reference-limit NUM\n\
+                       set the reference warning limit to NUM (default %d).\n\
+ --footnote-style STYLE\n\
+                       set the footnote style to STYLE.  STYLE should\n\
+                       either be `separate' to place footnotes in their own\n\
+                       node, or `end', to place the footnotes at the end of\n\
+                       the node in which they are defined (the default).\n\
+ --help                print this message and exit.\n\n",
+ 	   progname, paragraph_start_indent,
+ 	   fill_column, max_error_level, reference_warning_limit);
+   exit (exit_value);
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Manipulating Lists      		    */
+ /*					        		    */
+ /* **************************************************************** */
+ 
+ typedef struct generic_list {
+   struct generic_list *next;
+ } GENERIC_LIST;
+ 
+ /* Reverse the chain of structures in LIST.  Output the new head
+    of the chain.  You should always assign the output value of this
+    function to something, or you will lose the chain. */
+ GENERIC_LIST *
+ reverse_list (list)
+      register GENERIC_LIST *list;
+ {
+   register GENERIC_LIST *next;
+   register GENERIC_LIST *prev = (GENERIC_LIST *) NULL;
+ 
+   while (list)
+     {
+       next = list->next;
+       list->next = prev;
+       prev = list;
+       list = next;
+     }
+   return (prev);
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Pushing and Popping Files       	    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Find and load the file named FILENAME.  Return a pointer to
+    the loaded file, or NULL if it can't be loaded. */
+ char *
+ find_and_load (filename)
+      char *filename;
+ {
+   struct stat fileinfo;
+   long file_size;
+   int file = -1, n, i, count = 0;
+   char *fullpath, *result, *get_file_info_in_path ();
+ 
+   result = fullpath = (char *)NULL;
+ 
+   fullpath = get_file_info_in_path (filename, include_files_path, &fileinfo);
+ 
+   if (!fullpath)
+     goto error_exit;
+ 
+   filename = fullpath;
+   file_size = (long) fileinfo.st_size;
+ 
+   file = open (filename, O_RDONLY);
+   if (file < 0)
+     goto error_exit;
+ 
+   /* Load the file. */
+   result = (char *)xmalloc (1 + file_size);
+ 
+   /* VMS stat lies about the st_size value.  The actual number of
+      readable bytes is always less than this value.  The arcane
+      mysteries of VMS/RMS are too much to probe, so this hack
+     suffices to make things work. */
+ #if defined (VMS)
+   while ((n = read (file, result + count, file_size)) > 0)
+     count += n;
+   if (n == -1)
+ #else /* !VMS */
+     count = file_size;
+     if (read (file, result, file_size) != file_size)
+ #endif /* !VMS */
+   error_exit:
+     {
+       if (result)
+ 	free (result);
+ 
+       if (fullpath)
+ 	free (fullpath);
+ 
+       if (file != -1)
+ 	close (file);
+ 
+       return ((char *) NULL);
+     }
+   close (file);
+ 
+   /* Set the globals to the new file. */
+   input_text = result;
+   size_of_input_text = count;
+   input_filename = fullpath;
+   node_filename = strdup (fullpath);
+   input_text_offset = 0;
+   line_number = 1;
+   /* Not strictly necessary.  This magic prevents read_token () from doing
+      extra unnecessary work each time it is called (that is a lot of times).
+      The SIZE_OF_INPUT_TEXT is one past the actual end of the text. */
+   input_text[size_of_input_text] = '\n';
+   return (result);
+ }
+ 
+ /* Save the state of the current input file. */
+ void
+ pushfile ()
+ {
+   FSTACK *newstack = (FSTACK *) xmalloc (sizeof (FSTACK));
+   newstack->filename = input_filename;
+   newstack->text = input_text;
+   newstack->size = size_of_input_text;
+   newstack->offset = input_text_offset;
+   newstack->line_number = line_number;
+   newstack->next = filestack;
+ 
+   filestack = newstack;
+   push_node_filename ();
+ }
+ 
+ /* Make the current file globals be what is on top of the file stack. */
+ void
+ popfile ()
+ {
+   FSTACK *tos = filestack;
+ 
+   if (!tos)
+     abort ();			/* My fault.  I wonder what I did? */
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     {
+       maybe_write_itext (input_text, input_text_offset);
+       forget_itext (input_text);
+     }
+ #endif /* HAVE_MACROS */
+ 
+   /* Pop the stack. */
+   filestack = filestack->next;
+ 
+   /* Make sure that commands with braces have been satisfied. */
+   if (!executing_string)
+     discard_braces ();
+ 
+   /* Get the top of the stack into the globals. */
+   input_filename = tos->filename;
+   input_text = tos->text;
+   size_of_input_text = tos->size;
+   input_text_offset = tos->offset;
+   line_number = tos->line_number;
+   free (tos);
+ 
+   /* Go back to the (now) current node. */
+   pop_node_filename ();
+ }
+ 
+ /* Flush all open files on the file stack. */
+ void
+ flush_file_stack ()
+ {
+   while (filestack)
+     {
+       char *fname = input_filename;
+       char *text = input_text;
+       popfile ();
+       free (fname);
+       free (text);
+     }
+ }
+ 
+ int node_filename_stack_index = 0;
+ int node_filename_stack_size = 0;
+ char **node_filename_stack = (char **)NULL;
+ 
+ void
+ push_node_filename ()
+ {
+   if (node_filename_stack_index + 1 > node_filename_stack_size)
+     {
+       if (!node_filename_stack)
+ 	node_filename_stack =
+ 	  (char **)xmalloc ((node_filename_stack_size += 10)
+ 			    * sizeof (char *));
+       else
+ 	node_filename_stack =
+ 	  (char **)xrealloc (node_filename_stack,
+ 			     (node_filename_stack_size + 10)
+ 			     * sizeof (char *));
+     }
+ 
+   node_filename_stack[node_filename_stack_index] = node_filename;
+   node_filename_stack_index++;
+ }
+ 
+ void
+ pop_node_filename ()
+ {
+   node_filename = node_filename_stack[--node_filename_stack_index];
+ }
+ 
+ /* Return just the simple part of the filename; i.e. the
+    filename without the path information, or extensions.
+    This conses up a new string. */
+ char *
+ filename_part (filename)
+      char *filename;
+ {
+   char *basename;
+ 
+   basename = strrchr (filename, '/');
+   if (!basename)
+     basename = filename;
+   else
+     basename++;
+ 
+   basename = strdup (basename);
+ #if defined (REMOVE_OUTPUT_EXTENSIONS)
+ 
+   /* See if there is an extension to remove.  If so, remove it. */
+   {
+     char *temp;
+ 
+     temp = strrchr (basename, '.');
+     if (temp)
+       *temp = '\0';
+   }
+ #endif /* REMOVE_OUTPUT_EXTENSIONS */
+   return (basename);
+ }
+ 
+ /* Return the pathname part of filename.  This can be NULL. */
+ char *
+ pathname_part (filename)
+      char *filename;
+ {
+   char *expand_filename ();
+   char *result = (char *) NULL;
+   register int i;
+ 
+   filename = expand_filename (filename, "");
+ 
+   i = strlen (filename) - 1;
+ 
+   while (i && filename[i] != '/')
+     i--;
+   if (filename[i] == '/')
+     i++;
+ 
+   if (i)
+     {
+       result = (char *)xmalloc (1 + i);
+       strncpy (result, filename, i);
+       result[i] = '\0';
+     }
+   free (filename);
+   return (result);
+ }
+ 
+ char *
+ filename_non_directory (name)
+      char *name;
+ {
+   register int i;
+ 
+   for (i = strlen (name) - 1; i; i--)
+     if (name[i] == '/')
+       return (strdup (name + i + 1));
+ 
+   return (strdup (name));
+ }
+ 
+ /* Return the expansion of FILENAME. */
+ char *
+ expand_filename (filename, input_name)
+      char *filename, *input_name;
+ {
+   register int i;
+   char *full_pathname ();
+ 
+   if (filename)
+     filename = full_pathname (filename);
+   else
+     {
+       filename = filename_non_directory (input_name);
+ 
+       if (!*filename)
+ 	{
+ 	  free (filename);
+ 	  filename = strdup ("noname.texi");
+ 	}
+ 
+       for (i = strlen (filename) - 1; i; i--)
+ 	if (filename[i] == '.')
+ 	  break;
+ 
+       if (!i)
+ 	i = strlen (filename);
+ 
+       if (i + 6 > (strlen (filename)))
+ 	filename = (char *)xrealloc (filename, i + 6);
+       strcpy (filename + i, ".info");
+       return (filename);
+     }
+ 	
+   if (filename[0] == '.' || filename[0] == '/')
+     return (filename);
+ 
+   if (filename[0] != '/' && input_name[0] == '/')
+     {
+       /* Make it so that relative names work. */
+       char *result;
+       
+       i = strlen (input_name) - 1;
+ 
+       result = (char *)xmalloc (1 + strlen (input_name) + strlen (filename));
+       strcpy (result, input_name);
+ 
+       while (result[i] != '/' && i)
+ 	i--;
+ 
+       if (result[i] == '/')
+ 	i++;
+ 
+       strcpy (&result[i], filename);
+       free (filename);
+       return (result);
+     }
+   return (filename);
+ }
+ 
+ /* Return the full path to FILENAME. */
+ char *
+ full_pathname (filename)
+      char *filename;
+ {
+   int initial_character;
+   char *result;
+ 
+   /* No filename given? */
+   if (!filename || !(initial_character = *filename))
+     return (strdup (""));
+   
+   /* Already absolute? */
+   if ((initial_character == '/') ||
+       ((strncmp (filename, "./", 2) == 0) ||
+        (strncmp (filename, "../", 3) == 0)))
+     return (strdup (filename));
+ 
+   if (initial_character != '~')
+     {
+       char *localdir;
+ 
+       localdir = (char *)xmalloc (1025);
+ #if defined (HAVE_GETCWD)
+       if (!getcwd (localdir, 1024))
+ #else  /*  !HAVE_GETCWD */
+ 	if (!getwd (localdir))
+ #endif /* !HAVE_GETCWD */
+ 	  {
+ 	    fprintf (stderr, "%s: getwd: %s, %s\n",
+ 		     progname, filename, localdir);
+ 	    exit (1);
+ 	  }
+ 
+       strcat (localdir, "/");
+       strcat (localdir, filename);
+       result = strdup (localdir);
+       free (localdir);
+     }
+   else
+     {
+       if (filename[1] == '/')
+ 	{
+ 	  /* Return the concatenation of the environment variable HOME
+ 	     and the rest of the string. */
+ 	  char *temp_home;
+ 
+ 	  temp_home = (char *) getenv ("HOME");
+ 	  result = (char *)xmalloc (strlen (&filename[1])
+ 				    + 1
+ 				    + temp_home ? strlen (temp_home)
+ 				    : 0);
+ 	  *result = '\0';
+ 
+ 	  if (temp_home)
+ 	    strcpy (result, temp_home);
+ 
+ 	  strcat (result, &filename[1]);
+ 	}
+       else
+ 	{
+ 	  struct passwd *user_entry;
+ 	  int i, c;
+ 	  char *username = (char *)xmalloc (257);
+ 
+ 	  for (i = 1; c = filename[i]; i++)
+ 	    {
+ 	      if (c == '/')
+ 		break;
+ 	      else
+ 		username[i - 1] = c;
+ 	    }
+ 	  if (c)
+ 	    username[i - 1] = '\0';
+ 
+ 	  user_entry = getpwnam (username);
+ 
+ 	  if (!user_entry)
+ 	    return (strdup (filename));
+ 
+ 	  result = (char *)xmalloc (1 + strlen (user_entry->pw_dir)
+ 				    + strlen (&filename[i]));
+ 	  strcpy (result, user_entry->pw_dir);
+ 	  strcat (result, &filename[i]);
+ 	}
+     }
+   return (result);
+ }
+ 
+ char *
+ output_name_from_input_name (name)
+      char *name;
+ {
+   return (expand_filename ((char *)NULL, name));
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Error Handling				    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Number of errors encountered. */
+ int errors_printed = 0;
+ 
+ /* Print the last error gotten from the file system. */
+ int
+ fs_error (filename)
+      char *filename;
+ {
+   remember_error ();
+   perror (filename);
+   return (0);
+ }
+ 
+ /* Print an error message, and return false. */
+ #if defined (HAVE_VARARGS_H) && defined (HAVE_VFPRINTF)
+ 
+ int
+ error (va_alist)
+      va_dcl
+ {
+   char *format;
+   va_list args;
+ 
+   remember_error ();
+   va_start (args);
+   format = va_arg (args, char *);
+   vfprintf (stderr, format, args);
+   va_end (args);
+   fprintf (stderr, "\n");
+ }
+ 
+ /* Just like error (), but print the line number as well. */
+ int
+ line_error (va_alist)
+      va_dcl
+ {
+   char *format;
+   va_list args;
+ 
+   remember_error ();
+   va_start (args);
+   format = va_arg (args, char *);
+   fprintf (stderr, "%s:%d: ", input_filename, line_number);
+   vfprintf (stderr, format, args);
+   fprintf (stderr, ".\n");
+   va_end (args);
+   return ((int) 0);
+ }
+ 
+ int
+ warning (va_alist)
+      va_dcl
+ {
+   char *format;
+   va_list args;
+ 
+   va_start (args);
+   format = va_arg (args, char *);
+   if (print_warnings)
+     {
+       fprintf (stderr, "%s:%d: Warning: ", input_filename, line_number);
+       vfprintf (stderr, format, args);
+       fprintf (stderr, ".\n");
+     }
+   va_end (args);
+   return ((int) 0);
+ }
+ 
+ #else /* !(HAVE_VARARGS_H && HAVE_VFPRINTF) */
+ 
+ int
+ error (format, arg1, arg2, arg3, arg4, arg5)
+      char *format;
+ {
+   remember_error ();
+   fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
+   fprintf (stderr, "\n");
+   return ((int) 0);
+ }
+ 
+ /* Just like error (), but print the line number as well. */
+ int
+ line_error (format, arg1, arg2, arg3, arg4, arg5)
+      char *format;
+ {
+   remember_error ();
+   fprintf (stderr, "%s:%d: ", input_filename, line_number);
+   fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
+   fprintf (stderr, ".\n");
+   return ((int) 0);
+ }
+ 
+ int
+ warning (format, arg1, arg2, arg3, arg4, arg5)
+      char *format;
+ {
+   if (print_warnings)
+     {
+       fprintf (stderr, "%s:%d: Warning: ", input_filename, line_number);
+       fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
+       fprintf (stderr, ".\n");
+     }
+   return ((int) 0);
+ }
+ 
+ #endif /* !(HAVE_VARARGS_H && HAVE_VFPRINTF) */
+ 
+ /* Remember that an error has been printed.  If this is the first
+    error printed, then tell them which program is printing them.
+    If more than max_error_level have been printed, then exit the
+    program. */
+ void
+ remember_error ()
+ {
+   errors_printed++;
+   if (max_error_level && (errors_printed > max_error_level))
+     {
+       fprintf (stderr, "Too many errors!  Gave up.\n");
+       flush_file_stack ();
+       cm_bye ();
+       exit (1);
+     }
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Hacking Tokens and Strings		    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Return the next token as a string pointer.  We cons the
+    string. */
+ char *
+ read_token ()
+ {
+   int i, character;
+   char *result;
+ 
+   /* If the first character to be read is self-delimiting, then that
+      is the command itself. */
+   character = curchar ();
+   if (self_delimiting (character))
+     {
+       input_text_offset++;
+ 
+       if (character == '\n')
+ 	line_number++;
+ 
+       result = strdup (" ");
+       *result = character;
+       return (result);
+     }
+ 
+   for (i = 0; ((input_text_offset != size_of_input_text)
+ 	       && (character = curchar ())
+ 	       && command_char (character));
+        i++, input_text_offset++);
+   result = (char *)xmalloc (i + 1);
+   memcpy (result, &input_text[input_text_offset - i], i);
+   result[i] = '\0';
+   return (result);
+ }
+ 
+ /* Return non-zero if CHARACTER is self-delimiting. */
+ int
+ self_delimiting (character)
+      int character;
+ {
+   return (member (character, "{}:.@*'`,!?; \n\t"));
+ }
+ 
+ /* Clear whitespace from the front and end of string. */
+ void
+ canon_white (string)
+      char *string;
+ {
+   int len = strlen (string);
+   int x;
+ 
+   if (!len)
+     return;
+ 
+   for (x = 0; x < len; x++)
+     {
+       if (!cr_or_whitespace (string[x]))
+ 	{
+ 	  strcpy (string, string + x);
+ 	  break;
+ 	}
+     }
+   len = strlen (string);
+   if (len)
+     len--;
+   while (len > -1 && cr_or_whitespace (string[len]))
+     len--;
+   string[len + 1] = '\0';
+ }
+ 
+ /* Bash STRING, replacing all whitespace with just one space. */
+ void
+ fix_whitespace (string)
+      char *string;
+ {
+   char *temp = (char *)xmalloc (strlen (string) + 1);
+   int string_index = 0;
+   int temp_index = 0;
+   int c;
+ 
+   canon_white (string);
+ 
+   while (string[string_index])
+     {
+       c = temp[temp_index++] = string[string_index++];
+ 
+       if (c == ' ' || c == '\n' || c == '\t')
+ 	{
+ 	  temp[temp_index - 1] = ' ';
+ 	  while ((c = string[string_index]) && (c == ' ' ||
+ 						c == '\t' ||
+ 						c == '\n'))
+ 	    string_index++;
+ 	}
+     }
+   temp[temp_index] = '\0';
+   strcpy (string, temp);
+   free (temp);
+ }
+ 
+ /* Discard text until the desired string is found.  The string is
+    included in the discarded text. */
+ void
+ discard_until (string)
+      char *string;
+ {
+   int temp = search_forward (string, input_text_offset);
+ 
+   int tt = (temp < 0) ? size_of_input_text : temp + strlen (string);
+   int from = input_text_offset;
+ 
+   /* Find out what line we are on. */
+   while (from != tt)
+     if (input_text[from++] == '\n')
+       line_number++;
+ 
+   if (temp < 0)
+     {
+       input_text_offset = size_of_input_text - strlen (string);
+ 
+       if (strcmp (string, "\n") != 0)
+ 	{
+ 	  line_error ("Expected `%s'", string);
+ 	  return;
+ 	}
+     }
+   else
+     input_text_offset = temp;
+ 
+   input_text_offset += strlen (string);
+ }
+ 
+ /* Read characters from the file until we are at MATCH.
+    Place the characters read into STRING.
+    On exit input_text_offset is after the match string.
+    Return the offset where the string starts. */
+ int
+ get_until (match, string)
+      char *match, **string;
+ {
+   int len, current_point, x, new_point, tem;
+ 
+   current_point = x = input_text_offset;
+   new_point = search_forward (match, input_text_offset);
+ 
+   if (new_point < 0)
+     new_point = size_of_input_text;
+   len = new_point - current_point;
+ 
+   /* Keep track of which line number we are at. */
+   tem = new_point + (strlen (match) - 1);
+   while (x != tem)
+     if (input_text[x++] == '\n')
+       line_number++;
+ 
+   *string = (char *)xmalloc (len + 1);
+ 
+   memcpy (*string, &input_text[current_point], len);
+   (*string)[len] = '\0';
+ 
+   /* Now leave input_text_offset in a consistent state. */
+   input_text_offset = tem;
+ 
+   if (input_text_offset > size_of_input_text)
+     input_text_offset = size_of_input_text;
+ 
+   return (new_point);
+ }
+ 
+ /* Read characters from the file until we are at MATCH or end of line.
+    Place the characters read into STRING.  */
+ void
+ get_until_in_line (match, string)
+      char *match, **string;
+ {
+   int real_bottom, temp;
+ 
+   real_bottom = size_of_input_text;
+   temp = search_forward ("\n", input_text_offset);
+ 
+   if (temp < 0)
+     temp = size_of_input_text;
+ 
+   size_of_input_text = temp;
+   get_until (match, string);
+   size_of_input_text = real_bottom;
+ }
+ 
+ void
+ get_rest_of_line (string)
+      char **string;
+ {
+   get_until ("\n", string);
+   canon_white (*string);
+ 
+   if (curchar () == '\n')	/* as opposed to the end of the file... */
+     {
+       line_number++;
+       input_text_offset++;
+     }
+ }
+ 
+ /* Backup the input pointer to the previous character, keeping track
+    of the current line number. */
+ void
+ backup_input_pointer ()
+ {
+   if (input_text_offset)
+     {
+       input_text_offset--;
+       if (curchar () == '\n')
+ 	line_number--;
+     }
+ }
+ 
+ /* Read characters from the file until we are at MATCH or closing brace.
+    Place the characters read into STRING.  */
+ void
+ get_until_in_braces (match, string)
+      char *match, **string;
+ {
+   int i, brace = 0;
+   int match_len = strlen (match);
+   char *temp;
+ 
+   for (i = input_text_offset; i < size_of_input_text; i++)
+     {
+       if (input_text[i] == '{')
+ 	brace++;
+       else if (input_text[i] == '}')
+ 	brace--;
+       else if (input_text[i] == '\n')
+ 	line_number++;
+ 
+       if (brace < 0 ||
+ 	  (brace == 0 && strncmp (input_text + i, match, match_len) == 0))
+ 	break;
+     }
+ 
+   match_len = i - input_text_offset;
+   temp = (char *)xmalloc (2 + match_len);
+   strncpy (temp, input_text + input_text_offset, match_len);
+   temp[match_len] = '\0';
+   input_text_offset = i;
+   *string = temp;
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Converting the File     		    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Convert the file named by NAME.  The output is saved on the file
+    named as the argument to the @setfilename command. */
+ static char *suffixes[] = {
+   "",
+   ".texinfo",
+   ".texi",
+   ".txinfo",
+   (char *)NULL
+ };
+ 
+ void
+ initialize_conversion ()
+ {
+   init_tag_table ();
+   init_indices ();
+   init_internals ();
+   init_paragraph ();
+ }
+ 
+   /* We read in multiples of 4k, simply because it is a typical pipe size
+      on unix systems. */
+ #define _READ_BUFFER_GROWTH (4 * 4096)
+ 
+ /* Convert the texinfo file coming from the open stream STREAM.  Assume the
+    source of the stream is named NAME. */
+ void
+ convert_from_stream (stream, name)
+      FILE *stream;
+      char *name;
+ {
+   char *buffer = (char *)NULL;
+   int buffer_offset = 0, buffer_size = 0;
+ 
+   initialize_conversion ();
+ 
+   /* Read until the end of the stream.  This isn't strictly correct, since
+      the texinfo input may end before the stream ends, but it is a quick
+      working hueristic. */
+   while (!feof (stream))
+     {
+       int count;
+ 
+       if (buffer_offset + (_READ_BUFFER_GROWTH + 1) >= buffer_size)
+ 	buffer = (char *)
+ 	  xrealloc (buffer, (buffer_size += _READ_BUFFER_GROWTH));
+ 
+       count = fread (buffer + buffer_offset, 1, _READ_BUFFER_GROWTH, stream);
+ 
+       if (count < 0)
+ 	{
+ 	  perror (name);
+ 	  exit (FATAL);
+ 	}
+ 
+       buffer_offset += count;
+       if (count == 0)
+ 	break;
+     }
+ 
+   /* Set the globals to the new file. */
+   input_text = buffer;
+   size_of_input_text = buffer_offset;
+   input_filename = strdup (name);
+   node_filename = strdup (name);
+   input_text_offset = 0;
+   line_number = 1;
+ 
+   /* Not strictly necessary.  This magic prevents read_token () from doing
+      extra unnecessary work each time it is called (that is a lot of times).
+      The SIZE_OF_INPUT_TEXT is one past the actual end of the text. */
+   input_text[size_of_input_text] = '\n';
+ 
+   convert_from_loaded_file (name);
+ }
+ 
+ void
+ convert_from_file (name)
+      char *name;
+ {
+   register int i;
+   char *filename = (char *)xmalloc (strlen (name) + 50);
+ 
+   initialize_conversion ();
+ 
+   /* Try to load the file specified by NAME.  If the file isn't found, and
+      there is no suffix in NAME, then try NAME.texinfo, and NAME.texi. */
+   for (i = 0; suffixes[i]; i++)
+     {
+       strcpy (filename, name);
+       strcat (filename, suffixes[i]);
+ 
+       if (find_and_load (filename))
+ 	break;
+ 
+       if (!suffixes[i][0] && strrchr (filename, '.'))
+ 	{
+ 	  fs_error (filename);
+ 	  free (filename);
+ 	  return;
+ 	}
+     }
+ 
+   if (!suffixes[i])
+     {
+       fs_error (name);
+       free (filename);
+       return;
+     }
+ 
+   input_filename = filename;
+ 
+   convert_from_loaded_file (name);
+ }
+   
+ void
+ convert_from_loaded_file (name)
+      char *name;
+ {
+   char *expand_filename (), *filename_part ();
+   char *real_output_filename = (char *)NULL;
+ 
+ #if defined (HAVE_MACROS)
+   remember_itext (input_text, 0);
+ #endif /* HAVE_MACROS */
+ 
+   /* Search this file looking for the special string which starts conversion.
+      Once found, we may truly begin. */
+   input_text_offset = 0;
+   while (input_text_offset >= 0)
+     {
+       input_text_offset =
+ 	search_forward (setfilename_search, input_text_offset);
+ 
+       if ((input_text_offset == 0) ||
+ 	  ((input_text_offset > 0) &&
+ 	   (input_text[input_text_offset -1] == '\n')))
+ 	break;
+       else if (input_text_offset > 0)
+ 	input_text_offset++;
+     }
+ 
+   if (input_text_offset < 0)
+     {
+       if (!command_output_filename)
+ 	{
+ #if defined (REQUIRE_SETFILENAME)
+ 	  error ("No `%s' found in `%s'", setfilename_search, name);
+ 	  goto finished;
+ #else
+ 	  register int i, end_of_first_line;
+ 
+ 	  /* Find the end of the first line in the file. */
+ 	  for (i = 0; i < size_of_input_text - 1; i++)
+ 	    if (input_text[i] == '\n')
+ 	      break;
+ 
+ 	  end_of_first_line = i + 1;
+ 
+ 	  input_text_offset = 0;
+ 
+ 	  for (i = 0; i < end_of_first_line; i++)
+ 	    {
+ 	      if ((input_text[i] == '\\') &&
+ 		  (strncmp (input_text + i + 1, "include", 7) == 0))
+ 		{
+ 		  input_text_offset = end_of_first_line;
+ 		  break;
+ 		}
+ 	    }
+ 	  command_output_filename = output_name_from_input_name (name);
+ #endif /* !REQUIRE_SETFILENAME */
+ 	}
+     }
+   else
+     input_text_offset += strlen (setfilename_search);
+ 
+   if (!command_output_filename)
+     get_until ("\n", &output_filename);
+   else
+     {
+       if (input_text_offset != -1)
+ 	discard_until ("\n");
+       else
+ 	input_text_offset = 0;
+ 
+       real_output_filename = output_filename = command_output_filename;
+       command_output_filename = (char *)NULL;
+     }
+ 
+   canon_white (output_filename);
+ 
+   if (real_output_filename &&
+       strcmp (real_output_filename, "-") == 0)
+     {
+       real_output_filename = strdup (real_output_filename);
+       output_stream = stdout;
+       splitting = 0;		/* Cannot split when writing to stdout. */
+     }
+   else
+     {
+       if (!real_output_filename)
+ 	real_output_filename = expand_filename (output_filename, name);
+       else
+ 	real_output_filename = strdup (real_output_filename);
+ 
+       output_stream = fopen (real_output_filename, "w");
+     }
+ 
+   if (output_stream != stdout)
+     printf ("Making info file `%s' from `%s'.\n", output_filename, name);
+ 
+   if (output_stream == NULL)
+     {
+       fs_error (real_output_filename);
+       goto finished;
+     }
+ 
+   /* Make the displayable filename from output_filename.  Only the base
+      portion of the filename need be displayed. */
+   if (output_stream != stdout)
+     pretty_output_filename = filename_part (output_filename);
+   else
+     pretty_output_filename = strdup ("stdout");
+ 
+   /* For this file only, count the number of newlines from the top of
+      the file to here.  This way, we keep track of line numbers for
+      error reporting.  Line_number starts at 1, since the user isn't
+      zero-based. */
+   {
+     int temp = 0;
+     line_number = 1;
+     while (temp != input_text_offset)
+       if (input_text[temp++] == '\n')
+ 	line_number++;
+   }
+ 
+   if (!no_headers)
+     {
+       add_word_args ("This is Info file %s, produced by Makeinfo-%d.%d from ",
+ 		     output_filename, major_version, minor_version);
+       add_word_args ("the input file %s.\n", input_filename);
+     }
+ 
+   close_paragraph ();
+   reader_loop ();
+ 
+ finished:
+   close_paragraph ();
+   flush_file_stack ();
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     fclose (macro_expansion_output_stream);
+ #endif /* HAVE_MACROS */
+ 
+   if (output_stream != NULL)
+     {
+       output_pending_notes ();
+       free_pending_notes ();
+       if (tag_table != NULL)
+ 	{
+ 	  tag_table = (TAG_ENTRY *) reverse_list (tag_table);
+ 	  if (!no_headers)
+ 	    write_tag_table ();
+ 	}
+ 
+       if (output_stream != stdout)
+ 	fclose (output_stream);
+ 
+       /* If validating, then validate the entire file right now. */
+       if (validating)
+ 	validate_file (tag_table);
+ 
+       /* This used to test  && !errors_printed.
+ 	 But some files might have legit warnings.  So split anyway.  */
+       if (splitting)
+ 	split_file (real_output_filename, 0);
+     }
+   free (real_output_filename);
+ }
+ 
+ void
+ free_and_clear (pointer)
+      char **pointer;
+ {
+   if ((*pointer) != (char *) NULL)
+     {
+       free (*pointer);
+       *pointer = (char *) NULL;
+     }
+ }
+ 
+  /* Initialize some state. */
+ void
+ init_internals ()
+ {
+   free_and_clear (&current_node);
+   free_and_clear (&output_filename);
+   free_and_clear (&command);
+   free_and_clear (&input_filename);
+   free_node_references ();
+   init_insertion_stack ();
+   init_brace_stack ();
+   command_index = 0;
+   in_menu = 0;
+   top_node_seen = 0;
+   non_top_node_seen = 0;
+ }
+ 
+ void
+ init_paragraph ()
+ {
+   free_and_clear (&output_paragraph);
+   output_paragraph = (unsigned char *)xmalloc (paragraph_buffer_len);
+   output_position = 0;
+   output_paragraph[0] = '\0';
+   output_paragraph_offset = 0;
+   output_column = 0;
+   paragraph_is_open = 0;
+   current_indent = 0;
+ }
+ 
+ /* Okay, we are ready to start the conversion.  Call the reader on
+    some text, and fill the text as it is output.  Handle commands by
+    remembering things like open braces and the current file position on a
+    stack, and when the corresponding close brace is found, you can call
+    the function with the proper arguments. */
+ void
+ reader_loop ()
+ {
+   int character;
+   int done = 0;
+   int dash_count = 0;
+ 
+   while (!done)
+     {
+       if (input_text_offset >= size_of_input_text)
+ 	break;
+ 
+       character = curchar ();
+ 
+       if (!in_fixed_width_font &&
+ 	  (character == '\'' || character == '`') &&
+ 	  input_text[input_text_offset + 1] == character)
+ 	{
+ 	  input_text_offset++;
+ 	  character = '"';
+ 	}
+ 
+       if (character == '-')
+ 	{
+ 	  dash_count++;
+ 	  if (dash_count == 2 && !in_fixed_width_font)
+ 	    {
+ 	      input_text_offset++;
+ 	      continue;
+ 	    }
+ 	}
+       else
+ 	{
+ 	  dash_count = 0;
+ 	}
+ 
+       /* If this is a whitespace character, then check to see if the line
+ 	 is blank.  If so, advance to the carriage return. */
+       if (whitespace (character))
+ 	{
+ 	  register int i = input_text_offset + 1;
+ 
+ 	  while (i < size_of_input_text && whitespace (input_text[i]))
+ 	    i++;
+ 
+ 	  if (i == size_of_input_text || input_text[i] == '\n')
+ 	    {
+ 	      if (i == size_of_input_text)
+ 		i--;
+ 
+ 	      input_text_offset = i;
+ 	      character = curchar ();
+ 	    }
+ 	}
+ 
+       if (character == '\n')
+ 	{
+ 	  line_number++;
+ 
+ 	  /* Check for a menu entry here, since the "escape sequence"
+ 	     that begins menu entrys is "\n* ". */
+ 	  if (in_menu && input_text_offset + 1 < size_of_input_text)
+ 	    {
+ 	      char *glean_node_from_menu (), *tem;
+ 
+ 	      /* Note that the value of TEM is discarded, since it is
+ 		 gauranteed to be NULL when glean_node_from_menu () is
+ 		 called with a non-zero argument. */
+ 	      tem = glean_node_from_menu (1);
+ 	    }
+ 	}
+ 
+       switch (character)
+ 	{
+ 	case COMMAND_PREFIX:
+ 	  read_command ();
+ 	  break;
+ 
+ 	case '{':
+ 
+ 	  /* Special case.  I'm not supposed to see this character by itself.
+ 	     If I do, it means there is a syntax error in the input text.
+ 	     Report the error here, but remember this brace on the stack so
+ 	     you can ignore its partner. */
+ 
+ 	  line_error ("Misplaced `{'");
+ 	  remember_brace (misplaced_brace);
+ 
+ 	  /* Don't advance input_text_offset since this happens in
+ 	     remember_brace ().
+ 	     input_text_offset++;
+            */
+ 	  break;
+ 
+ 	case '}':
+ 	  pop_and_call_brace ();
+ 	  input_text_offset++;
+ 	  break;
+ 
+ 	default:
+ 	  add_char (character);
+ 	  input_text_offset++;
+ 	}
+     }
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     maybe_write_itext (input_text, input_text_offset);
+ #endif /* HAVE_MACROS */
+ }
+ 
+ /* Find the command corresponding to STRING.  If the command
+    is found, return a pointer to the data structure.  Otherwise
+    return (-1). */
+ COMMAND *
+ get_command_entry (string)
+      char *string;
+ {
+   register int i;
+ 
+   for (i = 0; CommandTable[i].name; i++)
+     if (strcmp (CommandTable[i].name, string) == 0)
+       return (&CommandTable[i]);
+ 
+   /* This command is not in our predefined command table.  Perhaps
+      it is a user defined command. */
+   for (i = 0; i < user_command_array_len; i++)
+     if (user_command_array[i] &&
+ 	(strcmp (user_command_array[i]->name, string) == 0))
+       return (user_command_array[i]);
+ 
+   /* Nope, we never heard of this command. */
+   return ((COMMAND *) -1);
+ }
+ 
+ /* input_text_offset is right at the command prefix character.
+    Read the next token to determine what to do. */
+ void
+ read_command ()
+ {
+   COMMAND *entry;
+ 
+   input_text_offset++;
+   free_and_clear (&command);
+   command = read_token ();
+ 
+ #if defined (HAVE_MACROS)
+   /* Check to see if this command is a macro.  If so, execute it here. */
+   {
+     MACRO_DEF *def;
+ 
+     def = find_macro (command);
+ 
+     if (def)
+       {
+ 	/* We disallow recursive use of a macro call.  Inhibit the expansion
+ 	   of this macro during the life of its execution. */
+ 	if (!(def->flags & ME_RECURSE))
+ 	  def->inhibited = 1;
+ 
+ 	execute_macro (def);
+ 
+ 	if (!(def->flags & ME_RECURSE))
+ 	  def->inhibited = 0;
+ 
+ 	return;
+       }
+     }
+ #endif /* HAVE_MACROS */
+ 
+   entry = get_command_entry (command);
+ 
+   if (entry == (COMMAND *)-1)
+     {
+       line_error ("Unknown info command `%s'", command);
+       return;
+     }
+ 
+   if (entry->argument_in_braces)
+     remember_brace (entry->proc);
+ 
+   (*(entry->proc)) (START, output_paragraph_offset, 0);
+ }
+ 
+ /* Return the string which invokes PROC; a pointer to a function. */
+ char *
+ find_proc_name (proc)
+      COMMAND_FUNCTION *proc;
+ {
+   register int i;
+ 
+   for (i = 0; CommandTable[i].name; i++)
+     if (proc == CommandTable[i].proc)
+       return (CommandTable[i].name);
+   return ("NO_NAME!");
+ }
+ 
+ void
+ init_brace_stack ()
+ {
+   brace_stack = (BRACE_ELEMENT *) NULL;
+ }
+ 
+ void
+ remember_brace (proc)
+      COMMAND_FUNCTION *proc;
+ {
+   if (curchar () != '{')
+     line_error ("%c%s expected `{..}'", COMMAND_PREFIX, command);
+   else
+     input_text_offset++;
+   remember_brace_1 (proc, output_paragraph_offset);
+ }
+ 
+ /* Remember the current output position here.  Save PROC
+    along with it so you can call it later. */
+ void
+ remember_brace_1 (proc, position)
+      COMMAND_FUNCTION *proc;
+      int position;
+ {
+   BRACE_ELEMENT *new = (BRACE_ELEMENT *) xmalloc (sizeof (BRACE_ELEMENT));
+   new->next = brace_stack;
+   new->proc = proc;
+   new->pos = position;
+   new->line = line_number;
+   brace_stack = new;
+ }
+ 
+ /* Pop the top of the brace stack, and call the associated function
+    with the args END and POS. */
+ void
+ pop_and_call_brace ()
+ {
+   BRACE_ELEMENT *temp;
+   COMMAND_FUNCTION *proc;
+   int pos;
+ 
+   if (brace_stack == (BRACE_ELEMENT *) NULL)
+     {
+       line_error ("Unmatched close brace");
+       return;
+     }
+ 
+   pos = brace_stack->pos;
+   proc = brace_stack->proc;
+   temp = brace_stack->next;
+   free (brace_stack);
+   brace_stack = temp;
+ 
+   (*proc) (END, pos, output_paragraph_offset);
+ }
+ 
+ /* Shift all of the markers in `brace_stack' by AMOUNT. */
+ void
+ adjust_braces_following (here, amount)
+      int here, amount;
+ {
+   register BRACE_ELEMENT *stack = brace_stack;
+ 
+   while (stack)
+     {
+       if (stack->pos >= here)
+ 	stack->pos += amount;
+       stack = stack->next;
+     }
+ }
+ 
+ /* You call discard_braces () when you shouldn't have any braces on the stack.
+    I used to think that this happens for commands that don't take arguments
+    in braces, but that was wrong because of things like @code{foo @@}.  So now
+    I only detect it at the beginning of nodes. */
+ void
+ discard_braces ()
+ {
+   if (!brace_stack)
+     return;
+ 
+   while (brace_stack)
+     {
+       if (brace_stack->proc != misplaced_brace)
+ 	{
+ 	  char *proc_name;
+ 	  int temp_line_number = line_number;
+ 
+ 	  line_number = brace_stack->line;
+ 	  proc_name = find_proc_name (brace_stack->proc);
+ 	  line_error ("%c%s missing close brace", COMMAND_PREFIX, proc_name);
+ 	  line_number = temp_line_number;
+ 	  pop_and_call_brace ();
+ 	}
+       else
+ 	{
+ 	  BRACE_ELEMENT *temp;
+ 	  temp = brace_stack->next;
+ 	  free (brace_stack);
+ 	  brace_stack = temp;
+ 	}
+     }
+ }
+ 
+ int
+ get_char_len (character)
+      int character;
+ {
+   /* Return the printed length of the character. */
+   int len;
+ 
+   switch (character)
+     {
+     case '\t':
+       len = (output_column + 8) & 0xf7;
+       if (len > fill_column)
+ 	len = fill_column - output_column;
+       else
+ 	len = len - output_column;
+       break;
+ 
+     case '\n':
+       len = fill_column - output_column;
+       break;
+ 
+     default:
+       if (character < ' ')
+ 	len = 2;
+       else
+ 	len = 1;
+     }
+   return (len);
+ }
+ 
+ #if defined (HAVE_VARARGS_H) && defined (HAVE_VSPRINTF)
+ 
+ void
+ add_word_args (va_alist)
+      va_dcl
+ {
+   char buffer[1000];
+   char *format;
+   va_list args;
+ 
+   va_start (args);
+   format = va_arg (args, char *);
+   vsprintf (buffer, format, args);
+   va_end (args);
+   add_word (buffer);
+ }
+ 
+ #else /* !(HAVE_VARARGS_H && HAVE_VSPRINTF) */
+ 
+ void
+ add_word_args (format, arg1, arg2, arg3, arg4, arg5)
+      char *format;
+ {
+   char buffer[1000];
+   sprintf (buffer, format, arg1, arg2, arg3, arg4, arg5);
+   add_word (buffer);
+ }
+ 
+ #endif /* !(HAVE_VARARGS_H && HAVE_VSPRINTF) */
+ 
+ /* Add STRING to output_paragraph. */
+ void
+ add_word (string)
+      char *string;
+ {
+   while (*string)
+     add_char (*string++);
+ }
+ 
+ /* Non-zero if the last character inserted has the syntax class of NEWLINE. */
+ int last_char_was_newline = 1;
+ 
+ /* The actual last inserted character.  Note that this may be something
+    other than NEWLINE even if last_char_was_newline is 1. */
+ int last_inserted_character = 0;
+ 
+ /* Non-zero means that a newline character has already been
+    inserted, so close_paragraph () should insert one less. */
+ int line_already_broken = 0;
+ 
+ /* When non-zero we have finished an insertion (see end_insertion ()) and we
+    want to ignore false continued paragraph closings. */
+ int insertion_paragraph_closed = 0;
+ 
+ /* Non-zero means attempt to make all of the lines have fill_column width. */
+ int do_justification = 0;
+ 
+ /* Add the character to the current paragraph.  If filling_enabled is
+    non-zero, then do filling as well. */
+ void
+ add_char (character)
+      int character;
+ {
+   /* If we are avoiding outputting headers, and we are currently
+      in a menu, then simply return. */
+   if (no_headers && in_menu)
+     return;
+ 
+   /* If we are adding a character now, then we don't have to
+      ignore close_paragraph () calls any more. */
+   if (must_start_paragraph && character != '\n')
+     {
+       must_start_paragraph = 0;
+       line_already_broken = 0;	/* The line is no longer broken. */
+       if (current_indent > output_column)
+ 	{
+ 	  indent (current_indent - output_column);
+ 	  output_column = current_indent;
+ 	}
+     }
+ 
+   if (non_splitting_words && member (character, " \t\n"))
+     character = ' ' | 0x80;
+ 
+   insertion_paragraph_closed = 0;
+ 
+   switch (character)
+     {
+     case '\n':
+       if (!filling_enabled)
+ 	{
+ 	  insert ('\n');
+ 
+ 	  if (force_flush_right)
+ 	    {
+ 	      close_paragraph ();
+ 	      /* Hack to force single blank lines out in this mode. */
+ 	      flush_output ();
+ 	    }
+ 
+ 	  output_column = 0;
+ 
+ 	  if (!no_indent && paragraph_is_open)
+ 	    indent (output_column = current_indent);
+ 	  break;
+ 	}
+       else /* CHARACTER is newline, and filling is enabled. */
+ 	{
+ 	  if (sentence_ender (last_inserted_character))
+ 	    {
+ 	      insert (' ');
+ 	      output_column++;
+ 	      last_inserted_character = character;
+ 	    }
+ 	}
+ 
+       if (last_char_was_newline)
+ 	{
+ 	  close_paragraph ();
+ 	  pending_indent = 0;
+ 	}
+       else
+ 	{
+ 	  last_char_was_newline = 1;
+ 	  insert (' ');
+ 	  output_column++;
+ 	}
+       break;
+ 
+     default:
+       {
+ 	int len = get_char_len (character);
+ 	int suppress_insert = 0;
+ 
+ 	if ((character == ' ') && (last_char_was_newline))
+ 	  {
+ 	    if (!paragraph_is_open)
+ 	      {
+ 		pending_indent++;
+ 		return;
+ 	      }
+ 	  }
+ 
+ 	if (!paragraph_is_open)
+ 	  {
+ 	    start_paragraph ();
+ 
+ 	    /* If the paragraph is supposed to be indented a certain way,
+ 	       then discard all of the pending whitespace.  Otherwise, we
+ 	       let the whitespace stay. */
+ 	    if (!paragraph_start_indent)
+ 	      indent (pending_indent);
+ 	    pending_indent = 0;
+ 	  }
+ 
+ 	if ((output_column += len) > fill_column)
+ 	  {
+ 	    if (filling_enabled)
+ 	      {
+ 		int temp = output_paragraph_offset;
+ 		while (--temp > 0 && output_paragraph[temp] != '\n')
+ 		  {
+ 		    /* If we have found a space, we have the place to break
+ 		       the line. */
+ 		    if (output_paragraph[temp] == ' ')
+ 		      {
+ 			/* Remove trailing whitespace from output. */
+ 			while (temp && whitespace (output_paragraph[temp - 1]))
+ 			  temp--;
+ 
+ 			output_paragraph[temp++] = '\n';
+ 
+ 			/* We have correctly broken the line where we want
+ 			   to.  What we don't want is spaces following where
+ 			   we have decided to break the line.  We get rid of
+ 			   them. */
+ 			{
+ 			  int t1 = temp;
+ 
+ 			  for (;; t1++)
+ 			    {
+ 			      if (t1 == output_paragraph_offset)
+ 				{
+ 				  if (whitespace (character))
+ 				    suppress_insert = 1;
+ 				  break;
+ 				}
+ 			      if (!whitespace (output_paragraph[t1]))
+ 				break;
+ 			    }
+ 
+ 			  if (t1 != temp)
+ 			    {
+ 			      adjust_braces_following (temp, (- (t1 - temp)));
+ 			      strncpy ((char *) &output_paragraph[temp],
+ 				       (char *) &output_paragraph[t1],
+ 				       (output_paragraph_offset - t1));
+ 			      output_paragraph_offset -= (t1 - temp);
+ 			    }
+ 			}
+ 
+ 			/* Filled, but now indent if that is right. */
+ 			if (indented_fill && current_indent)
+ 			  {
+ 			    int buffer_len = ((output_paragraph_offset - temp)
+ 					      + current_indent);
+ 			    char *temp_buffer = (char *)xmalloc (buffer_len);
+ 			    int indentation = 0;
+ 
+ 			    /* We have to shift any markers that are in
+ 			       front of the wrap point. */
+ 			    adjust_braces_following (temp, current_indent);
+ 
+ 			    while (current_indent > 0 &&
+ 				   indentation != current_indent)
+ 			      temp_buffer[indentation++] = ' ';
+ 
+ 			    strncpy ((char *) &temp_buffer[current_indent],
+ 				     (char *) &output_paragraph[temp],
+ 				     buffer_len - current_indent);
+ 
+ 			    if (output_paragraph_offset + buffer_len
+ 				>= paragraph_buffer_len)
+ 			      {
+ 				unsigned char *tt = xrealloc
+ 				  (output_paragraph,
+ 				   (paragraph_buffer_len += buffer_len));
+ 				output_paragraph = tt;
+ 			      }
+ 			    strncpy ((char *) &output_paragraph[temp],
+ 				     temp_buffer, buffer_len);
+ 			    output_paragraph_offset += current_indent;
+ 			    free (temp_buffer);
+ 			  }
+ 			output_column = 0;
+ 			while (temp < output_paragraph_offset)
+ 			  output_column +=
+ 			    get_char_len (output_paragraph[temp++]);
+ 			output_column += len;
+ 			break;
+ 		      }
+ 		  }
+ 	      }
+ 	  }
+ 
+ 	if (!suppress_insert)
+ 	  {
+ 	    insert (character);
+ 	    last_inserted_character = character;
+ 	  }
+ 	last_char_was_newline = 0;
+ 	line_already_broken = 0;
+       }
+     }
+ }
+ 
+ /* Insert CHARACTER into OUTPUT_PARAGRAPH. */
+ void
+ insert (character)
+      int character;
+ {
+   output_paragraph[output_paragraph_offset++] = character;
+   if (output_paragraph_offset == paragraph_buffer_len)
+     {
+       output_paragraph =
+ 	xrealloc (output_paragraph, (paragraph_buffer_len += 100));
+     }
+ }
+ 
+ /* Remove upto COUNT characters of whitespace from the
+    the current output line.  If COUNT is less than zero,
+    then remove until none left. */
+ void
+ kill_self_indent (count)
+      int count;
+ {
+   /* Handle infinite case first. */
+   if (count < 0)
+     {
+       output_column = 0;
+       while (output_paragraph_offset)
+ 	{
+ 	  if (whitespace (output_paragraph[output_paragraph_offset - 1]))
+ 	    output_paragraph_offset--;
+ 	  else
+ 	    break;
+ 	}
+     }
+   else
+     {
+       while (output_paragraph_offset && count--)
+ 	if (whitespace (output_paragraph[output_paragraph_offset - 1]))
+ 	  output_paragraph_offset--;
+ 	else
+ 	  break;
+     }
+ }
+ 
+ /* Non-zero means do not honor calls to flush_output (). */
+ static int flushing_ignored = 0;
+ 
+ /* Prevent calls to flush_output () from having any effect. */
+ void
+ inhibit_output_flushing ()
+ {
+   flushing_ignored++;
+ }
+ 
+ /* Allow calls to flush_output () to write the paragraph data. */
+ void
+ uninhibit_output_flushing ()
+ {
+   flushing_ignored--;
+ }
+ 
+ void
+ flush_output ()
+ {
+   register int i;
+ 
+   if (!output_paragraph_offset || flushing_ignored)
+     return;
+ 
+   for (i = 0; i < output_paragraph_offset; i++)
+     {
+       if (output_paragraph[i] == (unsigned char)(' ' | 0x80))
+ 	output_paragraph[i] &= 0x7f;
+     }
+ 
+   fwrite (output_paragraph, 1, output_paragraph_offset, output_stream);
+ 
+   output_position += output_paragraph_offset;
+   output_paragraph_offset = 0;
+ }
+ 
+ /* How to close a paragraph controlling the number of lines between
+    this one and the last one. */
+ 
+ /* Paragraph spacing is controlled by this variable.  It is the number of
+    blank lines that you wish to appear between paragraphs.  A value of
+    1 creates a single blank line between paragraphs. */
+ int paragraph_spacing = DEFAULT_PARAGRAPH_SPACING;
+ 
+ /* Close the current paragraph, leaving no blank lines between them. */
+ void
+ close_single_paragraph ()
+ {
+   close_paragraph_with_lines (0);
+ }
+ 
+ /* Close a paragraph after an insertion has ended. */
+ void
+ close_insertion_paragraph ()
+ {
+   if (!insertion_paragraph_closed)
+     {
+       /* Close the current paragraph, breaking the line. */
+       close_single_paragraph ();
+ 
+       /* Start a new paragraph here, inserting whatever indention is correct
+ 	 for the now current insertion level (one above the one that we are
+ 	 ending). */
+       start_paragraph ();
+ 
+       /* Tell close_paragraph () that the previous line has already been
+ 	 broken, so it should insert one less newline. */
+       line_already_broken = 1;
+ 
+       /* Let functions such as add_char () know that we have already found a
+ 	 newline. */
+       ignore_blank_line ();
+     }
+   else
+     {
+       /* If the insertion paragraph is closed already, then we are seeing
+ 	 two `@end' commands in a row.  Note that the first one we saw was
+ 	 handled in the first part of this if-then-else clause, and at that
+ 	 time start_paragraph () was called, partially to handle the proper
+ 	 indentation of the current line.  However, the indentation level
+ 	 may have just changed again, so we may have to outdent the current
+ 	 line to the new indentation level. */
+       if (current_indent < output_column)
+ 	kill_self_indent (output_column - current_indent);
+     }
+ 
+   insertion_paragraph_closed = 1;
+ }
+ 
+ void
+ close_paragraph_with_lines (lines)
+      int lines;
+ {
+   int old_spacing = paragraph_spacing;
+   paragraph_spacing = lines;
+   close_paragraph ();
+   paragraph_spacing = old_spacing;
+ }
+ 
+ /* Close the currently open paragraph. */
+ void
+ close_paragraph ()
+ {
+   register int i;
+ 
+   /* The insertion paragraph is no longer closed. */
+   insertion_paragraph_closed = 0;
+ 
+   if (paragraph_is_open && !must_start_paragraph)
+     {
+       register int tindex, c;
+ 
+       tindex = output_paragraph_offset;
+ 
+       /* Back up to last non-newline/space character, forcing all such
+ 	 subsequent characters to be newlines.  This isn't strictly
+ 	 necessary, but a couple of functions use the presence of a newline
+ 	 to make decisions. */
+       for (tindex = output_paragraph_offset - 1; tindex >= 0; --tindex)
+ 	{
+ 	  c = output_paragraph[tindex];
+ 
+ 	  if (c == ' '|| c == '\n')
+ 	    output_paragraph[tindex] = '\n';
+ 	  else
+ 	    break;
+ 	}
+ 
+       /* All trailing whitespace is ignored. */
+       output_paragraph_offset = ++tindex;
+ 
+       /* Break the line if that is appropriate. */
+       if (paragraph_spacing >= 0)
+ 	insert ('\n');
+ 
+       /* Add as many blank lines as is specified in PARAGRAPH_SPACING. */
+       if (!force_flush_right)
+ 	{
+ 	  for (i = 0; i < (paragraph_spacing - line_already_broken); i++)
+ 	    insert ('\n');
+ 	}
+ 
+       /* If we are doing flush right indentation, then do it now
+ 	 on the paragraph (really a single line). */
+       if (force_flush_right)
+ 	do_flush_right_indentation ();
+ 
+       flush_output ();
+       paragraph_is_open = 0;
+       no_indent = 0;
+       output_column = 0;
+     }
+   ignore_blank_line ();
+ }
+ 
+ /* Make the last line just read look as if it were only a newline. */
+ void
+ ignore_blank_line ()
+ {
+   last_inserted_character = '\n';
+   last_char_was_newline = 1;
+ }
+ 
+ /* Align the end of the text in output_paragraph with fill_column. */
+ void
+ do_flush_right_indentation ()
+ {
+   char *temp;
+   int temp_len;
+ 
+   kill_self_indent (-1);
+ 
+   if (output_paragraph[0] != '\n')
+     {
+       output_paragraph[output_paragraph_offset] = '\0';
+ 
+       if (output_paragraph_offset < fill_column)
+ 	{
+ 	  register int i;
+ 
+ 	  if (fill_column >= paragraph_buffer_len)
+ 	    output_paragraph =
+ 	      xrealloc (output_paragraph,
+ 			(paragraph_buffer_len += fill_column));
+ 
+ 	  temp_len = strlen ((char *)output_paragraph);
+ 	  temp = (char *)xmalloc (temp_len + 1);
+ 	  memcpy (temp, (char *)output_paragraph, temp_len);
+ 
+ 	  for (i = 0; i < fill_column - output_paragraph_offset; i++)
+ 	    output_paragraph[i] = ' ';
+ 
+ 	  memcpy ((char *)output_paragraph + i, temp, temp_len);
+ 	  free (temp);
+ 	  output_paragraph_offset = fill_column;
+ 	}
+     }
+ }
+ 
+ /* Begin a new paragraph. */
+ void
+ start_paragraph ()
+ {
+   /* First close existing one. */
+   if (paragraph_is_open)
+     close_paragraph ();
+ 
+   /* In either case, the insertion paragraph is no longer closed. */
+   insertion_paragraph_closed = 0;
+ 
+   /* However, the paragraph is open! */
+   paragraph_is_open = 1;
+ 
+   /* If we MUST_START_PARAGRAPH, that simply means that start_paragraph ()
+      had to be called before we would allow any other paragraph operations
+      to have an effect. */
+   if (!must_start_paragraph)
+     {
+       int amount_to_indent = 0;
+ 
+       /* If doing indentation, then insert the appropriate amount. */
+       if (!no_indent)
+ 	{
+ 	  if (inhibit_paragraph_indentation)
+ 	    {
+ 	      amount_to_indent = current_indent;
+ 	      if (inhibit_paragraph_indentation < 0)
+ 		inhibit_paragraph_indentation++;
+ 	    }
+ 	  else if (paragraph_start_indent < 0)
+ 	    amount_to_indent = current_indent;
+ 	  else
+ 	    amount_to_indent = current_indent + paragraph_start_indent;
+ 
+ 	  if (amount_to_indent >= output_column)
+ 	    {
+ 	      amount_to_indent -= output_column;
+ 	      indent (amount_to_indent);
+ 	      output_column += amount_to_indent;
+ 	    }
+ 	}
+     }
+   else
+     must_start_paragraph = 0;
+ }
+ 
+ /* Insert the indentation specified by AMOUNT. */
+ void
+ indent (amount)
+      int amount;
+ {
+   register BRACE_ELEMENT *elt = brace_stack;
+ 
+   /* For every START_POS saved within the brace stack which will be affected
+      by this indentation, bump that start pos forward. */
+   while (elt)
+     {
+       if (elt->pos >= output_paragraph_offset)
+ 	elt->pos += amount;
+       elt = elt->next;
+     }
+ 
+   while (--amount >= 0)
+     insert (' ');
+ }
+ 
+ /* Search forward for STRING in input_text.
+    FROM says where where to start. */
+ int
+ search_forward (string, from)
+      char *string;
+      int from;
+ {
+   int len = strlen (string);
+ 
+   while (from < size_of_input_text)
+     {
+       if (strncmp (input_text + from, string, len) == 0)
+ 	return (from);
+       from++;
+     }
+   return (-1);
+ }
+ 
+ /* Whoops, Unix doesn't have strcasecmp. */
+ 
+ /* Case independent string compare. */
+ #if !defined (HAVE_STRCASECMP)
+ int
+ strcasecmp (string1, string2)
+      char *string1, *string2;
+ {
+   char ch1, ch2;
+ 
+   for (;;)
+     {
+       ch1 = *string1++;
+       ch2 = *string2++;
+ 
+       if (!(ch1 | ch2))
+ 	return (0);
+ 
+       ch1 = coerce_to_upper (ch1);
+       ch2 = coerce_to_upper (ch2);
+ 
+       if (ch1 != ch2)
+ 	return (ch1 - ch2);
+     }
+ }
+ #endif /* !HAVE_STRCASECMP */
+ 
+ enum insertion_type { menu, quotation, lisp, smalllisp, example,
+   smallexample, display, itemize, format, enumerate, cartouche, table,
+   ftable, vtable, group, ifinfo, flushleft, flushright, ifset, ifclear, deffn,
+   defun, defmac, defspec, defvr, defvar, defopt, deftypefn,
+   deftypefun, deftypevr, deftypevar, defcv, defivar, defop, defmethod,
+   deftypemethod, deftp, bad_type };
+ 
+ char *insertion_type_names[] = { "menu", "quotation", "lisp",
+   "smalllisp", "example", "smallexample", "display", "itemize",
+   "format", "enumerate", "cartouche", "table", "ftable", "vtable", "group",
+   "ifinfo", "flushleft", "flushright", "ifset", "ifclear", "deffn",
+   "defun", "defmac", "defspec", "defvr", "defvar", "defopt",
+   "deftypefn", "deftypefun", "deftypevr", "deftypevar", "defcv",
+   "defivar", "defop", "defmethod", "deftypemethod", "deftp",
+   "bad_type" };
+ 
+ int insertion_level = 0;
+ typedef struct istack_elt
+ {
+   struct istack_elt *next;
+   char *item_function;
+   char *filename;
+   int line_number;
+   int filling_enabled;
+   int indented_fill;
+   enum insertion_type insertion;
+   int inhibited;
+ } INSERTION_ELT;
+ 
+ INSERTION_ELT *insertion_stack = (INSERTION_ELT *) NULL;
+ 
+ void
+ init_insertion_stack ()
+ {
+   insertion_stack = (INSERTION_ELT *) NULL;
+ }
+ 
+ /* Return the type of the current insertion. */
+ enum insertion_type
+ current_insertion_type ()
+ {
+   if (!insertion_level)
+     return (bad_type);
+   else
+     return (insertion_stack->insertion);
+ }
+ 
+ /* Return a pointer to the string which is the function to wrap around
+    items. */
+ char *
+ current_item_function ()
+ {
+   register int level, done;
+   register INSERTION_ELT *elt;
+ 
+   level = insertion_level;
+   elt = insertion_stack;
+   done = 0;
+ 
+   /* Skip down through the stack until we find a non-conditional insertion. */
+   while (!done && (elt != NULL))
+     {
+       switch (elt->insertion)
+ 	{
+ 	case ifinfo:
+ 	case ifset:
+ 	case ifclear:
+ 	case cartouche:
+ 	  elt = elt->next;
+ 	  level--;
+ 	  break;
+ 
+ 	default:
+ 	  done = 1;
+ 	}
+     }
+ 
+   if (!level)
+     return ((char *) NULL);
+   else
+     return (elt->item_function);
+ }
+ 
+ char *
+ get_item_function ()
+ {
+   char *item_function;
+   get_rest_of_line (&item_function);
+   backup_input_pointer ();
+   canon_white (item_function);
+   return (item_function);
+ }
+ 
+  /* Push the state of the current insertion on the stack. */
+ void
+ push_insertion (type, item_function)
+      enum insertion_type type;
+      char *item_function;
+ {
+   INSERTION_ELT *new = (INSERTION_ELT *) xmalloc (sizeof (INSERTION_ELT));
+ 
+   new->item_function = item_function;
+   new->filling_enabled = filling_enabled;
+   new->indented_fill = indented_fill;
+   new->insertion = type;
+   new->line_number = line_number;
+   new->filename = strdup (input_filename);
+   new->inhibited = inhibit_paragraph_indentation;
+   new->next = insertion_stack;
+   insertion_stack = new;
+   insertion_level++;
+ }
+ 
+  /* Pop the value on top of the insertion stack into the
+     global variables. */
+ void
+ pop_insertion ()
+ {
+   INSERTION_ELT *temp = insertion_stack;
+ 
+   if (temp == (INSERTION_ELT *) NULL)
+     return;
+ 
+   inhibit_paragraph_indentation = temp->inhibited;
+   filling_enabled = temp->filling_enabled;
+   indented_fill = temp->indented_fill;
+   free_and_clear (&(temp->item_function));
+   free_and_clear (&(temp->filename));
+   insertion_stack = insertion_stack->next;
+   free (temp);
+   insertion_level--;
+ }
+ 
+  /* Return a pointer to the print name of this
+     enumerated type. */
+ char *
+ insertion_type_pname (type)
+      enum insertion_type type;
+ {
+   if ((int) type < (int) bad_type)
+     return (insertion_type_names[(int) type]);
+   else
+     return ("Broken-Type in insertion_type_pname");
+ }
+ 
+ /* Return the insertion_type associated with NAME.
+    If the type is not one of the known ones, return BAD_TYPE. */
+ enum insertion_type
+ find_type_from_name (name)
+      char *name;
+ {
+   int index = 0;
+   while (index < (int) bad_type)
+     {
+       if (strcmp (name, insertion_type_names[index]) == 0)
+ 	return (enum insertion_type) index;
+       index++;
+     }
+   return (bad_type);
+ }
+ 
+ void
+ do_nothing ()
+ {
+ }
+ 
+ int
+ defun_insertion (type)
+      enum insertion_type type;
+ {
+   return
+     ((type == deffn)
+      || (type == defun)
+      || (type == defmac)
+      || (type == defspec)
+      || (type == defvr)
+      || (type == defvar)
+      || (type == defopt)
+      || (type == deftypefn)
+      || (type == deftypefun)
+      || (type == deftypevr)
+      || (type == deftypevar)
+      || (type == defcv)
+      || (type == defivar)
+      || (type == defop)
+      || (type == defmethod)
+      || (type == deftypemethod)
+      || (type == deftp));
+ }
+ 
+ /* MAX_NS is the maximum nesting level for enumerations.  I picked 100
+    which seemed reasonable.  This doesn't control the number of items,
+    just the number of nested lists. */
+ #define max_stack_depth 100
+ #define ENUM_DIGITS 1
+ #define ENUM_ALPHA  2
+ typedef struct {
+   int enumtype;
+   int enumval;
+ } DIGIT_ALPHA;
+ 
+ DIGIT_ALPHA enumstack[max_stack_depth];
+ int enumstack_offset = 0;
+ int current_enumval = 1;
+ int current_enumtype = ENUM_DIGITS;
+ char *enumeration_arg = (char *)NULL;
+ 
+ void
+ start_enumerating (at, type)
+      int at, type;
+ {
+   if ((enumstack_offset + 1) == max_stack_depth)
+     {
+       line_error ("Enumeration stack overflow");
+       return;
+     }
+   enumstack[enumstack_offset].enumtype = current_enumtype;
+   enumstack[enumstack_offset].enumval = current_enumval;
+   enumstack_offset++;
+   current_enumval = at;
+   current_enumtype = type;
+ }
+ 
+ void
+ stop_enumerating ()
+ {
+   --enumstack_offset;
+   if (enumstack_offset < 0)
+     enumstack_offset = 0;
+ 
+   current_enumval = enumstack[enumstack_offset].enumval;
+   current_enumtype = enumstack[enumstack_offset].enumtype;
+ }
+ 
+ /* Place a letter or digits into the output stream. */
+ void
+ enumerate_item ()
+ {
+   char temp[10];
+ 
+   if (current_enumtype == ENUM_ALPHA)
+     {
+       if (current_enumval == ('z' + 1) || current_enumval == ('Z' + 1))
+ 	{
+ 	  current_enumval = ((current_enumval - 1) == 'z' ? 'a' : 'A');
+ 	  warning ("Lettering overflow, restarting at %c", current_enumval);
+ 	}
+       sprintf (temp, "%c. ", current_enumval);
+     }
+   else
+     sprintf (temp, "%d. ", current_enumval);
+ 
+   indent (output_column += (current_indent - strlen (temp)));
+   add_word (temp);
+   current_enumval++;
+ }
+ 
+ /* This is where the work for all the "insertion" style
+    commands is done.  A huge switch statement handles the
+    various setups, and generic code is on both sides. */
+ void
+ begin_insertion (type)
+      enum insertion_type type;
+ {
+   int no_discard = 0;
+ 
+   if (defun_insertion (type))
+     {
+       push_insertion (type, strdup (""));
+       no_discard++;
+     }
+   else
+     push_insertion (type, get_item_function ());
+ 
+   switch (type)
+     {
+     case menu:
+       if (!no_headers)
+ 	close_paragraph ();
+ 
+       filling_enabled = no_indent = 0;
+       inhibit_paragraph_indentation = 1;
+ 
+       if (!no_headers)
+ 	add_word ("* Menu:\n");
+ 
+       in_menu++;
+       no_discard++;
+       break;
+ 
+       /* I think @quotation is meant to do filling.
+ 	 If you don't want filling, then use @example. */
+     case quotation:
+       close_single_paragraph ();
+       last_char_was_newline = no_indent = 0;
+       indented_fill = filling_enabled = 1;
+       inhibit_paragraph_indentation = 1;
+       current_indent += default_indentation_increment;
+       break;
+ 
+     case display:
+     case example:
+     case smallexample:
+     case lisp:
+     case smalllisp:
+       /* Just like @example, but no indentation. */
+     case format:
+ 
+       close_single_paragraph ();
+       inhibit_paragraph_indentation = 1;
+       in_fixed_width_font++;
+       filling_enabled = 0;
+       last_char_was_newline = 0;
+ 
+       if (type != format)
+ 	current_indent += default_indentation_increment;
+ 
+       break;
+ 
+     case table:
+     case ftable:
+     case vtable:
+     case itemize:
+       close_single_paragraph ();
+       current_indent += default_indentation_increment;
+       filling_enabled = indented_fill = 1;
+ #if defined (INDENT_PARAGRAPHS_IN_TABLE)
+       inhibit_paragraph_indentation = 0;
+ #else
+       inhibit_paragraph_indentation = 1;
+ #endif /* !INDENT_PARAGRAPHS_IN_TABLE */
+ 
+       /* Make things work for losers who forget the itemize syntax. */
+       if (allow_lax_format && (type == itemize))
+ 	{
+ 	  if (!(*insertion_stack->item_function))
+ 	    {
+ 	      free (insertion_stack->item_function);
+ 	      insertion_stack->item_function = strdup ("@bullet");
+ 	      insertion_stack->item_function[0] = COMMAND_PREFIX;
+ 	    }
+ 	}
+ 
+       if (!*insertion_stack->item_function)
+ 	{
+ 	  line_error ("%s requires an argument: the formatter for %citem",
+ 		      insertion_type_pname (type), COMMAND_PREFIX);
+ 	}
+       break;
+ 
+     case enumerate:
+       close_single_paragraph ();
+       no_indent = 0;
+ #if defined (INDENT_PARAGRAPHS_IN_TABLE)
+       inhibit_paragraph_indentation = 0;
+ #else
+       inhibit_paragraph_indentation = 1;
+ #endif /* !INDENT_PARAGRAPHS_IN_TABLE */
+ 
+       current_indent += default_indentation_increment;
+       filling_enabled = indented_fill = 1;
+ 
+       if (isdigit (*enumeration_arg))
+ 	start_enumerating (atoi (enumeration_arg), ENUM_DIGITS);
+       else
+ 	start_enumerating (*enumeration_arg, ENUM_ALPHA);
+       break;
+ 
+       /* Does nothing special in makeinfo. */
+     case group:
+       /* Only close the paragraph if we are not inside of an @example. */
+       if (!insertion_stack->next ||
+ 	  insertion_stack->next->insertion != example)
+ 	close_single_paragraph ();
+       break;
+ 
+       /* Insertions that are no-ops in info, but do something in TeX. */
+     case ifinfo:
+     case ifset:
+     case ifclear:
+     case cartouche:
+       if (in_menu)
+ 	no_discard++;
+       break;
+ 
+     case deffn:
+     case defun:
+     case defmac:
+     case defspec:
+     case defvr:
+     case defvar:
+     case defopt:
+     case deftypefn:
+     case deftypefun:
+     case deftypevr:
+     case deftypevar:
+     case defcv:
+     case defivar:
+     case defop:
+     case defmethod:
+     case deftypemethod:
+     case deftp:
+       inhibit_paragraph_indentation = 1;
+       filling_enabled = indented_fill = 1;
+       current_indent += default_indentation_increment;
+       no_indent = 0;
+       break;
+ 
+     case flushleft:
+       close_single_paragraph ();
+       inhibit_paragraph_indentation = 1;
+       filling_enabled = indented_fill = no_indent = 0;
+       break;
+ 
+     case flushright:
+       close_single_paragraph ();
+       filling_enabled = indented_fill = no_indent = 0;
+       inhibit_paragraph_indentation = 1;
+       force_flush_right++;
+       break;
+     }
+ 
+   if (!no_discard)
+     discard_until ("\n");
+ }
+ 
+ /* Try to end the insertion with the specified TYPE.
+    TYPE, with a value of bad_type,  gets translated to match
+    the value currently on top of the stack.
+    Otherwise, if TYPE doesn't match the top of the insertion stack,
+    give error. */
+ void
+ end_insertion (type)
+      enum insertion_type type;
+ {
+   enum insertion_type temp_type;
+ 
+   if (!insertion_level)
+     return;
+ 
+   temp_type = current_insertion_type ();
+ 
+   if (type == bad_type)
+     type = temp_type;
+ 
+   if (type != temp_type)
+     {
+       line_error
+ 	("`%cend' expected `%s', but saw `%s'", COMMAND_PREFIX,
+ 	 insertion_type_pname (temp_type), insertion_type_pname (type));
+       return;
+     }
+ 
+   pop_insertion ();
+ 
+   switch (type)
+     {
+       /* Insertions which have no effect on paragraph formatting. */
+     case ifinfo:
+     case ifset:
+     case ifclear:
+       break;
+ 
+     case menu:
+       in_menu--;		/* No longer hacking menus. */
+       if (!no_headers)
+ 	close_insertion_paragraph ();
+       break;
+ 
+     case enumerate:
+       stop_enumerating ();
+       close_insertion_paragraph ();
+       current_indent -= default_indentation_increment;
+       break;
+ 
+     case flushleft:
+     case group:
+     case cartouche:
+       close_insertion_paragraph ();
+       break;
+ 
+     case format:
+     case display:
+     case example:
+     case smallexample:
+     case lisp:
+     case smalllisp:
+     case quotation:
+ 
+       /* @quotation is the only one of the above without a fixed width
+ 	 font. */
+       if (type != quotation)
+ 	in_fixed_width_font--;
+ 
+       /* @format is the only fixed_width insertion without a change
+ 	 in indentation. */
+       if (type != format)
+ 	current_indent -= default_indentation_increment;
+ 
+       /* The ending of one of these insertions always marks the
+ 	 start of a new paragraph. */
+       close_insertion_paragraph ();
+       break;
+ 
+     case table:
+     case ftable:
+     case vtable:
+     case itemize:
+       current_indent -= default_indentation_increment;
+       break;
+ 
+     case flushright:
+       force_flush_right--;
+       close_insertion_paragraph ();
+       break;
+ 
+       /* Handle the @defun style insertions with a default clause. */
+     default:
+       current_indent -= default_indentation_increment;
+       close_insertion_paragraph ();
+       break;
+     }
+ }
+ 
+ /* Insertions cannot cross certain boundaries, such as node beginnings.  In
+    code that creates such boundaries, you should call discard_insertions ()
+    before doing anything else.  It prints the errors for you, and cleans up
+    the insertion stack. */
+ void
+ discard_insertions ()
+ {
+   int real_line_number = line_number;
+   while (insertion_stack)
+     {
+       if (insertion_stack->insertion == ifinfo ||
+ 	  insertion_stack->insertion == ifset ||
+ 	  insertion_stack->insertion == ifclear)
+ 	break;
+       else
+ 	{
+ 	  char *offender;
+ 	  char *current_filename;
+ 
+ 	  current_filename = input_filename;
+ 	  offender = (char *)insertion_type_pname (insertion_stack->insertion);
+ 	  input_filename = insertion_stack->filename;
+ 	  line_number = insertion_stack->line_number;
+ 	  line_error ("This `%s' doesn't have a matching `%cend %s'", offender,
+ 		      COMMAND_PREFIX, offender);
+ 	  input_filename = current_filename;
+ 	  pop_insertion ();
+ 	}
+     }
+   line_number = real_line_number;
+ }
+ 
+ /* The actual commands themselves. */
+ 
+ /* Commands which insert themselves. */
+ void
+ insert_self ()
+ {
+   add_word (command);
+ }
+ 
+ /* Force a line break in the output. */
+ void
+ cm_asterisk ()
+ {
+   close_single_paragraph ();
+ #if !defined (ASTERISK_NEW_PARAGRAPH)
+   cm_noindent ();
+ #endif /* ASTERISK_NEW_PARAGRAPH */
+ }
+ 
+ /* Insert ellipsis. */
+ void
+ cm_dots (arg)
+      int arg;
+ {
+   if (arg == START)
+     add_word ("...");
+ }
+ 
+ void
+ cm_bullet (arg)
+      int arg;
+ {
+   if (arg == START)
+     add_char ('*');
+ }
+ 
+ void
+ cm_minus (arg)
+      int arg;
+ {
+   if (arg == START)
+     add_char ('-');
+ }
+ 
+ /* Insert "TeX". */
+ void
+ cm_TeX (arg)
+      int arg;
+ {
+   if (arg == START)
+     add_word ("TeX");
+ }
+ 
+ void
+ cm_copyright (arg)
+      int arg;
+ {
+   if (arg == START)
+     add_word ("(C)");
+ }
+ 
+ #if defined (__osf__)
+ #define LOCALTIME_CAST(x) (time_t *)(x)
+ #else
+ #define LOCALTIME_CAST(x) (x)
+ #endif
+ 
+ void
+ cm_today (arg)
+      int arg;
+ {
+   static char * months [12] =
+     { "January", "February", "March", "April", "May", "June", "July",
+ 	"August", "September", "October", "November", "December" };
+   if (arg == START)
+     {
+       long timer = time (0);
+       struct tm *ts = localtime (LOCALTIME_CAST (&timer));
+       add_word_args
+ 	("%d %s %d",
+ 	 (ts -> tm_mday),
+ 	 (months [ts -> tm_mon]),
+ 	 ((ts -> tm_year) + 1900));
+     }
+ }
+ 
+ void
+ cm_code (arg)
+      int arg;
+ {
+   extern int printing_index;
+ 
+   if (printing_index)
+     return;
+ 
+   if (arg == START)
+     {
+       in_fixed_width_font++;
+       add_char ('`');
+     }
+   else
+     {
+       add_word ("'");
+       in_fixed_width_font--;
+     }
+ }
+ 
+ void
+ cm_samp (arg)
+      int arg;
+ {
+   cm_code (arg);
+ }
+ 
+ void
+ cm_file (arg)
+      int arg;
+ {
+   cm_code (arg);
+ }
+ 
+ void
+ cm_kbd (arg)
+      int arg;
+ {
+   cm_code (arg);
+ }
+ 
+ void
+ cm_key (arg)
+      int arg;
+ {
+ }
+ 
+ /* Convert the character at position into CTL. */
+ void
+ cm_ctrl (arg, start, end)
+      int arg, start, end;
+ {
+   /* Should we allow multiple character arguments?  I think yes. */
+   if (arg == END)
+     {
+       register int i, character;
+ #if defined (NO_MULTIPLE_CTRL)
+       if ((end - start) != 1)
+ 	line_error ("%c%s expects a single character as an argument",
+ 		    COMMAND_PREFIX, command);
+       else
+ #endif
+ 	for (i = start; i < end; i++)
+ 	  {
+ 	    character = output_paragraph[i];
+ 
+ 	    if (isletter (character))
+ 	      output_paragraph[i] = CTL (coerce_to_upper (character));
+ 	  }
+     }
+ }
+ 
+ /* Small Caps in makeinfo just does all caps. */
+ void
+ cm_sc (arg, start_pos, end_pos)
+      int arg, start_pos, end_pos;
+ {
+   if (arg == END)
+     {
+       while (start_pos < end_pos)
+ 	{
+ 	  output_paragraph[start_pos] =
+ 	    coerce_to_upper (output_paragraph[start_pos]);
+ 	  start_pos++;
+ 	}
+     }
+ }
+ 
+ /* @var in makeinfo just uppercases the text. */
+ void
+ cm_var (arg, start_pos, end_pos)
+      int arg, start_pos, end_pos;
+ {
+   if (arg == END)
+     {
+       while (start_pos < end_pos)
+ 	{
+ 	  output_paragraph[start_pos] =
+ 	    coerce_to_upper (output_paragraph[start_pos]);
+ 	  start_pos++;
+ 	}
+     }
+ }
+ 
+ void
+ cm_dfn (arg, position)
+      int arg, position;
+ {
+   add_char ('"');
+ }
+ 
+ void
+ cm_emph (arg)
+      int arg;
+ {
+   add_char ('*');
+ }
+ 
+ void
+ cm_strong (arg, position)
+      int arg, position;
+ {
+   cm_emph (arg);
+ }
+ 
+ void
+ cm_cite (arg, position)
+      int arg, position;
+ {
+   if (arg == START)
+     add_word ("`");
+   else
+     add_word ("'");
+ }
+ 
+ /* Current text is italicized. */
+ void
+ cm_italic (arg, start, end)
+      int arg, start, end;
+ {
+ }
+ 
+ /* Current text is highlighted. */
+ void
+ cm_bold (arg, start, end)
+      int arg, start, end;
+ {
+   cm_italic (arg);
+ }
+ 
+ /* Current text is in roman font. */
+ void
+ cm_roman (arg, start, end)
+      int arg, start, end;
+ {
+ }
+ 
+ /* Current text is in roman font. */
+ void
+ cm_titlefont (arg, start, end)
+      int arg, start, end;
+ {
+ }
+ 
+ /* Italicize titles. */
+ void
+ cm_title (arg, start, end)
+      int arg, start, end;
+ {
+   cm_italic (arg);
+ }
+ 
+ /* @refill is a NOP. */
+ void
+ cm_refill ()
+ {
+ }
+ 
+ /* Prevent the argument from being split across two lines. */
+ void
+ cm_w (arg, start, end)
+      int arg, start, end;
+ {
+   if (arg == START)
+     non_splitting_words++;
+   else
+     non_splitting_words--;
+ }
+ 
+ 
+ /* Explain that this command is obsolete, thus the user shouldn't
+    do anything with it. */
+ void
+ cm_obsolete (arg, start, end)
+      int arg, start, end;
+ {
+   if (arg == START)
+     warning ("The command `%c%s' is obsolete", COMMAND_PREFIX, command);
+ }
+ 
+ /* Insert the text following input_text_offset up to the end of the line
+    in a new, separate paragraph.  Directly underneath it, insert a
+    line of WITH_CHAR, the same length of the inserted text. */
+ void
+ insert_and_underscore (with_char)
+      int with_char;
+ {
+   register int i, len;
+   int old_no_indent, starting_pos, ending_pos;
+   char *temp;
+ 
+   close_paragraph ();
+   filling_enabled =  indented_fill = 0;
+   old_no_indent = no_indent;
+   no_indent = 1;
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     append_to_expansion_output (input_text_offset + 1);
+ #endif /* HAVE_MACROS */
+ 
+   get_rest_of_line (&temp);
+ 
+   starting_pos = output_position + output_paragraph_offset;
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     {
+       char *temp1;
+ 
+       temp1 = (char *)xmalloc (2 + strlen (temp));
+       sprintf (temp1, "%s\n", temp);
+       remember_itext (input_text, input_text_offset);
+       me_execute_string (temp1);
+       free (temp1);
+     }
+   else
+ #endif /* HAVE_MACROS */
+   execute_string ("%s\n", temp);
+ 
+   ending_pos = output_position + output_paragraph_offset;
+   free (temp);
+ 
+   len = (ending_pos - starting_pos) - 1;
+   for (i = 0; i < len; i++)
+     add_char (with_char);
+   insert ('\n');
+   close_paragraph ();
+   filling_enabled = 1;
+   no_indent = old_no_indent;
+ }
+ 
+ /* Here is a structure which associates sectioning commands with
+    an integer, hopefully to reflect the `depth' of the current
+    section. */
+ struct {
+   char *name;
+   int level;
+ } section_alist[] = {
+   { "unnumberedsubsubsec", 5 },
+   { "unnumberedsubsec", 4 },
+   { "unnumberedsec", 3 },
+   { "unnumbered", 2 },
+   { "appendixsubsubsec", 5 },
+   { "appendixsubsec", 4 },
+   { "appendixsec", 3 },
+   { "appendixsection", 3 },
+   { "appendix", 2 },
+   { "subsubsec", 5 },
+   { "subsubsection", 5 },
+   { "subsection", 4 },
+   { "section", 3 },
+   { "chapter", 2 },
+   { "top", 1 },
+ 
+   { (char *)NULL, 0 }
+ };
+ 
+ /* Amount to offset the name of sectioning commands to levels by. */
+ int section_alist_offset = 0;
+ 
+ /* Shift the meaning of @section to @chapter. */
+ void
+ cm_raisesections ()
+ {
+   discard_until ("\n");
+   section_alist_offset--;
+ }
+ 
+ /* Shift the meaning of @chapter to @section. */
+ void
+ cm_lowersections ()
+ {
+   discard_until ("\n");
+   section_alist_offset++;
+ }
+ 
+ /* Return an integer which identifies the type section present in TEXT. */
+ int
+ what_section (text)
+      char *text;
+ {
+   register int i, j;
+   char *t;
+ 
+  find_section_command:
+   for (j = 0; text[j] && cr_or_whitespace (text[j]); j++);
+   if (text[j] != COMMAND_PREFIX)
+     return (-1);
+ 
+   text = text + j + 1;
+ 
+   /* We skip @c, @comment, and @?index commands. */
+   if ((strncmp (text, "comment", strlen ("comment")) == 0) ||
+       (text[0] == 'c' && cr_or_whitespace (text[1])) ||
+       (strcmp (text + 1, "index") == 0))
+     {
+       while (*text++ != '\n');
+       goto find_section_command;
+     }
+ 
+   /* Handle italicized sectioning commands. */
+   if (*text == 'i')
+     text++;
+ 
+   for (j = 0; text[j] && !cr_or_whitespace (text[j]); j++);
+ 
+   for (i = 0; t = section_alist[i].name; i++)
+     {
+       if (j == strlen (t) && strncmp (t, text, j) == 0)
+ 	{
+ 	  int return_val;
+ 
+ 	  return_val = (section_alist[i].level + section_alist_offset);
+ 
+ 	  if (return_val < 0)
+ 	    return_val = 0;
+ 	  else if (return_val > 5)
+ 	    return_val = 5;
+ 	  return (return_val);
+ 	}
+     }
+   return (-1);
+ }
+ 
+ /* Set the level of @top to LEVEL.  Return the old level of @top. */
+ int
+ set_top_section_level (level)
+      int level;
+ {
+   register int i, result = -1;
+ 
+   for (i = 0; section_alist[i].name; i++)
+     if (strcmp (section_alist[i].name, "top") == 0)
+       {
+ 	result = section_alist[i].level;
+ 	section_alist[i].level = level;
+ 	break;
+       }
+   return (result);
+ }
+ 
+ /* Treat this just like @unnumbered.  The only difference is
+    in node defaulting. */
+ void
+ cm_top ()
+ {
+   /* It is an error to have more than one @top. */
+   if (top_node_seen)
+     {
+       TAG_ENTRY *tag = tag_table;
+ 
+       line_error ("There already is a node having %ctop as a section",
+ 		  COMMAND_PREFIX);
+ 
+       while (tag != (TAG_ENTRY *)NULL)
+ 	{
+ 	  if ((tag->flags & IS_TOP))
+ 	    {
+ 	      int old_line_number = line_number;
+ 	      char *old_input_filename = input_filename;
+ 
+ 	      line_number = tag->line_no;
+ 	      input_filename = tag->filename;
+ 	      line_error ("Here is the %ctop node", COMMAND_PREFIX);
+ 	      input_filename = old_input_filename;
+ 	      line_number = old_line_number;
+ 	      return;
+ 	    }
+ 	  tag = tag->next_ent;
+ 	}
+     }
+   else
+     {
+       top_node_seen = 1;
+ 
+       /* It is an error to use @top before you have used @node. */
+       if (!tag_table)
+ 	{
+ 	  char *top_name;
+ 
+ 	  get_rest_of_line (&top_name);
+ 	  free (top_name);
+ 	  line_error ("%ctop used before %cnode, defaulting to %s",
+ 		      COMMAND_PREFIX, COMMAND_PREFIX, top_name);
+ 	  execute_string ("@node Top, , (dir), (dir)\n@top %s\n", top_name);
+ 	  return;
+ 	}
+ 
+       cm_unnumbered ();
+ 
+       /* The most recently defined node is the top node. */
+       tag_table->flags |= IS_TOP;
+ 
+       /* Now set the logical hierarchical level of the Top node. */
+       {
+ 	int orig_offset = input_text_offset;
+ 
+ 	input_text_offset = search_forward (node_search_string, orig_offset);
+ 
+ 	if (input_text_offset > 0)
+ 	  {
+ 	    int this_section;
+ 
+ 	    /* We have encountered a non-top node, so mark that one exists. */
+ 	    non_top_node_seen = 1;
+ 
+ 	    /* Move to the end of this line, and find out what the
+ 	       sectioning command is here. */
+ 	    while (input_text[input_text_offset] != '\n')
+ 	      input_text_offset++;
+ 
+ 	    if (input_text_offset < size_of_input_text)
+ 	      input_text_offset++;
+ 
+ 	    this_section = what_section (input_text + input_text_offset);
+ 
+ 	    /* If we found a sectioning command, then give the top section
+ 	       a level of this section - 1. */
+ 	    if (this_section != -1)
+ 	      set_top_section_level (this_section - 1);
+ 	  }
+ 	input_text_offset = orig_offset;
+       }
+     }
+ }
+ 
+ /* Organized by level commands.  That is, "*" == chapter, "=" == section. */
+ char *scoring_characters = "*=-.";
+ 
+ void
+ sectioning_underscore (command)
+      char *command;
+ {
+   char character;
+   char *temp;
+   int level;
+ 
+   temp = (char *)xmalloc (2 + strlen (command));
+   temp[0] = COMMAND_PREFIX;
+   strcpy (&temp[1], command);
+   level = what_section (temp);
+   free (temp);
+   level -= 2;
+ 
+   if (level < 0)
+     level = 0;
+ 
+   character = scoring_characters[level];
+ 
+   insert_and_underscore (character);
+ }
+ 
+ /* The remainder of the text on this line is a chapter heading. */
+ void
+ cm_chapter ()
+ {
+   sectioning_underscore ("chapter");
+ }
+ 
+ /* The remainder of the text on this line is a section heading. */
+ void
+ cm_section ()
+ {
+   sectioning_underscore ("section");
+ }
+ 
+ /* The remainder of the text on this line is a subsection heading. */
+ void
+ cm_subsection ()
+ {
+   sectioning_underscore ("subsection");
+ }
+ 
+ /* The remainder of the text on this line is a subsubsection heading. */
+ void
+ cm_subsubsection ()
+ {
+   sectioning_underscore ("subsubsection");
+ }
+ 
+ /* The remainder of the text on this line is an unnumbered heading. */
+ void
+ cm_unnumbered ()
+ {
+   cm_chapter ();
+ }
+ 
+ /* The remainder of the text on this line is an unnumbered section heading. */
+ void
+ cm_unnumberedsec ()
+ {
+   cm_section ();
+ }
+ 
+ /* The remainder of the text on this line is an unnumbered
+    subsection heading. */
+ void
+ cm_unnumberedsubsec ()
+ {
+   cm_subsection ();
+ }
+ 
+ /* The remainder of the text on this line is an unnumbered
+    subsubsection heading. */
+ void
+ cm_unnumberedsubsubsec ()
+ {
+   cm_subsubsection ();
+ }
+ 
+ /* The remainder of the text on this line is an appendix heading. */
+ void
+ cm_appendix ()
+ {
+   cm_chapter ();
+ }
+ 
+ /* The remainder of the text on this line is an appendix section heading. */
+ void
+ cm_appendixsec ()
+ {
+   cm_section ();
+ }
+ 
+ /* The remainder of the text on this line is an appendix subsection heading. */
+ void
+ cm_appendixsubsec ()
+ {
+   cm_subsection ();
+ }
+ 
+ /* The remainder of the text on this line is an appendix
+    subsubsection heading. */
+ void
+ cm_appendixsubsubsec ()
+ {
+   cm_subsubsection ();
+ }
+ 
+ /* Compatibility functions substitute for chapter, section, etc. */
+ void
+ cm_majorheading ()
+ {
+   cm_chapheading ();
+ }
+ 
+ void
+ cm_chapheading ()
+ {
+   cm_chapter ();
+ }
+ 
+ void
+ cm_heading ()
+ {
+   cm_section ();
+ }
+ 
+ void
+ cm_subheading ()
+ {
+   cm_subsection ();
+ }
+ 
+ void
+ cm_subsubheading ()
+ {
+   cm_subsubsection ();
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*		   Adding nodes, and making tags		    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* Start a new tag table. */
+ void
+ init_tag_table ()
+ {
+   while (tag_table != (TAG_ENTRY *) NULL)
+     {
+       TAG_ENTRY *temp = tag_table;
+       free (temp->node);
+       free (temp->prev);
+       free (temp->next);
+       free (temp->up);
+       tag_table = tag_table->next_ent;
+       free (temp);
+     }
+ }
+ 
+ void
+ write_tag_table ()
+ {
+   write_tag_table_internal (0);	/* Not indirect. */
+ }
+ 
+ void
+ write_tag_table_indirect ()
+ {
+   write_tag_table_internal (1);
+ }
+ 
+ /* Write out the contents of the existing tag table.
+    INDIRECT_P says how to format the output. */
+ void
+ write_tag_table_internal (indirect_p)
+      int indirect_p;
+ {
+   TAG_ENTRY *node = tag_table;
+   int old_indent = no_indent;
+ 
+   no_indent = 1;
+   filling_enabled = 0;
+   must_start_paragraph = 0;
+   close_paragraph ();
+ 
+   if (!indirect_p)
+     {
+       no_indent = 1;
+       insert ('\n');
+     }
+ 
+   add_word_args ("\037\nTag Table:\n%s", indirect_p ? "(Indirect)\n" : "");
+ 
+   while (node != (TAG_ENTRY *) NULL)
+     {
+       execute_string ("Node: %s", node->node);
+       add_word_args ("\177%d\n", node->position);
+       node = node->next_ent;
+     }
+ 
+   add_word ("\037\nEnd Tag Table\n");
+   flush_output ();
+   no_indent = old_indent;
+ }
+ 
+ char *
+ get_node_token ()
+ {
+   char *string;
+ 
+   get_until_in_line (",", &string);
+ 
+   if (curchar () == ',')
+     input_text_offset++;
+ 
+   canon_white (string);
+ 
+   /* Force all versions of "top" to be "Top". */
+   normalize_node_name (string);
+ 
+   return (string);
+ }
+ 
+ /* Convert "top" and friends into "Top". */
+ void
+ normalize_node_name (string)
+      char *string;
+ {
+   if (strcasecmp (string, "Top") == 0)
+     strcpy (string, "Top");
+ }
+ 
+ /* Look up NAME in the tag table, and return the associated
+    tag_entry.  If the node is not in the table return NULL. */
+ TAG_ENTRY *
+ find_node (name)
+      char *name;
+ {
+   TAG_ENTRY *tag = tag_table;
+ 
+   while (tag != (TAG_ENTRY *) NULL)
+     {
+       if (strcmp (tag->node, name) == 0)
+ 	return (tag);
+       tag = tag->next_ent;
+     }
+   return ((TAG_ENTRY *) NULL);
+ }
+ 
+ /* Remember NODE and associates. */
+ void
+ remember_node (node, prev, next, up, position, line_no, no_warn)
+      char *node, *prev, *next, *up;
+      int position, line_no, no_warn;
+ {
+   /* Check for existence of this tag already. */
+   if (validating)
+     {
+       register TAG_ENTRY *tag = find_node (node);
+       if (tag)
+ 	{
+ 	  line_error ("Node `%s' multiply defined (%d is first definition)",
+ 		      node, tag->line_no);
+ 	  return;
+ 	}
+     }
+ 
+   /* First, make this the current node. */
+   current_node = node;
+ 
+   /* Now add it to the list. */
+   {
+     TAG_ENTRY *new = (TAG_ENTRY *) xmalloc (sizeof (TAG_ENTRY));
+     new->node = node;
+     new->prev = prev;
+     new->next = next;
+     new->up = up;
+     new->position = position;
+     new->line_no = line_no;
+     new->filename = node_filename;
+     new->touched = 0;		/* not yet referenced. */
+     new->flags = 0;
+     if (no_warn)
+       new->flags |= NO_WARN;
+     new->next_ent = tag_table;
+     tag_table = new;
+   }
+ }
+ 
+ /* The order is: nodename, nextnode, prevnode, upnode.
+    If all of the NEXT, PREV, and UP fields are empty, they are defaulted.
+    You must follow a node command which has those fields defaulted
+    with a sectioning command (e.g. @chapter) giving the "level" of that node.
+    It is an error not to do so.
+    The defaults come from the menu in this node's parent. */
+ void
+ cm_node ()
+ {
+   char *node, *prev, *next, *up;
+   int new_node_pos, defaulting, this_section, no_warn = 0;
+   extern int already_outputting_pending_notes;
+ 
+   if (strcmp (command, "nwnode") == 0)
+     no_warn = 1;
+ 
+   /* Get rid of unmatched brace arguments from previous commands. */
+   discard_braces ();
+ 
+   /* There also might be insertions left lying around that haven't been
+      ended yet.  Do that also. */
+   discard_insertions ();
+ 
+   if (!already_outputting_pending_notes)
+     {
+       close_paragraph ();
+       output_pending_notes ();
+       free_pending_notes ();
+     }
+ 
+   filling_enabled = indented_fill = 0;
+   new_node_pos = output_position;
+   current_footnote_number = 1;
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     append_to_expansion_output (input_text_offset + 1);
+ #endif /* HAVE_MACROS */
+ 
+   node = get_node_token ();
+   next = get_node_token ();
+   prev = get_node_token ();
+   up = get_node_token ();
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     remember_itext (input_text, input_text_offset);
+ #endif /* HAVE_MACROS */
+ 
+   no_indent = 1;
+   if (!no_headers)
+     {
+       add_word_args ("\037\nFile: %s,  Node: ", pretty_output_filename);
+ 
+ #if defined (HAVE_MACROS)
+       if (macro_expansion_output_stream)
+ 	me_execute_string (node);
+       else
+ #endif /* HAVE_MACROS */
+       execute_string ("%s", node);
+       filling_enabled = indented_fill = 0;
+     }
+ 
+   /* Check for defaulting of this node's next, prev, and up fields. */
+   defaulting = ((strlen (next) == 0) &&
+ 		(strlen (prev) == 0) &&
+ 		(strlen (up) == 0));
+ 
+   this_section = what_section (input_text + input_text_offset);
+ 
+   /* If we are defaulting, then look at the immediately following
+      sectioning command (error if none) to determine the node's
+      level.  Find the node that contains the menu mentioning this node
+      that is one level up (error if not found).  That node is the "Up"
+      of this node.  Default the "Next" and "Prev" from the menu. */
+   if (defaulting)
+     {
+       NODE_REF *last_ref = (NODE_REF *)NULL;
+       NODE_REF *ref = node_references;
+ 
+       if ((this_section < 0) && (strcmp (node, "Top") != 0))
+ 	{
+ 	  char *polite_section_name = "top";
+ 	  int i;
+ 
+ 	  for (i = 0; section_alist[i].name; i++)
+ 	    if (section_alist[i].level == current_section + 1)
+ 	      {
+ 		polite_section_name = section_alist[i].name;
+ 		break;
+ 	      }
+ 
+ 	  line_error
+ 	    ("Node `%s' requires a sectioning command (e.g. %c%s)",
+ 	     node, COMMAND_PREFIX, polite_section_name);
+ 	}
+       else
+ 	{
+ 	  if (strcmp (node, "Top") == 0)
+ 	    {
+ 	      /* Default the NEXT pointer to be the first menu item in
+ 		 this node, if there is a menu in this node.  We have to
+ 		 try very hard to find the menu, as it may be obscured
+ 		 by execution_strings which are on the filestack.  For
+ 		 every member of the filestack which has a FILENAME
+ 		 member which is identical to the current INPUT_FILENAME,
+ 		 search forward from that offset. */
+ 	      int saved_input_text_offset = input_text_offset;
+ 	      int saved_size_of_input_text = size_of_input_text;
+ 	      char *saved_input_text = input_text;
+ 	      FSTACK *next_file = filestack;
+ 
+ 	      int orig_offset, orig_size;
+ 	      char *glean_node_from_menu ();
+ 
+ 	      /* No matter what, make this file point back at `(dir)'. */
+ 	      free (up);   up = strdup ("(dir)");
+ 
+ 	      while (1)
+ 		{
+ 		  orig_offset = input_text_offset;
+ 		  orig_size =
+ 		    search_forward (node_search_string, orig_offset);
+ 
+ 		  if (orig_size < 0)
+ 		    orig_size = size_of_input_text;
+ 
+ 		  input_text_offset =
+ 		    search_forward (menu_search_string, orig_offset);
+ 
+ 		  if (input_text_offset > -1)
+ 		    {
+ 		      char *nodename_from_menu = (char *)NULL;
+ 
+ 		      input_text_offset =
+ 			search_forward ("\n* ", input_text_offset);
+ 
+ 		      if (input_text_offset != -1)
+ 			nodename_from_menu = glean_node_from_menu (0);
+ 
+ 		      if (nodename_from_menu)
+ 			{
+ 			  free (next); next = nodename_from_menu;
+ 			  break;
+ 			}
+ 		    }
+ 
+ 		  /* We got here, so it hasn't been found yet.  Try
+ 		     the next file on the filestack if there is one. */
+ 		  if (next_file &&
+ 		      (strcmp (next_file->filename, input_filename) == 0))
+ 		    {
+ 		      input_text = next_file->text;
+ 		      input_text_offset = next_file->offset;
+ 		      size_of_input_text = next_file->size;
+ 		      next_file = next_file->next;
+ 		    }
+ 		  else
+ 		    {
+ 		      /* No more input files to check. */
+ 		      break;
+ 		    }
+ 		}
+ 
+ 	      input_text = saved_input_text;
+ 	      input_text_offset = saved_input_text_offset;
+ 	      size_of_input_text = saved_size_of_input_text;
+ 	    }
+ 	}
+ 
+       /* Fix the level of the menu references in the Top node, iff it
+ 	 was declared with @top, and no subsequent reference was found. */
+       if (top_node_seen && !non_top_node_seen)
+ 	{
+ 	  /* Then this is the first non-@top node seen. */
+ 	  int level;
+ 
+ 	  level = set_top_section_level (this_section - 1);
+ 	  non_top_node_seen = 1;
+ 
+ 	  while (ref)
+ 	    {
+ 	      if (ref->section == level)
+ 		ref->section = this_section - 1;
+ 	      ref = ref->next;
+ 	    }
+ 
+ 	  ref = node_references;
+ 	}
+ 
+       while (ref)
+ 	{
+ 	  if (ref->section == (this_section - 1) &&
+ 	      ref->type == menu_reference &&
+ 	      strcmp (ref->node, node) == 0)
+ 	    {
+ 	      char *containing_node = ref->containing_node;
+ 
+ 	      free (up);
+ 	      up = strdup (containing_node);
+ 
+ 	      if (last_ref &&
+ 		  last_ref->type == menu_reference &&
+ 		  (strcmp (last_ref->containing_node,
+ 			   containing_node) == 0))
+ 		{
+ 		  free (next);
+ 		  next = strdup (last_ref->node);
+ 		}
+ 
+ 	      while ((ref->section == this_section - 1) &&
+ 		     (ref->next) &&
+ 		     (ref->next->type != menu_reference))
+ 		ref = ref->next;
+ 
+ 	      if (ref->next && ref->type == menu_reference &&
+ 		  (strcmp (ref->next->containing_node,
+ 			   containing_node) == 0))
+ 		{
+ 		  free (prev);
+ 		  prev = strdup (ref->next->node);
+ 		}
+ 	      else if (!ref->next &&
+ 		       strcasecmp (ref->containing_node, "Top") == 0)
+ 		{
+ 		  free (prev);
+ 		  prev = strdup (ref->containing_node);
+ 		}
+ 	      break;
+ 	    }
+ 	  last_ref = ref;
+ 	  ref = ref->next;
+ 	}
+     }
+ 
+ #if defined (HAVE_MACROS)
+   /* Insert the correct args if we are expanding macros, and the node's
+      pointers weren't defaulted. */
+   if (macro_expansion_output_stream && !defaulting)
+     {
+       char *temp;
+       int op_orig = output_paragraph_offset;
+ 
+       temp = (char *)xmalloc (3 + strlen (next));
+       sprintf (temp, ", %s", next);
+       me_execute_string (temp);
+       free (temp);
+ 
+       temp = (char *)xmalloc (3 + strlen (prev));
+       sprintf (temp, ", %s", prev);
+       me_execute_string (temp);
+       free (temp);
+ 
+       temp = (char *)xmalloc (4 + strlen (up));
+       sprintf (temp, ", %s", up);
+       me_execute_string (temp);
+       free (temp);
+ 
+       output_paragraph_offset = op_orig;
+     }
+ #endif /* HAVE_MACROS */
+ 
+   if (!no_headers)
+     {
+ #if defined (HAVE_MACROS)
+       if (macro_expansion_output_stream)
+ 	me_inhibit_expansion++;
+ #endif /* HAVE_MACROS */
+ 
+       if (*next)
+ 	{
+ 	  execute_string (",  Next: %s", next);
+ 	  filling_enabled = indented_fill = 0;
+ 	}
+ 
+       if (*prev)
+ 	{
+ 	  execute_string (",  Prev: %s", prev);
+ 	  filling_enabled = indented_fill = 0;
+ 	}
+ 
+       if (*up)
+ 	{
+ 	  execute_string (",  Up: %s", up);
+ 	  filling_enabled = indented_fill = 0;
+ 	}
+ #if defined (HAVE_MACROS)
+       if (macro_expansion_output_stream)
+ 	me_inhibit_expansion--;
+ #endif /* HAVE_MACROS */
+     }
+ 
+   close_paragraph ();
+   no_indent = 0;
+ 
+   if (!*node)
+     {
+       line_error ("No node name specified for `%c%s' command",
+ 		  COMMAND_PREFIX, command);
+       free (node);
+       free (next);
+       free (prev);
+       free (up);
+     }
+   else
+     {
+       if (!*next) { free (next); next = (char *)NULL; }
+       if (!*prev) { free (prev); prev = (char *)NULL; }
+       if (!*up) { free (up); up = (char *)NULL; }
+       remember_node (node, prev, next, up, new_node_pos, line_number, no_warn);
+     }
+ 
+   /* Change the section only if there was a sectioning command. */
+   if (this_section >= 0)
+     current_section = this_section;
+ 
+   filling_enabled = 1;
+ }
+ 
+ /* Validation of an info file.
+    Scan through the list of tag entrys touching the Prev, Next, and Up
+    elements of each.  It is an error not to be able to touch one of them,
+    except in the case of external node references, such as "(DIR)".
+ 
+    If the Prev is different from the Up,
+    then the Prev node must have a Next pointing at this node.
+ 
+    Every node except Top must have an Up.
+    The Up node must contain some sort of reference, other than a Next,
+    to this node.
+ 
+    If the Next is different from the Next of the Up,
+    then the Next node must have a Prev pointing at this node. */
+ void
+ validate_file (tag_table)
+      TAG_ENTRY *tag_table;
+ {
+   char *old_input_filename = input_filename;
+   TAG_ENTRY *tags = tag_table;
+ 
+   while (tags != (TAG_ENTRY *) NULL)
+     {
+       register TAG_ENTRY *temp_tag;
+ 
+       input_filename = tags->filename;
+       line_number = tags->line_no;
+ 
+       /* If this is a "no warn" node, don't validate it in any way. */
+       if (tags->flags & NO_WARN)
+ 	{
+ 	  tags = tags->next_ent;
+ 	  continue;
+ 	}
+ 
+       /* If this node has a Next, then make sure that the Next exists. */
+       if (tags->next)
+ 	{
+ 	  validate (tags->next, tags->line_no, "Next");
+ 
+ 	  /* If the Next node exists, and there is no Up, then make
+ 	     sure that the Prev of the Next points back. */
+ 	  if (temp_tag = find_node (tags->next))
+ 	    {
+ 	      char *prev;
+ 
+ 	      if (temp_tag->flags & NO_WARN)
+ 		{
+ 		  /* Do nothing if we aren't supposed to issue warnings
+ 		     about this node. */
+ 		}
+ 	      else
+ 		{
+ 		  prev = temp_tag->prev;
+ 		  if (!prev || (strcmp (prev, tags->node) != 0))
+ 		    {
+ 		      line_error ("Node `%s''s Next field not pointed back to",
+ 				  tags->node);
+ 		      line_number = temp_tag->line_no;
+ 		      input_filename = temp_tag->filename;
+ 		      line_error
+ 			("This node (`%s') is the one with the bad `Prev'",
+ 			 temp_tag->node);
+ 		      input_filename = tags->filename;
+ 		      line_number = tags->line_no;
+ 		      temp_tag->flags |= PREV_ERROR;
+ 		    }
+ 		}
+ 	    }
+ 	}
+ 
+       /* Validate the Prev field if there is one, and we haven't already
+ 	 complained about it in some way.  You don't have to have a Prev
+ 	 field at this stage. */
+       if (!(tags->flags & PREV_ERROR) && tags->prev)
+ 	{
+ 	  int valid = validate (tags->prev, tags->line_no, "Prev");
+ 
+ 	  if (!valid)
+ 	    tags->flags |= PREV_ERROR;
+ 	  else
+ 	    {
+ 	      /* If the Prev field is not the same as the Up field,
+ 		 then the node pointed to by the Prev field must have
+ 		 a Next field which points to this node. */
+ 	      if (tags->up && (strcmp (tags->prev, tags->up) != 0))
+ 		{
+ 		  temp_tag = find_node (tags->prev);
+ 
+ 		  /* If we aren't supposed to issue warnings about the
+ 		     target node, do nothing. */
+ 		  if (!temp_tag || (temp_tag->flags & NO_WARN))
+ 		    {
+ 		      /* Do nothing. */
+ 		    }
+ 		  else
+ 		    {
+ 		      if (!temp_tag->next ||
+ 			  (strcmp (temp_tag->next, tags->node) != 0))
+ 			{
+ 			  line_error
+ 			    ("Node `%s''s Prev field not pointed back to",
+ 			     tags->node);
+ 			  line_number = temp_tag->line_no;
+ 			  input_filename = temp_tag->filename;
+ 			  line_error
+ 			    ("This node (`%s') is the one with the bad `Next'",
+ 			     temp_tag->node);
+ 			  input_filename = tags->filename;
+ 			  line_number = tags->line_no;
+ 			  temp_tag->flags |= NEXT_ERROR;
+ 			}
+ 		    }
+ 		}
+ 	    }
+ 	}
+ 
+       if (!tags->up && (strcasecmp (tags->node, "Top") != 0))
+ 	line_error ("Node `%s' is missing an \"Up\" field", tags->node);
+       else if (tags->up)
+ 	{
+ 	  int valid = validate (tags->up, tags->line_no, "Up");
+ 
+ 	  /* If node X has Up: Y, then warn if Y fails to have a menu item
+ 	     or note pointing at X, if Y isn't of the form "(Y)". */
+ 	  if (valid && *tags->up != '(')
+ 	    {
+ 	      NODE_REF *nref, *tref, *list;
+ 	      NODE_REF *find_node_reference ();
+ 
+ 	      tref = (NODE_REF *) NULL;
+ 	      list = node_references;
+ 
+ 	      for (;;)
+ 		{
+ 		  if (!(nref = find_node_reference (tags->node, list)))
+ 		    break;
+ 
+ 		  if (strcmp (nref->containing_node, tags->up) == 0)
+ 		    {
+ 		      if (nref->type != menu_reference)
+ 			{
+ 			  tref = nref;
+ 			  list = nref->next;
+ 			}
+ 		      else
+ 			break;
+ 		    }
+ 		  list = nref->next;
+ 		}
+ 
+ 	      if (!nref)
+ 		{
+ 		  temp_tag = find_node (tags->up);
+ 		  line_number = temp_tag->line_no;
+ 		  input_filename = temp_tag->filename;
+ 		  if (!tref)
+ 		    line_error (
+ "`%s' has an Up field of `%s', but `%s' has no menu item for `%s'",
+ 				tags->node, tags->up, tags->up, tags->node);
+ 		  line_number = tags->line_no;
+ 		  input_filename = tags->filename;
+ 		}
+ 	    }
+ 	}
+       tags = tags->next_ent;
+     }
+ 
+   validate_other_references (node_references);
+   /* We have told the user about the references which didn't exist.
+      Now tell him about the nodes which aren't referenced. */
+ 
+   tags = tag_table;
+   while (tags != (TAG_ENTRY *) NULL)
+     {
+       /* If this node is a "no warn" node, do nothing. */
+       if (tags->flags & NO_WARN)
+ 	{
+ 	  tags = tags->next_ent;
+ 	  continue;
+ 	}
+ 
+       /* Special hack.  If the node in question appears to have
+          been referenced more than REFERENCE_WARNING_LIMIT times,
+          give a warning. */
+       if (tags->touched > reference_warning_limit)
+ 	{
+ 	  input_filename = tags->filename;
+ 	  line_number = tags->line_no;
+ 	  warning ("Node `%s' has been referenced %d times",
+ 		   tags->node, tags->touched);
+ 	}
+ 
+       if (tags->touched == 0)
+ 	{
+ 	  input_filename = tags->filename;
+ 	  line_number = tags->line_no;
+ 
+ 	  /* Notice that the node "Top" is special, and doesn't have to
+ 	     be referenced. */
+ 	  if (strcasecmp (tags->node, "Top") != 0)
+ 	    warning ("Unreferenced node `%s'", tags->node);
+ 	}
+       tags = tags->next_ent;
+     }
+   input_filename = old_input_filename;
+ }
+ 
+ /* Return 1 if tag correctly validated, or 0 if not. */
+ int
+ validate (tag, line, label)
+      char *tag;
+      int line;
+      char *label;
+ {
+   TAG_ENTRY *result;
+ 
+   /* If there isn't a tag to verify, or if the tag is in another file,
+      then it must be okay. */
+   if (!tag || !*tag || *tag == '(')
+     return (1);
+ 
+   /* Otherwise, the tag must exist. */
+   result = find_node (tag);
+ 
+   if (!result)
+     {
+       line_number = line;
+       line_error (
+ "Validation error.  `%s' field points to node `%s', which doesn't exist",
+ 		  label, tag);
+       return (0);
+     }
+   result->touched++;
+   return (1);
+ }
+ 
+ /* Split large output files into a series of smaller files.  Each file
+    is pointed to in the tag table, which then gets written out as the
+    original file.  The new files have the same name as the original file
+    with a "-num" attached.  SIZE is the largest number of bytes to allow
+    in any single split file. */
+ void
+ split_file (filename, size)
+      char *filename;
+      int size;
+ {
+   char *root_filename, *root_pathname;
+   char *the_file, *filename_part ();
+   struct stat fileinfo;
+   long file_size;
+   char *the_header;
+   int header_size;
+ 
+   /* Can only do this to files with tag tables. */
+   if (!tag_table)
+     return;
+ 
+   if (size == 0)
+     size = DEFAULT_SPLIT_SIZE;
+ 
+   if ((stat (filename, &fileinfo) != 0) ||
+       (((long) fileinfo.st_size) < SPLIT_SIZE_THRESHOLD))
+     return;
+   file_size = (long) fileinfo.st_size;
+ 
+   the_file = find_and_load (filename);
+   if (!the_file)
+     return;
+ 
+   root_filename = filename_part (filename);
+   root_pathname = pathname_part (filename);
+ 
+   if (!root_pathname)
+     root_pathname = strdup ("");
+ 
+   /* Start splitting the file.  Walk along the tag table
+      outputting sections of the file.  When we have written
+      all of the nodes in the tag table, make the top-level
+      pointer file, which contains indirect pointers and
+      tags for the nodes. */
+   {
+     int which_file = 1;
+     TAG_ENTRY *tags = tag_table;
+     char *indirect_info = (char *)NULL;
+ 
+     /* Remember the `header' of this file.  The first tag in the file is
+        the bottom of the header; the top of the file is the start. */
+     the_header = (char *)xmalloc (1 + (header_size = tags->position));
+     memcpy (the_header, the_file, header_size);
+ 
+     while (tags)
+       {
+ 	int file_top, file_bot, limit;
+ 
+ 	/* Have to include the Control-_. */
+ 	file_top = file_bot = tags->position;
+ 	limit = file_top + size;
+ 
+ 	/* If the rest of this file is only one node, then
+ 	   that is the entire subfile. */
+ 	if (!tags->next_ent)
+ 	  {
+ 	    int i = tags->position + 1;
+ 	    char last_char = the_file[i];
+ 
+ 	    while (i < file_size)
+ 	      {
+ 		if ((the_file[i] == '\037') &&
+ 		    ((last_char == '\n') ||
+ 		     (last_char == '\014')))
+ 		  break;
+ 		else
+ 		  last_char = the_file[i];
+ 		i++;
+ 	      }
+ 	    file_bot = i;
+ 	    tags = tags->next_ent;
+ 	    goto write_region;
+ 	  }
+ 
+ 	/* Otherwise, find the largest number of nodes that can fit in
+ 	   this subfile. */
+ 	for (; tags; tags = tags->next_ent)
+ 	  {
+ 	    if (!tags->next_ent)
+ 	      {
+ 		/* This entry is the last node.  Search forward for the end
+ 	           of this node, and that is the end of this file. */
+ 		int i = tags->position + 1;
+ 		char last_char = the_file[i];
+ 
+ 		while (i < file_size)
+ 		  {
+ 		    if ((the_file[i] == '\037') &&
+ 			((last_char == '\n') ||
+ 			 (last_char == '\014')))
+ 		      break;
+ 		    else
+ 		      last_char = the_file[i];
+ 		    i++;
+ 		  }
+ 		file_bot = i;
+ 
+ 		if (file_bot < limit)
+ 		  {
+ 		    tags = tags->next_ent;
+ 		    goto write_region;
+ 		  }
+ 		else
+ 		  {
+ 		    /* Here we want to write out everything before the last
+ 		       node, and then write the last node out in a file
+ 		       by itself. */
+ 		    file_bot = tags->position;
+ 		    goto write_region;
+ 		  }
+ 	      }
+ 
+ 	    if (tags->next_ent->position > limit)
+ 	      {
+ 		if (tags->position == file_top)
+ 		  tags = tags->next_ent;
+ 
+ 		file_bot = tags->position;
+ 
+ 	      write_region:
+ 		{
+ 		  int fd;
+ 		  char *split_filename;
+ 
+ 		  split_filename = (char *) xmalloc
+ 		    (10 + strlen (root_pathname) + strlen (root_filename));
+ 		  sprintf
+ 		    (split_filename,
+ 		     "%s%s-%d", root_pathname, root_filename, which_file);
+ 
+ 		  fd = open
+ 		    (split_filename, O_WRONLY | O_TRUNC | O_CREAT, 0666);
+ 
+ 		  if ((fd < 0) ||
+ 		      (write (fd, the_header, header_size) != header_size) ||
+ 		      (write (fd, the_file + file_top, file_bot - file_top)
+ 		       != (file_bot - file_top)) ||
+ 		      ((close (fd)) < 0))
+ 		    {
+ 		      perror (split_filename);
+ 		      if (fd != -1)
+ 			close (fd);
+ 		      exit (FATAL);
+ 		    }
+ 
+ 		  if (!indirect_info)
+ 		    {
+ 		      indirect_info = the_file + file_top;
+ 		      sprintf (indirect_info, "\037\nIndirect:\n");
+ 		      indirect_info += strlen (indirect_info);
+ 		    }
+ 
+ 		  sprintf (indirect_info, "%s-%d: %d\n",
+ 			   root_filename, which_file, file_top);
+ 
+ 		  free (split_filename);
+ 		  indirect_info += strlen (indirect_info);
+ 		  which_file++;
+ 		  break;
+ 		}
+ 	      }
+ 	  }
+       }
+ 
+     /* We have sucessfully created the subfiles.  Now write out the
+        original again.  We must use `output_stream', or
+        write_tag_table_indirect () won't know where to place the output. */
+     output_stream = fopen (filename, "w");
+     if (!output_stream)
+       {
+ 	perror (filename);
+ 	exit (FATAL);
+       }
+ 
+     {
+       int distance = indirect_info - the_file;
+       fwrite (the_file, 1, distance, output_stream);
+ 
+       /* Inhibit newlines. */
+       paragraph_is_open = 0;
+ 
+       write_tag_table_indirect ();
+       fclose (output_stream);
+       free (the_header);
+       free (the_file);
+       return;
+     }
+   }
+ }
+ 
+ /* Some menu hacking.  This is used to remember menu references while
+    reading the input file.  After the output file has been written, if
+    validation is on, then we use the contents of NODE_REFERENCES as a
+    list of nodes to validate. */
+ char *
+ reftype_type_string (type)
+      enum reftype type;
+ {
+   switch (type)
+     {
+     case menu_reference:
+       return ("Menu");
+     case followed_reference:
+       return ("Followed-Reference");
+     default:
+       return ("Internal-bad-reference-type");
+     }
+ }
+ 
+ /* Remember this node name for later validation use. */
+ void
+ remember_node_reference (node, line, type)
+      char *node;
+      int line;
+      enum reftype type;
+ {
+   NODE_REF *temp = (NODE_REF *) xmalloc (sizeof (NODE_REF));
+ 
+   temp->next = node_references;
+   temp->node = strdup (node);
+   temp->line_no = line;
+   temp->section = current_section;
+   temp->type = type;
+   temp->containing_node = strdup (current_node);
+   temp->filename = node_filename;
+ 
+   node_references = temp;
+ }
+ 
+ void
+ validate_other_references (ref_list)
+      register NODE_REF *ref_list;
+ {
+   char *old_input_filename = input_filename;
+ 
+   while (ref_list != (NODE_REF *) NULL)
+     {
+       input_filename = ref_list->filename;
+       validate (ref_list->node, ref_list->line_no,
+ 		reftype_type_string (ref_list->type));
+       ref_list = ref_list->next;
+     }
+   input_filename = old_input_filename;
+ }
+ 
+ /* Find NODE in REF_LIST. */
+ NODE_REF *
+ find_node_reference (node, ref_list)
+      char *node;
+      register NODE_REF *ref_list;
+ {
+   while (ref_list)
+     {
+       if (strcmp (node, ref_list->node) == 0)
+ 	break;
+       ref_list = ref_list->next;
+     }
+   return (ref_list);
+ }
+ 
+ void
+ free_node_references ()
+ {
+   register NODE_REF *list, *temp;
+ 
+   list = node_references;
+ 
+   while (list)
+     {
+       temp = list;
+       free (list->node);
+       free (list->containing_node);
+       list = list->next;
+       free (temp);
+     }
+   node_references = (NODE_REF *) NULL;
+ }
+ 
+   /* This function gets called at the start of every line while inside of
+      a menu.  It checks to see if the line starts with "* ", and if so,
+      remembers the node reference that this menu refers to.
+      input_text_offset is at the \n just before the line start. */
+ #define menu_starter "* "
+ char *
+ glean_node_from_menu (remember_reference)
+      int remember_reference;
+ {
+   int i, orig_offset = input_text_offset;
+   char *nodename;
+ 
+   if (strncmp (&input_text[input_text_offset + 1],
+ 	       menu_starter,
+ 	       strlen (menu_starter)) != 0)
+     return ((char *)NULL);
+   else
+     input_text_offset += strlen (menu_starter) + 1;
+ 
+   get_until_in_line (":", &nodename);
+   if (curchar () == ':')
+     input_text_offset++;
+   canon_white (nodename);
+ 
+   if (curchar () == ':')
+     goto save_node;
+ 
+   free (nodename);
+   get_rest_of_line (&nodename);
+ 
+   /* Special hack: If the nodename follows the menu item name,
+      then we have to read the rest of the line in order to find
+      out what the nodename is.  But we still have to read the
+      line later, in order to process any formatting commands that
+      might be present.  So un-count the carriage return that has just
+      been counted. */
+   line_number--;
+ 
+   isolate_nodename (nodename);
+ 
+ save_node:
+   input_text_offset = orig_offset;
+   normalize_node_name (nodename);
+   i = strlen (nodename);
+   if (i && nodename[i - 1] == ':')
+     nodename[i - 1] = '\0';
+ 
+   if (remember_reference)
+     {
+       remember_node_reference (nodename, line_number, menu_reference);
+       free (nodename);
+       return ((char *)NULL);
+     }
+   else
+     return (nodename);
+ }
+ 
+ static void
+ isolate_nodename (nodename)
+      char *nodename;
+ {
+   register int i, c;
+   int paren_seen, paren;
+ 
+   if (!nodename)
+     return;
+ 
+   canon_white (nodename);
+   paren_seen = paren = i = 0;
+ 
+   if (*nodename == '.' || !*nodename)
+     {
+       *nodename = '\0';
+       return;
+     }
+ 
+   if (*nodename == '(')
+     {
+       paren++;
+       paren_seen++;
+       i++;
+     }
+ 
+   for (; c = nodename[i]; i++)
+     {
+       if (paren)
+ 	{
+ 	  if (c == '(')
+ 	    paren++;
+ 	  else if (c == ')')
+ 	    paren--;
+ 
+ 	  continue;
+ 	}
+ 
+       /* If the character following the close paren is a space, then this
+ 	 node has no more characters associated with it. */
+       if (c == '\t' ||
+ 	  c == '\n' ||
+ 	  c == ','  ||
+ 	  ((paren_seen && nodename[i - 1] == ')') &&
+ 	   (c == ' ' || c == '.')) ||
+ 	  (c == '.' &&
+ 	   ((!nodename[i + 1] ||
+ 	     (cr_or_whitespace (nodename[i + 1])) ||
+ 	     (nodename[i + 1] == ')')))))
+ 	break;
+     }
+   nodename[i] = '\0';
+ }
+ 
+ void
+ cm_menu ()
+ {
+   if (current_node == (char *)NULL)
+     {
+       warning ("%cmenu seen before a node has been defined", COMMAND_PREFIX);
+       warning ("Creating `TOP' node.");
+       execute_string ("@node Top");
+     }
+   begin_insertion (menu);
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Cross Reference Hacking			    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ char *
+ get_xref_token ()
+ {
+   char *string;
+ 
+   get_until_in_braces (",", &string);
+   if (curchar () == ',')
+     input_text_offset++;
+   fix_whitespace (string);
+   return (string);
+ }
+ 
+ int px_ref_flag = 0;		/* Controls initial output string. */
+ 
+ /* Make a cross reference. */
+ void
+ cm_xref (arg)
+ {
+   if (arg == START)
+     {
+       char *arg1, *arg2, *arg3, *arg4, *arg5;
+ 
+       arg1 = get_xref_token ();
+       arg2 = get_xref_token ();
+       arg3 = get_xref_token ();
+       arg4 = get_xref_token ();
+       arg5 = get_xref_token ();
+ 
+       add_word_args ("%s", px_ref_flag ? "*note " : "*Note ");
+ 
+       if (*arg5 || *arg4)
+ 	{
+ 	  char *node_name;
+ 
+ 	  if (!*arg2)
+ 	    {
+ 	      if (*arg3)
+ 		node_name = arg3;
+ 	      else
+ 		node_name = arg1;
+ 	    }
+ 	  else
+ 	    node_name = arg2;
+ 
+ 	  execute_string ("%s: (%s)%s", node_name, arg4, arg1);
+ 	  /* Free all of the arguments found. */
+ 	  if (arg1) free (arg1);
+ 	  if (arg2) free (arg2);
+ 	  if (arg3) free (arg3);
+ 	  if (arg4) free (arg4);
+ 	  if (arg5) free (arg5);
+ 	  return;
+ 	}
+       else
+ 	remember_node_reference (arg1, line_number, followed_reference);
+ 
+       if (*arg3)
+ 	{
+ 	  if (!*arg2)
+ 	    execute_string ("%s: %s", arg3, arg1);
+ 	  else
+ 	    execute_string ("%s: %s", arg2, arg1);
+ 	}
+       else
+ 	{
+ 	  if (*arg2)
+ 	    execute_string ("%s: %s", arg2, arg1);
+ 	  else
+ 	    execute_string ("%s::", arg1);
+ 	}
+ 
+       /* Free all of the arguments found. */
+       if (arg1) free (arg1);
+       if (arg2) free (arg2);
+       if (arg3) free (arg3);
+       if (arg4) free (arg4);
+       if (arg5) free (arg5);
+     }
+   else
+     {
+       /* Check to make sure that the next non-whitespace character is either
+          a period or a comma. input_text_offset is pointing at the "}" which
+          ended the xref or pxref command. */
+       int temp = input_text_offset + 1;
+ 
+       if (output_paragraph[output_paragraph_offset - 2] == ':' &&
+ 	  output_paragraph[output_paragraph_offset - 1] == ':')
+ 	return;
+       while (temp < size_of_input_text)
+ 	{
+ 	  if (cr_or_whitespace (input_text[temp]))
+ 	    temp++;
+ 	  else
+ 	    {
+ 	      if (input_text[temp] == '.' ||
+ 		  input_text[temp] == ',' ||
+ 		  input_text[temp] == '\t')
+ 		return;
+ 	      else
+ 		{
+ 		  line_error (
+ 		"Cross-reference must be terminated with a period or a comma");
+ 		  return;
+ 		}
+ 	    }
+ 	}
+     }
+ }
+ 
+ void
+ cm_pxref (arg)
+      int arg;
+ {
+   if (arg == START)
+     {
+       px_ref_flag++;
+       cm_xref (arg);
+       px_ref_flag--;
+     }
+   else
+     add_char ('.');
+ }
+ 
+ void
+ cm_inforef (arg)
+      int arg;
+ {
+   if (arg == START)
+     {
+       char *node, *pname, *file;
+ 
+       node = get_xref_token ();
+       pname = get_xref_token ();
+       file = get_xref_token ();
+ 
+       execute_string ("*note %s: (%s)%s", pname, file, node);
+     }
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Insertion Command Stubs			    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ void
+ cm_quotation ()
+ {
+   begin_insertion (quotation);
+ }
+ 
+ void
+ cm_example ()
+ {
+   begin_insertion (example);
+ }
+ 
+ void
+ cm_smallexample ()
+ {
+   begin_insertion (smallexample);
+ }
+ 
+ void
+ cm_lisp ()
+ {
+   begin_insertion (lisp);
+ }
+ 
+ void
+ cm_smalllisp ()
+ {
+   begin_insertion (smalllisp);
+ }
+ 
+ /* @cartouche/@end cartouche draws box with rounded corners in
+    TeX output.  Right now, just a NOP insertion. */
+ void
+ cm_cartouche ()
+ {
+   begin_insertion (cartouche);
+ }
+ 
+ void
+ cm_format ()
+ {
+   begin_insertion (format);
+ }
+ 
+ void
+ cm_display ()
+ {
+   begin_insertion (display);
+ }
+ 
+ void
+ cm_itemize ()
+ {
+   begin_insertion (itemize);
+ }
+ 
+ void
+ cm_enumerate ()
+ {
+   do_enumeration (enumerate, "1");
+ }
+ 
+ /* Start an enumeration insertion of type TYPE.  If the user supplied
+    no argument on the line, then use DEFAULT_STRING as the initial string. */
+ void
+ do_enumeration (type, default_string)
+      int type;
+      char *default_string;
+ {
+   get_until_in_line (".", &enumeration_arg);
+   canon_white (enumeration_arg);
+ 
+   if (!*enumeration_arg)
+     {
+       free (enumeration_arg);
+       enumeration_arg = strdup (default_string);
+     }
+ 
+   if (!isdigit (*enumeration_arg) && !isletter (*enumeration_arg))
+     {
+       warning ("%s requires a letter or a digit", insertion_type_pname (type));
+ 
+       switch (type)
+ 	{
+ 	case enumerate:
+ 	  default_string = "1";
+ 	  break;
+ 	}
+       enumeration_arg = strdup (default_string);
+     }
+   begin_insertion (type);
+ }
+ 
+ void
+ cm_table ()
+ {
+   begin_insertion (table);
+ }
+ 
+ void
+ cm_ftable ()
+ {
+   begin_insertion (ftable);
+ }
+ 
+ void
+ cm_vtable ()
+ {
+   begin_insertion (vtable);
+ }
+ 
+ void
+ cm_group ()
+ {
+   begin_insertion (group);
+ }
+ 
+ void
+ cm_ifinfo ()
+ {
+   begin_insertion (ifinfo);
+ }
+ 
+ /* Begin an insertion where the lines are not filled or indented. */
+ void
+ cm_flushleft ()
+ {
+   begin_insertion (flushleft);
+ }
+ 
+ /* Begin an insertion where the lines are not filled, and each line is
+    forced to the right-hand side of the page. */
+ void
+ cm_flushright ()
+ {
+   begin_insertion (flushright);
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			  Conditional Handling			    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* A structure which contains `defined' variables. */
+ typedef struct _defines {
+   struct _defines *next;
+   char *name;
+   char *value;
+ } DEFINE;
+ 
+ /* The linked list of `set' defines. */
+ DEFINE *defines = (DEFINE *)NULL;
+ 
+ /* Add NAME to the list of `set' defines. */
+ void
+ set (name, value)
+      char *name;
+      char *value;
+ {
+   DEFINE *temp;
+ 
+   for (temp = defines; temp; temp = temp->next)
+     if (strcmp (name, temp->name) == 0)
+       {
+ 	free (temp->value);
+ 	temp->value = strdup (value);
+ 	return;
+       }
+ 
+   temp = (DEFINE *)xmalloc (sizeof (DEFINE));
+   temp->next = defines;
+   temp->name = strdup (name);
+   temp->value = strdup (value);
+   defines = temp;
+ }
+ 
+ /* Remove NAME from the list of `set' defines. */
+ void
+ clear (name)
+      char *name;
+ {
+   register DEFINE *temp, *last;
+ 
+   last = (DEFINE *)NULL;
+   temp = defines;
+ 
+   while (temp)
+     {
+       if (strcmp (temp->name, name) == 0)
+ 	{
+ 	  if (last)
+ 	    last->next = temp->next;
+ 	  else
+ 	    defines = temp->next;
+ 
+ 	  free (temp->name);
+ 	  free (temp->value);
+ 	  free (temp);
+ 	  break;
+ 	}
+       last = temp;
+       temp = temp->next;
+     }
+ }
+ 
+ /* Return the value of NAME.  The return value is NULL if NAME is unset. */
+ char *
+ set_p (name)
+      char *name;
+ {
+   register DEFINE *temp;
+ 
+   for (temp = defines; temp; temp = temp->next)
+     if (strcmp (temp->name, name) == 0)
+       return (temp->value);
+ 
+   return ((char *)NULL);
+ }
+ 
+ /* Conditionally parse based on the current command name. */
+ void
+ command_name_condition ()
+ {
+   char *discarder;
+ 
+   discarder = (char *)xmalloc (8 + strlen (command));
+ 
+   sprintf (discarder, "\n%cend %s", COMMAND_PREFIX, command);
+   discard_until (discarder);
+   discard_until ("\n");
+ 
+   free (discarder);
+ }
+ 
+ /* Create a variable whose name appears as the first word on this line. */
+ void
+ cm_set ()
+ {
+   handle_variable (SET);
+ }
+ 
+ /* Remove a variable whose name appears as the first word on this line. */
+ void
+ cm_clear ()
+ {
+   handle_variable (CLEAR);
+ }
+ 
+ void
+ cm_ifset ()
+ {
+   handle_variable (IFSET);
+ }
+ 
+ void
+ cm_ifclear ()
+ {
+   handle_variable (IFCLEAR);
+ }
+ 
+ /* This command takes braces, but we parse the contents specially, so we
+    don't use the standard brace popping code.
+ 
+    The syntax @ifeq{arg1, arg2, texinfo commands} performs texinfo commands
+    if ARG1 and ARG2 caselessly string compare to the same string, otherwise,
+    it produces no output. */
+ void
+ cm_ifeq ()
+ {
+   register int i;
+   char **arglist;
+ 
+   arglist = get_brace_args (0);
+ 
+   if (arglist)
+     {
+       if (array_len (arglist) > 1)
+ 	{
+ 	  if ((strcasecmp (arglist[0], arglist[1]) == 0) &&
+ 	      (arglist[2] != (char *)NULL))
+ 	    execute_string ("%s\n", arglist[2]);
+ 	}
+ 
+       free_array (arglist);
+     }
+ }
+ 
+ void
+ cm_value (arg, start_pos, end_pos)
+      int arg, start_pos, end_pos;
+ {
+   if (arg == END)
+     {
+       char *name, *value;
+       name = (char *)&output_paragraph[start_pos];
+       output_paragraph[end_pos] = '\0';
+       name = strdup (name);
+       value = set_p (name);
+       output_column -= end_pos - start_pos;
+       output_paragraph_offset = start_pos;
+ 
+       if (value)
+         execute_string ("%s", value);
+       else
+ 	add_word_args ("{No Value For \"%s\"}", name);
+ 
+       free (name);
+     }
+ }
+ 
+ /* Set, clear, or conditionalize based on ACTION. */
+ void
+ handle_variable (action)
+      int action;
+ {
+   char *name;
+ 
+   get_rest_of_line (&name);
+   backup_input_pointer ();
+   canon_white (name);
+   handle_variable_internal (action, name);
+   free (name);
+ }
+ 
+ void
+ handle_variable_internal (action, name)
+      int action;
+      char *name;
+ {
+   char *temp;
+   int delimiter, additional_text_present = 0;
+ 
+   /* Only the first word of NAME is a valid tag. */
+   temp = name;
+   delimiter = 0;
+   while (*temp && (delimiter || !whitespace (*temp)))
+     {
+ /* #if defined (SET_WITH_EQUAL) */
+       if (*temp == '"' || *temp == '\'')
+ 	{
+ 	  if (*temp == delimiter)
+ 	    delimiter = 0;
+ 	  else
+ 	    delimiter = *temp;
+ 	}
+ /* #endif SET_WITH_EQUAL */
+       temp++;
+     }
+ 
+   if (*temp)
+     additional_text_present++;
+ 
+   *temp = '\0';
+ 
+   if (!*name)
+     line_error ("%c%s requires a name", COMMAND_PREFIX, command);
+   else
+     {
+       switch (action)
+ 	{
+ 	case SET:
+ 	  {
+ 	    char *value;
+ 
+ #if defined (SET_WITH_EQUAL)
+ 	    /* Allow a value to be saved along with a variable.  The value is
+ 	       the text following an `=' sign in NAME, if any is present. */
+ 
+ 	    for (value = name; *value && *value != '='; value++);
+ 
+ 	    if (*value)
+ 	      *value++ = '\0';
+ 
+ 	    if (*value == '"' || *value == '\'')
+ 	      {
+ 		value++;
+ 		value[strlen (value) - 1] = '\0';
+ 	      }
+ 
+ #else /* !SET_WITH_EQUAL */
+ 	    /* The VALUE of NAME is the remainder of the line sans
+ 	       whitespace. */
+ 	    if (additional_text_present)
+ 	      {
+ 		value = temp + 1;
+ 		canon_white (value);
+ 	      }
+ 	    else
+ 	      value = "";
+ #endif /* !SET_WITH_VALUE */
+ 
+ 	    set (name, value);
+ 	  }
+ 	  break;
+ 
+ 	case CLEAR:
+ 	  clear (name);
+ 	  break;
+ 
+ 	case IFSET:
+ 	case IFCLEAR:
+ 	  /* If IFSET and NAME is not set, or if IFCLEAR and NAME is set,
+ 	     read lines from the the file until we reach a matching
+ 	     "@end CONDITION".  This means that we only take note of
+ 	     "@ifset/clear" and "@end" commands. */
+ 	  {
+ 	    char condition[8];
+ 	    int condition_len;
+ 
+ 	    if (action == IFSET)
+ 	      strcpy (condition, "ifset");
+ 	    else
+ 	      strcpy (condition, "ifclear");
+ 
+ 	    condition_len = strlen (condition);
+ 
+ 	  if ((action == IFSET && !set_p (name)) ||
+ 	      (action == IFCLEAR && set_p (name)))
+ 	    {
+ 	      int level = 0, done = 0;
+ 
+ 	      while (!done)
+ 		{
+ 		  char *freeable_line, *line;
+ 
+ 		  get_rest_of_line (&freeable_line);
+ 
+ 		  for (line = freeable_line; whitespace (*line); line++);
+ 
+ 		  if (*line == COMMAND_PREFIX &&
+ 		      (strncmp (line + 1, condition, condition_len) == 0))
+ 		    level++;
+ 		  else if (strncmp (line, "@end", 4) == 0)
+ 		    {
+ 		      char *cname = line + 4;
+ 		      char *temp;
+ 
+ 		      while (*cname && whitespace (*cname))
+ 			cname++;
+ 		      temp = cname;
+ 
+ 		      while (*temp && !whitespace (*temp))
+ 			temp++;
+ 		      *temp = '\0';
+ 
+ 		      if (strcmp (cname, condition) == 0)
+ 			{
+ 			  if (!level)
+ 			    {
+ 			      done = 1;
+ 			    }
+ 			  else
+ 			    level--;
+ 			}
+ 		    }
+ 		  free (freeable_line);
+ 		}
+ 	      /* We found the end of a false @ifset/ifclear.  If we are
+ 		 in a menu, back up over the newline that ends the ifset,
+ 		 since that newline may also begin the next menu entry. */
+ 	      break;
+ 	    }
+ 	  else
+ 	    {
+ 	      if (action == IFSET)
+ 		begin_insertion (ifset);
+ 	      else
+ 		begin_insertion (ifclear);
+ 	    }
+ 	  }
+ 	  break;
+ 	}
+     }
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*		    Execution of Random Text not in file	    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ typedef struct {
+   char *string;			/* The string buffer. */
+   int size;			/* The size of the buffer. */
+   int in_use;			/* Non-zero means string currently in use. */
+ } EXECUTION_STRING;
+ 
+ static EXECUTION_STRING **execution_strings = (EXECUTION_STRING **)NULL;
+ static int execution_strings_index = 0;
+ static int execution_strings_slots = 0;
+ 
+ EXECUTION_STRING *
+ get_execution_string (initial_size)
+      int initial_size;
+ {
+   register int i = 0;
+   EXECUTION_STRING *es = (EXECUTION_STRING *)NULL;
+ 
+   if (execution_strings)
+     {
+       for (i = 0; i < execution_strings_index; i++)
+ 	if (execution_strings[i] && (execution_strings[i]->in_use == 0))
+ 	  {
+ 	    es = execution_strings[i];
+ 	    break;
+ 	  }
+     }
+ 
+   if (!es)
+     {
+       if (execution_strings_index + 1 >= execution_strings_slots)
+ 	{
+ 	  execution_strings = (EXECUTION_STRING **)xrealloc
+ 	    (execution_strings,
+ 	     (execution_strings_slots += 3) * sizeof (EXECUTION_STRING *));
+ 	  for (; i < execution_strings_slots; i++)
+ 	    execution_strings[i] = (EXECUTION_STRING *)NULL;
+ 	}
+ 
+       execution_strings[execution_strings_index] =
+ 	(EXECUTION_STRING *)xmalloc (sizeof (EXECUTION_STRING));
+       es = execution_strings[execution_strings_index];
+       execution_strings_index++;
+ 
+       es->size = 0;
+       es->string = (char *)NULL;
+       es->in_use = 0;
+     }
+ 
+   if (initial_size > es->size)
+     {
+       es->string = (char *) xrealloc (es->string, initial_size);
+       es->size = initial_size;
+     }
+   return (es);
+ }
+ 
+ /* Execute the string produced by formatting the ARGs with FORMAT.  This
+    is like submitting a new file with @include. */
+ #if defined (HAVE_VARARGS_H) && defined (HAVE_VSPRINTF)
+ void
+ execute_string (va_alist)
+      va_dcl
+ {
+   EXECUTION_STRING *es;
+   char *temp_string;
+   char *format;
+   va_list args;
+ 
+   es = get_execution_string (4000);
+   temp_string = es->string;
+   es->in_use = 1;
+ 
+   va_start (args);
+   format = va_arg (args, char *);
+   vsprintf (temp_string, format, args);
+   va_end (args);
+ 
+ #else /* !(HAVE_VARARGS_H && HAVE_VSPRINTF) */
+ 
+ void
+ execute_string (format, arg1, arg2, arg3, arg4, arg5)
+      char *format;
+ {
+   EXECUTION_STRING *es;
+   char *temp_string;
+ 
+   es = get_execution_string (4000);
+   temp_string = es->string;
+   es->in_use = 1;
+ 
+   sprintf (temp_string, format, arg1, arg2, arg3, arg4, arg5);
+ 
+ #endif /* !(HAVE_VARARGS_H && HAVE_VSPRINTF) */
+ 
+   pushfile ();
+   input_text_offset = 0;
+   input_text = temp_string;
+   input_filename = strdup (input_filename);
+   size_of_input_text = strlen (temp_string);
+ 
+   executing_string++;
+   reader_loop ();
+   free (input_filename);
+ 
+   popfile ();
+   executing_string--;
+   es->in_use = 0;
+ }
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			@itemx, @item				    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ static int itemx_flag = 0;
+ 
+ void
+ cm_itemx ()
+ {
+   itemx_flag++;
+   cm_item ();
+   itemx_flag--;
+ }
+ 
+ void
+ cm_item ()
+ {
+   char *rest_of_line, *item_func;
+ 
+   /* Can only hack "@item" while inside of an insertion. */
+   if (insertion_level)
+     {
+       INSERTION_ELT *stack = insertion_stack;
+       int original_input_text_offset;
+ 
+       skip_whitespace ();
+       original_input_text_offset = input_text_offset;
+ 
+       get_rest_of_line (&rest_of_line);
+       canon_white (rest_of_line);
+       item_func = current_item_function ();
+ 
+       /* Okay, do the right thing depending on which insertion function
+ 	 is active. */
+ 
+     switch_top:
+       switch (stack->insertion)
+ 	{
+ 	case ifinfo:
+ 	case ifset:
+ 	case ifclear:
+ 	case cartouche:
+ 	  stack = stack->next;
+ 	  if (!stack)
+ 	    goto no_insertion;
+ 	  else
+ 	    goto switch_top;
+ 	  break;
+ 
+ 	case menu:
+ 	case quotation:
+ 	case example:
+ 	case smallexample:
+ 	case lisp:
+ 	case format:
+ 	case display:
+ 	case group:
+ 	  line_error ("The `%c%s' command is meaningless within a `@%s' block",
+ 		      COMMAND_PREFIX, command,
+ 		      insertion_type_pname (current_insertion_type ()));
+ 	  break;
+ 
+ 	case itemize:
+ 	case enumerate:
+ 	  if (itemx_flag)
+ 	    {
+ 	      line_error ("%citemx is not meaningful inside of a `%s' block",
+ 			  COMMAND_PREFIX,
+ 			  insertion_type_pname (current_insertion_type ()));
+ 	    }
+ 	  else
+ 	    {
+ 	      start_paragraph ();
+ 	      kill_self_indent (-1);
+ 	      filling_enabled = indented_fill = 1;
+ 
+ 	      if (current_insertion_type () == itemize)
+ 		{
+ 		  indent (output_column = current_indent - 2);
+ 
+ 		  /* I need some way to determine whether this command
+ 		     takes braces or not.  I believe the user can type
+ 		     either "@bullet" or "@bullet{}".  Of course, they
+ 		     can also type "o" or "#" or whatever else they want. */
+ 		  if (item_func && *item_func)
+ 		    {
+ 		      if (*item_func == COMMAND_PREFIX)
+ 			if (item_func[strlen (item_func) - 1] != '}')
+ 			  execute_string ("%s{}", item_func);
+ 			else
+ 			  execute_string ("%s", item_func);
+ 		      else
+ 			execute_string ("%s", item_func);
+ 		    }
+ 		  insert (' ');
+ 		  output_column++;
+ 		}
+ 	      else
+ 		enumerate_item ();
+ 
+ 	      /* Special hack.  This makes close paragraph ignore you until
+ 		 the start_paragraph () function has been called. */
+ 	      must_start_paragraph = 1;
+ 
+ 	      /* Ultra special hack.  It appears that some people incorrectly
+ 		 place text directly after the @item, instead of on a new line
+ 		 by itself.  This happens to work in TeX, so I make it work
+ 		 here. */
+ 	      if (*rest_of_line)
+ 		{
+ 		  line_number--;
+ 		  input_text_offset = original_input_text_offset;
+ 		}
+ 	    }
+ 	  break;
+ 
+ 	case table:
+ 	case ftable:
+ 	case vtable:
+ 	  {
+ 	    /* Get rid of extra characters. */
+ 	    kill_self_indent (-1);
+ 
+ 	    /* close_paragraph () almost does what we want.  The problem
+ 	       is when paragraph_is_open, and last_char_was_newline, and
+ 	       the last newline has been turned into a space, because
+ 	       filling_enabled. I handle it here. */
+ 	    if (last_char_was_newline && filling_enabled && paragraph_is_open)
+ 	      insert ('\n');
+ 	    close_paragraph ();
+ 
+ #if defined (INDENT_PARAGRAPHS_IN_TABLE)
+ 	    /* Indent on a new line, but back up one indentation level. */
+ 	    {
+ 	      int t;
+ 
+ 	      t = inhibit_paragraph_indentation;
+ 	      inhibit_paragraph_indentation = 1;
+ 	      /* At this point, inserting any non-whitespace character will
+ 		 force the existing indentation to be output. */
+ 	      add_char ('i');
+ 	      inhibit_paragraph_indentation = t;
+ 	    }
+ #else /* !INDENT_PARAGRAPHS_IN_TABLE */
+ 	    add_char ('i');
+ #endif /* !INDENT_PARAGRAPHS_IN_TABLE */
+ 
+ 	    output_paragraph_offset--;
+ 	    kill_self_indent (default_indentation_increment + 1);
+ 
+ 	    /* Add item's argument to the line. */
+ 	    filling_enabled = 0;
+ 	    if (item_func && *item_func)
+  	      execute_string ("%s{%s}", item_func, rest_of_line);
+  	    else
+  	      execute_string ("%s", rest_of_line);
+ 
+ 	    if (current_insertion_type () == ftable)
+ 	      execute_string ("%cfindex %s\n", COMMAND_PREFIX, rest_of_line);
+ 
+ 	    if (current_insertion_type () == vtable)
+ 	      execute_string ("%cvindex %s\n", COMMAND_PREFIX, rest_of_line);
+ 
+ 	    /* Start a new line, and let start_paragraph ()
+ 	       do the indenting of it for you. */
+ 	    close_single_paragraph ();
+ 	    indented_fill = filling_enabled = 1;
+ 	  }
+ 	}
+       free (rest_of_line);
+     }
+   else
+     {
+     no_insertion:
+       line_error ("%c%s found outside of an insertion block",
+ 		  COMMAND_PREFIX, command);
+     }
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Defun and Friends       		    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ #define DEFUN_SELF_DELIMITING(c)					\
+   (((c) == '(')								\
+    || ((c) == ')')							\
+    || ((c) == '[')							\
+    || ((c) == ']'))
+ 
+ struct token_accumulator
+ {
+   unsigned int length;
+   unsigned int index;
+   char **tokens;
+ };
+ 
+ void
+ initialize_token_accumulator (accumulator)
+      struct token_accumulator *accumulator;
+ {
+   (accumulator->length) = 0;
+   (accumulator->index) = 0;
+   (accumulator->tokens) = NULL;
+ }
+ 
+ void
+ accumulate_token (accumulator, token)
+      struct token_accumulator *accumulator;
+      char *token;
+ {
+   if ((accumulator->index) >= (accumulator->length))
+     {
+       (accumulator->length) += 10;
+       (accumulator->tokens) = (char **) xrealloc
+ 	(accumulator->tokens, (accumulator->length * sizeof (char *)));
+     }
+   accumulator->tokens[accumulator->index] = token;
+   accumulator->index += 1;
+ }
+ 
+ char *
+ copy_substring (start, end)
+      char *start;
+      char *end;
+ {
+   char *result, *scan, *scan_result;
+ 
+   result = (char *) xmalloc ((end - start) + 1);
+   scan_result = result;
+   scan = start;
+ 
+   while (scan < end)
+     *scan_result++ = *scan++;
+ 
+   *scan_result = '\0';
+   return (result);
+ }
+ 
+ /* Given `string' pointing at an open brace, skip forward and return a
+    pointer to just past the matching close brace. */
+ int
+ scan_group_in_string (string_pointer)
+      char **string_pointer;
+ {
+   register int c;
+   register char *scan_string;
+   register unsigned int level = 1;
+ 
+   scan_string = (*string_pointer) + 1;
+ 
+   while (1)
+     {
+       if (level == 0)
+ 	{
+ 	  (*string_pointer) = scan_string;
+ 	  return (1);
+ 	}
+       c = (*scan_string++);
+       if (c == '\0')
+ 	{
+ 	  /* Tweak line_number to compensate for fact that
+ 	     we gobbled the whole line before coming here. */
+ 	  line_number -= 1;
+ 	  line_error ("Missing `}' in %cdef arg", COMMAND_PREFIX);
+ 	  line_number += 1;
+ 	  (*string_pointer) = (scan_string - 1);
+ 	  return (0);
+ 	}
+       if (c == '{')
+ 	level += 1;
+       if (c == '}')
+ 	level -= 1;
+     }
+ }
+ 
+ /* Return a list of tokens from the contents of `string'.
+    Commands and brace-delimited groups count as single tokens.
+    Contiguous whitespace characters are converted to a token
+    consisting of a single space. */
+ char **
+ args_from_string (string)
+      char *string;
+ {
+   struct token_accumulator accumulator;
+   register char *scan_string = string;
+   char *token_start, *token_end;
+ 
+   initialize_token_accumulator (&accumulator);
+ 
+   while ((*scan_string) != '\0')
+     {
+       /* Replace arbitrary whitespace by a single space. */
+       if (whitespace (*scan_string))
+ 	{
+ 	  scan_string += 1;
+ 	  while (whitespace (*scan_string))
+ 	    scan_string += 1;
+ 	  accumulate_token ((&accumulator), (strdup (" ")));
+ 	  continue;
+ 	}
+ 
+       /* Commands count as single tokens. */
+       if ((*scan_string) == COMMAND_PREFIX)
+ 	{
+ 	  token_start = scan_string;
+ 	  scan_string += 1;
+ 	  if (self_delimiting (*scan_string))
+ 	    scan_string += 1;
+ 	  else
+ 	    {
+ 	      register int c;
+ 	      while (1)
+ 		{
+ 		  c = *scan_string++;
+ 
+  		  if ((c == '\0') || (c == '{') || (whitespace (c)))
+ 		    {
+ 		      scan_string -= 1;
+ 		      break;
+ 		    }
+ 		}
+ 
+ 	      if (*scan_string == '{')
+ 		{
+ 		  char *s = scan_string;
+ 		  (void) scan_group_in_string (&s);
+ 		  scan_string = s;
+ 		}
+ 	    }
+ 	  token_end = scan_string;
+ 	}
+ 
+       /* Parentheses and brackets are self-delimiting. */
+       else if (DEFUN_SELF_DELIMITING (*scan_string))
+ 	{
+ 	  token_start = scan_string;
+ 	  scan_string += 1;
+ 	  token_end = scan_string;
+ 	}
+ 
+       /* Open brace introduces a group that is a single token. */
+       else if (*scan_string == '{')
+ 	{
+ 	  char *s = scan_string;
+ 	  int balanced = scan_group_in_string (&s);
+ 
+ 	  token_start = scan_string + 1;
+ 	  scan_string = s;
+ 	  token_end = balanced ? (scan_string - 1) : scan_string;
+ 	}
+ 
+       /* Otherwise a token is delimited by whitespace, parentheses,
+ 	 brackets, or braces.  A token is also ended by a command. */
+       else
+ 	{
+ 	  token_start = scan_string;
+ 
+ 	  while (1)
+ 	    {
+ 	      register int c;
+ 
+ 	      c = *scan_string++;
+ 
+ 	      if (!c ||
+ 		  (whitespace (c) || DEFUN_SELF_DELIMITING (c) ||
+ 		   c == '{' || c == '}'))
+ 		{
+ 		  scan_string--;
+ 		  break;
+ 		}
+ 
+ 	      /* If we encounter a command imbedded within a token,
+ 		 then end the token. */
+ 	      if (c == COMMAND_PREFIX)
+ 		{
+ 		  scan_string--;
+ 		  break;
+ 		}
+ 	    }
+ 	  token_end = scan_string;
+ 	}
+ 
+       accumulate_token
+ 	(&accumulator, copy_substring (token_start, token_end));
+     }
+   accumulate_token (&accumulator, NULL);
+   return (accumulator.tokens);
+ }
+ 
+ void
+ process_defun_args (defun_args, auto_var_p)
+      char **defun_args;
+      int auto_var_p;
+ {
+   int pending_space = 0;
+ 
+   while (1)
+     {
+       char *defun_arg = *defun_args++;
+ 
+       if (defun_arg == NULL)
+ 	break;
+ 
+       if (defun_arg[0] == ' ')
+ 	{
+ 	  pending_space = 1;
+ 	  continue;
+ 	}
+ 
+       if (pending_space)
+ 	{
+ 	  add_char (' ');
+ 	  pending_space = 0;
+ 	}
+ 
+       if (DEFUN_SELF_DELIMITING (defun_arg[0]))
+ 	add_char (defun_arg[0]);
+       else if (defun_arg[0] == '&')
+ 	add_word (defun_arg);
+       else if (defun_arg[0] == COMMAND_PREFIX)
+ 	execute_string ("%s", defun_arg);
+       else if (auto_var_p)
+ 	execute_string ("%cvar{%s}", COMMAND_PREFIX, defun_arg);
+       else
+ 	add_word (defun_arg);
+     }
+ }
+ 
+ char *
+ next_nonwhite_defun_arg (arg_pointer)
+      char ***arg_pointer;
+ {
+   char **scan = (*arg_pointer);
+   char *arg = (*scan++);
+ 
+   if ((arg != 0) && (*arg == ' '))
+     arg = *scan++;
+ 
+   if (arg == 0)
+     scan -= 1;
+ 
+   *arg_pointer = scan;
+ 
+   return ((arg == 0) ? "" : arg);
+ }
+ 
+ /* Make the defun type insertion.
+    TYPE says which insertion this is.
+    X_P says not to start a new insertion if non-zero. */
+ void
+ defun_internal (type, x_p)
+      enum insertion_type type;
+      int x_p;
+ {
+   enum insertion_type base_type;
+   char **defun_args, **scan_args;
+   char *category, *defined_name, *type_name, *type_name2;
+ 
+   {
+     char *line;
+     get_rest_of_line (&line);
+     defun_args = (args_from_string (line));
+     free (line);
+   }
+ 
+   scan_args = defun_args;
+ 
+   switch (type)
+     {
+     case defun:
+       category = "Function";
+       base_type = deffn;
+       break;
+     case defmac:
+       category = "Macro";
+       base_type = deffn;
+       break;
+     case defspec:
+       category = "Special Form";
+       base_type = deffn;
+       break;
+     case defvar:
+       category = "Variable";
+       base_type = defvr;
+       break;
+     case defopt:
+       category = "User Option";
+       base_type = defvr;
+       break;
+     case deftypefun:
+       category = "Function";
+       base_type = deftypefn;
+       break;
+     case deftypevar:
+       category = "Variable";
+       base_type = deftypevr;
+       break;
+     case defivar:
+       category = "Instance Variable";
+       base_type = defcv;
+       break;
+     case defmethod:
+       category = "Method";
+       base_type = defop;
+       break;
+     case deftypemethod:
+       category = "Method";
+       base_type = deftypemethod;
+       break;
+     default:
+       category = next_nonwhite_defun_arg (&scan_args);
+       base_type = type;
+       break;
+     }
+ 
+   if ((base_type == deftypefn)
+       || (base_type == deftypevr)
+       || (base_type == defcv)
+       || (base_type == defop)
+       || (base_type == deftypemethod))
+     type_name = next_nonwhite_defun_arg (&scan_args);
+ 
+   if (base_type == deftypemethod)
+     type_name2 = next_nonwhite_defun_arg (&scan_args);
+ 
+   defined_name = next_nonwhite_defun_arg (&scan_args);
+ 
+   /* This hack exists solely for the purposes of formatting the texinfo
+      manual.  I couldn't think of a better way.  The token might be
+      a simple @@ followed immediately by more text.  If this is the case,
+      then the next defun arg is part of this one, and we should concatenate
+      them. */
+   if (*scan_args && **scan_args && !whitespace (**scan_args) &&
+       (strcmp (defined_name, "@@") == 0))
+     {
+       char *tem = (char *)xmalloc (3 + strlen (scan_args[0]));
+ 
+       sprintf (tem, "@@%s", scan_args[0]);
+ 
+       free (scan_args[0]);
+       scan_args[0] = tem;
+       scan_args++;
+       defined_name = tem;
+     }
+ 
+   if (!x_p)
+     begin_insertion (type);
+ 
+   /* Write the definition header line.
+      This should start at the normal indentation.  */
+   current_indent -= default_indentation_increment;
+   start_paragraph ();
+ 
+   switch (base_type)
+     {
+     case deffn:
+     case defvr:
+     case deftp:
+       execute_string (" -- %s: %s", category, defined_name);
+       break;
+     case deftypefn:
+     case deftypevr:
+       execute_string (" -- %s: %s %s", category, type_name, defined_name);
+       break;
+     case defcv:
+       execute_string (" -- %s of %s: %s", category, type_name, defined_name);
+       break;
+     case defop:
+       execute_string (" -- %s on %s: %s", category, type_name, defined_name);
+       break;
+     case deftypemethod:
+       execute_string (" -- %s on %s: %s %s", category, type_name, type_name2,
+ 		      defined_name);
+       break;
+     }
+   current_indent += default_indentation_increment;
+ 
+   /* Now process the function arguments, if any.
+      If these carry onto the next line, they should be indented by two
+      increments to distinguish them from the body of the definition,
+      which is indented by one increment.  */
+   current_indent += default_indentation_increment;
+ 
+   switch (base_type)
+     {
+     case deffn:
+     case defop:
+       process_defun_args (scan_args, 1);
+       break;
+     case deftp:
+     case deftypefn:
+     case deftypemethod:
+       process_defun_args (scan_args, 0);
+       break;
+     }
+   current_indent -= default_indentation_increment;
+   close_single_paragraph ();
+ 
+   /* Make an entry in the appropriate index. */
+   switch (base_type)
+     {
+     case deffn:
+     case deftypefn:
+       execute_string ("%cfindex %s\n", COMMAND_PREFIX, defined_name);
+       break;
+     case defvr:
+     case deftypevr:
+     case defcv:
+       execute_string ("%cvindex %s\n", COMMAND_PREFIX, defined_name);
+       break;
+     case defop:
+     case deftypemethod:
+       execute_string ("%cfindex %s on %s\n",
+ 		      COMMAND_PREFIX, defined_name, type_name);
+       break;
+     case deftp:
+       execute_string ("%ctindex %s\n", COMMAND_PREFIX, defined_name);
+       break;
+     }
+ 
+   /* Deallocate the token list. */
+   scan_args = defun_args;
+   while (1)
+     {
+       char * arg = (*scan_args++);
+       if (arg == NULL)
+ 	break;
+       free (arg);
+     }
+   free (defun_args);
+ }
+ 
+ /* Add an entry for a function, macro, special form, variable, or option.
+    If the name of the calling command ends in `x', then this is an extra
+    entry included in the body of an insertion of the same type. */
+ void
+ cm_defun ()
+ {
+   int x_p;
+   enum insertion_type type;
+   char *temp = strdup (command);
+ 
+   x_p = (command[strlen (command) - 1] == 'x');
+ 
+   if (x_p)
+     temp[strlen (temp) - 1] = '\0';
+ 
+   type = find_type_from_name (temp);
+   free (temp);
+ 
+   /* If we are adding to an already existing insertion, then make sure
+      that we are already in an insertion of type TYPE. */
+   if (x_p &&
+       (!insertion_level || insertion_stack->insertion != type))
+     {
+       line_error ("Must be in a `%s' insertion in order to use `%s'x",
+ 		  command, command);
+       discard_until ("\n");
+       return;
+     }
+ 
+   defun_internal (type, x_p);
+ }
+ 
+ /* End existing insertion block. */
+ void
+ cm_end ()
+ {
+   char *temp;
+   enum insertion_type type;
+ 
+   if (!insertion_level)
+     {
+       line_error ("Unmatched `%c%s'", COMMAND_PREFIX, command);
+       return;
+     }
+ 
+   get_rest_of_line (&temp);
+   canon_white (temp);
+ 
+   if (strlen (temp) == 0)
+     line_error ("`%c%s' needs something after it", COMMAND_PREFIX, command);
+ 
+   type = find_type_from_name (temp);
+ 
+   if (type == bad_type)
+     {
+       line_error ("Bad argument to `%s', `%s', using `%s'",
+ 	   command, temp, insertion_type_pname (current_insertion_type ()));
+     }
+   end_insertion (type);
+   free (temp);
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Other Random Commands		   	    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ /* This says to inhibit the indentation of the next paragraph, but
+    not of following paragraphs.  */
+ void
+ cm_noindent ()
+ {
+   if (!inhibit_paragraph_indentation)
+     inhibit_paragraph_indentation = -1;
+ }
+ 
+ /* I don't know exactly what to do with this.  Should I allow
+    someone to switch filenames in the middle of output?  Since the
+    file could be partially written, this doesn't seem to make sense.
+    Another option: ignore it, since they don't *really* want to
+    switch files.  Finally, complain, or at least warn. */
+ void
+ cm_setfilename ()
+ {
+   char *filename;
+   get_rest_of_line (&filename);
+   /* warning ("`@%s %s' encountered and ignored", command, filename); */
+   free (filename);
+ }
+ 
+ void
+ cm_ignore_line ()
+ {
+   discard_until ("\n");
+ }
+ 
+ /* @br can be immediately followed by `{}', so we have to read those here.
+    It should simply close the paragraph. */
+ void
+ cm_br ()
+ {
+   if (looking_at ("{}"))
+     input_text_offset += 2;
+ 
+   if (curchar () == '\n')
+     {
+       input_text_offset++;
+       line_number++;
+     }
+ 
+   close_paragraph ();
+ }
+ 
+  /* Insert the number of blank lines passed as argument. */
+ void
+ cm_sp ()
+ {
+   int lines;
+   char *line;
+ 
+   get_rest_of_line (&line);
+ 
+   if (sscanf (line, "%d", &lines) != 1)
+     {
+       line_error ("%csp requires a positive numeric argument", COMMAND_PREFIX);
+     }
+   else
+     {
+       if (lines < 0)
+ 	lines = 0;
+ 
+       while (lines--)
+ 	add_char ('\n');
+     }
+   free (line);
+ }
+ 
+ /* Start a new line with just this text on it.
+    Then center the line of text.
+    This always ends the current paragraph. */
+ void
+ cm_center ()
+ {
+   register int i, start, length;
+   int fudge_factor = 1;
+   unsigned char *line;
+ 
+   close_paragraph ();
+   filling_enabled = indented_fill = 0;
+   cm_noindent ();
+   start = output_paragraph_offset;
+   inhibit_output_flushing ();
+   get_rest_of_line ((char **)&line);
+   execute_string ("%s", (char *)line);
+   free (line);
+   uninhibit_output_flushing ();
+ 
+   i = output_paragraph_offset - 1;
+   while (i > (start - 1) && output_paragraph[i] == '\n')
+ 	i--;
+ 
+   output_paragraph_offset = ++i;
+   length = output_paragraph_offset - start;
+ 
+   if (length < (fill_column - fudge_factor))
+     {
+       line = (unsigned char *)xmalloc (1 + length);
+       memcpy (line, (char *)(output_paragraph + start), length);
+ 
+       i = (fill_column - fudge_factor - length) / 2;
+       output_paragraph_offset = start;
+ 
+       while (i--)
+ 	insert (' ');
+ 
+       for (i = 0; i < length; i++)
+ 	insert (line[i]);
+ 
+       free (line);
+     }
+ 
+   insert ('\n');
+   close_paragraph ();
+   filling_enabled = 1;
+ }
+ 
+ /* Show what an expression returns. */
+ void
+ cm_result (arg)
+      int arg;
+ {
+   if (arg == END)
+     add_word ("=>");
+ }
+ 
+ /* What an expression expands to. */
+ void
+ cm_expansion (arg)
+      int arg;
+ {
+   if (arg == END)
+     add_word ("==>");
+ }
+ 
+ /* Indicates two expressions are equivalent. */
+ void
+ cm_equiv (arg)
+      int arg;
+ {
+   if (arg == END)
+     add_word ("==");
+ }
+ 
+ /* What an expression may print. */
+ void
+ cm_print (arg)
+      int arg;
+ {
+   if (arg == END)
+     add_word ("-|");
+ }
+ 
+ /* An error signaled. */
+ void
+ cm_error (arg)
+      int arg;
+ {
+   if (arg == END)
+     add_word ("error-->");
+ }
+ 
+ /* The location of point in an example of a buffer. */
+ void
+ cm_point (arg)
+      int arg;
+ {
+   if (arg == END)
+     add_word ("-!-");
+ }
+ 
+ /* Start a new line with just this text on it.
+    The text is outdented one level if possible. */
+ void
+ cm_exdent ()
+ {
+   char *line;
+   int i = current_indent;
+ 
+   if (current_indent)
+     current_indent -= default_indentation_increment;
+ 
+   get_rest_of_line (&line);
+   close_single_paragraph ();
+   execute_string ("%s", line);
+   current_indent = i;
+   free (line);
+   close_single_paragraph ();
+ }
+ 
+ void
+ cm_include ()
+ {
+   cm_infoinclude ();
+ }
+ 
+ #if !defined (HAVE_STRERROR)
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ 
+ char *
+ strerror (num)
+      int num;
+ {
+   if (num >= sys_nerr)
+     return ("Unknown file system error");
+   else
+     return (sys_errlist[num]);
+ }
+ #endif /* !HAVE_STRERROR */
+ 
+ /* Remember this file, and move onto the next. */
+ void
+ cm_infoinclude ()
+ {
+   char *filename;
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     me_append_before_this_command ();
+ #endif /* HAVE_MACROS */
+ 
+   close_paragraph ();
+   get_rest_of_line (&filename);
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     remember_itext (input_text, input_text_offset);
+ #endif /* HAVE_MACROS */
+ 
+   pushfile ();
+ 
+   /* In verbose mode we print info about including another file. */
+   if (verbose_mode)
+     {
+       register int i = 0;
+       register FSTACK *stack = filestack;
+ 
+       for (i = 0, stack = filestack; stack; stack = stack->next, i++);
+ 
+       i *= 2;
+ 
+       printf ("%*s", i, "");
+       printf ("%c%s %s\n", COMMAND_PREFIX, command, filename);
+       fflush (stdout);
+     }
+ 
+   if (!find_and_load (filename))
+     {
+       extern int errno;
+ 
+       popfile ();
+       line_number--;
+ 
+       /* Cannot "@include foo", in line 5 of "/wh/bar". */
+       line_error ("`%c%s %s': %s", COMMAND_PREFIX, command, filename,
+ 		  strerror (errno));
+ 
+       free (filename);
+       return;
+     }
+   else
+     {
+ #if defined (HAVE_MACROS)
+       if (macro_expansion_output_stream)
+ 	remember_itext (input_text, input_text_offset);
+ #endif /* HAVE_MACROS */
+       reader_loop ();
+     }
+   free (filename);
+   popfile ();
+ }
+ 
+ /* The other side of a malformed expression. */
+ void
+ misplaced_brace ()
+ {
+   line_error ("Misplaced `}'");
+ }
+ 
+ /* Don't let the filling algorithm insert extra whitespace here. */
+ void
+ cm_force_abbreviated_whitespace ()
+ {
+ }
+ 
+ /* Do not let this character signify the end of a sentence, though
+    if it was seen without the command prefix it normally would.  We
+    do this by turning on the 8th bit of the character. */
+ void
+ cm_ignore_sentence_ender ()
+ {
+   add_char (META ((*command)));
+ }
+ 
+ /* Signals end of processing.  Easy to make this happen. */
+ void
+ cm_bye ()
+ {
+   input_text_offset = size_of_input_text;
+ }
+ 
+ void
+ cm_asis ()
+ {
+ }
+ 
+ void
+ cm_math ()
+ {
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*			Indexing Stuff				    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ 
+ /* An index element... */
+ typedef struct index_elt
+ {
+   struct index_elt *next;
+   char *entry;			/* The index entry itself. */
+   char *node;			/* The node from whence it came. */
+   int code;			/* Non-zero means add `@code{...}' when
+ 				   printing this element. */
+   int defining_line;		/* Line number where this entry was written. */
+ } INDEX_ELT;
+ 
+ /* A list of short-names for each index, and the index to that index in our
+    index array, the_indices.  In addition, for each index, it is remembered
+    whether that index is a code index or not.  Code indices have @code{}
+    inserted around the first word when they are printed with printindex. */
+ typedef struct
+ {
+   char *name;
+   int index;
+   int code;
+ } INDEX_ALIST;
+ 
+ INDEX_ALIST **name_index_alist = (INDEX_ALIST **) NULL;
+ 
+ /* An array of pointers.  Each one is for a different index.  The
+    "synindex" command changes which array slot is pointed to by a
+    given "index". */
+ INDEX_ELT **the_indices = (INDEX_ELT **) NULL;
+ 
+ /* The number of defined indices. */
+ int defined_indices = 0;
+ 
+ /* We predefine these. */
+ #define program_index 0
+ #define function_index 1
+ #define concept_index 2
+ #define variable_index 3
+ #define datatype_index 4
+ #define key_index 5
+ 
+ void
+ init_indices ()
+ {
+   int i;
+ 
+   /* Create the default data structures. */
+ 
+   /* Initialize data space. */
+   if (!the_indices)
+     {
+       the_indices = (INDEX_ELT **) xmalloc ((1 + defined_indices) *
+ 					    sizeof (INDEX_ELT *));
+       the_indices[defined_indices] = (INDEX_ELT *) NULL;
+ 
+       name_index_alist = (INDEX_ALIST **) xmalloc ((1 + defined_indices) *
+ 						   sizeof (INDEX_ALIST *));
+       name_index_alist[defined_indices] = (INDEX_ALIST *) NULL;
+     }
+ 
+   /* If there were existing indices, get rid of them now. */
+   for (i = 0; i < defined_indices; i++)
+     undefindex (name_index_alist[i]->name);
+ 
+   /* Add the default indices. */
+   top_defindex ("pg", 0);
+   top_defindex ("fn", 1);		/* "fn" is a code index.  */
+   top_defindex ("cp", 0);
+   top_defindex ("vr", 0);
+   top_defindex ("tp", 0);
+   top_defindex ("ky", 0);
+ 
+ }
+ 
+ /* Find which element in the known list of indices has this name.
+    Returns -1 if NAME isn't found. */
+ int
+ find_index_offset (name)
+      char *name;
+ {
+   register int i;
+   for (i = 0; i < defined_indices; i++)
+     if (name_index_alist[i] &&
+ 	strcmp (name, name_index_alist[i]->name) == 0)
+       return (name_index_alist[i]->index);
+   return (-1);
+ }
+ 
+ /* Return a pointer to the entry of (name . index) for this name.
+    Return NULL if the index doesn't exist. */
+ INDEX_ALIST *
+ find_index (name)
+      char *name;
+ {
+   int offset = find_index_offset (name);
+   if (offset > -1)
+     return (name_index_alist[offset]);
+   else
+     return ((INDEX_ALIST *) NULL);
+ }
+ 
+ /* Given an index name, return the offset in the_indices of this index,
+    or -1 if there is no such index. */
+ int
+ translate_index (name)
+      char *name;
+ {
+   INDEX_ALIST *which = find_index (name);
+ 
+   if (which)
+     return (which->index);
+   else
+     return (-1);
+ }
+ 
+ /* Return the index list which belongs to NAME. */
+ INDEX_ELT *
+ index_list (name)
+      char *name;
+ {
+   int which = translate_index (name);
+   if (which < 0)
+     return ((INDEX_ELT *) -1);
+   else
+     return (the_indices[which]);
+ }
+ 
+ /* Please release me, let me go... */
+ void
+ free_index (index)
+      INDEX_ELT *index;
+ {
+   INDEX_ELT *temp;
+ 
+   while ((temp = index) != (INDEX_ELT *) NULL)
+     {
+       free (temp->entry);
+       free (temp->node);
+       index = index->next;
+       free (temp);
+     }
+ }
+ 
+ /* Flush an index by name. */
+ void
+ undefindex (name)
+      char *name;
+ {
+   int i;
+   int which = find_index_offset (name);
+ 
+   if (which < 0)
+     return;
+ 
+   i = name_index_alist[which]->index;
+ 
+   free_index (the_indices[i]);
+   the_indices[i] = (INDEX_ELT *) NULL;
+ 
+   free (name_index_alist[which]->name);
+   free (name_index_alist[which]);
+   name_index_alist[which] = (INDEX_ALIST *) NULL;
+ }
+ 
+ /* Define an index known as NAME.  We assign the slot number.
+    CODE if non-zero says to make this a code index. */
+ void
+ defindex (name, code)
+      char *name;
+      int code;
+ {
+   register int i, slot;
+ 
+   /* If it already exists, flush it. */
+   undefindex (name);
+ 
+   /* Try to find an empty slot. */
+   slot = -1;
+   for (i = 0; i < defined_indices; i++)
+     if (!name_index_alist[i])
+       {
+ 	slot = i;
+ 	break;
+       }
+ 
+   if (slot < 0)
+     {
+       /* No such luck.  Make space for another index. */
+       slot = defined_indices;
+       defined_indices++;
+ 
+       name_index_alist = (INDEX_ALIST **)
+ 	xrealloc ((char *)name_index_alist,
+ 		  (1 + defined_indices) * sizeof (INDEX_ALIST *));
+       the_indices = (INDEX_ELT **)
+ 	xrealloc ((char *)the_indices,
+ 		  (1 + defined_indices) * sizeof (INDEX_ELT *));
+     }
+ 
+   /* We have a slot.  Start assigning. */
+   name_index_alist[slot] = (INDEX_ALIST *) xmalloc (sizeof (INDEX_ALIST));
+   name_index_alist[slot]->name = strdup (name);
+   name_index_alist[slot]->index = slot;
+   name_index_alist[slot]->code = code;
+ 
+   the_indices[slot] = (INDEX_ELT *) NULL;
+ }
+ 
+ /* Add the arguments to the current index command to the index NAME. */
+ void
+ index_add_arg (name)
+      char *name;
+ {
+   int which;
+   char *index_entry;
+   INDEX_ALIST *tem;
+ 
+   tem = find_index (name);
+ 
+   which = tem ? tem->index : -1;
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     append_to_expansion_output (input_text_offset + 1);
+ #endif /* HAVE_MACROS */
+ 
+   get_rest_of_line (&index_entry);
+   ignore_blank_line ();
+ 
+ #if defined (HAVE_MACROS)
+   if (macro_expansion_output_stream)
+     {
+       int op_orig;
+ 
+       remember_itext (input_text, input_text_offset);
+       op_orig = output_paragraph_offset;
+       me_execute_string (index_entry);
+       me_execute_string ("\n");
+       output_paragraph_offset = op_orig;
+     }
+ #endif /* HAVE_MACROS */
+ 
+   if (which < 0)
+     {
+       line_error ("Unknown index reference `%s'", name);
+       free (index_entry);
+     }
+   else
+     {
+       INDEX_ELT *new = (INDEX_ELT *) xmalloc (sizeof (INDEX_ELT));
+       new->next = the_indices[which];
+       new->entry = index_entry;
+       new->node = current_node;
+       new->code = tem->code;
+       new->defining_line = line_number - 1;
+       the_indices[which] = new;
+     }
+ }
+ 
+ #define INDEX_COMMAND_SUFFIX "index"
+ 
+ /* The function which user defined index commands call. */
+ void
+ gen_index ()
+ {
+   char *name = strdup (command);
+   if (strlen (name) >= strlen ("index"))
+     name[strlen (name) - strlen ("index")] = '\0';
+   index_add_arg (name);
+   free (name);
+ }
+ 
+ void
+ top_defindex (name, code)
+      char *name;
+      int code;
+ {
+   char *temp;
+ 
+   temp = (char *) xmalloc (1 + strlen (name) + strlen ("index"));
+   sprintf (temp, "%sindex", name);
+   define_user_command (temp, gen_index, 0);
+   defindex (name, code);
+   free (temp);
+ }
+ 
+ /* Define a new index command.  Arg is name of index. */
+ void
+ cm_defindex ()
+ {
+   gen_defindex (0);
+ }
+ 
+ void
+ cm_defcodeindex ()
+ {
+   gen_defindex (1);
+ }
+ 
+ void
+ gen_defindex (code)
+      int code;
+ {
+   char *name;
+   get_rest_of_line (&name);
+ 
+   if (find_index (name))
+     {
+       line_error ("Index `%s' already exists", name);
+       free (name);
+       return;
+     }
+   else
+     {
+       char *temp = (char *) alloca (1 + strlen (name) + strlen ("index"));
+       sprintf (temp, "%sindex", name);
+       define_user_command (temp, gen_index, 0);
+       defindex (name, code);
+       free (name);
+     }
+ }
+ 
+ /* Append LIST2 to LIST1.  Return the head of the list. */
+ INDEX_ELT *
+ index_append (head, tail)
+      INDEX_ELT *head, *tail;
+ {
+   register INDEX_ELT *t_head = head;
+ 
+   if (!t_head)
+     return (tail);
+ 
+   while (t_head->next)
+     t_head = t_head->next;
+   t_head->next = tail;
+   return (head);
+ }
+ 
+ /* Expects 2 args, on the same line.  Both are index abbreviations.
+    Make the first one be a synonym for the second one, i.e. make the
+    first one have the same index as the second one. */
+ void
+ cm_synindex ()
+ {
+   int redirector, redirectee;
+   char *temp;
+ 
+   skip_whitespace ();
+   get_until_in_line (" ", &temp);
+   redirectee = find_index_offset (temp);
+   skip_whitespace ();
+   free_and_clear (&temp);
+   get_until_in_line (" ", &temp);
+   redirector = find_index_offset (temp);
+   free (temp);
+   if (redirector < 0 || redirectee < 0)
+     {
+       line_error ("Unknown index reference");
+     }
+   else
+     {
+       /* I think that we should let the user make indices synonymous to
+          each other without any lossage of info.  This means that one can
+          say @synindex cp dt anywhere in the file, and things that used to
+          be in cp will go into dt. */
+       INDEX_ELT *i1 = the_indices[redirectee], *i2 = the_indices[redirector];
+ 
+       if (i1 || i2)
+ 	{
+ 	  if (i1)
+ 	    the_indices[redirectee] = index_append (i1, i2);
+ 	  else
+ 	    the_indices[redirectee] = index_append (i2, i1);
+ 	}
+ 
+       name_index_alist[redirectee]->index =
+ 	name_index_alist[redirector]->index;
+     }
+ }
+ 
+ void
+ cm_pindex ()			/* Pinhead index. */
+ {
+   index_add_arg ("pg");
+ }
+ 
+ void
+ cm_vindex ()			/* Variable index. */
+ {
+   index_add_arg ("vr");
+ }
+ 
+ void
+ cm_kindex ()			/* Key index. */
+ {
+   index_add_arg ("ky");
+ }
+ 
+ void
+ cm_cindex ()			/* Concept index. */
+ {
+   index_add_arg ("cp");
+ }
+ 
+ void
+ cm_findex ()			/* Function index. */
+ {
+   index_add_arg ("fn");
+ }
+ 
+ void
+ cm_tindex ()			/* Data Type index. */
+ {
+   index_add_arg ("tp");
+ }
+ 
+ /* Sorting the index. */
+ int
+ index_element_compare (element1, element2)
+      INDEX_ELT **element1, **element2;
+ {
+   /* This needs to ignore leading non-text characters. */
+   return (strcasecmp ((*element1)->entry, (*element2)->entry));
+ }
+ 
+ /* Force all index entries to be unique. */
+ void
+ make_index_entries_unique (array, count)
+      INDEX_ELT **array;
+      int count;
+ {
+   register int i, j;
+   INDEX_ELT **copy;
+   int counter = 1;
+ 
+   copy = (INDEX_ELT **)xmalloc ((1 + count) * sizeof (INDEX_ELT *));
+ 
+   for (i = 0, j = 0; i < count; i++)
+     {
+       if ((i == (count - 1)) ||
+ 	  (array[i]->node != array[i + 1]->node) ||
+ 	  (strcasecmp (array[i]->entry, array[i + 1]->entry) != 0))
+ 	copy[j++] = array[i];
+       else
+ 	{
+ 	  free (array[i]->entry);
+ 	  free (array[i]);
+ 	}
+     }
+   copy[j] = (INDEX_ELT *)NULL;
+ 
+   /* Now COPY contains only unique entries.  Duplicated entries in the
+      original array have been freed.  Replace the current array with
+      the copy, fixing the NEXT pointers. */
+   for (i = 0; copy[i] != (INDEX_ELT *)NULL; i++)
+     {
+ 
+       copy[i]->next = copy[i + 1];
+ 
+       /* Fix entry names which are the same.  They point to different nodes,
+ 	 so we make the entry name unique. */
+       if ((copy[i + 1] != (INDEX_ELT *)NULL) &&
+ 	  (strcmp (copy[i]->entry, copy[i + 1]->entry) == 0))
+ 	{
+ 	  char *new_entry_name;
+ 
+ 	  new_entry_name = (char *)xmalloc (10 + strlen (copy[i]->entry));
+ 	  sprintf (new_entry_name, "%s <%d>", copy[i]->entry, counter);
+ 	  free (copy[i]->entry);
+ 	  copy[i]->entry = new_entry_name;
+ 	  counter++;
+ 	}
+       else
+ 	counter = 1;
+ 
+       array[i] = copy[i];
+     }
+   array[i] = (INDEX_ELT *)NULL;
+ 
+   /* Free the storage used only by COPY. */
+   free (copy);
+ }
+ 
+ /* Sort the index passed in INDEX, returning an array of
+    pointers to elements.  The array is terminated with a NULL
+    pointer.  We call qsort because it's supposed to be fast.
+    I think this looks bad. */
+ INDEX_ELT **
+ sort_index (index)
+      INDEX_ELT *index;
+ {
+   INDEX_ELT *temp = index;
+   INDEX_ELT **array;
+   int count = 0;
+ 
+   while (temp != (INDEX_ELT *) NULL)
+     {
+       count++;
+       temp = temp->next;
+     }
+ 
+   /* We have the length.  Make an array. */
+ 
+   array = (INDEX_ELT **) xmalloc ((count + 1) * sizeof (INDEX_ELT *));
+   count = 0;
+   temp = index;
+ 
+   while (temp != (INDEX_ELT *) NULL)
+     {
+       array[count++] = temp;
+       temp = temp->next;
+     }
+   array[count] = (INDEX_ELT *) NULL;	/* terminate the array. */
+ 
+   /* Sort the array. */
+   qsort (array, count, sizeof (INDEX_ELT *), index_element_compare);
+   make_index_entries_unique (array, count);
+   return (array);
+ }
+ 
+ /* Non-zero means that we are in the middle of printing an index. */
+ int printing_index = 0;
+ 
+ /* Takes one arg, a short name of an index to print.
+    Outputs a menu of the sorted elements of the index. */
+ void
+ cm_printindex ()
+ {
+   int item;
+   INDEX_ELT *index;
+   INDEX_ELT **array;
+   char *index_name;
+   int old_inhibitions = inhibit_paragraph_indentation;
+   int previous_filling_enabled_value = filling_enabled;
+ 
+   close_paragraph ();
+   get_rest_of_line (&index_name);
+ 
+   index = index_list (index_name);
+   if (index == (INDEX_ELT *)-1)
+     {
+       line_error ("Unknown index name `%s'", index_name);
+       free (index_name);
+       return;
+     }
+   else
+     free (index_name);
+ 
+   array = sort_index (index);
+ 
+   filling_enabled = 0;
+   inhibit_paragraph_indentation = 1;
+   close_paragraph ();
+   add_word ("* Menu:\n\n");
+ 
+   printing_index = 1;
+ 
+ #if defined (HAVE_MACROS)
+   me_inhibit_expansion++;
+ #endif /* HAVE_MACROS */
+ 
+   for (item = 0; (index = array[item]); item++)
+     {
+       int real_line_number = line_number;
+ 
+       /* Let errors generated while making the index entry point back
+ 	 at the line which contains the entry. */
+       line_number = index->defining_line;
+ 
+       /* If this particular entry should be printed as a "code" index,
+ 	 then wrap the entry with "@code{...}". */
+       if (index->code)
+ 	execute_string ("* %ccode{%s}: ", COMMAND_PREFIX, index->entry);
+       else
+ 	execute_string ("* %s: ", index->entry);
+ 
+       /* Pad the front of the destination nodename so that
+ 	 the output looks nice. */
+       if (fill_column > 40 && output_column < 40)
+ 	indent (40 - output_column);
+ 
+       execute_string ("%s.\n", index->node);
+ 
+       line_number = real_line_number;
+       flush_output ();
+     }
+ 
+ #if defined (HAVE_MACROS)
+       me_inhibit_expansion--;
+ #endif /* HAVE_MACROS */
+ 
+   printing_index = 0;
+   free (array);
+   close_single_paragraph ();
+   filling_enabled = previous_filling_enabled_value;
+   inhibit_paragraph_indentation = old_inhibitions;
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*								    */
+ /*		    Making User Defined Commands		    */
+ /*								    */
+ /* **************************************************************** */
+ 
+ void
+ define_user_command (name, proc, needs_braces_p)
+      char *name;
+      COMMAND_FUNCTION *proc;
+      int needs_braces_p;
+ {
+   int slot = user_command_array_len;
+   user_command_array_len++;
+ 
+   if (!user_command_array)
+     user_command_array = (COMMAND **) xmalloc (1 * sizeof (COMMAND *));
+ 
+   user_command_array = (COMMAND **) xrealloc (user_command_array,
+ 					      (1 + user_command_array_len) *
+ 					      sizeof (COMMAND *));
+ 
+   user_command_array[slot] = (COMMAND *) xmalloc (sizeof (COMMAND));
+   user_command_array[slot]->name = strdup (name);
+   user_command_array[slot]->proc = proc;
+   user_command_array[slot]->argument_in_braces = needs_braces_p;
+ }
+ 
+ /* Make ALIAS run the named FUNCTION.  Copies properties from FUNCTION. */
+ void
+ define_alias (alias, function)
+      char *alias, *function;
+ {
+ }
+ 
+ /* Set the paragraph indentation variable to the value specified in STRING.
+    Values can be:
+    `asis': Don't change existing indentation.
+    `none': Remove existing indentation.
+       NUM: Indent NUM spaces at the starts of paragraphs.
+            Note that if NUM is zero, we assume `none'.
+ 
+    Returns 0 if successful, or non-zero if STRING isn't one of the above. */
+ int
+ set_paragraph_indent (string)
+      char *string;
+ {
+   if (strcmp (string, "asis") == 0)
+     paragraph_start_indent = 0;
+   else if (strcmp (string, "none") == 0)
+     paragraph_start_indent = -1;
+   else
+     {
+       if (sscanf (string, "%d", &paragraph_start_indent) != 1)
+ 	return (-1);
+       else
+ 	{
+ 	  if (paragraph_start_indent == 0)
+ 	    paragraph_start_indent = -1;
+ 	}
+     }
+   return (0);
+ }
+ 
+ void
+ cm_paragraphindent ()
+ {
+   char *arg;
+ 
+   get_rest_of_line (&arg);
+   if (set_paragraph_indent (arg) != 0)
+     line_error ("Bad argument to %c%s", COMMAND_PREFIX, command);
+ 
+   free (arg);
+ }
+ 
+ /* Some support for footnotes. */
+ 
+ /* Footnotes are a new construct in Info.  We don't know the best method
+    of implementing them for sure, so we present two possiblities.
+ 
+    SeparateNode:
+ 	Make them look like followed references, with the reference
+ 	destinations in a makeinfo manufactured node or,
+ 
+    EndNode:
+ 	Make them appear at the bottom of the node that they originally
+ 	appeared in. */
+ #define SeparateNode 0
+ #define EndNode 1
+ 
+ int footnote_style = EndNode;
+ int first_footnote_this_node = 1;
+ int footnote_count = 0;
+ 
+ /* Set the footnote style based on he style identifier in STRING. */
+ int
+ set_footnote_style (string)
+      char *string;
+ {
+   if ((strcasecmp (string, "separate") == 0) ||
+       (strcasecmp (string, "MN") == 0))
+     footnote_style = SeparateNode;
+   else if ((strcasecmp (string, "end") == 0) ||
+ 	   (strcasecmp (string, "EN") == 0))
+     footnote_style = EndNode;
+   else
+     return (-1);
+ 
+  return (0);
+ }
+ 
+ void
+ cm_footnotestyle ()
+ {
+   char *arg;
+ 
+   get_rest_of_line (&arg);
+ 
+   if (set_footnote_style (arg) != 0)
+     line_error ("Bad argument to %c%s", COMMAND_PREFIX, command);
+ 
+   free (arg);
+ }
+ 
+ typedef struct fn
+ {
+   struct fn *next;
+   char *marker;
+   char *note;
+ }  FN;
+ 
+ FN *pending_notes = (FN *) NULL;
+ 
+ /* A method for remembering footnotes.  Note that this list gets output
+    at the end of the current node. */
+ void
+ remember_note (marker, note)
+      char *marker, *note;
+ {
+   FN *temp = (FN *) xmalloc (sizeof (FN));
+ 
+   temp->marker = strdup (marker);
+   temp->note = strdup (note);
+   temp->next = pending_notes;
+   pending_notes = temp;
+   footnote_count++;
+ }
+ 
+ /* How to get rid of existing footnotes. */
+ void
+ free_pending_notes ()
+ {
+   FN *temp;
+ 
+   while ((temp = pending_notes) != (FN *) NULL)
+     {
+       free (temp->marker);
+       free (temp->note);
+       pending_notes = pending_notes->next;
+       free (temp);
+     }
+   first_footnote_this_node = 1;
+   footnote_count = 0;
+ }
+ 
+ /* What to do when you see a @footnote construct. */
+ 
+  /* Handle a "footnote".
+     footnote *{this is a footnote}
+     where "*" is the marker character for this note. */
+ void
+ cm_footnote ()
+ {
+   char *marker;
+   char *note;
+ 
+   get_until ("{", &marker);
+   canon_white (marker);
+ 
+   /* Read the argument in braces. */
+   if (curchar () != '{')
+     {
+       line_error ("`%c%s' expected more than just `%s'.  It needs something in `{...}'",
+ 		  COMMAND_PREFIX, command, marker);
+       free (marker);
+       return;
+     }
+   else
+     {
+       int braces = 1;
+       int temp = ++input_text_offset;
+       int len;
+ 
+       while (braces)
+ 	{
+ 	  if (temp == size_of_input_text)
+ 	    {
+ 	      line_error ("No closing brace for footnote `%s'", marker);
+ 	      return;
+ 	    }
+ 
+ 	  if (input_text[temp] == '{')
+ 	    braces++;
+ 	  else if (input_text[temp] == '}')
+ 	    braces--;
+ 	  else if (input_text[temp] == '\n')
+ 	    line_number ++;
+ 
+ 	  temp++;
+ 	}
+ 
+       len = (temp - input_text_offset) - 1;
+       note = (char *)xmalloc (len + 1);
+       strncpy (note, &input_text[input_text_offset], len);
+       note[len] = '\0';
+       input_text_offset = temp;
+     }
+ 
+   if (!current_node || !*current_node)
+     {
+       line_error ("Footnote defined without parent node");
+       free (marker);
+       free (note);
+       return;
+     }
+ 
+   if (!*marker)
+     {
+       free (marker);
+ 
+       if (number_footnotes)
+ 	{
+ 	  marker = (char *)xmalloc (10);
+ 	  sprintf (marker, "%d", current_footnote_number);
+ 	  current_footnote_number++;
+ 	}
+       else
+ 	marker = strdup ("*");
+     }
+ 
+   remember_note (marker, note);
+ 
+   /* Your method should at least insert MARKER. */
+   switch (footnote_style)
+     {
+     case SeparateNode:
+       add_word_args ("(%s)", marker);
+       if (first_footnote_this_node)
+ 	{
+ 	  char *temp_string;
+ 
+ 	  temp_string = (char *)
+ 	    xmalloc ((strlen (current_node)) + (strlen ("-Footnotes")) + 1);
+ 
+ 	  add_word_args (" (*note %s-Footnotes::)", current_node);
+ 	  strcpy (temp_string, current_node);
+ 	  strcat (temp_string, "-Footnotes");
+ 	  remember_node_reference (temp_string, line_number, followed_reference);
+ 	  free (temp_string);
+ 	  first_footnote_this_node = 0;
+ 	}
+       break;
+ 
+     case EndNode:
+       add_word_args ("(%s)", marker);
+       break;
+ 
+     default:
+       break;
+     }
+   free (marker);
+   free (note);
+ }
+ 
+ /* Non-zero means that we are currently in the process of outputting
+    footnotes. */
+ int already_outputting_pending_notes = 0;
+ 
+ /* Output the footnotes.  We are at the end of the current node. */
+ void
+ output_pending_notes ()
+ {
+   FN *footnote = pending_notes;
+ 
+   if (!pending_notes)
+     return;
+ 
+   switch (footnote_style)
+     {
+ 
+     case SeparateNode:
+       {
+ 	char *old_current_node = current_node;
+ 	char *old_command = strdup (command);
+ 
+ 	already_outputting_pending_notes++;
+ 	execute_string ("%cnode %s-Footnotes,,,%s\n",
+ 			COMMAND_PREFIX, current_node, current_node);
+ 	already_outputting_pending_notes--;
+ 	current_node = old_current_node;
+ 	free (command);
+ 	command = old_command;
+       }
+       break;
+ 
+     case EndNode:
+       close_paragraph ();
+       in_fixed_width_font++;
+       execute_string ("---------- Footnotes ----------\n\n");
+       in_fixed_width_font--;
+       break;
+     }
+ 
+   /* Handle the footnotes in reverse order. */
+   {
+     FN **array = (FN **) xmalloc ((footnote_count + 1) * sizeof (FN *));
+ 
+     array[footnote_count] = (FN *) NULL;
+ 
+     while (--footnote_count > -1)
+       {
+ 	array[footnote_count] = footnote;
+ 	footnote = footnote->next;
+       }
+ 
+     filling_enabled = 1;
+     indented_fill = 1;
+ 
+     while (footnote = array[++footnote_count])
+       {
+ 
+ 	switch (footnote_style)
+ 	  {
+ 	  case SeparateNode:
+ 	  case EndNode:
+ 	    execute_string ("(%s)  %s", footnote->marker, footnote->note);
+ 	    close_paragraph ();
+ 	    break;
+ 	  }
+       }
+     close_paragraph ();
+     free (array);
+   }
+ }
+ 
+ 
+ /* **************************************************************** */
+ /*                                                                  */
+ /*              User definable Macros (text substitution)	    */
+ /*                                                                  */
+ /* **************************************************************** */
+ 
+ #if defined (HAVE_MACROS)
+ 
+ /* Array of macros and definitions. */
+ MACRO_DEF **macro_list = (MACRO_DEF **)NULL;
+ 
+ int macro_list_len = 0;		/* Number of elements. */
+ int macro_list_size = 0;	/* Number of slots in total. */
+ 
+ /* Return the macro definition of NAME or NULL if NAME is not defined. */
+ MACRO_DEF *
+ find_macro (name)
+      char *name;
+ {
+   register int i;
+   register MACRO_DEF *def;
+ 
+   def = (MACRO_DEF *)NULL;
+   for (i = 0; macro_list && (def = macro_list[i]); i++)
+     {
+       if ((!def->inhibited) && (strcmp (def->name, name) == 0))
+ 	break;
+     }
+   return (def);
+ }
+ 
+ /* Add the macro NAME with ARGLIST and BODY to the list of defined macros.
+    SOURCE_FILE is the name of the file where this definition can be found,
+    and SOURCE_LINENO is the line number within that file.  If a macro already
+    exists with NAME, then a warning is produced, and that previous
+    definition is overwritten. */
+ void
+ add_macro (name, arglist, body, source_file, source_lineno, flags)
+      char *name;
+      char **arglist;
+      char *body;
+      char *source_file;
+      int source_lineno, flags;
+ {
+   register MACRO_DEF *def;
+ 
+   def = find_macro (name);
+ 
+   if (!def)
+     {
+       if (macro_list_len + 2 >= macro_list_size)
+ 	macro_list = (MACRO_DEF **)xrealloc
+ 	  (macro_list, ((macro_list_size += 10) * sizeof (MACRO_DEF *)));
+ 
+       macro_list[macro_list_len] = (MACRO_DEF *)xmalloc (sizeof (MACRO_DEF));
+       macro_list[macro_list_len + 1] = (MACRO_DEF *)NULL;
+ 
+       def = macro_list[macro_list_len];
+       macro_list_len += 1;
+       def->name = name;
+     }
+   else
+     {
+       char *temp_filename = input_filename;
+       int temp_line = line_number;
+ 
+       warning ("The macro `%s' is previously defined", name);
+ 
+       input_filename = def->source_file;
+       line_number = def->source_lineno;
+ 
+       warning ("Here is the previous definition of `%s'", name);
+ 
+       input_filename = temp_filename;
+       line_number = temp_line;
+ 
+       if (def->arglist)
+ 	{
+ 	  register int i;
+ 
+ 	  for (i = 0; def->arglist[i]; i++)
+ 	    free (def->arglist[i]);
+ 
+ 	  free (def->arglist);
+ 	}
+       free (def->source_file);
+       free (def->body);
+     }
+ 
+   def->source_file = strdup (source_file);
+   def->source_lineno = source_lineno;
+   def->body = body;
+   def->arglist = arglist;
+   def->inhibited = 0;
+   def->flags = flags;
+ }
+ 
+ /* Delete the macro with name NAME.  The macro is deleted from the list,
+    but it is also returned.  If there was no macro defined, NULL is
+    returned. */
+ MACRO_DEF *
+ delete_macro (name)
+      char *name;
+ {
+   register int i;
+   register MACRO_DEF *def;
+ 
+   def = (MACRO_DEF *)NULL;
+ 
+   for (i = 0; macro_list && (def = macro_list[i]); i++)
+     if (strcmp (def->name, name) == 0)
+       {
+ 	memmove (macro_list + i, macro_list + i + 1,
+ 	       ((macro_list_len + 1) - i) * sizeof (MACRO_DEF *));
+ 	break;
+       }
+   return (def);
+ }
+ 
+ /* Return the arglist on the current line.  This can behave in two different
+    ways, depending on the variable BRACES_REQUIRED_FOR_MACRO_ARGS. */
+ int braces_required_for_macro_args = 0;
+ 
+ char **
+ get_macro_args (def)
+      MACRO_DEF *def;
+ {
+   register int i;
+   char *word;
+ 
+   /* Quickly check to see if this macro has been invoked with any arguments.
+      If not, then don't skip any of the following whitespace. */
+   for (i = input_text_offset; i < size_of_input_text; i++)
+     if (!cr_or_whitespace (input_text[i]))
+       break;
+ 
+   if (input_text[i] != '{')
+     {
+       if (braces_required_for_macro_args)
+ 	{
+ 	  return ((char **)NULL);
+ 	}
+       else
+ 	{
+ 	  /* Braces are not required to fill out the macro arguments.  If
+ 	     this macro takes one argument, it is considered to be the
+ 	     remainder of the line, sans whitespace. */
+ 	  if (def->arglist && def->arglist[0] && !def->arglist[1])
+ 	    {
+ 	      char **arglist;
+ 
+ 	      get_rest_of_line (&word);
+ 	      if (input_text[input_text_offset - 1] == '\n')
+ 		input_text_offset--;
+ 	      /* canon_white (word); */
+ 	      arglist = (char **)xmalloc (2 * sizeof (char *));
+ 	      arglist[0] = word;
+ 	      arglist[1] = (char *)NULL;
+ 	      return (arglist);
+ 	    }
+ 	  else
+ 	    {
+ 	      /* The macro either took no arguments, or took more than
+ 		 one argument.  In that case, it must be invoked with
+ 		 arguments surrounded by braces. */
+ 	      return ((char **)NULL);
+ 	    }
+ 	}
+     }
+   return (get_brace_args (def->flags & ME_QUOTE_ARG));
+ }
+ 
+ /* Substitute actual parameters for named parameters in body.
+    The named parameters which appear in BODY must by surrounded
+    reverse slashes, as in \foo\. */
+ char *
+ apply (named, actuals, body)
+      char **named, **actuals, *body;
+ {
+   register int i;
+   int new_body_index, new_body_size;
+   char *new_body, *text;
+   int length_of_actuals;
+ 
+   length_of_actuals = array_len (actuals);
+   new_body_size = strlen (body);
+   new_body = (char *)xmalloc (1 + new_body_size);
+ 
+   /* Copy chars from BODY into NEW_BODY. */
+   i = 0; new_body_index = 0;
+ 
+   while (1)
+     {
+       if (!body[i])
+ 	break;
+ 
+       if (body[i] != '\\')
+ 	new_body[new_body_index++] = body[i++];
+       else
+ 	{
+ 	  /* Snarf parameter name, check against named parameters. */
+ 	  char *param;
+ 	  int param_start, which, len;
+ 
+ 	  param_start = ++i;
+ 	  while ((body[i]) && (body[i] != '\\'))
+ 	    i++;
+ 
+ 	  len = i - param_start;
+ 	  param = (char *)xmalloc (1 + len);
+ 	  memcpy (param, body + param_start, len);
+ 	  param[len] = '\0';
+ 
+ 	  if (body[i])
+ 	    i++;
+ 
+ 	  /* Now check against named parameters. */
+ 	  for (which = 0; named && named[which]; which++)
+ 	    if (strcmp (named[which], param) == 0)
+ 	      break;
+ 
+ 	  if (named[which])
+ 	    {
+ 	      if (which < length_of_actuals)
+ 		text = actuals[which];
+ 	      else
+ 		text = (char *)NULL;
+ 
+ 	      if (!text)
+ 		text = "";
+ 
+ 	      len = strlen (text);
+ 	    }
+ 	  else
+ 	    {
+ 	      len += 2;
+ 	      text = (char *)xmalloc (1 + len);
+ 	      sprintf (text, "\\%s\\", param);
+ 	    }
+ 
+ 	  if ((2 + strlen (param)) < len)
+ 	    new_body = (char *)xrealloc
+ 	      (new_body, new_body_size += (1 + len));
+ 
+ 	  free (param);
+ 
+ 	  strcpy (new_body + new_body_index, text);
+ 	  new_body_index += len;
+ 
+ 	  if (!named[which])
+ 	    free (text);
+ 	}
+     }
+   new_body[new_body_index] = '\0';
+   return (new_body);
+ }
+ 
+ /* Execute the macro passed in DEF, a pointer to a MACRO_DEF.  */
+ void
+ execute_macro (def)
+      MACRO_DEF *def;
+ {
+   register int i;
+   char **arglist;
+   int num_args;
+   char *execution_string = (char *)NULL;
+ 
+   if (macro_expansion_output_stream && !me_inhibit_expansion)
+     me_append_before_this_command ();
+ 
+   /* Find out how many arguments this macro definition takes. */
+   num_args = array_len (def->arglist);
+ 
+   /* Gather the arguments present on the line if there are any. */
+   arglist = get_macro_args (def);
+ 
+   if (num_args < array_len (arglist))
+     {
+       free_array (arglist);
+       line_error ("Macro `%s' called with too many args", def->name);
+       return;
+     }
+ 
+   if (def->body)
+     execution_string = apply (def->arglist, arglist, def->body);
+ 
+   free_array (arglist);
+ 
+   if (def->body)
+     {
+       if (macro_expansion_output_stream && !me_inhibit_expansion)
+ 	{
+ 	  remember_itext (input_text, input_text_offset);
+ 	  me_execute_string (execution_string);
+ 	}
+       else
+ 	execute_string ("%s", execution_string);
+ 
+       free (execution_string);
+     }
+ }
+ 
+ /* Read and remember the definition of a macro. */
+ void
+ cm_macro ()
+ {
+   register int i;
+   char *name, **arglist, *body, *line;
+   int body_size, body_index;
+   int depth = 1;
+   int defining_line = line_number;
+   int flags = 0;
+ 
+   arglist = (char **)NULL;
+   body = (char *)NULL;
+   body_size = 0;
+   body_index = 0;
+ 
+   if (macro_expansion_output_stream)
+     me_append_before_this_command ();
+ 
+   skip_whitespace ();
+ 
+   /* Get the name of the macro.  This is the set of characters which are
+      not whitespace and are not `{' immediately following the @macro. */
+   {
+     int start = input_text_offset;
+     int len;
+ 
+     for (i = start;
+ 	 (i < size_of_input_text) &&
+ 	 (input_text[i] != '{') &&
+ 	 (!cr_or_whitespace (input_text[i]));
+ 	 i++);
+ 
+     len = i - start;
+     name = (char *)xmalloc (1 + len);
+     strncpy (name, input_text + start, len);
+     name[len] = '\0';
+     input_text_offset = i;
+   }
+ 
+   skip_whitespace ();
+ 
+   /* It is not required that the definition of a macro includes an arglist.
+      If not, don't try to get the named parameters, just use a null list. */
+   if (curchar () == '{')
+     {
+       int arglist_index = 0, arglist_size = 0;
+       int gathering_words = 1;
+       char *word = (char *)NULL;
+       int character;
+ 
+       /* Read the words inside of the braces which determine the arglist.
+ 	 These words will be replaced within the body of the macro at
+ 	 execution time. */
+ 
+       input_text_offset++;
+       skip_whitespace_and_newlines ();
+ 
+       while (gathering_words)
+ 	{
+ 	  int len;
+ 
+ 	  for (i = input_text_offset;
+ 	       character = input_text[i];
+ 	       i++)
+ 	    {
+ 	      switch (character)
+ 		{
+ 		case '\n':
+ 		  line_number++;
+ 		case ' ':
+ 		case '\t':
+ 		case ',':
+ 		case '}':
+ 		  /* Found the end of the current arglist word.  Save it. */
+ 		  len = i - input_text_offset;
+ 		  word = (char *)xmalloc (1 + len);
+ 		  strncpy (word, input_text + input_text_offset, len);
+ 		  word[len] = '\0';
+ 		  input_text_offset = i;
+ 
+ 		  /* Advance to the comma or close-brace that signified
+ 		     the end of the argument. */
+ 		  while ((character = curchar ())
+ 			 && character != ','
+ 			 && character != '}')
+ 		    {
+ 		      input_text_offset++;
+ 		      if (character == '\n')
+ 			line_number++;
+ 		    }
+ 
+ 		  /* Add the word to our list of words. */
+ 		  if ((arglist_index + 2) >= arglist_size)
+ 		    arglist = (char **)xrealloc
+ 		      (arglist, (arglist_size += 10) * sizeof (char *));
+ 
+ 		  arglist[arglist_index++] = word;
+ 		  arglist[arglist_index] = (char *)NULL;
+ 		  break;
+ 		}
+ 
+ 	      if (character == '}')
+ 		{
+ 		  input_text_offset++;
+ 		  gathering_words = 0;
+ 		  break;
+ 		}
+ 
+ 	      if (character == ',')
+ 		{
+ 		  input_text_offset++;
+ 		  skip_whitespace_and_newlines ();
+ 		  i = input_text_offset - 1;
+ 		}
+ 	    }
+ 	}
+     }
+ 
+   /* Read the text carefully until we find an "@end macro" which
+      matches this one.  The text in between is the body of the macro. */
+   skip_whitespace_and_newlines ();
+ 
+   while (depth)
+     {
+       if ((input_text_offset + 9) > size_of_input_text)
+ 	{
+ 	  int temp_line = line_number;
+ 	  line_number = defining_line;
+ 	  line_error ("%cend macro not found", COMMAND_PREFIX);
+ 	  line_number = temp_line;
+ 	  return;
+ 	}
+ 
+       get_rest_of_line (&line);
+ 
+       /* Handle commands only meaningful within a macro. */
+       if ((*line == COMMAND_PREFIX) && (depth == 1) &&
+ 	  (strncmp (line + 1, "allow-recursion", 15) == 0) &&
+ 	  (line[16] == '\0' || whitespace (line[16])))
+ 	{
+ 	  for (i = 16; whitespace (line[i]); i++);
+ 	  strcpy (line, line + i);
+ 	  flags |= ME_RECURSE;
+ 	  if (!*line)
+ 	    {
+ 	      free (line);
+ 	      continue;
+ 	    }
+ 	}
+ 
+       if ((*line == COMMAND_PREFIX) && (depth == 1) &&
+ 	  (strncmp (line + 1, "quote-arg", 9) == 0) &&
+ 	  (line[10] == '\0' || whitespace (line[10])))
+ 	{
+ 	  for (i = 10; whitespace (line[i]); i++);
+ 	  strcpy (line, line + i);
+ 
+ 	  if (arglist && arglist[0] && !arglist[1])
+ 	    {
+ 	      flags |= ME_QUOTE_ARG;
+ 	      if (!*line)
+ 		{
+ 		  free (line);
+ 		  continue;
+ 		}
+ 	    }
+ 	  else
+ 	    {
+ 	      line_error ("%cquote-arg only useful when the macro takes a single argument",
+ 			  COMMAND_PREFIX);
+ 	    }
+ 	}
+ 
+       if ((*line == COMMAND_PREFIX) &&
+ 	  (strncmp (line + 1, "macro ", 6) == 0))
+ 	depth++;
+ 
+       if ((*line == COMMAND_PREFIX) &&
+ 	  (strncmp (line + 1, "end macro", 9) == 0))
+ 	depth--;
+ 
+       if (depth)
+ 	{
+ 	  if ((body_index + strlen (line) + 3) >= body_size)
+ 	    body = (char *)xrealloc
+ 	      (body, body_size += 3 + strlen (line));
+ 	  strcpy (body + body_index, line);
+ 	  body_index += strlen (line);
+ 	  body[body_index++] = '\n';
+ 	  body[body_index] = '\0';
+ 	}
+       free (line);
+     }
+ 
+   /* We now have the name, the arglist, and the body.  However, BODY
+      includes the final newline which preceded the `@end macro' text.
+      Delete it. */
+   if (body && strlen (body))
+     body[strlen (body) - 1] = '\0';
+ 
+   add_macro (name, arglist, body, input_filename, defining_line, flags);
+ 
+   if (macro_expansion_output_stream)
+     remember_itext (input_text, input_text_offset);
+ }
+ 
+ void
+ cm_unmacro ()
+ {
+   register int i;
+   char *line, *name;
+   MACRO_DEF *def;
+ 
+   if (macro_expansion_output_stream)
+     me_append_before_this_command ();
+ 
+   get_rest_of_line (&line);
+   canon_white (line);
+ 
+   for (i = 0; line[i] && !whitespace (line[i]); i++);
+   name = (char *)xmalloc (i);
+   strncpy (name, line, i);
+   name[i] = '\0';
+ 
+   def = delete_macro (name);
+ 
+   if (def)
+     {
+       free (def->source_file);
+       free (def->name);
+       free (def->body);
+ 
+       if (def->arglist)
+ 	{
+ 	  register int i;
+ 
+ 	  for (i = 0; def->arglist[i]; i++)
+ 	    free (def->arglist[i]);
+ 
+ 	  free (def->arglist);
+ 	}
+ 
+       free (def);
+     }
+ 
+   free (line);
+   free (name);
+ 
+   if (macro_expansion_output_stream)
+     remember_itext (input_text, input_text_offset);
+ }
+ 
+ /* How to output sections of the input file verbatim. */
+ 
+ /* Set the value of POINTER's offset to OFFSET. */
+ ITEXT *
+ remember_itext (pointer, offset)
+      char *pointer;
+      int offset;
+ {
+   register int i;
+   ITEXT *itext = (ITEXT *)NULL;
+ 
+   /* If we have no info, initialize a blank list. */
+   if (!itext_info)
+     {
+       itext_info = (ITEXT **)xmalloc ((itext_size = 10) * sizeof (ITEXT *));
+       for (i = 0; i < itext_size; i++)
+ 	itext_info[i] = (ITEXT *)NULL;
+     }
+ 
+   /* If the pointer is already present in the list, then set the offset. */
+   for (i = 0; i < itext_size; i++)
+     if ((itext_info[i] != (ITEXT *)NULL) &&
+ 	(itext_info[i]->pointer == pointer))
+       {
+ 	itext = itext_info[i];
+ 	itext_info[i]->offset = offset;
+ 	break;
+       }
+ 
+   if (i == itext_size)
+     {
+       /* Find a blank slot, (or create a new one), and remember the
+ 	 pointer and offset. */
+       for (i = 0; i < itext_size; i++)
+ 	if (itext_info[i] == (ITEXT *)NULL)
+ 	  break;
+ 
+       /* If not found, then add some slots. */
+       if (i == itext_size)
+ 	{
+ 	  register int j;
+ 
+ 	  itext_info = (ITEXT **)xrealloc
+ 	    (itext_info, (itext_size += 10) * sizeof (ITEXT *));
+ 
+ 	  for (j = i; j < itext_size; j++)
+ 	    itext_info[j] = (ITEXT *)NULL;
+ 	}
+ 
+       /* Now add the pointer and the offset. */
+       itext_info[i] = (ITEXT *)xmalloc (sizeof (ITEXT));
+       itext_info[i]->pointer = pointer;
+       itext_info[i]->offset = offset;
+       itext = itext_info[i];
+     }
+   return (itext);
+ }
+ 
+ /* Forget the input text associated with POINTER. */
+ void
+ forget_itext (pointer)
+      char *pointer;
+ {
+   register int i;
+ 
+   for (i = 0; i < itext_size; i++)
+     if (itext_info[i] && (itext_info[i]->pointer == pointer))
+       {
+ 	free (itext_info[i]);
+ 	itext_info[i] = (ITEXT *)NULL;
+ 	break;
+       }
+ }
+ 
+ /* Append the text which appeared in input_text from the last offset to
+    the character just before the command that we are currently executing. */
+ void
+ me_append_before_this_command ()
+ {
+   register int i;
+ 
+   for (i = input_text_offset; i && (input_text[i] != COMMAND_PREFIX); i--);
+   maybe_write_itext (input_text, i);
+ }
+ 
+ /* Similar to execute_string (), but only takes a single string argument,
+    and remembers the input text location, etc. */
+ void
+ me_execute_string (execution_string)
+      char *execution_string;
+ {
+   pushfile ();
+   input_text_offset = 0;
+   input_text = execution_string;
+   input_filename = strdup (input_filename);
+   size_of_input_text = strlen (execution_string);
+ 
+   remember_itext (execution_string, 0);
+ 
+   executing_string++;
+   reader_loop ();
+   popfile ();
+   executing_string--;
+ }
+ 
+ /* Append the text which appears in input_text from the last offset to
+    the current OFFSET. */
+ void
+ append_to_expansion_output (offset)
+      int offset;
+ {
+   register int i;
+   ITEXT *itext = (ITEXT *)NULL;
+ 
+   for (i = 0; i < itext_size; i++)
+     if (itext_info[i] && itext_info[i]->pointer == input_text)
+       {
+ 	itext = itext_info[i];
+ 	break;
+       }
+ 
+   if (!itext)
+     itext = remember_itext (input_text, 0);
+ 
+   if (offset > itext->offset)
+     {
+       write_region_to_macro_output
+ 	(input_text, itext->offset, offset);
+       remember_itext (input_text, offset);
+     }
+ }
+ 
+ /* Only write this input text iff it appears in our itext list. */
+ void
+ maybe_write_itext (pointer, offset)
+      char *pointer;
+      int offset;
+ {
+   register int i;
+   ITEXT *itext = (ITEXT *)NULL;
+ 
+   for (i = 0; i < itext_size; i++)
+     if (itext_info[i] && (itext_info[i]->pointer == pointer))
+       {
+ 	itext = itext_info[i];
+ 	break;
+       }
+ 
+   if (itext && (itext->offset < offset))
+     {
+       write_region_to_macro_output (itext->pointer, itext->offset, offset);
+       remember_itext (pointer, offset);
+     }
+ }
+ 
+ void
+ write_region_to_macro_output (string, start, end)
+      char *string;
+      int start, end;
+ {
+   if (macro_expansion_output_stream)
+     fwrite (string + start, 1, end - start, macro_expansion_output_stream);
+ }
+ 
+ #endif /* HAVE_MACROS */
+ 
+ /* Return the length of the array in ARRAY. */
+ int
+ array_len (array)
+      char **array;
+ {
+   register int i = 0;
+ 
+   if (array)
+     for (i = 0; array[i] != (char *)NULL; i++);
+ 
+   return (i);
+ }
+ 
+ void
+ free_array (array)
+      char **array;
+ {
+   if (array)
+     {
+       register int i;
+ 
+       for (i = 0; array[i] != (char *)NULL; i++)
+ 	free (array[i]);
+ 
+       free (array);
+     }
+ }
+ 
+ /* Function is used even when we don't have macros.  Although, I have
+    to admit, it is unlikely that you would have a use for it if you
+    aren't using macros. */
+ char **
+ get_brace_args (quote_single)
+      int quote_single;
+ {
+   char **arglist, *word;
+   int arglist_index, arglist_size;
+   int character, escape_seen, start;
+   int depth = 1;
+ 
+   /* There is an arglist in braces here, so gather the args inside of it. */
+   skip_whitespace_and_newlines ();
+   input_text_offset++;
+   arglist = (char **)NULL;
+   arglist_index = arglist_size = 0;
+ 
+  get_arg:
+   skip_whitespace_and_newlines ();
+   start = input_text_offset;
+   escape_seen = 0;
+ 
+   while (character = curchar ())
+     {
+       if (character == '\\')
+ 	{
+ 	  input_text_offset += 2;
+ 	  escape_seen = 1;
+ 	}
+       else if (character == '{')
+ 	{
+ 	  depth++;
+ 	  input_text_offset++;
+ 	}
+       else if ((character == ',' && !quote_single) ||
+ 	       ((character == '}') && depth == 1))
+ 	{
+ 	  int len = input_text_offset - start;
+ 
+ 	  if (len || (character != '}'))
+ 	    {
+ 	      word = (char *)xmalloc (1 + len);
+ 	      strncpy (word, input_text + start, len);
+ 	      word[len] = '\0';
+ 
+ 	      /* Clean up escaped characters. */
+ 	      if (escape_seen)
+ 		{
+ 		  register int i;
+ 
+ 		  for (i = 0; word[i]; i++)
+ 		    if (word[i] == '\\')
+ 		      memmove (word + i, word + i + 1,
+ 			       1 + strlen (word + i + 1));
+ 		}
+ 
+ 	      if (arglist_index + 2 >= arglist_size)
+ 		arglist = (char **)xrealloc
+ 		  (arglist, (arglist_size += 10) * sizeof (char *));
+ 
+ 	      arglist[arglist_index++] = word;
+ 	      arglist[arglist_index] = (char *)NULL;
+ 	    }
+ 
+ 	  input_text_offset++;
+ 	  if (character == '}')
+ 	    break;
+ 	  else
+ 	    goto get_arg;
+ 	}
+       else if (character == '}')
+ 	{
+ 	  depth--;
+ 	  input_text_offset++;
+ 	}
+       else
+ 	{
+ 	  input_text_offset++;
+ 	  if (character == '\n') line_number++;
+ 	}
+     }
+   return (arglist);
+ }
+ 
+ /* **************************************************************** */
+ /*                                                                  */
+ /*                  Looking For Include Files                       */
+ /*                                                                  */
+ /* **************************************************************** */
+ 
+ /* Given a string containing units of information separated by colons,
+    return the next one pointed to by INDEX, or NULL if there are no more.
+    Advance INDEX to the character after the colon. */
+ char *
+ extract_colon_unit (string, index)
+      char *string;
+      int *index;
+ {
+   int i, start;
+ 
+   i = *index;
+ 
+   if (!string || (i >= strlen (string)))
+     return ((char *)NULL);
+ 
+   /* Each call to this routine leaves the index pointing at a colon if
+      there is more to the path.  If I is > 0, then increment past the
+      `:'.  If I is 0, then the path has a leading colon.  Trailing colons
+      are handled OK by the `else' part of the if statement; an empty
+      string is returned in that case. */
+   if (i && string[i] == ':')
+     i++;
+ 
+   start = i;
+ 
+   while (string[i] && string[i] != ':') i++;
+ 
+   *index = i;
+ 
+   if (i == start)
+     {
+       if (string[i])
+ 	(*index)++;
+ 
+       /* Return "" in the case of a trailing `:'. */
+       return (strdup (""));
+     }
+   else
+     {
+       char *value;
+ 
+       value = (char *)xmalloc (1 + (i - start));
+       strncpy (value, &string[start], (i - start));
+       value [i - start] = '\0';
+ 
+       return (value);
+     }
+ }
+ 
+ /* Return the full pathname for FILENAME by searching along PATH.
+    When found, return the stat () info for FILENAME in FINFO.
+    If PATH is NULL, only the current directory is searched.
+    If the file could not be found, return a NULL pointer. */
+ char *
+ get_file_info_in_path (filename, path, finfo)
+      char *filename, *path;
+      struct stat *finfo;
+ {
+   char *dir;
+   int result, index = 0;
+ 
+   if (path == (char *)NULL)
+     path = ".";
+ 
+   /* Handle absolute pathnames. "./foo", "/foo", "../foo". */
+   if (*filename == '/' ||
+       (*filename == '.' &&
+        (filename[1] == '/' ||
+ 	(filename[1] == '.' && filename[2] == '/'))))
+     {
+       if (stat (filename, finfo) == 0)
+ 	return (strdup (filename));
+       else
+ 	return ((char *)NULL);
+     }
+ 
+   while (dir = extract_colon_unit (path, &index))
+     {
+       char *fullpath;
+ 
+       if (!*dir)
+ 	{
+ 	  free (dir);
+ 	  dir = strdup (".");
+ 	}
+ 
+       fullpath = (char *)xmalloc (2 + strlen (dir) + strlen (filename));
+       sprintf (fullpath, "%s/%s", dir, filename);
+       free (dir);
+ 
+       result = stat (fullpath, finfo);
+ 
+       if (result == 0)
+ 	return (fullpath);
+       else
+ 	free (fullpath);
+     }
+   return ((char *)NULL);
+ }
Index: emacs/lib-src/permute-index
diff -c /dev/null emacs/lib-src/permute-index:1.1
*** /dev/null	Fri Aug  2 20:33:05 1996
--- emacs/lib-src/permute-index	Tue Jul 30 21:51:57 1996
***************
*** 0 ****
--- 1,102 ----
+ #!/bin/csh -f
+ # Generate a permuted index of all names.
+ # The result is a file called index.fns.
+ 
+ # You will need to modify this for your needs.
+ 
+ 
+ set TEXINDEX=texindex  # path to texindex command
+ #set EMACS=gnuemacs     # your emacs command
+ #set TEX=tex             # your tex command
+ 
+ set MANUAL=elisp  # the base name of the manual
+ 
+ # goto 3
+ 
+ 1:
+ echo "Extract raw index from texinfo fn index."
+ # Let texindex combine duplicate entries, later.
+ # But it wants to protect non-alphanumerics thus confusing ptx.
+ # Also change `\ ' to just a ` ', since texindex will fail. This is produced 
+ # by `@findex two words' in an example environment (no doubt among others).
+ # delete wrapper parens
+ # change dots {} to dots{}
+ # change {-} to char form, so ptx wont ignore it.
+ # delete leading \entry {
+ # change '\ ' to ' '
+ # change lines with = < > since they mess up field extraction.
+ # separate into fields delimited by "
+ cat ${MANUAL}.fn | \
+ 	sed \
+ 	-e 's/(\([^)]*\))/\1/' \
+ 	-e 's/\\dots {}/(\\dots{})/' \
+ 	-e "s/{-}/{{\\tt\\char'055}}/" \
+ 	-e 's,^[^ ]* {,,' \
+ 	-e 's, },},' \
+ 	-e 's,\\ , ,g' \
+ 	-e 's/{\\tt\\char61}/=/' \
+ 	-e 's/{\\tt\\gtr}/>/' \
+ 	-e 's/{\\tt\\less}/</' \
+ 	-e 's/}{/"/g' \
+ 	| awk -F\" '{print $2, $1}' >! permuted.raw
+ 
+ 2:
+ # Build break file for ptx.
+ cat <<EOF > permuted.break
+ -
+ :
+ EOF
+ # Build the ignore file for ptx.
+ # We would like to ignore "and", "or", and "for", 
+ # but ptx ignores ignore words even if they stand alone.
+ cat <<EOF > permuted.ignore
+ the
+ in
+ to
+ as
+ a
+ an
+ of
+ on
+ them
+ how
+ from
+ by
+ EOF
+ 
+ echo "Make troff permuted index."
+ ptx -i permuted.ignore -b permuted.break -f -r -w 144 \
+ 	 < permuted.raw >! permuted.t
+ 
+ 3:
+ echo "Extract the desired fields."
+ awk -F\" '{printf "%s\"%s\"%s\n", $4,$6,$9}' permuted.t >! permuted.fields 
+ 
+ 4:
+ echo "Format for texindex."
+ # delete lines that start with "and ", "for "
+ sed 	< permuted.fields \
+ 	-e 's/=/{\\tt\\char61}/' \
+ 	-e 's/>/{\\tt\\gtr}/' \
+ 	-e 's/</{\\tt\\less}/' \
+ 	-e '/"and /d' \
+ 	-e '/"for /d' \
+   | awk -F\" 'NF>0 {if ($1=="") {\
+ 	  print "\entry {" $2 "}{" 0+$3 "}{" $2 "}" }\
+ 	else {\
+ 	  print "\entry {" $2 ", " $1 "}{" 0+$3 "}{" $2 ", " $1 "}"} }'\
+ 	      > permuted.fn
+ 
+ 5:
+ echo "Sort with texindex."
+ ${TEXINDEX} permuted.fn
+ #mv permuted.fns ${MANUAL}.fns
+ 
+ # The resulting permuted.fns will be read when we run TeX 
+ # on the manual the second time.  Or you can use permuted.texinfo here.
+ #${TEX} permuted.texinfo
+ 
+ 6:
+ echo "Clean up."
+ rm -f permuted.fields permuted.t permuted.raw
+ rm -f permuted.break permuted.ignore permuted.fn
Index: emacs/lib-src/texi2dvi
diff -c /dev/null emacs/lib-src/texi2dvi:1.1
*** /dev/null	Fri Aug  2 20:33:15 1996
--- emacs/lib-src/texi2dvi	Wed Jul 31 04:52:46 1996
***************
*** 0 ****
--- 1,275 ----
+ #!  /bin/sh
+ # texi2dvi --- smartly produce DVI files from texinfo sources
+ 
+ # Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
+ # $Id: texi2dvi,v 1.1 1996/07/31 02:52:46 chris Exp $
+ 
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 2, or (at your option)
+ # any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ # GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, you can either send email to this
+ # program's maintainer or write to: The Free Software Foundation,
+ # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+ 
+ # Commentary:
+ 
+ # Author: Noah Friedman <friedman@prep.ai.mit.edu>
+ 
+ # Please send bug reports, etc. to bug-texinfo@prep.ai.mit.edu
+ # If possible, please send a copy of the output of the script called with
+ # the `--debug' option when making a bug report.
+ 
+ # In the interest of general portability, some common bourne shell
+ # constructs were avoided because they weren't guaranteed to be available
+ # in some earlier implementations.  I've tried to make this program as
+ # portable as possible.  Welcome to unix, where the lowest common
+ # denominator is rapidly diminishing.
+ #
+ # Among the more interesting lossages I noticed with some bourne shells
+ # are:
+ #     * No shell functions.
+ #     * No `unset' builtin.
+ #     * `shift' cannot take a numeric argument, and signals an error if
+ #       there are no arguments to shift.
+ 
+ # Code:
+ 
+ # Name by which this script was invoked.
+ progname=`echo "$0" | sed -e 's/[^\/]*\///g'`
+ 
+ # This string is expanded by rcs automatically when this file is checked out.
+ rcs_revision='$Revision: 1.1 $'
+ version=`set - $rcs_revision; echo $2`
+ 
+ # To prevent hairy quoting and escaping later.
+ bq='`'
+ eq="'"
+ 
+ usage="Usage: $progname {options} [file1] {file2 {...}}
+ (version $version)
+ 
+ Options are:
+ -D, --debug          Turn on shell debugging ($bq${bq}set -x$eq$eq).
+ -h, --help           You're looking at it.
+ -v, --version        Print version number.
+ 
+ Arguments in brackets are required.  Those in braces are optional.
+ "
+ 
+ # Initialize variables.
+ # Don't use `unset' since old bourne shells don't have this command.
+ # Instead, assign them an empty value.
+ # Some of these, like TEX and TEXINDEX, may be inherited from the environment
+ backup_extension=.bak
+ debug=
+ orig_pwd="`pwd`"
+ verbose=
+ texindex="${TEXINDEX-texindex}"
+ tex="${TEX-tex}"
+ 
+ # Save this so we can construct a new TEXINPUTS path for each file to be
+ # processed.
+ TEXINPUTS_orig="$TEXINPUTS"
+ export TEXINPUTS
+ 
+ # Parse command line arguments.
+ # Make sure that all wildcarded options are long enough to be unambiguous.
+ # It's a good idea to document the full long option name in each case.
+ # Long options which take arguments will need a `*' appended to the
+ # canonical name to match the value appended after the `=' character.
+ while : ; do
+   case $# in 0) break ;; esac
+   case "$1" in
+     -D | --debug | --d* )
+       debug=t
+       shift
+      ;;
+     -h | --help | --h* )
+       echo "$usage" 1>&2
+       exit 0
+      ;;
+     -v | --version | --v* )
+       echo "texi2dvi version $version" 1>&2
+       exit 0
+      ;;
+     -- )     # Stop option processing
+       shift
+       break
+      ;;
+     -* )
+       case "$1" in
+         --*=* ) arg=`echo "$1" | sed -e 's/=.*//'` ;;
+         * )     arg="$1" ;;
+       esac
+       exec 1>&2
+       echo "$progname: unknown or ambiguous option $bq$arg$eq"
+       echo "$progname: Use $bq--help$eq for a list of options."
+       exit 1
+      ;;
+     * )
+       break
+      ;;
+    esac
+ done
+ 
+ # See if there are any command line args left (which will be interpreted as
+ # filename arguments)
+ case $# in
+   0 )
+     exec 1>&2
+     echo "$progname: at least one file name is required as an argument."
+     echo "$progname: Use $bq--help$eq for a description of command syntax."
+     exit 2
+    ;;
+ esac
+ 
+ case "$debug" in t ) set -x ;; esac
+ 
+ # Texify files
+ for command_line_filename in ${1+"$@"} ; do
+    # Roughly equivalent to `dirname ...`, but more portable
+    directory="`echo ${command_line_filename} | sed 's/\/[^\/]*$//'`"
+    filename_texi="`basename ${command_line_filename}`"
+    # Strip off the last extension part (probably .texinfo or .texi)
+    filename_noext="`echo ${filename_texi} | sed 's/\.[^.]*$//'`"
+ 
+    # If directory and file are the same, then it's probably because there's
+    # no pathname component.  Set dirname to `.', the current directory.
+    if test "z${directory}" = "z${command_line_filename}" ; then
+       directory="."
+    fi
+ 
+    # Source file might @include additional texinfo sources.  Put `.' and
+    # directory where source file(s) reside in TEXINPUTS before anything
+    # else.  `.' goes first to ensure that any old .aux, .cps, etc. files in
+    # ${directory} don't get used in preference to fresher files in `.'.
+    TEXINPUTS=".:${directory}:${TEXINPUTS_orig}"
+ 
+    # "Unset" variables that might have values from previous iterations and
+    # which won't be completely reset later.
+    definite_index_files=""
+ 
+    # See if file exists here.  If it doesn't we're in trouble since, even
+    # though the user may be able to reenter a valid filename at the tex
+    # prompt (assuming they're attending the terminal), this script won't be
+    # able to find the right index files and so forth.
+    if test ! -r "${command_line_filename}" ; then
+       echo "${progname}: ${command_line_filename}: No such file or permission denied." 1>&2
+       continue;
+    fi
+ 
+    # Find all files having root filename with a two-letter extension,
+    # determine whether they're really index files, and save them.  Foo.aux
+    # is actually the cross-references file, but we need to keep track of
+    # that too.
+    possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+    for this_file in ${possible_index_files} ; do
+       # If file is empty, forget it.
+       if test ! -s "${this_file}" ; then
+          continue;
+       fi
+ 
+       # Examine first character of file.  If it's not a backslash or
+       # single quote, then it's definitely not an index or xref file.
+       first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+       if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
+          definite_index_files="${definite_index_files} ${this_file}"
+       fi
+    done
+    orig_index_files="${definite_index_files}"
+    orig_index_files_sans_aux="`echo ${definite_index_files} \
+                                 | sed 's/'${filename_noext}'\.aux//;
+                                        s/^[ ]*//;s/[ ]*$//;'`"
+ 
+    # Now save copies of original index files so we have some means of
+    # comparison later.
+    for index_file_to_save in ${orig_index_files} ; do
+        cp "${index_file_to_save}" "${index_file_to_save}${backup_extension}"
+    done
+ 
+    # Run texindex on current index files.  If they already exist, and
+    # after running TeX a first time the index files don't change, then
+    # there's no reason to run TeX again.  But we won't know that if the
+    # index files are out of date or nonexistent.
+    if test "${orig_index_files_sans_aux}" ; then
+       ${texindex} ${orig_index_files_sans_aux}
+    fi
+ 
+    if ${tex} ${command_line_filename} ; then		# TeX run first time
+       definite_index_files=""
+       # Get list of new index files
+       possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+       for this_file in ${possible_index_files} ; do
+          # If file is empty, forget it.
+          if test ! -s ${this_file} ; then
+             continue;
+          fi
+ 
+          # Examine first character of file.  If it's not a backslash or
+          # single quote, then it's definitely not an index or xref file.
+          first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+          if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
+             definite_index_files="${definite_index_files} ${this_file}"
+          fi
+       done
+       new_index_files="${definite_index_files}"
+       new_index_files_sans_aux="`echo ${definite_index_files} \
+                                   | sed 's/'${filename_noext}'\.aux//;
+                                          s/^[ ]*//;s/[ ]*$//;'`"
+ 
+       # If old and new list don't at least have the same file list, then one
+       # file or another has definitely changed.
+       if test "${orig_index_files}" != "${new_index_files}" ; then
+          index_files_changed_p=t
+       else
+          # File list is the same.  We must compare each file until we find a
+          # difference.
+          index_files_changed_p=""
+          for this_file in ${new_index_files} ; do
+             # cmp -s will return nonzero exit status if files differ.
+             cmp -s "${this_file}" "${this_file}${backup_extension}"
+             if test $? -ne 0  ; then
+                # We only need to keep comparing until we find *one* that
+                # differs, because we'll have to run texindex & tex no
+                # matter what.
+                index_files_changed_p=t
+                break
+             fi
+          done
+       fi
+ 
+       # If index files have changed since TeX has been run, or if the aux
+       # file wasn't present originally, run texindex and TeX again.
+       if test "${index_files_changed_p}"  ; then
+          retval=0
+          if test "${new_index_files_sans_aux}" ; then
+             ${texindex} ${new_index_files_sans_aux}
+             retval=$?
+          fi
+          if test ${retval} -eq 0 ; then
+             ${tex} "${command_line_filename}"
+          fi
+       fi
+    fi
+ 
+    # Generate list of files to delete, then call rm once with the entire
+    # list.  This is significantly faster than multiple executions of rm.
+    file_list=""
+    for file in ${orig_index_files} ; do
+        file_list="${file_list} ${file}${backup_extension}"
+    done
+    if test "${file_list}" ; then
+       rm -f ${file_list}
+    fi
+ done
+ 
+ # texi2dvi ends here
Index: emacs/lib-src/texindex.c
diff -c /dev/null emacs/lib-src/texindex.c:1.1
*** /dev/null	Fri Aug  2 20:33:25 1996
--- emacs/lib-src/texindex.c	Wed Jul 31 04:52:46 1996
***************
*** 0 ****
--- 1,1785 ----
+ /* Prepare TeX index dribble output into an actual index.
+ 
+    Version 1.45
+ 
+    Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc.
+ 
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2, or (at your option)
+    any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307. */
+ 
+ 
+ #include <stdio.h>
+ #include <ctype.h>
+ #include <errno.h>
+ #include "getopt.h"
+ 
+ #define TEXINDEX_VERSION_STRING "GNU Texindex 2.0 for Texinfo release 3.4"
+ 
+ #if defined (emacs)
+ #  include "../src/config.h"
+ /* Some s/os.h files redefine these. */
+ #  undef read
+ #  undef close
+ #  undef write
+ #  undef open
+ #endif
+ 
+ #if defined (HAVE_STRING_H)
+ #  include <string.h>
+ #endif /* HAVE_STRING_H */
+ 
+ #if !defined (HAVE_STRCHR)
+ char *strrchr ();
+ #endif /* !HAVE_STRCHR */
+ 
+ #if defined (STDC_HEADERS)
+ #  include <stdlib.h>
+ #else /* !STDC_HEADERS */
+ char *getenv (), *malloc (), *realloc ();
+ #endif /* !STDC_HEADERS */
+ 
+ #if defined (HAVE_UNISTD_H)
+ #  include <unistd.h>
+ #else /* !HAVE_UNISTD_H */
+ off_t lseek ();
+ #endif /* !HAVE_UNISTD_H */
+ 
+ #if !defined (HAVE_MEMSET)
+ #undef memset
+ #define memset(ptr, ignore, count) bzero (ptr, count)
+ #endif
+ 
+ 
+ char *mktemp ();
+ 
+ #if defined (VMS)
+ #  include <file.h>
+ #  define TI_NO_ERROR ((1 << 28) | 1)
+ #  define TI_FATAL_ERROR ((1 << 28) | 4)
+ #  define unlink delete
+ #else /* !VMS */
+ #  if defined (HAVE_SYS_FCNTL_H)
+ #    include <sys/types.h>
+ #    include <sys/fcntl.h>
+ #  endif /* HAVE_SYS_FCNTL_H */
+ 
+ #  if defined (_AIX) || !defined (_POSIX_VERSION)
+ #    include <sys/file.h>
+ #  else /* !AIX && _POSIX_VERSION */
+ #    if !defined (HAVE_SYS_FCNTL_H)
+ #      include <fcntl.h>
+ #    endif /* !HAVE_FCNTL_H */
+ #  endif /* !_AIX && _POSIX_VERSION */
+ #  define TI_NO_ERROR 0
+ #  define TI_FATAL_ERROR 1
+ #endif /* !VMS */
+ 
+ #if !defined (SEEK_SET)
+ #  define SEEK_SET 0
+ #  define SEEK_CUR 1
+ #  define SEEK_END 2
+ #endif /* !SEEK_SET */
+ 
+ #if !defined (errno)
+ extern int errno;
+ #endif
+ char *strerror ();
+ 
+ /* When sorting in core, this structure describes one line
+    and the position and length of its first keyfield.  */
+ struct lineinfo
+ {
+   char *text;		/* The actual text of the line. */
+   union {
+     char *text;		/* The start of the key (for textual comparison). */
+     long number;	/* The numeric value (for numeric comparison). */
+   } key;
+   long keylen;		/* Length of KEY field. */
+ };
+ 
+ /* This structure describes a field to use as a sort key. */
+ struct keyfield
+ {
+   int startwords;	/* Number of words to skip. */
+   int startchars;	/* Number of additional chars to skip. */
+   int endwords;		/* Number of words to ignore at end. */
+   int endchars;		/* Ditto for characters of last word. */
+   char ignore_blanks;	/* Non-zero means ignore spaces and tabs. */
+   char fold_case;	/* Non-zero means case doesn't matter. */
+   char reverse;		/* Non-zero means compare in reverse order. */
+   char numeric;		/* Non-zeros means field is ASCII numeric. */
+   char positional;	/* Sort according to file position. */
+   char braced;		/* Count balanced-braced groupings as fields. */
+ };
+ 
+ /* Vector of keyfields to use. */
+ struct keyfield keyfields[3];
+ 
+ /* Number of keyfields stored in that vector.  */
+ int num_keyfields = 3;
+ 
+ /* Vector of input file names, terminated with a null pointer. */
+ char **infiles;
+ 
+ /* Vector of corresponding output file names, or NULL, meaning default it
+    (add an `s' to the end). */
+ char **outfiles;
+ 
+ /* Length of `infiles'. */
+ int num_infiles;
+ 
+ /* Pointer to the array of pointers to lines being sorted. */
+ char **linearray;
+ 
+ /* The allocated length of `linearray'. */
+ long nlines;
+ 
+ /* Directory to use for temporary files.  On Unix, it ends with a slash.  */
+ char *tempdir;
+ 
+ /* Start of filename to use for temporary files.  */
+ char *tempbase;
+ 
+ /* Number of last temporary file.  */
+ int tempcount;
+ 
+ /* Number of last temporary file already deleted.
+    Temporary files are deleted by `flush_tempfiles' in order of creation.  */
+ int last_deleted_tempcount;
+ 
+ /* During in-core sort, this points to the base of the data block
+    which contains all the lines of data.  */
+ char *text_base;
+ 
+ /* Additional command switches .*/
+ 
+ /* Nonzero means do not delete tempfiles -- for debugging. */
+ int keep_tempfiles;
+ 
+ /* The name this program was run with. */
+ char *program_name;
+ 
+ /* Forward declarations of functions in this file. */
+ 
+ void decode_command ();
+ void sort_in_core ();
+ void sort_offline ();
+ char **parsefile ();
+ char *find_field ();
+ char *find_pos ();
+ long find_value ();
+ char *find_braced_pos ();
+ char *find_braced_end ();
+ void writelines ();
+ int compare_field ();
+ int compare_full ();
+ long readline ();
+ int merge_files ();
+ int merge_direct ();
+ void pfatal_with_name ();
+ void fatal ();
+ void error ();
+ void *xmalloc (), *xrealloc ();
+ char *concat ();
+ char *maketempname ();
+ void flush_tempfiles ();
+ char *tempcopy ();
+ 
+ #define MAX_IN_CORE_SORT 500000
+ 
+ void
+ main (argc, argv)
+      int argc;
+      char **argv;
+ {
+   int i;
+ 
+   tempcount = 0;
+   last_deleted_tempcount = 0;
+ 
+   program_name = strrchr (argv[0], '/');
+   if (program_name != (char *)NULL)
+     program_name++;
+   else
+     program_name = argv[0];
+ 
+   /* Describe the kind of sorting to do. */
+   /* The first keyfield uses the first braced field and folds case. */
+   keyfields[0].braced = 1;
+   keyfields[0].fold_case = 1;
+   keyfields[0].endwords = -1;
+   keyfields[0].endchars = -1;
+ 
+   /* The second keyfield uses the second braced field, numerically. */
+   keyfields[1].braced = 1;
+   keyfields[1].numeric = 1;
+   keyfields[1].startwords = 1;
+   keyfields[1].endwords = -1;
+   keyfields[1].endchars = -1;
+ 
+   /* The third keyfield (which is ignored while discarding duplicates)
+      compares the whole line. */
+   keyfields[2].endwords = -1;
+   keyfields[2].endchars = -1;
+ 
+   decode_command (argc, argv);
+ 
+   tempbase = mktemp (concat ("txiXXXXXX", "", ""));
+ 
+   /* Process input files completely, one by one.  */
+ 
+   for (i = 0; i < num_infiles; i++)
+     {
+       int desc;
+       long ptr;
+       char *outfile;
+ 
+       desc = open (infiles[i], O_RDONLY, 0);
+       if (desc < 0)
+ 	pfatal_with_name (infiles[i]);
+       lseek (desc, 0, SEEK_END);
+       ptr = (long) lseek (desc, 0, SEEK_CUR);
+ 
+       close (desc);
+ 
+       outfile = outfiles[i];
+       if (!outfile)
+ 	{
+ 	  outfile = concat (infiles[i], "s", "");
+ 	}
+ 
+       if (ptr < MAX_IN_CORE_SORT)
+ 	/* Sort a small amount of data. */
+ 	sort_in_core (infiles[i], ptr, outfile);
+       else
+ 	sort_offline (infiles[i], ptr, outfile);
+     }
+ 
+   flush_tempfiles (tempcount);
+   exit (TI_NO_ERROR);
+ }
+ 
+ typedef struct
+ {
+   char *long_name;
+   char *short_name;
+   int *variable_ref;
+   int variable_value;
+   char *arg_name;
+   char *doc_string;
+ } TEXINDEX_OPTION;
+ 
+ TEXINDEX_OPTION texindex_options[] = {
+   { "--keep", "-k", &keep_tempfiles, 1, (char *)NULL,
+       "Keep temporary files around after processing" },
+   { "--no-keep", 0, &keep_tempfiles, 0, (char *)NULL,
+       "Do not keep temporary files around after processing (default)" },
+   { "--output", "-o", (int *)NULL, 0, "FILE",
+       "Send output to FILE" },
+   { "--version", (char *)NULL, (int *)NULL, 0, (char *)NULL,
+       "Show version information" },
+   { "--help", "-h", (int *)NULL, 0, (char *)NULL, "Produce this listing" },
+   { (char *)NULL, (char *)NULL, (int *)NULL, 0, (char *)NULL }
+ };
+ 
+ void
+ usage (result_value)
+      int result_value;
+ {
+   register int i;
+ 
+   fprintf (stderr, "Usage: %s [OPTIONS] FILE...\n", program_name);
+   fprintf (stderr, "  Generate a permuted index for the TeX files given.\n");
+   fprintf (stderr, "  Usually FILE... is `foo.??' for the source file `foo.tex'.\n");
+   fprintf (stderr, "  The OPTIONS are:\n");
+ 
+   for (i = 0; texindex_options[i].long_name; i++)
+     {
+       fprintf (stderr, "    %s %s",
+ 	       texindex_options[i].long_name,
+ 	       texindex_options[i].arg_name ?
+ 	       texindex_options[i].arg_name : "");
+ 
+       if (texindex_options[i].short_name)
+ 	fprintf (stderr, " \n    or %s %s",
+ 		 texindex_options[i].short_name,
+ 		 texindex_options[i].arg_name ?
+ 		 texindex_options[i].arg_name : "");
+       fprintf (stderr, "\t%s\n", texindex_options[i].doc_string);
+     }
+   exit (result_value);
+ }
+ 
+ /* Decode the command line arguments to set the parameter variables
+    and set up the vector of keyfields and the vector of input files. */
+ 
+ void
+ decode_command (argc, argv)
+      int argc;
+      char **argv;
+ {
+   int arg_index = 1;
+   int optc;
+   char **ip;
+   char **op;
+ 
+   /* Store default values into parameter variables. */
+ 
+   tempdir = getenv ("TMPDIR");
+ #ifdef VMS
+   if (tempdir == NULL)
+     tempdir = "sys$scratch:";
+ #else
+   if (tempdir == NULL)
+     tempdir = "/tmp/";
+   else
+     tempdir = concat (tempdir, "/", "");
+ #endif
+ 
+   keep_tempfiles = 0;
+ 
+   /* Allocate ARGC input files, which must be enough.  */
+ 
+   infiles = (char **) xmalloc (argc * sizeof (char *));
+   outfiles = (char **) xmalloc (argc * sizeof (char *));
+   ip = infiles;
+   op = outfiles;
+ 
+   while (arg_index < argc)
+     {
+       char *arg = argv[arg_index++];
+ 
+       if (*arg == '-')
+ 	{
+ 	  if (strcmp (arg, "--version") == 0)
+ 	    {
+ 	      fprintf (stderr, "%s\n", TEXINDEX_VERSION_STRING);
+ 	      exit (0);
+ 	    }
+ 	  else if ((strcmp (arg, "--keep") == 0) ||
+ 		   (strcmp (arg, "-k") == 0))
+ 	    {
+ 	      keep_tempfiles = 1;
+ 	    }
+ 	  else if ((strcmp (arg, "--help") == 0) ||
+ 		   (strcmp (arg, "-h") == 0))
+ 	    {
+ 	      usage (0);
+ 	    }
+ 	  else if ((strcmp (arg, "--output") == 0) ||
+ 		   (strcmp (arg, "-o") == 0))
+ 	    {
+ 	      if (argv[arg_index] != (char *)NULL)
+ 		{
+ 		  arg_index++;
+ 		  if (op > outfiles)
+ 		    *(op - 1) = argv[arg_index];
+ 		}
+ 	      else
+ 		usage (1);
+ 	    }
+ 	  else
+ 	    usage (1);
+ 	}
+       else
+ 	{
+ 	  *ip++ = arg;
+ 	  *op++ = (char *)NULL;
+ 	}
+     }
+ 
+   /* Record number of keyfields and terminate list of filenames. */
+   num_infiles = ip - infiles;
+   *ip = (char *)NULL;
+   if (num_infiles == 0)
+     usage (1);
+ }
+ 
+ /* Return a name for a temporary file. */
+ 
+ char *
+ maketempname (count)
+      int count;
+ {
+   char tempsuffix[10];
+   sprintf (tempsuffix, "%d", count);
+   return concat (tempdir, tempbase, tempsuffix);
+ }
+ 
+ /* Delete all temporary files up to TO_COUNT. */
+ 
+ void
+ flush_tempfiles (to_count)
+      int to_count;
+ {
+   if (keep_tempfiles)
+     return;
+   while (last_deleted_tempcount < to_count)
+     unlink (maketempname (++last_deleted_tempcount));
+ }
+ 
+ /* Copy the input file open on IDESC into a temporary file
+    and return the temporary file name. */
+ 
+ #define BUFSIZE 1024
+ 
+ char *
+ tempcopy (idesc)
+      int idesc;
+ {
+   char *outfile = maketempname (++tempcount);
+   int odesc;
+   char buffer[BUFSIZE];
+ 
+   odesc = open (outfile, O_WRONLY | O_CREAT, 0666);
+ 
+   if (odesc < 0)
+     pfatal_with_name (outfile);
+ 
+   while (1)
+     {
+       int nread = read (idesc, buffer, BUFSIZE);
+       write (odesc, buffer, nread);
+       if (!nread)
+ 	break;
+     }
+ 
+   close (odesc);
+ 
+   return outfile;
+ }
+ 
+ /* Compare LINE1 and LINE2 according to the specified set of keyfields. */
+ 
+ int
+ compare_full (line1, line2)
+      char **line1, **line2;
+ {
+   int i;
+ 
+   /* Compare using the first keyfield;
+      if that does not distinguish the lines, try the second keyfield;
+      and so on. */
+ 
+   for (i = 0; i < num_keyfields; i++)
+     {
+       long length1, length2;
+       char *start1 = find_field (&keyfields[i], *line1, &length1);
+       char *start2 = find_field (&keyfields[i], *line2, &length2);
+       int tem = compare_field (&keyfields[i], start1, length1, *line1 - text_base,
+ 			       start2, length2, *line2 - text_base);
+       if (tem)
+ 	{
+ 	  if (keyfields[i].reverse)
+ 	    return -tem;
+ 	  return tem;
+ 	}
+     }
+ 
+   return 0;			/* Lines match exactly. */
+ }
+ 
+ /* Compare LINE1 and LINE2, described by structures
+    in which the first keyfield is identified in advance.
+    For positional sorting, assumes that the order of the lines in core
+    reflects their nominal order.  */
+ 
+ int
+ compare_prepared (line1, line2)
+      struct lineinfo *line1, *line2;
+ {
+   int i;
+   int tem;
+   char *text1, *text2;
+ 
+   /* Compare using the first keyfield, which has been found for us already. */
+   if (keyfields->positional)
+     {
+       if (line1->text - text_base > line2->text - text_base)
+ 	tem = 1;
+       else
+ 	tem = -1;
+     }
+   else if (keyfields->numeric)
+     tem = line1->key.number - line2->key.number;
+   else
+     tem = compare_field (keyfields, line1->key.text, line1->keylen, 0,
+ 			 line2->key.text, line2->keylen, 0);
+   if (tem)
+     {
+       if (keyfields->reverse)
+ 	return -tem;
+       return tem;
+     }
+ 
+   text1 = line1->text;
+   text2 = line2->text;
+ 
+   /* Compare using the second keyfield;
+      if that does not distinguish the lines, try the third keyfield;
+      and so on. */
+ 
+   for (i = 1; i < num_keyfields; i++)
+     {
+       long length1, length2;
+       char *start1 = find_field (&keyfields[i], text1, &length1);
+       char *start2 = find_field (&keyfields[i], text2, &length2);
+       int tem = compare_field (&keyfields[i], start1, length1, text1 - text_base,
+ 			       start2, length2, text2 - text_base);
+       if (tem)
+ 	{
+ 	  if (keyfields[i].reverse)
+ 	    return -tem;
+ 	  return tem;
+ 	}
+     }
+ 
+   return 0;			/* Lines match exactly. */
+ }
+ 
+ /* Like compare_full but more general.
+    You can pass any strings, and you can say how many keyfields to use.
+    POS1 and POS2 should indicate the nominal positional ordering of
+    the two lines in the input.  */
+ 
+ int
+ compare_general (str1, str2, pos1, pos2, use_keyfields)
+      char *str1, *str2;
+      long pos1, pos2;
+      int use_keyfields;
+ {
+   int i;
+ 
+   /* Compare using the first keyfield;
+      if that does not distinguish the lines, try the second keyfield;
+      and so on. */
+ 
+   for (i = 0; i < use_keyfields; i++)
+     {
+       long length1, length2;
+       char *start1 = find_field (&keyfields[i], str1, &length1);
+       char *start2 = find_field (&keyfields[i], str2, &length2);
+       int tem = compare_field (&keyfields[i], start1, length1, pos1,
+ 			       start2, length2, pos2);
+       if (tem)
+ 	{
+ 	  if (keyfields[i].reverse)
+ 	    return -tem;
+ 	  return tem;
+ 	}
+     }
+ 
+   return 0;			/* Lines match exactly. */
+ }
+ 
+ /* Find the start and length of a field in STR according to KEYFIELD.
+    A pointer to the starting character is returned, and the length
+    is stored into the int that LENGTHPTR points to.  */
+ 
+ char *
+ find_field (keyfield, str, lengthptr)
+      struct keyfield *keyfield;
+      char *str;
+      long *lengthptr;
+ {
+   char *start;
+   char *end;
+   char *(*fun) ();
+ 
+   if (keyfield->braced)
+     fun = find_braced_pos;
+   else
+     fun = find_pos;
+ 
+   start = (*fun) (str, keyfield->startwords, keyfield->startchars,
+ 		  keyfield->ignore_blanks);
+   if (keyfield->endwords < 0)
+     {
+       if (keyfield->braced)
+ 	end = find_braced_end (start);
+       else
+ 	{
+ 	  end = start;
+ 	  while (*end && *end != '\n')
+ 	    end++;
+ 	}
+     }
+   else
+     {
+       end = (*fun) (str, keyfield->endwords, keyfield->endchars, 0);
+       if (end - str < start - str)
+ 	end = start;
+     }
+   *lengthptr = end - start;
+   return start;
+ }
+ 
+ /* Return a pointer to a specified place within STR,
+    skipping (from the beginning) WORDS words and then CHARS chars.
+    If IGNORE_BLANKS is nonzero, we skip all blanks
+    after finding the specified word.  */
+ 
+ char *
+ find_pos (str, words, chars, ignore_blanks)
+      char *str;
+      int words, chars;
+      int ignore_blanks;
+ {
+   int i;
+   char *p = str;
+ 
+   for (i = 0; i < words; i++)
+     {
+       char c;
+       /* Find next bunch of nonblanks and skip them. */
+       while ((c = *p) == ' ' || c == '\t')
+ 	p++;
+       while ((c = *p) && c != '\n' && !(c == ' ' || c == '\t'))
+ 	p++;
+       if (!*p || *p == '\n')
+ 	return p;
+     }
+ 
+   while (*p == ' ' || *p == '\t')
+     p++;
+ 
+   for (i = 0; i < chars; i++)
+     {
+       if (!*p || *p == '\n')
+ 	break;
+       p++;
+     }
+   return p;
+ }
+ 
+ /* Like find_pos but assumes that each field is surrounded by braces
+    and that braces within fields are balanced. */
+ 
+ char *
+ find_braced_pos (str, words, chars, ignore_blanks)
+      char *str;
+      int words, chars;
+      int ignore_blanks;
+ {
+   int i;
+   int bracelevel;
+   char *p = str;
+   char c;
+ 
+   for (i = 0; i < words; i++)
+     {
+       bracelevel = 1;
+       while ((c = *p++) != '{' && c != '\n' && c)
+ 	/* Do nothing. */ ;
+       if (c != '{')
+ 	return p - 1;
+       while (bracelevel)
+ 	{
+ 	  c = *p++;
+ 	  if (c == '{')
+ 	    bracelevel++;
+ 	  if (c == '}')
+ 	    bracelevel--;
+ 	  if (c == 0 || c == '\n')
+ 	    return p - 1;
+ 	}
+     }
+ 
+   while ((c = *p++) != '{' && c != '\n' && c)
+     /* Do nothing. */ ;
+ 
+   if (c != '{')
+     return p - 1;
+ 
+   if (ignore_blanks)
+     while ((c = *p) == ' ' || c == '\t')
+       p++;
+ 
+   for (i = 0; i < chars; i++)
+     {
+       if (!*p || *p == '\n')
+ 	break;
+       p++;
+     }
+   return p;
+ }
+ 
+ /* Find the end of the balanced-brace field which starts at STR.
+    The position returned is just before the closing brace. */
+ 
+ char *
+ find_braced_end (str)
+      char *str;
+ {
+   int bracelevel;
+   char *p = str;
+   char c;
+ 
+   bracelevel = 1;
+   while (bracelevel)
+     {
+       c = *p++;
+       if (c == '{')
+ 	bracelevel++;
+       if (c == '}')
+ 	bracelevel--;
+       if (c == 0 || c == '\n')
+ 	return p - 1;
+     }
+   return p - 1;
+ }
+ 
+ long
+ find_value (start, length)
+      char *start;
+      long length;
+ {
+   while (length != 0L)
+     {
+       if (isdigit (*start))
+ 	return atol (start);
+       length--;
+       start++;
+     }
+   return 0l;
+ }
+ 
+ /* Vector used to translate characters for comparison.
+    This is how we make all alphanumerics follow all else,
+    and ignore case in the first sorting.  */
+ int char_order[256];
+ 
+ void
+ init_char_order ()
+ {
+   int i;
+   for (i = 1; i < 256; i++)
+     char_order[i] = i;
+ 
+   for (i = '0'; i <= '9'; i++)
+     char_order[i] += 512;
+ 
+   for (i = 'a'; i <= 'z'; i++)
+     {
+       char_order[i] = 512 + i;
+       char_order[i + 'A' - 'a'] = 512 + i;
+     }
+ }
+ 
+ /* Compare two fields (each specified as a start pointer and a character count)
+    according to KEYFIELD.
+    The sign of the value reports the relation between the fields. */
+ 
+ int
+ compare_field (keyfield, start1, length1, pos1, start2, length2, pos2)
+      struct keyfield *keyfield;
+      char *start1;
+      long length1;
+      long pos1;
+      char *start2;
+      long length2;
+      long pos2;
+ {
+   if (keyfields->positional)
+     {
+       if (pos1 > pos2)
+ 	return 1;
+       else
+ 	return -1;
+     }
+   if (keyfield->numeric)
+     {
+       long value = find_value (start1, length1) - find_value (start2, length2);
+       if (value > 0)
+ 	return 1;
+       if (value < 0)
+ 	return -1;
+       return 0;
+     }
+   else
+     {
+       char *p1 = start1;
+       char *p2 = start2;
+       char *e1 = start1 + length1;
+       char *e2 = start2 + length2;
+ 
+       while (1)
+ 	{
+ 	  int c1, c2;
+ 
+ 	  if (p1 == e1)
+ 	    c1 = 0;
+ 	  else
+ 	    c1 = *p1++;
+ 	  if (p2 == e2)
+ 	    c2 = 0;
+ 	  else
+ 	    c2 = *p2++;
+ 
+ 	  if (char_order[c1] != char_order[c2])
+ 	    return char_order[c1] - char_order[c2];
+ 	  if (!c1)
+ 	    break;
+ 	}
+ 
+       /* Strings are equal except possibly for case.  */
+       p1 = start1;
+       p2 = start2;
+       while (1)
+ 	{
+ 	  int c1, c2;
+ 
+ 	  if (p1 == e1)
+ 	    c1 = 0;
+ 	  else
+ 	    c1 = *p1++;
+ 	  if (p2 == e2)
+ 	    c2 = 0;
+ 	  else
+ 	    c2 = *p2++;
+ 
+ 	  if (c1 != c2)
+ 	    /* Reverse sign here so upper case comes out last.  */
+ 	    return c2 - c1;
+ 	  if (!c1)
+ 	    break;
+ 	}
+ 
+       return 0;
+     }
+ }
+ 
+ /* A `struct linebuffer' is a structure which holds a line of text.
+    `readline' reads a line from a stream into a linebuffer
+    and works regardless of the length of the line.  */
+ 
+ struct linebuffer
+ {
+   long size;
+   char *buffer;
+ };
+ 
+ /* Initialize LINEBUFFER for use. */
+ 
+ void
+ initbuffer (linebuffer)
+      struct linebuffer *linebuffer;
+ {
+   linebuffer->size = 200;
+   linebuffer->buffer = (char *) xmalloc (200);
+ }
+ 
+ /* Read a line of text from STREAM into LINEBUFFER.
+    Return the length of the line.  */
+ 
+ long
+ readline (linebuffer, stream)
+      struct linebuffer *linebuffer;
+      FILE *stream;
+ {
+   char *buffer = linebuffer->buffer;
+   char *p = linebuffer->buffer;
+   char *end = p + linebuffer->size;
+ 
+   while (1)
+     {
+       int c = getc (stream);
+       if (p == end)
+ 	{
+ 	  buffer = (char *) xrealloc (buffer, linebuffer->size *= 2);
+ 	  p += buffer - linebuffer->buffer;
+ 	  end += buffer - linebuffer->buffer;
+ 	  linebuffer->buffer = buffer;
+ 	}
+       if (c < 0 || c == '\n')
+ 	{
+ 	  *p = 0;
+ 	  break;
+ 	}
+       *p++ = c;
+     }
+ 
+   return p - buffer;
+ }
+ 
+ /* Sort an input file too big to sort in core.  */
+ 
+ void
+ sort_offline (infile, nfiles, total, outfile)
+      char *infile;
+      int nfiles;
+      long total;
+      char *outfile;
+ {
+   /* More than enough. */
+   int ntemps = 2 * (total + MAX_IN_CORE_SORT - 1) / MAX_IN_CORE_SORT;
+   char **tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+   FILE *istream = fopen (infile, "r");
+   int i;
+   struct linebuffer lb;
+   long linelength;
+   int failure = 0;
+ 
+   initbuffer (&lb);
+ 
+   /* Read in one line of input data.  */
+ 
+   linelength = readline (&lb, istream);
+ 
+   if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+     {
+       error ("%s: not a texinfo index file", infile);
+       return;
+     }
+ 
+   /* Split up the input into `ntemps' temporary files, or maybe fewer,
+      and put the new files' names into `tempfiles' */
+ 
+   for (i = 0; i < ntemps; i++)
+     {
+       char *outname = maketempname (++tempcount);
+       FILE *ostream = fopen (outname, "w");
+       long tempsize = 0;
+ 
+       if (!ostream)
+ 	pfatal_with_name (outname);
+       tempfiles[i] = outname;
+ 
+       /* Copy lines into this temp file as long as it does not make file
+ 	 "too big" or until there are no more lines.  */
+ 
+       while (tempsize + linelength + 1 <= MAX_IN_CORE_SORT)
+ 	{
+ 	  tempsize += linelength + 1;
+ 	  fputs (lb.buffer, ostream);
+ 	  putc ('\n', ostream);
+ 
+ 	  /* Read another line of input data.  */
+ 
+ 	  linelength = readline (&lb, istream);
+ 	  if (!linelength && feof (istream))
+ 	    break;
+ 
+ 	  if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+ 	    {
+ 	      error ("%s: not a texinfo index file", infile);
+ 	      failure = 1;
+ 	      goto fail;
+ 	    }
+ 	}
+       fclose (ostream);
+       if (feof (istream))
+ 	break;
+     }
+ 
+   free (lb.buffer);
+ 
+ fail:
+   /* Record number of temp files we actually needed.  */
+ 
+   ntemps = i;
+ 
+   /* Sort each tempfile into another tempfile.
+     Delete the first set of tempfiles and put the names of the second
+     into `tempfiles'. */
+ 
+   for (i = 0; i < ntemps; i++)
+     {
+       char *newtemp = maketempname (++tempcount);
+       sort_in_core (&tempfiles[i], MAX_IN_CORE_SORT, newtemp);
+       if (!keep_tempfiles)
+ 	unlink (tempfiles[i]);
+       tempfiles[i] = newtemp;
+     }
+ 
+   if (failure)
+     return;
+ 
+   /* Merge the tempfiles together and indexify. */
+ 
+   merge_files (tempfiles, ntemps, outfile);
+ }
+ 
+ /* Sort INFILE, whose size is TOTAL,
+    assuming that is small enough to be done in-core,
+    then indexify it and send the output to OUTFILE (or to stdout).  */
+ 
+ void
+ sort_in_core (infile, total, outfile)
+      char *infile;
+      long total;
+      char *outfile;
+ {
+   char **nextline;
+   char *data = (char *) xmalloc (total + 1);
+   char *file_data;
+   long file_size;
+   int i;
+   FILE *ostream = stdout;
+   struct lineinfo *lineinfo;
+ 
+   /* Read the contents of the file into the moby array `data'. */
+ 
+   int desc = open (infile, O_RDONLY, 0);
+ 
+   if (desc < 0)
+     fatal ("failure reopening %s", infile);
+   for (file_size = 0;;)
+     {
+       i = read (desc, data + file_size, total - file_size);
+       if (i <= 0)
+ 	break;
+       file_size += i;
+     }
+   file_data = data;
+   data[file_size] = 0;
+ 
+   close (desc);
+ 
+   if (file_size > 0 && data[0] != '\\' && data[0] != '@')
+     {
+       error ("%s: not a texinfo index file", infile);
+       return;
+     }
+ 
+   init_char_order ();
+ 
+   /* Sort routines want to know this address. */
+ 
+   text_base = data;
+ 
+   /* Create the array of pointers to lines, with a default size
+      frequently enough.  */
+ 
+   nlines = total / 50;
+   if (!nlines)
+     nlines = 2;
+   linearray = (char **) xmalloc (nlines * sizeof (char *));
+ 
+   /* `nextline' points to the next free slot in this array.
+      `nlines' is the allocated size.  */
+ 
+   nextline = linearray;
+ 
+   /* Parse the input file's data, and make entries for the lines.  */
+ 
+   nextline = parsefile (infile, nextline, file_data, file_size);
+   if (nextline == 0)
+     {
+       error ("%s: not a texinfo index file", infile);
+       return;
+     }
+ 
+   /* Sort the lines. */
+ 
+   /* If we have enough space, find the first keyfield of each line in advance.
+      Make a `struct lineinfo' for each line, which records the keyfield
+      as well as the line, and sort them.  */
+ 
+   lineinfo = (struct lineinfo *) malloc ((nextline - linearray) * sizeof (struct lineinfo));
+ 
+   if (lineinfo)
+     {
+       struct lineinfo *lp;
+       char **p;
+ 
+       for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+ 	{
+ 	  lp->text = *p;
+ 	  lp->key.text = find_field (keyfields, *p, &lp->keylen);
+ 	  if (keyfields->numeric)
+ 	    lp->key.number = find_value (lp->key.text, lp->keylen);
+ 	}
+ 
+       qsort (lineinfo, nextline - linearray, sizeof (struct lineinfo), compare_prepared);
+ 
+       for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+ 	*p = lp->text;
+ 
+       free (lineinfo);
+     }
+   else
+     qsort (linearray, nextline - linearray, sizeof (char *), compare_full);
+ 
+   /* Open the output file. */
+ 
+   if (outfile)
+     {
+       ostream = fopen (outfile, "w");
+       if (!ostream)
+ 	pfatal_with_name (outfile);
+     }
+ 
+   writelines (linearray, nextline - linearray, ostream);
+   if (outfile)
+     fclose (ostream);
+ 
+   free (linearray);
+   free (data);
+ }
+ 
+ /* Parse an input string in core into lines.
+    DATA is the input string, and SIZE is its length.
+    Data goes in LINEARRAY starting at NEXTLINE.
+    The value returned is the first entry in LINEARRAY still unused.
+    Value 0 means input file contents are invalid.  */
+ 
+ char **
+ parsefile (filename, nextline, data, size)
+      char *filename;
+      char **nextline;
+      char *data;
+      long size;
+ {
+   char *p, *end;
+   char **line = nextline;
+ 
+   p = data;
+   end = p + size;
+   *end = 0;
+ 
+   while (p != end)
+     {
+       if (p[0] != '\\' && p[0] != '@')
+ 	return 0;
+ 
+       *line = p;
+       while (*p && *p != '\n')
+ 	p++;
+       if (p != end)
+ 	p++;
+ 
+       line++;
+       if (line == linearray + nlines)
+ 	{
+ 	  char **old = linearray;
+ 	  linearray = (char **) xrealloc (linearray, sizeof (char *) * (nlines *= 4));
+ 	  line += linearray - old;
+ 	}
+     }
+ 
+   return line;
+ }
+ 
+ /* Indexification is a filter applied to the sorted lines
+    as they are being written to the output file.
+    Multiple entries for the same name, with different page numbers,
+    get combined into a single entry with multiple page numbers.
+    The first braced field, which is used for sorting, is discarded.
+    However, its first character is examined, folded to lower case,
+    and if it is different from that in the previous line fed to us
+    a \initial line is written with one argument, the new initial.
+ 
+    If an entry has four braced fields, then the second and third
+    constitute primary and secondary names.
+    In this case, each change of primary name
+    generates a \primary line which contains only the primary name,
+    and in between these are \secondary lines which contain
+    just a secondary name and page numbers. */
+ 
+ /* The last primary name we wrote a \primary entry for.
+    If only one level of indexing is being done, this is the last name seen. */
+ char *lastprimary;
+ /* Length of storage allocated for lastprimary. */
+ int lastprimarylength;
+ 
+ /* Similar, for the secondary name. */
+ char *lastsecondary;
+ int lastsecondarylength;
+ 
+ /* Zero if we are not in the middle of writing an entry.
+    One if we have written the beginning of an entry but have not
+    yet written any page numbers into it.
+    Greater than one if we have written the beginning of an entry
+    plus at least one page number. */
+ int pending;
+ 
+ /* The initial (for sorting purposes) of the last primary entry written.
+    When this changes, a \initial {c} line is written */
+ 
+ char *lastinitial;
+ 
+ int lastinitiallength;
+ 
+ /* When we need a string of length 1 for the value of lastinitial,
+    store it here.  */
+ 
+ char lastinitial1[2];
+ 
+ /* Initialize static storage for writing an index. */
+ 
+ void
+ init_index ()
+ {
+   pending = 0;
+   lastinitial = lastinitial1;
+   lastinitial1[0] = 0;
+   lastinitial1[1] = 0;
+   lastinitiallength = 0;
+   lastprimarylength = 100;
+   lastprimary = (char *) xmalloc (lastprimarylength + 1);
+   memset (lastprimary, '\0', lastprimarylength + 1);
+   lastsecondarylength = 100;
+   lastsecondary = (char *) xmalloc (lastsecondarylength + 1);
+   memset (lastsecondary, '\0', lastsecondarylength + 1);
+ }
+ 
+ /* Indexify.  Merge entries for the same name,
+    insert headers for each initial character, etc.  */
+ 
+ void
+ indexify (line, ostream)
+      char *line;
+      FILE *ostream;
+ {
+   char *primary, *secondary, *pagenumber;
+   int primarylength, secondarylength = 0, pagelength;
+   int nosecondary;
+   int initiallength;
+   char *initial;
+   char initial1[2];
+   register char *p;
+ 
+   /* First, analyze the parts of the entry fed to us this time. */
+ 
+   p = find_braced_pos (line, 0, 0, 0);
+   if (*p == '{')
+     {
+       initial = p;
+       /* Get length of inner pair of braces starting at `p',
+ 	 including that inner pair of braces.  */
+       initiallength = find_braced_end (p + 1) + 1 - p;
+     }
+   else
+     {
+       initial = initial1;
+       initial1[0] = *p;
+       initial1[1] = 0;
+       initiallength = 1;
+ 
+       if (initial1[0] >= 'a' && initial1[0] <= 'z')
+ 	initial1[0] -= 040;
+     }
+ 
+   pagenumber = find_braced_pos (line, 1, 0, 0);
+   pagelength = find_braced_end (pagenumber) - pagenumber;
+   if (pagelength == 0)
+     abort ();
+ 
+   primary = find_braced_pos (line, 2, 0, 0);
+   primarylength = find_braced_end (primary) - primary;
+ 
+   secondary = find_braced_pos (line, 3, 0, 0);
+   nosecondary = !*secondary;
+   if (!nosecondary)
+     secondarylength = find_braced_end (secondary) - secondary;
+ 
+   /* If the primary is different from before, make a new primary entry. */
+   if (strncmp (primary, lastprimary, primarylength))
+     {
+       /* Close off current secondary entry first, if one is open. */
+       if (pending)
+ 	{
+ 	  fputs ("}\n", ostream);
+ 	  pending = 0;
+ 	}
+ 
+       /* If this primary has a different initial, include an entry for
+ 	 the initial. */
+       if (initiallength != lastinitiallength ||
+ 	  strncmp (initial, lastinitial, initiallength))
+ 	{
+ 	  fprintf (ostream, "\\initial {");
+ 	  fwrite (initial, 1, initiallength, ostream);
+ 	  fprintf (ostream, "}\n", initial);
+ 	  if (initial == initial1)
+ 	    {
+ 	      lastinitial = lastinitial1;
+ 	      *lastinitial1 = *initial1;
+ 	    }
+ 	  else
+ 	    {
+ 	      lastinitial = initial;
+ 	    }
+ 	  lastinitiallength = initiallength;
+ 	}
+ 
+       /* Make the entry for the primary.  */
+       if (nosecondary)
+ 	fputs ("\\entry {", ostream);
+       else
+ 	fputs ("\\primary {", ostream);
+       fwrite (primary, primarylength, 1, ostream);
+       if (nosecondary)
+ 	{
+ 	  fputs ("}{", ostream);
+ 	  pending = 1;
+ 	}
+       else
+ 	fputs ("}\n", ostream);
+ 
+       /* Record name of most recent primary. */
+       if (lastprimarylength < primarylength)
+ 	{
+ 	  lastprimarylength = primarylength + 100;
+ 	  lastprimary = (char *) xrealloc (lastprimary,
+ 					   1 + lastprimarylength);
+ 	}
+       strncpy (lastprimary, primary, primarylength);
+       lastprimary[primarylength] = 0;
+ 
+       /* There is no current secondary within this primary, now. */
+       lastsecondary[0] = 0;
+     }
+ 
+   /* Should not have an entry with no subtopic following one with a subtopic. */
+ 
+   if (nosecondary && *lastsecondary)
+     error ("entry %s follows an entry with a secondary name", line);
+ 
+   /* Start a new secondary entry if necessary. */
+   if (!nosecondary && strncmp (secondary, lastsecondary, secondarylength))
+     {
+       if (pending)
+ 	{
+ 	  fputs ("}\n", ostream);
+ 	  pending = 0;
+ 	}
+ 
+       /* Write the entry for the secondary.  */
+       fputs ("\\secondary {", ostream);
+       fwrite (secondary, secondarylength, 1, ostream);
+       fputs ("}{", ostream);
+       pending = 1;
+ 
+       /* Record name of most recent secondary. */
+       if (lastsecondarylength < secondarylength)
+ 	{
+ 	  lastsecondarylength = secondarylength + 100;
+ 	  lastsecondary = (char *) xrealloc (lastsecondary,
+ 					     1 + lastsecondarylength);
+ 	}
+       strncpy (lastsecondary, secondary, secondarylength);
+       lastsecondary[secondarylength] = 0;
+     }
+ 
+   /* Here to add one more page number to the current entry. */
+   if (pending++ != 1)
+     fputs (", ", ostream);	/* Punctuate first, if this is not the first. */
+   fwrite (pagenumber, pagelength, 1, ostream);
+ }
+ 
+ /* Close out any unfinished output entry. */
+ 
+ void
+ finish_index (ostream)
+      FILE *ostream;
+ {
+   if (pending)
+     fputs ("}\n", ostream);
+   free (lastprimary);
+   free (lastsecondary);
+ }
+ 
+ /* Copy the lines in the sorted order.
+    Each line is copied out of the input file it was found in. */
+ 
+ void
+ writelines (linearray, nlines, ostream)
+      char **linearray;
+      int nlines;
+      FILE *ostream;
+ {
+   char **stop_line = linearray + nlines;
+   char **next_line;
+ 
+   init_index ();
+ 
+   /* Output the text of the lines, and free the buffer space. */
+ 
+   for (next_line = linearray; next_line != stop_line; next_line++)
+     {
+       /* If -u was specified, output the line only if distinct from previous one.  */
+       if (next_line == linearray
+       /* Compare previous line with this one, using only the
+          explicitly specd keyfields. */
+ 	  || compare_general (*(next_line - 1), *next_line, 0L, 0L, num_keyfields - 1))
+ 	{
+ 	  char *p = *next_line;
+ 	  char c;
+ 
+ 	  while ((c = *p++) && c != '\n')
+ 	    /* Do nothing. */ ;
+ 	  *(p - 1) = 0;
+ 	  indexify (*next_line, ostream);
+ 	}
+     }
+ 
+   finish_index (ostream);
+ }
+ 
+ /* Assume (and optionally verify) that each input file is sorted;
+    merge them and output the result.
+    Returns nonzero if any input file fails to be sorted.
+ 
+    This is the high-level interface that can handle an unlimited
+    number of files.  */
+ 
+ #define MAX_DIRECT_MERGE 10
+ 
+ int
+ merge_files (infiles, nfiles, outfile)
+      char **infiles;
+      int nfiles;
+      char *outfile;
+ {
+   char **tempfiles;
+   int ntemps;
+   int i;
+   int value = 0;
+   int start_tempcount = tempcount;
+ 
+   if (nfiles <= MAX_DIRECT_MERGE)
+     return merge_direct (infiles, nfiles, outfile);
+ 
+   /* Merge groups of MAX_DIRECT_MERGE input files at a time,
+      making a temporary file to hold each group's result.  */
+ 
+   ntemps = (nfiles + MAX_DIRECT_MERGE - 1) / MAX_DIRECT_MERGE;
+   tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+   for (i = 0; i < ntemps; i++)
+     {
+       int nf = MAX_DIRECT_MERGE;
+       if (i + 1 == ntemps)
+ 	nf = nfiles - i * MAX_DIRECT_MERGE;
+       tempfiles[i] = maketempname (++tempcount);
+       value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]);
+     }
+ 
+   /* All temporary files that existed before are no longer needed
+      since their contents have been merged into our new tempfiles.
+      So delete them.  */
+   flush_tempfiles (start_tempcount);
+ 
+   /* Now merge the temporary files we created.  */
+ 
+   merge_files (tempfiles, ntemps, outfile);
+ 
+   free (tempfiles);
+ 
+   return value;
+ }
+ 
+ /* Assume (and optionally verify) that each input file is sorted;
+    merge them and output the result.
+    Returns nonzero if any input file fails to be sorted.
+ 
+    This version of merging will not work if the number of
+    input files gets too high.  Higher level functions
+    use it only with a bounded number of input files.  */
+ 
+ int
+ merge_direct (infiles, nfiles, outfile)
+      char **infiles;
+      int nfiles;
+      char *outfile;
+ {
+   struct linebuffer *lb1, *lb2;
+   struct linebuffer **thisline, **prevline;
+   FILE **streams;
+   int i;
+   int nleft;
+   int lossage = 0;
+   int *file_lossage;
+   struct linebuffer *prev_out = 0;
+   FILE *ostream = stdout;
+ 
+   if (outfile)
+     {
+       ostream = fopen (outfile, "w");
+     }
+   if (!ostream)
+     pfatal_with_name (outfile);
+ 
+   init_index ();
+ 
+   if (nfiles == 0)
+     {
+       if (outfile)
+ 	fclose (ostream);
+       return 0;
+     }
+ 
+   /* For each file, make two line buffers.
+      Also, for each file, there is an element of `thisline'
+      which points at any time to one of the file's two buffers,
+      and an element of `prevline' which points to the other buffer.
+      `thisline' is supposed to point to the next available line from the file,
+      while `prevline' holds the last file line used,
+      which is remembered so that we can verify that the file is properly sorted. */
+ 
+   /* lb1 and lb2 contain one buffer each per file. */
+   lb1 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+   lb2 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+ 
+   /* thisline[i] points to the linebuffer holding the next available line in file i,
+      or is zero if there are no lines left in that file.  */
+   thisline = (struct linebuffer **)
+     xmalloc (nfiles * sizeof (struct linebuffer *));
+   /* prevline[i] points to the linebuffer holding the last used line
+      from file i.  This is just for verifying that file i is properly
+      sorted.  */
+   prevline = (struct linebuffer **)
+     xmalloc (nfiles * sizeof (struct linebuffer *));
+   /* streams[i] holds the input stream for file i.  */
+   streams = (FILE **) xmalloc (nfiles * sizeof (FILE *));
+   /* file_lossage[i] is nonzero if we already know file i is not
+      properly sorted.  */
+   file_lossage = (int *) xmalloc (nfiles * sizeof (int));
+ 
+   /* Allocate and initialize all that storage. */
+ 
+   for (i = 0; i < nfiles; i++)
+     {
+       initbuffer (&lb1[i]);
+       initbuffer (&lb2[i]);
+       thisline[i] = &lb1[i];
+       prevline[i] = &lb2[i];
+       file_lossage[i] = 0;
+       streams[i] = fopen (infiles[i], "r");
+       if (!streams[i])
+ 	pfatal_with_name (infiles[i]);
+ 
+       readline (thisline[i], streams[i]);
+     }
+ 
+   /* Keep count of number of files not at eof. */
+   nleft = nfiles;
+ 
+   while (nleft)
+     {
+       struct linebuffer *best = 0;
+       struct linebuffer *exch;
+       int bestfile = -1;
+       int i;
+ 
+       /* Look at the next avail line of each file; choose the least one.  */
+ 
+       for (i = 0; i < nfiles; i++)
+ 	{
+ 	  if (thisline[i] &&
+ 	      (!best ||
+ 	       0 < compare_general (best->buffer, thisline[i]->buffer,
+ 				 (long) bestfile, (long) i, num_keyfields)))
+ 	    {
+ 	      best = thisline[i];
+ 	      bestfile = i;
+ 	    }
+ 	}
+ 
+       /* Output that line, unless it matches the previous one and we
+ 	 don't want duplicates. */
+ 
+       if (!(prev_out &&
+ 	    !compare_general (prev_out->buffer,
+ 			      best->buffer, 0L, 1L, num_keyfields - 1)))
+ 	indexify (best->buffer, ostream);
+       prev_out = best;
+ 
+       /* Now make the line the previous of its file, and fetch a new
+ 	 line from that file.  */
+ 
+       exch = prevline[bestfile];
+       prevline[bestfile] = thisline[bestfile];
+       thisline[bestfile] = exch;
+ 
+       while (1)
+ 	{
+ 	  /* If the file has no more, mark it empty. */
+ 
+ 	  if (feof (streams[bestfile]))
+ 	    {
+ 	      thisline[bestfile] = 0;
+ 	      /* Update the number of files still not empty. */
+ 	      nleft--;
+ 	      break;
+ 	    }
+ 	  readline (thisline[bestfile], streams[bestfile]);
+ 	  if (thisline[bestfile]->buffer[0] || !feof (streams[bestfile]))
+ 	    break;
+ 	}
+     }
+ 
+   finish_index (ostream);
+ 
+   /* Free all storage and close all input streams. */
+ 
+   for (i = 0; i < nfiles; i++)
+     {
+       fclose (streams[i]);
+       free (lb1[i].buffer);
+       free (lb2[i].buffer);
+     }
+   free (file_lossage);
+   free (lb1);
+   free (lb2);
+   free (thisline);
+   free (prevline);
+   free (streams);
+ 
+   if (outfile)
+     fclose (ostream);
+ 
+   return lossage;
+ }
+ 
+ /* Print error message and exit.  */
+ 
+ void
+ fatal (format, arg)
+      char *format, *arg;
+ {
+   error (format, arg);
+   exit (TI_FATAL_ERROR);
+ }
+ 
+ /* Print error message.  FORMAT is printf control string, ARG is arg for it. */
+ void
+ error (format, arg)
+      char *format, *arg;
+ {
+   printf ("%s: ", program_name);
+   printf (format, arg);
+   if (format[strlen (format) -1] != '\n')
+     printf ("\n");
+ }
+ 
+ void
+ perror_with_name (name)
+      char *name;
+ {
+   char *s;
+ 
+   s = strerror (errno);
+   printf ("%s: ", program_name);
+   printf ("%s; for file `%s'.\n", s, name);
+ }
+ 
+ void
+ pfatal_with_name (name)
+      char *name;
+ {
+   char *s;
+ 
+   s = strerror (errno);
+   printf ("%s: ", program_name);
+   printf ("%s; for file `%s'.\n", s, name);
+   exit (TI_FATAL_ERROR);
+ }
+ 
+ /* Return a newly-allocated string whose contents concatenate those of
+    S1, S2, S3.  */
+ 
+ char *
+ concat (s1, s2, s3)
+      char *s1, *s2, *s3;
+ {
+   int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+   char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
+ 
+   strcpy (result, s1);
+   strcpy (result + len1, s2);
+   strcpy (result + len1 + len2, s3);
+   *(result + len1 + len2 + len3) = 0;
+ 
+   return result;
+ }
+ 
+ #if !defined (HAVE_STRERROR)
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ 
+ char *
+ strerror (num)
+      int num;
+ {
+   if (num >= sys_nerr)
+     return ("");
+   else
+     return (sys_errlist[num]);
+ }
+ #endif /* !HAVE_STRERROR */
+ 
+ #if !defined (HAVE_STRCHR)
+ char *
+ strrchr (string, character)
+      char *string;
+      int character;
+ {
+   register int i;
+ 
+   for (i = strlen (string) - 1; i > -1; i--)
+     if (string[i] == character)
+       return (string + i);
+ 
+   return ((char *)NULL);
+ }
+ #endif /* HAVE_STRCHR */
+ 
+ /* Just like malloc, but kills the program in case of fatal error. */
+ void *
+ xmalloc (nbytes)
+      int nbytes;
+ {
+   void *temp = (void *) malloc (nbytes);
+ 
+   if (nbytes && temp == (void *)NULL)
+     memory_error ("xmalloc", nbytes);
+ 
+   return (temp);
+ }
+ 
+ /* Like realloc (), but barfs if there isn't enough memory. */
+ void *
+ xrealloc (pointer, nbytes)
+      void *pointer;
+      int nbytes;
+ {
+   void *temp;
+ 
+   if (!pointer)
+     temp = (void *)xmalloc (nbytes);
+   else
+     temp = (void *)realloc (pointer, nbytes);
+ 
+   if (nbytes && !temp)
+     memory_error ("xrealloc", nbytes);
+ 
+   return (temp);
+ }
+ 
+ memory_error (callers_name, bytes_wanted)
+      char *callers_name;
+      int bytes_wanted;
+ {
+   char printable_string[80];
+ 
+   sprintf (printable_string,
+ 	   "Virtual memory exhausted in %s ()!  Needed %d bytes.",
+ 	   callers_name, bytes_wanted);
+ 
+   error (printable_string);
+   abort ();
+ }
+ 
Index: emacs/lisp/Makefile
diff -c emacs/lisp/Makefile:1.1.1.1 emacs/lisp/Makefile:1.2
*** emacs/lisp/Makefile:1.1.1.1	Fri Jul 19 01:51:45 1996
--- emacs/lisp/Makefile	Fri Jul 19 05:00:48 1996
***************
*** 13,15 ****
--- 13,18 ----
  
  TAGS: $(lisptagsfiles)
  	../lib-src/etags $(lisptagsfiles)
+ 
+ #realclean:
+ #	-/bin/rm -f *.elc term/*.elc
Index: emacs/lisp/bookmark.el
diff -c emacs/lisp/bookmark.el:1.1.1.2 emacs/lisp/bookmark.el:1.3
*** emacs/lisp/bookmark.el:1.1.1.2	Mon Jul 22 01:30:30 1996
--- emacs/lisp/bookmark.el	Wed Jul 31 01:33:04 1996
***************
*** 1399,1404 ****
--- 1399,1405 ----
    (define-key bookmark-bmenu-mode-map "n" 'next-line)
    (define-key bookmark-bmenu-mode-map "p" 'previous-line)
    (define-key bookmark-bmenu-mode-map "\177" 'bookmark-bmenu-backup-unmark)
+   (define-key bookmark-bmenu-mode-map [delete] 'bookmark-bmenu-backup-unmark)
    (define-key bookmark-bmenu-mode-map "?" 'describe-mode)
    (define-key bookmark-bmenu-mode-map "u" 'bookmark-bmenu-unmark)
    (define-key bookmark-bmenu-mode-map "m" 'bookmark-bmenu-mark)
Index: emacs/lisp/buff-menu.el
diff -c emacs/lisp/buff-menu.el:1.1.1.2 emacs/lisp/buff-menu.el:1.3
*** emacs/lisp/buff-menu.el:1.1.1.2	Mon Jul 22 01:30:34 1996
--- emacs/lisp/buff-menu.el	Wed Jul 31 01:33:07 1996
***************
*** 84,89 ****
--- 84,90 ----
    (define-key Buffer-menu-mode-map "n" 'next-line)
    (define-key Buffer-menu-mode-map "p" 'previous-line)
    (define-key Buffer-menu-mode-map "\177" 'Buffer-menu-backup-unmark)
+   (define-key Buffer-menu-mode-map [delete] 'Buffer-menu-backup-unmark)
    (define-key Buffer-menu-mode-map "~" 'Buffer-menu-not-modified)
    (define-key Buffer-menu-mode-map "?" 'describe-mode)
    (define-key Buffer-menu-mode-map "u" 'Buffer-menu-unmark)
Index: emacs/lisp/byte-opt.el
diff -c emacs/lisp/byte-opt.el:1.1.1.2 emacs/lisp/byte-opt.el:1.3
*** emacs/lisp/byte-opt.el:1.1.1.2	Mon Jul 22 01:30:36 1996
--- emacs/lisp/byte-opt.el	Wed Jul 31 01:33:09 1996
***************
*** 1242,1248 ****
      noninteractive parse-sexp-ignore-comments pop-up-frames
      pop-up-windows print-escape-newlines print-escape-newlines
      truncate-partial-width-windows visible-bell vms-stmlf-recfm
!     words-include-escapes x-save-under)
    "DEFVAR_BOOL variables.  Giving these any non-nil value sets them to t.
  If this does not enumerate all DEFVAR_BOOL variables, the byte-optimizer
  may generate incorrect code.")
--- 1242,1248 ----
      noninteractive parse-sexp-ignore-comments pop-up-frames
      pop-up-windows print-escape-newlines print-escape-newlines
      truncate-partial-width-windows visible-bell vms-stmlf-recfm
!     words-include-escapes)
    "DEFVAR_BOOL variables.  Giving these any non-nil value sets them to t.
  If this does not enumerate all DEFVAR_BOOL variables, the byte-optimizer
  may generate incorrect code.")
Index: emacs/lisp/bytecomp.el
diff -c emacs/lisp/bytecomp.el:1.1.1.2 emacs/lisp/bytecomp.el:1.3
*** emacs/lisp/bytecomp.el:1.1.1.2	Mon Jul 22 01:30:40 1996
--- emacs/lisp/bytecomp.el	Wed Jul 31 01:33:12 1996
***************
*** 3242,3250 ****
        (error "batch-byte-recompile-directory is to be used only with -batch"))
    (or command-line-args-left
        (setq command-line-args-left '(".")))
!   (while command-line-args-left
!     (byte-recompile-directory (car command-line-args-left))
!     (setq command-line-args-left (cdr command-line-args-left)))
    (kill-emacs 0))
  
  
--- 3242,3257 ----
        (error "batch-byte-recompile-directory is to be used only with -batch"))
    (or command-line-args-left
        (setq command-line-args-left '(".")))
!   (let ((arg . nil))
!     (while command-line-args-left
!       (cond
!        ((equal (car command-line-args-left) "--force")
!         (setq arg 0))
!        ((equal (car command-line-args-left) "--nowarn")
!         (setq byte-compile-warnings nil))
!        (t        
!         (byte-recompile-directory (car command-line-args-left) arg)))
!       (setq command-line-args-left (cdr command-line-args-left))))
    (kill-emacs 0))
  
  
Index: emacs/lisp/c-mode.el
diff -c emacs/lisp/c-mode.el:1.1.1.2 emacs/lisp/c-mode.el:1.3
*** emacs/lisp/c-mode.el:1.1.1.2	Mon Jul 22 01:30:43 1996
--- emacs/lisp/c-mode.el	Wed Jul 31 01:33:16 1996
***************
*** 49,54 ****
--- 49,55 ----
  (define-key c-mode-map "\C-c\C-p" 'c-backward-conditional)
  (define-key c-mode-map "\C-c\C-u" 'c-up-conditional)
  (define-key c-mode-map "\177" 'backward-delete-char-untabify)
+ (define-key c-mode-map [delete] 'backward-delete-char-untabify)
  (define-key c-mode-map "\t" 'c-indent-command)
  
  (define-key c-mode-map [menu-bar] (make-sparse-keymap))
***************
*** 264,269 ****
--- 265,284 ----
    (make-local-variable 'parse-sexp-ignore-comments)
    (setq parse-sexp-ignore-comments t)
    (run-hooks 'c-mode-hook))
+ 
+ 
+ (defun c-beginning-of-function (&optional arg)
+   "Move backward to the beginning of a function.
+ With argument, do it that many times.  Negative arg -N
+ means move forward to Nth following beginning of function.
+ Returns t unless search stops due to beginning or end of buffer.
+ 
+ A function starts when there is a non-comment, non-preprocessor char
+ at the beginning of a line."
+   (interactive "p")
+   (and arg (< arg 0) (forward-char 1))
+   (and (re-search-backward "^\\(\\w\\|\\s(\\|[+-]\\)" nil 'move (or arg 1))
+        (progn (beginning-of-line) t)))
  
  (defun c-outline-level ()
    (save-excursion
***************
*** 559,565 ****
  			       (skip-chars-forward " \t")
  			       (< (point) end)))
  			(progn
! 			  (beginning-of-defun)
  			  (let ((pps (parse-partial-sexp (point) end)))
  			    (or (nth 3 pps) (nth 4 pps) (nth 5 pps))))))))
  	(progn
--- 574,580 ----
  			       (skip-chars-forward " \t")
  			       (< (point) end)))
  			(progn
! 			  (c-beginning-of-function)
  			  (let ((pps (parse-partial-sexp (point) end)))
  			    (or (nth 3 pps) (nth 4 pps) (nth 5 pps))))))))
  	(progn
***************
*** 586,592 ****
        (save-excursion
  	(save-restriction
  	  (narrow-to-region (point)
! 			    (progn (beginning-of-defun) (point)))
  	  (goto-char (point-max))
  	  (= (char-after (or (scan-lists (point) -1 1) (point-min))) ?\()))
      (error nil)))
--- 601,607 ----
        (save-excursion
  	(save-restriction
  	  (narrow-to-region (point)
! 			    (progn (c-beginning-of-function) (point)))
  	  (goto-char (point-max))
  	  (= (char-after (or (scan-lists (point) -1 1) (point-min))) ?\()))
      (error nil)))
***************
*** 700,706 ****
  	  containing-sexp)
        (if parse-start
  	  (goto-char parse-start)
! 	(beginning-of-defun))
        (while (< (point) indent-point)
  	(setq parse-start (point))
  	(setq state (parse-partial-sexp (point) indent-point 0))
--- 715,721 ----
  	  containing-sexp)
        (if parse-start
  	  (goto-char parse-start)
! 	(c-beginning-of-function))
        (while (< (point) indent-point)
  	(setq parse-start (point))
  	(setq state (parse-partial-sexp (point) indent-point 0))
***************
*** 956,962 ****
  
  (defun c-backward-to-start-of-if (&optional limit)
    "Move to the start of the last \"unbalanced\" `if'."
!   (or limit (setq limit (save-excursion (beginning-of-defun) (point))))
    (let ((if-level 1)
  	(case-fold-search nil))
      (while (and (not (bobp)) (not (zerop if-level)))
--- 971,977 ----
  
  (defun c-backward-to-start-of-if (&optional limit)
    "Move to the start of the last \"unbalanced\" `if'."
!   (or limit (setq limit (save-excursion (c-beginning-of-function) (point))))
    (let ((if-level 1)
  	(case-fold-search nil))
      (while (and (not (bobp)) (not (zerop if-level)))
***************
*** 974,980 ****
  (defun c-backward-to-start-of-do (&optional limit)
    "If point follows a `do' statement, move to beginning of it and return t.
  Otherwise return nil and don't move point."
!   (or limit (setq limit (save-excursion (beginning-of-defun) (point))))
    (let ((first t)
  	(startpos (point))
  	(done nil))
--- 989,995 ----
  (defun c-backward-to-start-of-do (&optional limit)
    "If point follows a `do' statement, move to beginning of it and return t.
  Otherwise return nil and don't move point."
!   (or limit (setq limit (save-excursion (c-beginning-of-function) (point))))
    (let ((first t)
  	(startpos (point))
  	(done nil))
***************
*** 1020,1026 ****
    (interactive "p")
    (let ((here (point)) state)
      (save-excursion
!       (beginning-of-defun)
        (setq state (parse-partial-sexp (point) here nil nil)))
      (if (or (nth 3 state) (nth 4 state)
  	    (looking-at (concat "[ \t]*" comment-start-skip))
--- 1035,1041 ----
    (interactive "p")
    (let ((here (point)) state)
      (save-excursion
!       (c-beginning-of-function)
        (setq state (parse-partial-sexp (point) here nil nil)))
      (if (or (nth 3 state) (nth 4 state)
  	    (looking-at (concat "[ \t]*" comment-start-skip))
***************
*** 1082,1088 ****
    (push-mark (point))
    (end-of-defun)
    (push-mark (point) nil t)
!   (beginning-of-defun)
    (backward-paragraph))
  
  ;; Idea of ENDPOS is, indent each line, stopping when
--- 1097,1103 ----
    (push-mark (point))
    (end-of-defun)
    (push-mark (point) nil t)
!   (c-beginning-of-function)
    (backward-paragraph))
  
  ;; Idea of ENDPOS is, indent each line, stopping when
***************
*** 1097,1103 ****
  		    (let (funbeg)
  		      ;; Find previous fcn-start.
  		      (save-excursion (forward-char 1)
! 				      (beginning-of-defun)
  				      (setq funbeg (point)))
  		      (setq opoint funbeg)
  		      ;; Try to find containing open,
--- 1112,1118 ----
  		    (let (funbeg)
  		      ;; Find previous fcn-start.
  		      (save-excursion (forward-char 1)
! 				      (c-beginning-of-function)
  				      (setq funbeg (point)))
  		      (setq opoint funbeg)
  		      ;; Try to find containing open,
Index: emacs/lisp/cal-menu.el
diff -c emacs/lisp/cal-menu.el:1.1.1.2 emacs/lisp/cal-menu.el:1.3
*** emacs/lisp/cal-menu.el:1.1.1.2	Mon Jul 22 01:30:48 1996
--- emacs/lisp/cal-menu.el	Wed Jul 31 01:33:18 1996
***************
*** 201,207 ****
    "Pop up menu to insert a Hebrew-date diary entry."
    (interactive "e")
    (let ((hebrew-selection
!          (x-popup-menu
            event
            (list "Hebrew insert menu"
                  (list (calendar-hebrew-date-string (calendar-cursor-to-date))
--- 201,207 ----
    "Pop up menu to insert a Hebrew-date diary entry."
    (interactive "e")
    (let ((hebrew-selection
!          (popup-menu
            event
            (list "Hebrew insert menu"
                  (list (calendar-hebrew-date-string (calendar-cursor-to-date))
***************
*** 214,220 ****
    "Pop up menu to insert an Islamic-date diary entry."
    (interactive "e")
    (let ((islamic-selection
!          (x-popup-menu
            event
            (list "Islamic insert menu"
                  (list (calendar-islamic-date-string (calendar-cursor-to-date))
--- 214,220 ----
    "Pop up menu to insert an Islamic-date diary entry."
    (interactive "e")
    (let ((islamic-selection
!          (popup-menu
            event
            (list "Islamic insert menu"
                  (list (calendar-islamic-date-string (calendar-cursor-to-date))
***************
*** 269,275 ****
    "Pop up menu of equivalent dates to mouse selected date."
    (interactive)
    (let ((date (calendar-event-to-date)))
!     (x-popup-menu
       event
       (list
        "Date Menu"
--- 269,275 ----
    "Pop up menu of equivalent dates to mouse selected date."
    (interactive)
    (let ((date (calendar-event-to-date)))
!     (popup-menu
       event
       (list
        "Date Menu"
***************
*** 298,304 ****
    (interactive "e")
    (let* ((date (calendar-event-to-date t))
           (selection
!           (x-popup-menu
             event
             (list "Menu"
                   (list
--- 298,304 ----
    (interactive "e")
    (let* ((date (calendar-event-to-date t))
           (selection
!           (popup-menu
             event
             (list "Menu"
                   (list
Index: emacs/lisp/calendar.el
diff -c emacs/lisp/calendar.el:1.1.1.2 emacs/lisp/calendar.el:1.3
*** emacs/lisp/calendar.el:1.1.1.2	Mon Jul 22 01:30:50 1996
--- emacs/lisp/calendar.el	Wed Jul 31 01:33:20 1996
***************
*** 153,159 ****
      (require 'faces)
      (make-face 'diary-face)
      (cond ((face-differs-from-default-p 'diary-face))
!           ((x-display-color-p) (set-face-foreground 'diary-face "red"))
            (t (copy-face 'bold 'diary-face)))
      'diary-face)
    "*Used to mark dates that have diary entries.
--- 153,159 ----
      (require 'faces)
      (make-face 'diary-face)
      (cond ((face-differs-from-default-p 'diary-face))
!           ((display-color-p) (set-face-foreground 'diary-face "red"))
            (t (copy-face 'bold 'diary-face)))
      'diary-face)
    "*Used to mark dates that have diary entries.
***************
*** 176,182 ****
      (require 'faces)
      (make-face 'holiday-face)
      (cond ((face-differs-from-default-p 'holiday-face))
!           ((x-display-color-p) (set-face-background 'holiday-face "pink"))
            (t (set-face-background 'holiday-face "black")
               (set-face-foreground 'holiday-face "white")))
      'holiday-face)
--- 176,182 ----
      (require 'faces)
      (make-face 'holiday-face)
      (cond ((face-differs-from-default-p 'holiday-face))
!           ((display-color-p) (set-face-background 'holiday-face "pink"))
            (t (set-face-background 'holiday-face "black")
               (set-face-foreground 'holiday-face "white")))
      'holiday-face)
Index: emacs/lisp/chistory.el
diff -c emacs/lisp/chistory.el:1.1.1.2 emacs/lisp/chistory.el:1.3
*** emacs/lisp/chistory.el:1.1.1.2	Mon Jul 22 01:31:00 1996
--- emacs/lisp/chistory.el	Wed Jul 31 01:33:26 1996
***************
*** 137,142 ****
--- 137,143 ----
    (define-key command-history-map "x" 'command-history-repeat)
    (define-key command-history-map "\n" 'next-line)
    (define-key command-history-map "\r" 'next-line)
+   (define-key command-history-map [delete] 'previous-line)
    (define-key command-history-map "\177" 'previous-line))
  
  (defun command-history-repeat ()
Index: emacs/lisp/cl-macs.el
diff -c emacs/lisp/cl-macs.el:1.1.1.2 emacs/lisp/cl-macs.el:1.3
*** emacs/lisp/cl-macs.el:1.1.1.2	Mon Jul 22 01:31:06 1996
--- emacs/lisp/cl-macs.el	Wed Jul 31 01:33:28 1996
***************
*** 1638,1647 ****
  (defsetf window-start set-window-start)
  (defsetf window-width () (store)
    (list 'progn (list 'enlarge-window (list '- store '(window-width)) t) store))
! (defsetf x-get-cutbuffer x-store-cutbuffer t)
! (defsetf x-get-cut-buffer x-store-cut-buffer t)   ; groan.
! (defsetf x-get-secondary-selection x-own-secondary-selection t)
! (defsetf x-get-selection x-own-selection t)
  
  ;;; More complex setf-methods.
  ;;; These should take &environment arguments, but since full arglists aren't
--- 1638,1647 ----
  (defsetf window-start set-window-start)
  (defsetf window-width () (store)
    (list 'progn (list 'enlarge-window (list '- store '(window-width)) t) store))
! (defsetf get-cutbuffer store-cutbuffer t)
! (defsetf get-cut-buffer store-cut-buffer t)   ; groan.
! (defsetf get-secondary-selection own-secondary-selection t)
! (defsetf get-selection own-selection t)
  
  ;;; More complex setf-methods.
  ;;; These should take &environment arguments, but since full arglists aren't
Index: emacs/lisp/compile.el
diff -c emacs/lisp/compile.el:1.1.1.2 emacs/lisp/compile.el:1.3
*** emacs/lisp/compile.el:1.1.1.2	Mon Jul 22 01:31:29 1996
--- emacs/lisp/compile.el	Wed Jul 31 01:33:33 1996
***************
*** 454,459 ****
--- 454,460 ----
    (let ((map (cons 'keymap compilation-minor-mode-map)))
      (define-key map " " 'scroll-up)
      (define-key map "\^?" 'scroll-down)
+     (define-key map [delete] 'scroll-down)
      ;; Set up the menu-bar
      (define-key map [menu-bar compilation-menu]
        (cons "Compile" (make-sparse-keymap "Compile")))
Index: emacs/lisp/cplus-md.el
diff -c emacs/lisp/cplus-md.el:1.1.1.2 emacs/lisp/cplus-md.el:1.3
*** emacs/lisp/cplus-md.el:1.1.1.2	Mon Jul 22 01:31:37 1996
--- emacs/lisp/cplus-md.el	Wed Jul 31 01:33:36 1996
***************
*** 110,115 ****
--- 110,116 ----
    (define-key c++-mode-map ";" 'electric-c++-semi)
    (define-key c++-mode-map "\e\C-h" 'mark-c-function)
    (define-key c++-mode-map "\e\C-q" 'indent-c++-exp)
+   (define-key c++-mode-map [delete] 'backward-delete-char-untabify)
    (define-key c++-mode-map "\177" 'backward-delete-char-untabify)
    (define-key c++-mode-map "\t" 'c++-indent-command)
  ;;   (define-key c++-mode-map "\C-c\C-i" 'c++-insert-header)
Index: emacs/lisp/dired.el
diff -c emacs/lisp/dired.el:1.1.1.2 emacs/lisp/dired.el:1.3
*** emacs/lisp/dired.el:1.1.1.2	Mon Jul 22 01:32:00 1996
--- emacs/lisp/dired.el	Wed Jul 31 01:33:39 1996
***************
*** 797,802 ****
--- 797,803 ----
    (define-key dired-mode-map "\M-$" 'dired-hide-all)
    ;; misc
    (define-key dired-mode-map "?" 'dired-summary)
+   (define-key dired-mode-map [delete] 'dired-unmark-backward)
    (define-key dired-mode-map "\177" 'dired-unmark-backward)
    (define-key dired-mode-map "\C-_" 'dired-undo)
    (define-key dired-mode-map "\C-xu" 'dired-undo)
***************
*** 804,811 ****
  
  ;; Make menu bar items.
  
! ;; Get rid of the Edit menu bar item to save space.
! (define-key dired-mode-map [menu-bar edit] 'undefined)
  
  (define-key dired-mode-map [menu-bar subdir]
    (cons "Subdir" (make-sparse-keymap "Subdir")))
--- 805,812 ----
  
  ;; Make menu bar items.
  
! ;; Get rid of the Edit menu bar item to save space if necessary.
! ;; (define-key dired-mode-map [menu-bar edit] 'undefined))
  
  (define-key dired-mode-map [menu-bar subdir]
    (cons "Subdir" (make-sparse-keymap "Subdir")))
Index: emacs/lisp/ebuff-menu.el
diff -c emacs/lisp/ebuff-menu.el:1.1.1.2 emacs/lisp/ebuff-menu.el:1.3
*** emacs/lisp/ebuff-menu.el:1.1.1.2	Mon Jul 22 01:32:13 1996
--- emacs/lisp/ebuff-menu.el	Wed Jul 31 01:33:43 1996
***************
*** 172,177 ****
--- 172,178 ----
      (define-key map "k" 'Buffer-menu-delete)
      (define-key map "\C-d" 'Buffer-menu-delete-backwards)
      ;(define-key map "\C-k" 'Buffer-menu-delete)
+     (define-key map [delete] 'Buffer-menu-backup-unmark)
      (define-key map "\177" 'Buffer-menu-backup-unmark)
      (define-key map "~" 'Buffer-menu-not-modified)
      (define-key map "u" 'Buffer-menu-unmark)
Index: emacs/lisp/echistory.el
diff -c emacs/lisp/echistory.el:1.1.1.1 emacs/lisp/echistory.el:1.2
*** emacs/lisp/echistory.el:1.1.1.1	Fri Jul 19 01:49:48 1996
--- emacs/lisp/echistory.el	Fri Jul 19 05:01:29 1996
***************
*** 69,74 ****
--- 69,75 ----
    (define-key electric-history-map "\e<" 'beginning-of-buffer)
    (define-key electric-history-map "\n" 'next-line)
    (define-key electric-history-map "\r" 'next-line)
+   (define-key electric-history-map [delete] 'previous-line)  
    (define-key electric-history-map "\177" 'previous-line)  
    (define-key electric-history-map "\C-n" 'next-line)
    (define-key electric-history-map "\C-p" 'previous-line)
Index: emacs/lisp/edebug.el
diff -c emacs/lisp/edebug.el:1.1.1.2 emacs/lisp/edebug.el:1.3
*** emacs/lisp/edebug.el:1.1.1.2	Mon Jul 22 01:32:16 1996
--- emacs/lisp/edebug.el	Wed Jul 31 01:33:46 1996
***************
*** 4362,4368 ****
  
    (easy-menu-define edebug-menu edebug-mode-map "Edebug menus" edebug-mode-menus)
    (if window-system
!       (x-popup-menu nil (lookup-key edebug-mode-map [menu-bar Edebug])))
    )
  
  
--- 4362,4368 ----
  
    (easy-menu-define edebug-menu edebug-mode-map "Edebug menus" edebug-mode-menus)
    (if window-system
!       (popup-menu nil (lookup-key edebug-mode-map [menu-bar Edebug])))
    )
  
  
Index: emacs/lisp/ediff-util.el
diff -c emacs/lisp/ediff-util.el:1.1.1.1 emacs/lisp/ediff-util.el:1.2
*** emacs/lisp/ediff-util.el:1.1.1.1	Mon Jul 22 01:32:21 1996
--- emacs/lisp/ediff-util.el	Wed Jul 31 01:33:51 1996
***************
*** 733,742 ****
  	      (progn
  		(ediff-reset-mouse control-frame)
  		(or ediff-xemacs-p
! 		    (cond ((eq (ediff-device-type) 'ns)
! 			   (unfocus-frame (selected-frame)))
! 			  (t (unfocus-frame))))
! 		))
  	  ))
      (ediff-eval-in-buffer control-buf
        (ediff-refresh-mode-lines))
--- 733,740 ----
  	      (progn
  		(ediff-reset-mouse control-frame)
  		(or ediff-xemacs-p
!                     (unfocus-frame))
!                 ))
  	  ))
      (ediff-eval-in-buffer control-buf
        (ediff-refresh-mode-lines))
Index: emacs/lisp/ehelp.el
diff -c emacs/lisp/ehelp.el:1.1.1.2 emacs/lisp/ehelp.el:1.3
*** emacs/lisp/ehelp.el:1.1.1.2	Mon Jul 22 01:32:32 1996
--- emacs/lisp/ehelp.el	Wed Jul 31 01:34:03 1996
***************
*** 44,49 ****
--- 44,50 ----
      (define-key map (char-to-string help-char) 'electric-help-help)
      (define-key map "?" 'electric-help-help)
      (define-key map " " 'scroll-up)
+     (define-key map [delete] 'scroll-down)
      (define-key map "\^?" 'scroll-down)
      (define-key map "." 'beginning-of-buffer)
      (define-key map "<" 'beginning-of-buffer)
Index: emacs/lisp/emerge.el
diff -c emacs/lisp/emerge.el:1.1.1.2 emacs/lisp/emerge.el:1.3
*** emacs/lisp/emerge.el:1.1.1.2	Mon Jul 22 01:32:38 1996
--- emacs/lisp/emerge.el	Wed Jul 31 01:34:05 1996
***************
*** 2810,2824 ****
        (while (< x-begin x-end)
  	;; bite off and compare no more than 1000 characters at a time
  	(let* ((compare-length (min (- x-end x-begin) 1000))
! 	       (x-string (emerge-eval-in-buffer 
  			  buffer-x
  			  (buffer-substring x-begin
  					    (+ x-begin compare-length))))
! 	       (y-string (emerge-eval-in-buffer
  			  buffer-y
  			  (buffer-substring y-begin
  					    (+ y-begin compare-length)))))
! 	  (if (not (string-equal x-string y-string))
  	      (throw 'exit nil)
  	    (setq x-begin (+ x-begin compare-length))
  	    (setq y-begin (+ y-begin compare-length)))))
--- 2810,2824 ----
        (while (< x-begin x-end)
  	;; bite off and compare no more than 1000 characters at a time
  	(let* ((compare-length (min (- x-end x-begin) 1000))
! 	       (string-x (emerge-eval-in-buffer 
  			  buffer-x
  			  (buffer-substring x-begin
  					    (+ x-begin compare-length))))
! 	       (string-y (emerge-eval-in-buffer
  			  buffer-y
  			  (buffer-substring y-begin
  					    (+ y-begin compare-length)))))
! 	  (if (not (string-equal string-x string-y))
  	      (throw 'exit nil)
  	    (setq x-begin (+ x-begin compare-length))
  	    (setq y-begin (+ y-begin compare-length)))))
Index: emacs/lisp/enriched.el
diff -c emacs/lisp/enriched.el:1.1.1.1 emacs/lisp/enriched.el:1.2
*** emacs/lisp/enriched.el:1.1.1.1	Mon Jul 22 01:32:40 1996
--- emacs/lisp/enriched.el	Wed Jul 31 01:34:08 1996
***************
*** 70,79 ****
    (make-face 'fixed)
    (if window-system
        (set-face-font 'fixed
! 		     (car (or (x-list-fonts "*fixed-medium*" 
! 					    'default (selected-frame))
! 			      (x-list-fonts "*fixed*" 
! 					    'default (selected-frame)))))))
  			      
  (if (internal-find-face 'excerpt)
      nil
--- 70,79 ----
    (make-face 'fixed)
    (if window-system
        (set-face-font 'fixed
! 		     (car (or (list-fonts "*fixed-medium*" 
! 					  'default (selected-frame))
! 			      (list-fonts "*fixed*" 
! 					  'default (selected-frame)))))))
  			      
  (if (internal-find-face 'excerpt)
      nil
Index: emacs/lisp/env.el
diff -c emacs/lisp/env.el:1.1.1.2 emacs/lisp/env.el:1.3
*** emacs/lisp/env.el:1.1.1.2	Mon Jul 22 01:32:41 1996
--- emacs/lisp/env.el	Wed Jul 31 01:34:10 1996
***************
*** 106,111 ****
--- 106,139 ----
  		    (cons (concat variable "=" value)
  			  process-environment)))))))
  
+ ;;;###autoload
+ (defun grabenv (&optional shell-path &rest startup)
+   "Run a shell subprocess, and interpret its output as a series of environment\n\
+ variables to insert into the emacs environment.  The first optional argument\n\
+ gives the path to the shell (defaults to \"/bin/csh\").  The remaining arguments\n\
+ are interpreted as a list of commands for it to execute (defaults to\n\
+ \"source /etc/login.std\", \"source ~/.login\" and \"setenv\")."
+   (let ((tmpbuf (get-buffer-create " tmp-env"))
+         (startlist (if startup startup '("source /etc/login.std"
+                                          "source ~/.login"
+                                          "setenv"))))
+     (save-excursion
+      (set-buffer tmpbuf)
+      (erase-buffer)
+      (while startlist
+        (insert (car startlist) "\n")
+        (setq startlist (cdr startlist)))
+      (call-process-region (point-min) (point-max)
+                           (if shell-path shell-path "/bin/csh")
+                           t t nil)
+      (goto-char (point-min))
+      (while (< (point) (point-max))
+        (if (looking-at "^\\([^=\n]*\\)=\\(.*\\)$")
+            (setenv (buffer-substring (match-beginning 1) (match-end 1))
+                    (buffer-substring (match-beginning 2) (match-end 2))))
+        (forward-line 1))
+      (kill-buffer tmpbuf))))
+ 
  (provide 'env)
  
  ;;; env.el ends here
Index: emacs/lisp/etags.el
diff -c emacs/lisp/etags.el:1.1.1.2 emacs/lisp/etags.el:1.3
*** emacs/lisp/etags.el:1.1.1.2	Mon Jul 22 01:32:43 1996
--- emacs/lisp/etags.el	Wed Jul 31 01:34:11 1996
***************
*** 1479,1484 ****
--- 1479,1485 ----
    (define-key map "t" 'select-tags-table-select)
    (define-key map " " 'next-line)
    (define-key map "\^?" 'previous-line)
+   (define-key map [delete] 'previous-line)
    (define-key map "n" 'next-line)
    (define-key map "p" 'previous-line)
    (define-key map "q" 'select-tags-table-quit)
Index: emacs/lisp/facemenu.el
diff -c emacs/lisp/facemenu.el:1.1.1.1 emacs/lisp/facemenu.el:1.2
*** emacs/lisp/facemenu.el:1.1.1.1	Mon Jul 22 01:32:46 1996
--- emacs/lisp/facemenu.el	Wed Jul 31 01:34:15 1996
***************
*** 412,419 ****
    "Read a color using the minibuffer."
    (let ((col (completing-read (or prompt "Color: ") 
  			      (or facemenu-color-alist
! 				  (if (eq 'x window-system)
! 				      (mapcar 'list (x-defined-colors))))
  			      nil t)))
      (if (equal "" col)
  	nil
--- 412,419 ----
    "Read a color using the minibuffer."
    (let ((col (completing-read (or prompt "Color: ") 
  			      (or facemenu-color-alist
! 				  (if (memq window-system '(x ns))
! 				      (mapcar 'list (defined-colors))))
  			      nil t)))
      (if (equal "" col)
  	nil
***************
*** 426,434 ****
  colors to display.  Otherwise, this command computes a list
  of colors that the current display can handle."
    (interactive)
!   (if (and (null list) (eq 'x window-system))
        (progn
! 	(setq list (x-defined-colors))
  	;; Delete duplicate colors.
  	(let ((l list))
  	  (while (cdr l)
--- 426,435 ----
  colors to display.  Otherwise, this command computes a list
  of colors that the current display can handle."
    (interactive)
!   ;; FIXME/cl defined-colors
!   (if (and (null list) (memq window-system '(x ns)))
        (progn
! 	(setq list (defined-colors))
  	;; Delete duplicate colors.
  	(let ((l list))
  	  (while (cdr l)
***************
*** 461,468 ****
  color names mean.  It returns nil if the colors differ or if it can't
  determine the correct answer."
    (cond ((equal a b) t)
! 	((and (eq 'x window-system)
! 	      (equal (x-color-values a) (x-color-values b))))))
  
  (defun facemenu-add-face (face start end)
    "Add FACE to text between START and END.
--- 462,469 ----
  color names mean.  It returns nil if the colors differ or if it can't
  determine the correct answer."
    (cond ((equal a b) t)
! 	((and (memq window-system '(x ns))
! 	      (equal (color-values a) (color-values b))))))
  
  (defun facemenu-add-face (face start end)
    "Add FACE to text between START and END.
***************
*** 523,532 ****
  		 (color (substring name 3)))
  	    (cond ((string-match "^fg:" name)
  		   (set-face-foreground face color)
! 		   (and (eq 'x window-system) (x-color-defined-p color)))
  		  ((string-match "^bg:" name)
  		   (set-face-background face color)
! 		   (and (eq 'x window-system) (x-color-defined-p color)))
  		  (t))))
        symbol))
  
--- 524,535 ----
  		 (color (substring name 3)))
  	    (cond ((string-match "^fg:" name)
  		   (set-face-foreground face color)
! 		   (and (memq window-system '(x ns))
!                         (color-defined-p color)))
  		  ((string-match "^bg:" name)
  		   (set-face-background face color)
! 		   (and (memq window-system '(x ns))
!                         (color-defined-p color)))
  		  (t))))
        symbol))
  
Index: emacs/lisp/faces.el
diff -c emacs/lisp/faces.el:1.1.1.2 emacs/lisp/faces.el:1.3
*** emacs/lisp/faces.el:1.1.1.2	Mon Jul 22 01:32:47 1996
--- emacs/lisp/faces.el	Wed Jul 31 01:34:18 1996
***************
*** 43,53 ****
  ;;;; Functions for manipulating face vectors.
  
  ;;; A face vector is a vector of the form:
! ;;;    [face NAME ID FONT FOREGROUND BACKGROUND STIPPLE UNDERLINE]
  
  ;;; Type checkers.
  (defsubst internal-facep (x)
!   (and (vectorp x) (= (length x) 8) (eq (aref x 0) 'face)))
  
  (defun facep (x)
    "Return t if X is a face name or an internal face vector."
--- 43,53 ----
  ;;;; Functions for manipulating face vectors.
  
  ;;; A face vector is a vector of the form:
! ;;;    [face NAME ID FONT FOREGROUND BACKGROUND STIPPLE UNDERLINE SIZE]
  
  ;;; Type checkers.
  (defsubst internal-facep (x)
!   (and (vectorp x) (= (length x) 9) (eq (aref x 0) 'face)))
  
  (defun facep (x)
    "Return t if X is a face name or an internal face vector."
***************
*** 107,112 ****
--- 107,119 ----
  If FRAME is omitted or nil, use the selected frame."
   (aref (internal-get-face face frame) 7))
  
+ (defsubst face-fontsize (face &optional frame)
+   "Return the font size name of face FACE, or nil if it is unspecified.
+ If the optional argument FRAME is given, report on face FACE in that frame.
+ If FRAME is t, report on the defaults for face FACE (for new frames).
+ If FRAME is omitted or nil, use the selected frame."
+   (aref (internal-get-face face frame) 8))
+ 
  
  ;;; Mutators.
  
***************
*** 115,121 ****
  If the optional FRAME argument is provided, change only
  in that frame; otherwise change each frame."
    (interactive (internal-face-interactive "font"))
!   (if (stringp font) (setq font (x-resolve-font-name font 'default frame)))
    (internal-set-face-1 face 'font font 3 frame))
  
  (defun set-face-foreground (face color &optional frame)
--- 122,128 ----
  If the optional FRAME argument is provided, change only
  in that frame; otherwise change each frame."
    (interactive (internal-face-interactive "font"))
!   (if (stringp font) (setq font (resolve-font-name font 'default frame)))
    (internal-set-face-1 face 'font font 3 frame))
  
  (defun set-face-foreground (face color &optional frame)
***************
*** 134,141 ****
    ;; if the display does not support a gray color.
    (if (and frame (not (eq frame t))
  	   (member color '("gray" "gray1" "gray3"))
! 	   (not (x-display-color-p frame))
! 	   (not (x-display-grayscale-p frame)))
        (set-face-stipple face color frame)
      (if (null frame)
  	(let ((frames (frame-list)))
--- 141,150 ----
    ;; if the display does not support a gray color.
    (if (and frame (not (eq frame t))
  	   (member color '("gray" "gray1" "gray3"))
! 	   (not (display-color-p frame))
! ;;; FIXME/cl
! ;	   (not (display-grayscale-p frame)))
!            )
        (set-face-stipple face color frame)
      (if (null frame)
  	(let ((frames (frame-list)))
***************
*** 168,173 ****
--- 177,191 ----
  in that frame; otherwise change each frame."
    (interactive (internal-face-interactive "underline-p" "underlined"))
    (internal-set-face-1 face 'underline underline-p 7 frame))
+ 
+ (defsubst set-face-fontsize (face size &optional frame)
+   "Specify the size of the font for face FACE.
+ If the optional FRAME argument is provided, change only
+ in that frame; otherwise change each frame."
+   (interactive (internal-face-interactive "size"))
+   (if (stringp size) (setq size (string-to-number size)))
+   (internal-set-face-1 face 'fontsize size 8 frame))
+ 
  
  (defun modify-face-read-string (face default name alist)
    (let ((value
***************
*** 183,188 ****
--- 201,207 ----
  	   default)
  	  (t value))))
  
+ ;;; FIXME/cl
  (defun modify-face (face foreground background stipple
  			 bold-p italic-p underline-p)
    "Change the display attributes for face FACE.
***************
*** 312,318 ****
  If the face already exists, it is unmodified."
    (interactive "SMake face: ")
    (or (internal-find-face name)
!       (let ((face (make-vector 8 nil)))
  	(aset face 0 'face)
  	(aset face 1 name)
  	(let* ((frames (frame-list))
--- 331,337 ----
  If the face already exists, it is unmodified."
    (interactive "SMake face: ")
    (or (internal-find-face name)
!       (let ((face (make-vector 9 nil)))
  	(aset face 0 'face)
  	(aset face 1 name)
  	(let* ((frames (frame-list))
***************
*** 327,334 ****
  	    (setq frames (cdr frames)))
  	  (setq global-face-data (cons (cons name face) global-face-data)))
  	;; when making a face after frames already exist
! 	(if (eq window-system 'x)
! 	    (make-face-x-resource-internal face))
  	;; add to menu
  	(if (fboundp 'facemenu-add-new-face)
  	    (facemenu-add-new-face name))
--- 346,356 ----
  	    (setq frames (cdr frames)))
  	  (setq global-face-data (cons (cons name face) global-face-data)))
  	;; when making a face after frames already exist
! 	(cond
!          ((eq window-system 'x)
!           (make-face-x-resource-internal face))
!          ((eq window-system 'ns)
!           (make-face-ns-resource-internal face)))
  	;; add to menu
  	(if (fboundp 'facemenu-add-new-face)
  	    (facemenu-add-new-face name))
***************
*** 402,407 ****
--- 424,479 ----
  	   )))
    face)
  
+ (defun safecapitalize (str)
+   (let ((case-fold-search nil))
+     (while (string-match "\\(^\\|[^A-Za-z]\\)\\([a-z]\\)" str)
+       (aset str (match-beginning 2) (- (aref str (match-beginning 2)) 32))))
+   str)
+ 
+ (defun make-face-ns-resource-internal (face &optional frame set-anyway)
+   (cond ((null frame)
+ 	 (let ((frames (frame-list)))
+ 	   (while frames
+ 	     (if (eq (framep (car frames)) 'ns)
+                  (make-face-ns-resource-internal (face-name face)
+                                                  (car frames) set-anyway))
+ 	     (setq frames (cdr frames)))))
+ 	(t
+ 	 (setq face (internal-get-face (face-name face) frame))
+ 	 (let* ((name (safecapitalize (concat (symbol-name (face-name face)))))
+ 		(fn  (or (get-resource nil (concat name "Font"))
+ 			 (and set-anyway (face-font face))))
+ 		(fg  (or (get-resource nil (concat name "Foreground"))
+ 			 (and set-anyway (face-foreground face))))
+ 		(bg  (or (get-resource nil (concat name "Background"))
+ 			 (and set-anyway (face-background face))))
+ 		(ulp (or (eq (get-lisp-resource nil (concat name "Underline")) t)
+ 			 (and set-anyway (face-underline-p face))))
+                 (size (or (get-resource nil (concat name "FontSize"))
+                           (and set-anyway (face-fontsize face)))))
+ 	   (if fn
+ 	       (condition-case ()
+ 		   (set-face-font face fn frame)
+ 		 (error (message "font `%s' not found for face `%s'" fn name))))
+ 	   (if fg
+ 	       (condition-case ()
+ 		   (set-face-foreground face fg frame)
+ 		 (error (message "color `%s' not allocated for face `%s'" fg name))))
+ 	   (if bg
+ 	       (condition-case ()
+ 		   (set-face-background face bg frame)
+ 		 (error (message "color `%s' not allocated for face `%s'" bg name))))
+ ;;	   (if bgp
+ ;;	       (condition-case ()
+ ;;		   (set-face-background-pixmap face bgp frame)
+ ;;		 (error (message "pixmap `%s' not found for face `%s'" bgp name))))
+ 	   (if (or ulp set-anyway)
+ 	       (set-face-underline-p face ulp frame))
+ 	   (if (or size set-anyway)
+ 	       (set-face-fontsize face size frame))
+ 	   )))
+   face)
+ 
  (defun copy-face (old-face new-face &optional frame new-frame)
    "Define a face just like OLD-FACE, with name NEW-FACE.
  If NEW-FACE already exists as a face, it is modified to be like OLD-FACE.
***************
*** 440,446 ****
  			(face-stipple old-face frame)
  			new-frame)
        (set-face-underline-p new-face (face-underline-p old-face frame)
! 			    new-frame))
      new-face))
  
  (defun face-equal (face1 face2 &optional frame)
--- 512,520 ----
  			(face-stipple old-face frame)
  			new-frame)
        (set-face-underline-p new-face (face-underline-p old-face frame)
! 			    new-frame)
!       (set-face-fontsize new-face (face-fontsize old-face frame)
!                          new-frame))
      new-face))
  
  (defun face-equal (face1 face2 &optional frame)
***************
*** 452,458 ****
         (equal (face-font face1 frame) (face-font face2 frame))
         (eq (face-underline-p face1 frame) (face-underline-p face2 frame))
         (equal (face-stipple face1 frame)
! 	      (face-stipple face2 frame))))
  
  (defun face-differs-from-default-p (face &optional frame)
    "True if face FACE displays differently from the default face, on FRAME.
--- 526,533 ----
         (equal (face-font face1 frame) (face-font face2 frame))
         (eq (face-underline-p face1 frame) (face-underline-p face2 frame))
         (equal (face-stipple face1 frame)
! 	      (face-stipple face2 frame))
!        (equal (face-fontsize face1 frame) (face-fontsize face2 frame))))
  
  (defun face-differs-from-default-p (face &optional frame)
    "True if face FACE displays differently from the default face, on FRAME.
***************
*** 479,484 ****
--- 554,562 ----
  		  (null (face-stipple face frame)))
  	      (equal (face-underline-p default frame)
  		     (face-underline-p face frame))
+               (or (equal (face-fontsize default frame)
+                          (face-fontsize face frame))
+                   (null (face-fontsize face frame)))
  	      ))))
  
  (defun face-nontrivial-p (face &optional frame)
***************
*** 491,497 ****
        (face-background face frame)
        (face-font face frame)
        (face-stipple face frame)
!       (face-underline-p face frame)))
  
  
  (defun invert-face (face &optional frame)
--- 569,576 ----
        (face-background face frame)
        (face-font face frame)
        (face-stipple face frame)
!       (face-underline-p face frame)
!       (face-fontsize face frame)))
  
  
  (defun invert-face (face &optional frame)
***************
*** 565,571 ****
    (setq x-font-regexp-weight (concat - weight -))
    nil)	    
  
! (defun x-resolve-font-name (pattern &optional face frame)
    "Return a font name matching PATTERN.
  All wildcards in PATTERN become substantiated.
  If PATTERN is nil, return the name of the frame's base font, which never
--- 644,650 ----
    (setq x-font-regexp-weight (concat - weight -))
    nil)	    
  
! (defun resolve-font-name (pattern &optional face frame)
    "Return a font name matching PATTERN.
  All wildcards in PATTERN become substantiated.
  If PATTERN is nil, return the name of the frame's base font, which never
***************
*** 577,584 ****
    (and (eq frame t)
         (setq frame nil))
    (if pattern
!       ;; Note that x-list-fonts has code to handle a face with nil as its font.
!       (let ((fonts (x-list-fonts pattern face frame)))
  	(or fonts
  	    (if face
  		(if (string-match "\\*" pattern)
--- 656,663 ----
    (and (eq frame t)
         (setq frame nil))
    (if pattern
!       ;; Note that list-fonts has code to handle a face with nil as its font.
!       (let ((fonts (list-fonts pattern face frame)))
  	(or fonts
  	    (if face
  		(if (string-match "\\*" pattern)
***************
*** 645,650 ****
--- 724,754 ----
  
  ;;; non-X-specific interface
  
+ (defun ns-convert-font-trait-alist-internal (font what)
+   (let ((a1 (cond ((eq what 'bold)
+                    (append (mapcar '(lambda (a) (cons (nth 0 a) (nth 1 a)))
+                                    ns-convert-font-trait-alist)
+                            (mapcar '(lambda (a) (cons (nth 2 a) (nth 3 a)))
+                                    ns-convert-font-trait-alist)))
+                   ((eq what 'italic)
+                    (append (mapcar '(lambda (a) (cons (nth 0 a) (nth 2 a)))
+                                    ns-convert-font-trait-alist)
+                            (mapcar '(lambda (a) (cons (nth 1 a) (nth 3 a)))
+                                    ns-convert-font-trait-alist)))
+                   ((eq what 'unbold)
+                    (append (mapcar '(lambda (a) (cons (nth 1 a) (nth 0 a)))
+                                    ns-convert-font-trait-alist)
+                            (mapcar '(lambda (a) (cons (nth 3 a) (nth 2 a)))
+                                    ns-convert-font-trait-alist)))
+                   ((eq what 'unitalic)
+                    (append (mapcar '(lambda (a) (cons (nth 2 a) (nth 0 a)))
+                                    ns-convert-font-trait-alist)
+                            (mapcar '(lambda (a) (cons (nth 3 a) (nth 1 a)))
+                                    ns-convert-font-trait-alist))))))
+     (if (setq a1 (assoc font a1))
+ 	(cdr a1)
+       (ns-convert-font-trait-internal font what))))
+ 
  (defun make-face-bold (face &optional frame noerror)
    "Make the font of the given face be bold, if possible.  
  If NOERROR is non-nil, return nil on failure."
***************
*** 678,687 ****
  
  (defun make-face-bold-internal (face frame font)
    (let (f2)
!     (or (and (setq f2 (x-make-font-bold font))
! 	     (internal-try-face-font face f2 frame))
! 	(and (setq f2 (x-make-font-demibold font))
! 	     (internal-try-face-font face f2 frame)))))
  
  (defun make-face-italic (face &optional frame noerror)
    "Make the font of the given face be italic, if possible.  
--- 782,796 ----
  
  (defun make-face-bold-internal (face frame font)
    (let (f2)
!     (cond
!      ((eq (framep frame) 'x)
!       (or (and (setq f2 (x-make-font-bold font))
!                (internal-try-face-font face f2 frame))
!           (and (setq f2 (x-make-font-demibold font))
!                (internal-try-face-font face f2 frame))))
!      ((eq (framep frame) 'ns)
!       (and (setq f2 (ns-convert-font-trait-alist-internal font 'bold))
!            (internal-try-face-font face f2 frame))))))
  
  (defun make-face-italic (face &optional frame noerror)
    "Make the font of the given face be italic, if possible.  
***************
*** 716,725 ****
  
  (defun make-face-italic-internal (face frame font)
    (let (f2)
!     (or (and (setq f2 (x-make-font-italic font))
! 	     (internal-try-face-font face f2 frame))
! 	(and (setq f2 (x-make-font-oblique font))
! 	     (internal-try-face-font face f2 frame)))))
  
  (defun make-face-bold-italic (face &optional frame noerror)
    "Make the font of the given face be bold and italic, if possible.  
--- 825,839 ----
  
  (defun make-face-italic-internal (face frame font)
    (let (f2)
!     (cond
!      ((eq (framep frame) 'x)
!       (or (and (setq f2 (x-make-font-italic font))
!                (internal-try-face-font face f2 frame))
!           (and (setq f2 (x-make-font-oblique font))
!                (internal-try-face-font face f2 frame))))
!      ((eq (framep frame) 'ns)
!       (and (setq f2 (ns-convert-font-trait-alist-internal font 'italic))
!            (internal-try-face-font face f2 frame))))))
  
  (defun make-face-bold-italic (face &optional frame noerror)
    "Make the font of the given face be bold and italic, if possible.  
***************
*** 752,777 ****
  
  (defun make-face-bold-italic-internal (face frame font)
    (let (f2 f3)
!     (or (and (setq f2 (x-make-font-italic font))
! 	     (not (equal font f2))
! 	     (setq f3 (x-make-font-bold f2))
! 	     (not (equal f2 f3))
! 	     (internal-try-face-font face f3 frame))
! 	(and (setq f2 (x-make-font-oblique font))
! 	     (not (equal font f2))
! 	     (setq f3 (x-make-font-bold f2))
! 	     (not (equal f2 f3))
! 	     (internal-try-face-font face f3 frame))
! 	(and (setq f2 (x-make-font-italic font))
! 	     (not (equal font f2))
! 	     (setq f3 (x-make-font-demibold f2))
! 	     (not (equal f2 f3))
! 	     (internal-try-face-font face f3 frame))
! 	(and (setq f2 (x-make-font-oblique font))
! 	     (not (equal font f2))
! 	     (setq f3 (x-make-font-demibold f2))
! 	     (not (equal f2 f3))
! 	     (internal-try-face-font face f3 frame)))))
  
  (defun make-face-unbold (face &optional frame noerror)
    "Make the font of the given face be non-bold, if possible.  
--- 866,897 ----
  
  (defun make-face-bold-italic-internal (face frame font)
    (let (f2 f3)
!     (cond
!      ((eq (framep frame) 'x)
!       (or (and (setq f2 (x-make-font-italic font))
!                (not (equal font f2))
!                (setq f3 (x-make-font-bold f2))
!                (not (equal f2 f3))
!                (internal-try-face-font face f3 frame))
!           (and (setq f2 (x-make-font-oblique font))
!                (not (equal font f2))
!                (setq f3 (x-make-font-bold f2))
!                (not (equal f2 f3))
!                (internal-try-face-font face f3 frame))
!           (and (setq f2 (x-make-font-italic font))
!                (not (equal font f2))
!                (setq f3 (x-make-font-demibold f2))
!                (not (equal f2 f3))
!                (internal-try-face-font face f3 frame))
!           (and (setq f2 (x-make-font-oblique font))
!                (not (equal font f2))
!                (setq f3 (x-make-font-demibold f2))
!                (not (equal f2 f3))
!                (internal-try-face-font face f3 frame))))
!      ((eq (framep frame) 'ns)
!       (and (setq f2 (ns-convert-font-trait-alist-internal font 'italic))
!            (setq f2 (ns-convert-font-trait-alist-internal f2 'bold))
!            (internal-try-face-font face f2 frame))))))
  
  (defun make-face-unbold (face &optional frame noerror)
    "Make the font of the given face be non-bold, if possible.  
***************
*** 799,810 ****
  	(setq font1 (or font1
  			(face-font 'default frame)
  			(cdr (assq 'font (frame-parameters frame)))))
! 	(setq font (and font1 (x-make-font-unbold font1)))
! 	(if font (internal-try-face-font face font frame)))
        (or (not (equal ofont (face-font face)))
  	  (and (not noerror)
  	       (error "No unbold version of %S" font1))))))
  
  (defun make-face-unitalic (face &optional frame noerror)
    "Make the font of the given face be non-italic, if possible.  
  If NOERROR is non-nil, return nil on failure."
--- 919,938 ----
  	(setq font1 (or font1
  			(face-font 'default frame)
  			(cdr (assq 'font (frame-parameters frame)))))
!         (make-face-unbold-internal face frame))
        (or (not (equal ofont (face-font face)))
  	  (and (not noerror)
  	       (error "No unbold version of %S" font1))))))
  
+ (defun make-face-unbold-internal (face frame)
+   (cond
+    ((eq (framep frame) 'x)
+     (and (setq f2 (x-make-font-unbold font1))
+          (internal-try-face-font face f2 frame)))
+    ((eq (framep frame) 'ns)
+     (and (setq f2 (ns-convert-font-trait-alist-internal font1 'unbold))
+          (internal-try-face-font face f2 frame)))))
+ 
  (defun make-face-unitalic (face &optional frame noerror)
    "Make the font of the given face be non-italic, if possible.  
  If NOERROR is non-nil, return nil on failure."
***************
*** 831,841 ****
  	(setq font1 (or font1
  			(face-font 'default frame)
  			(cdr (assq 'font (frame-parameters frame)))))
! 	(setq font (and font1 (x-make-font-unitalic font1)))
! 	(if font (internal-try-face-font face font frame)))
        (or (not (equal ofont (face-font face)))
  	  (and (not noerror)
  	       (error "No unitalic version of %S" font1))))))
  
  (defvar list-faces-sample-text
    "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"
--- 959,977 ----
  	(setq font1 (or font1
  			(face-font 'default frame)
  			(cdr (assq 'font (frame-parameters frame)))))
!         (make-face-unitalic-internal face frame))
        (or (not (equal ofont (face-font face)))
  	  (and (not noerror)
  	       (error "No unitalic version of %S" font1))))))
+ 
+ (defun make-face-unitalic-internal (face frame)
+   (cond
+    ((eq (framep frame) 'x)
+     (and (setq f2 (x-make-font-unitalic font1))
+          (internal-try-face-font face f2 frame)))
+    ((eq (framep frame) 'ns)
+     (and (setq f2 (ns-convert-font-trait-alist-internal font1 'unitalic))
+          (internal-try-face-font face f2 frame)))))
  
  (defvar list-faces-sample-text
    "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"
***************
*** 914,925 ****
    (make-face-bold-italic 'bold-italic t)
  
    (set-face-background 'highlight '("darkseagreen2" "green" t) t)
!   (set-face-background 'region '("gray" underline) t)
    (set-face-background 'secondary-selection '("paleturquoise" "green" t) t)
!   (set-face-background 'modeline '(t) t)
    (set-face-underline-p 'underline t t)
  
!   ;; Set up the faces of all existing X Window frames
    ;; from those global properties, unless already set in a given frame.
  
    (let ((frames (frame-list)))
--- 1050,1061 ----
    (make-face-bold-italic 'bold-italic t)
  
    (set-face-background 'highlight '("darkseagreen2" "green" t) t)
!   (set-face-background 'region '("Dark Gray" "gray" underline) t)
    (set-face-background 'secondary-selection '("paleturquoise" "green" t) t)
!   (set-face-background 'modeline '("Dark Gray" t) t)
    (set-face-underline-p 'underline t t)
  
!   ;; Set up the faces of all existing X Window and NS frames
    ;; from those global properties, unless already set in a given frame.
  
    (let ((frames (frame-list)))
***************
*** 935,968 ****
        (setq frames (cdr frames)))))
  
  
! ;; Like x-create-frame but also set up the faces.
  
! (defun x-create-frame-with-faces (&optional parameters)
    ;; Read this frame's geometry resource, if it has an explicit name,
    ;; and put the specs into PARAMETERS.
!   (let* ((name (or (cdr (assq 'name parameters))
! 		   (cdr (assq 'name default-frame-alist))))
! 	 (x-resource-name name)
! 	 (res-geometry (if name (x-get-resource "geometry" "Geometry")))
! 	 parsed)
!     (if res-geometry
! 	(progn
! 	  (setq parsed (x-parse-geometry res-geometry))
! 	  ;; If the resource specifies a position,
! 	  ;; call the position and size "user-specified".
! 	  (if (or (assq 'top parsed) (assq 'left parsed))
! 	      (setq parsed (cons '(user-position . t)
! 				 (cons '(user-size . t) parsed))))
! 	  ;; Put the geometry parameters at the end.
! 	  ;; Copy default-frame-alist so that they go after it.
! 	  (setq parameters (append parameters
! 				   default-frame-alist
! 				   parsed)))))
    (if (null global-face-data)
!       (x-create-frame parameters)
      (let* ((visibility-spec (assq 'visibility parameters))
! 	   (frame (x-create-frame (cons '(visibility . nil) parameters)))
! 	   (faces (copy-alist global-face-data))
  	   success
  	   (rest faces))
        (unwind-protect
--- 1071,1110 ----
        (setq frames (cdr frames)))))
  
  
! ;; Like create-frame but also set up the faces.
  
! (defun create-frame-with-faces (&optional parameters)
    ;; Read this frame's geometry resource, if it has an explicit name,
    ;; and put the specs into PARAMETERS.
!   ;; FIXME/cl x resource stuff
!   (if (eq window-system 'x)
!       (let* ((name (or (cdr (assq 'name parameters))
!                        (cdr (assq 'name default-frame-alist))))
!              (x-resource-name name)
!              (res-geometry (if name (x-get-resource "geometry" "Geometry")))
!              parsed)
!         (if res-geometry
!             (progn
!               (setq parsed (x-parse-geometry res-geometry))
!               ;; If the resource specifies a position,
!               ;; call the position and size "user-specified".
!               (if (or (assq 'top parsed) (assq 'left parsed))
!                   (setq parsed (cons '(user-position . t)
!                                      (cons '(user-size . t) parsed))))
!               ;; Put the geometry parameters at the end.
!               ;; Copy default-frame-alist so that they go after it.
!               (setq parameters (append parameters
!                                        default-frame-alist
!                                        parsed))))))
    (if (null global-face-data)
!       (create-frame parameters)
      (let* ((visibility-spec (assq 'visibility parameters))
! 	   (frame
!             (create-frame (cond ((eq window-system 'ns)
!                                  parameters)
!                                 (t
!                                  (cons '(visibility . nil) parameters)))))
!            (faces (copy-alist global-face-data))
  	   success
  	   (rest faces))
        (unwind-protect
***************
*** 971,981 ****
  
  	    (if (cdr (or (assq 'reverse parameters)
  			 (assq 'reverse default-frame-alist)
! 			 (let ((resource (x-get-resource "reverseVideo"
! 							 "ReverseVideo")))
! 			   (if resource
! 			       (cons nil (member (downcase resource)
! 						 '("on" "true")))))))
  		(let* ((params (frame-parameters frame))
  		       (bg (cdr (assq 'foreground-color params)))
  		       (fg (cdr (assq 'background-color params))))
--- 1113,1124 ----
  
  	    (if (cdr (or (assq 'reverse parameters)
  			 (assq 'reverse default-frame-alist)
!                          (and (eq window-system 'x)
!                               (let ((resource (x-get-resource "reverseVideo"
!                                                               "ReverseVideo")))
!                                 (if resource
!                                     (cons nil (member (downcase resource)
!                                                       '("on" "true"))))))))
  		(let* ((params (frame-parameters frame))
  		       (bg (cdr (assq 'foreground-color params)))
  		       (fg (cdr (assq 'background-color params))))
***************
*** 992,1011 ****
  		      (modify-frame-parameters frame
  					       (list (cons 'cursor-color fg))))))
  	    ;; Copy the vectors that represent the faces.
! 	    ;; Also fill them in from X resources.
  	    (while rest
  	      (let ((global (cdr (car rest))))
  		(setcdr (car rest) (vector 'face
  					   (face-name (cdr (car rest)))
  					   (face-id (cdr (car rest)))
! 					   nil nil nil nil nil))
  		(face-fill-in (car (car rest)) global frame))
! 	      (make-face-x-resource-internal (cdr (car rest)) frame t)
  	      (setq rest (cdr rest)))
! 	    (if (null visibility-spec)
! 		(make-frame-visible frame)
! 	      (modify-frame-parameters frame (list visibility-spec)))
! 	    (setq success t)
  	    frame)
  	(or success
  	    (delete-frame frame))))))
--- 1135,1159 ----
  		      (modify-frame-parameters frame
  					       (list (cons 'cursor-color fg))))))
  	    ;; Copy the vectors that represent the faces.
! 	    ;; Also fill them in from resources.
  	    (while rest
  	      (let ((global (cdr (car rest))))
  		(setcdr (car rest) (vector 'face
  					   (face-name (cdr (car rest)))
  					   (face-id (cdr (car rest)))
! 					   nil nil nil nil nil nil))
  		(face-fill-in (car (car rest)) global frame))
!               (cond
!                ((eq (framep frame) 'x)
!                 (make-face-x-resource-internal (cdr (car rest)) frame t))
!                ((eq (framep frame) 'ns)
!                 (make-face-ns-resource-internal (cdr (car rest)) frame t)))
  	      (setq rest (cdr rest)))
! 	    (or (eq window-system 'ns)
!                 (if (null visibility-spec)
!                     (make-frame-visible frame)
!                   (modify-frame-parameters frame (list visibility-spec))))
!             (setq success t)
  	    frame)
  	(or success
  	    (delete-frame frame))))))
***************
*** 1099,1119 ****
  ;; Assuming COLOR is a valid color name,
  ;; return t if it can be displayed on FRAME.
  (defun face-color-supported-p (frame color background-p)
!   (or (x-display-color-p frame)
        ;; A black-and-white display can implement these.
        (member color '("black" "white"))
        ;; A black-and-white display can fake these for background.
        (and background-p
  	   (member color '("gray" "gray1" "gray3")))
        ;; A grayscale display can implement colors that are gray (more or less).
!       (and (x-display-grayscale-p frame)
! 	   (let* ((values (x-color-values color frame))
! 		  (r (nth 0 values))
! 		  (g (nth 1 values))
! 		  (b (nth 2 values)))
! 	     (and (< (abs (- r g)) (/ (abs (+ r g)) 20))
! 		  (< (abs (- g b)) (/ (abs (+ g b)) 20))
! 		  (< (abs (- b r)) (/ (abs (+ b r)) 20)))))))
  
  ;; Use FUNCTION to store a color in FACE on FRAME.
  ;; COLORS is either a single color or a list of colors.
--- 1247,1269 ----
  ;; Assuming COLOR is a valid color name,
  ;; return t if it can be displayed on FRAME.
  (defun face-color-supported-p (frame color background-p)
!   (or (display-color-p frame)
        ;; A black-and-white display can implement these.
        (member color '("black" "white"))
        ;; A black-and-white display can fake these for background.
        (and background-p
  	   (member color '("gray" "gray1" "gray3")))
        ;; A grayscale display can implement colors that are gray (more or less).
! ;;; FIXME/cl
!       ))
! ;      (and (display-grayscale-p frame)
! ;	   (let* ((values (color-values color frame))
! ;		  (r (nth 0 values))
! ;		  (g (nth 1 values))
! ;		  (b (nth 2 values)))
! ;	     (and (< (abs (- r g)) (/ (abs (+ r g)) 20))
! ;		  (< (abs (- g b)) (/ (abs (+ g b)) 20))
! ;		  (< (abs (- b r)) (/ (abs (+ b r)) 20)))))))
  
  ;; Use FUNCTION to store a color in FACE on FRAME.
  ;; COLORS is either a single color or a list of colors.
***************
*** 1122,1127 ****
--- 1272,1279 ----
  ;; t as COLORS or as an element of COLORS means to invert the face.
  ;; That can't fail, so any subsequent elements after the t are ignored.
  (defun face-try-color-list (function face colors frame)
+   (if (and (symbolp colors) (not (eq colors t)))
+       (setq colors (symbol-name colors)))
    (if (stringp colors)
        (if (face-color-supported-p frame colors
  				  (eq function 'set-face-background))
***************
*** 1156,1163 ****
  		       (funcall function face (car colors) frame)))))
  	  (setq colors (cdr colors)))))))
  
! ;; If we are already using x-window frames, initialize faces for them.
! (if (eq (framep (selected-frame)) 'x)
      (face-initialize))
  
  (provide 'faces)
--- 1308,1315 ----
  		       (funcall function face (car colors) frame)))))
  	  (setq colors (cdr colors)))))))
  
! ;; If we are already using window frames, initialize faces for them.
! (if (not (memq (framep (selected-frame)) '(t nil)))
      (face-initialize))
  
  (provide 'faces)
Index: emacs/lisp/files.el
diff -c emacs/lisp/files.el:1.1.1.2 emacs/lisp/files.el:1.3
*** emacs/lisp/files.el:1.1.1.2	Mon Jul 22 01:32:50 1996
--- emacs/lisp/files.el	Wed Jul 31 01:34:20 1996
***************
*** 856,868 ****
  				  ("\\.hh\\'" . c++-mode)
  				  ("\\.C\\'" . c++-mode)
  				  ("\\.H\\'" . c++-mode)
  				  ("\\.cpp\\'" . c++-mode)
  				  ("\\.cxx\\'" . c++-mode)
  				  ("\\.hxx\\'" . c++-mode)
  				  ("\\.c\\+\\+\\'" . c++-mode)
  				  ("\\.h\\+\\+\\'" . c++-mode)
  ;;;				  ("\\.mk\\'" . makefile-mode)
- ;;;				  ("[Mm]akefile" . makefile-mode)
  ;;; Less common extensions come here
  ;;; so more common ones above are found faster.
  				  ("\\.texinfo\\'" . texinfo-mode)
--- 856,869 ----
  				  ("\\.hh\\'" . c++-mode)
  				  ("\\.C\\'" . c++-mode)
  				  ("\\.H\\'" . c++-mode)
+ 				  ("\\.m\\'" . objc-mode)
+ 				  ("[Mm]akefile" . makefile-mode)
  				  ("\\.cpp\\'" . c++-mode)
  				  ("\\.cxx\\'" . c++-mode)
  				  ("\\.hxx\\'" . c++-mode)
  				  ("\\.c\\+\\+\\'" . c++-mode)
  				  ("\\.h\\+\\+\\'" . c++-mode)
  ;;;				  ("\\.mk\\'" . makefile-mode)
  ;;; Less common extensions come here
  ;;; so more common ones above are found faster.
  				  ("\\.texinfo\\'" . texinfo-mode)
Index: emacs/lisp/font-lock.el
diff -c emacs/lisp/font-lock.el:1.1.1.2 emacs/lisp/font-lock.el:1.3
*** emacs/lisp/font-lock.el:1.1.1.2	Mon Jul 22 01:33:04 1996
--- emacs/lisp/font-lock.el	Wed Jul 31 01:34:24 1996
***************
*** 918,923 ****
--- 918,1082 ----
  				 c++-font-lock-keywords-1)
    "Additional expressions to highlight in C++ mode.")
  
+ (defconst objc-font-lock-keywords-1 nil
+  "For consideration as a value of `objc-font-lock-keywords'.
+ This does fairly subdued highlighting.")
+ 
+ (defconst objc-font-lock-keywords-2 nil
+  "For consideration as a value of `objc-font-lock-keywords'.
+ This does a lot more highlighting.")
+ 
+ (let ((storage "auto\\|extern\\|register\\|static\\|volatile")
+       (prefixes "unsigned\\|short\\|long")
+       (types (concat "int\\|char\\|float\\|double\\|void\\|struct\\|"
+ 		     "union\\|enum\\|typedef"))
+       (ctoken "[a-zA-Z0-9_:~*]+")
+       )
+   (setq objc-font-lock-keywords-1
+    (list
+     ;; fontify preprocessor directives as comments.
+     '("^#[ \t]*[a-z]+" . font-lock-comment-face)
+     ;;
+     ;; fontify C++-style comments as comments.
+     '("//.*" . font-lock-comment-face)
+     ;;
+     ;; fontify names being defined.
+     '("^#[ \t]*\\(define\\|undef\\)[ \t]+\\(\\(\\sw\\|\\s_\\)+\\)" 2
+       font-lock-function-name-face)
+     ;;
+     ;; fontify other preprocessor lines.
+     '("^#[ \t]*\\(if\\|ifn?def\\)[ \t]+\\([^\n]+\\)"
+       2 font-lock-function-name-face t)
+     ;;
+     ;; fontify the filename in #include <...>
+     ;; don't need to do this for #include "..." because those were
+     ;; already fontified as strings by the syntactic pass.
+     '("^#[ \t]*include[ \t]+\\(<[^>\"\n]+>\\)" 1 font-lock-string-face)
+     ;;
+     ;; fontify the names of functions being defined.
+     (list (concat
+ 	   "^\\(" ctoken "[ \t]+\\)?"	; type specs; there can be no
+ 	   "\\(" ctoken "[ \t]+\\)?"	; more than 3 tokens, right?
+ 	   "\\(" ctoken "[ \t]+\\)?"
+ 	   "\\([*&]+[ \t]*\\)?"		; pointer
+ 	   "\\(" ctoken "\\)[ \t]*(")		; name
+ 	  5 'font-lock-function-name-face)
+     ;;
+     ;; fontify the (first word of) names of methods being defined.
+     (list (concat
+ 	   "^[+-][ \t]+"
+ 	   "\\(("                          ;; typecasts are inside parens
+ 	   "\\(" ctoken "[ \t]+\\)?"       ;; as above, <= 3, right?
+ 	   "\\(" ctoken "[ \t]+\\)?"
+ 	   "\\(" ctoken "[ \t]*\\)?"
+ 	   "\\(\*+[ \t]*\\)?"              ;; pointer
+ 	   ")[ \t]*\\)?"                   ;; end of typecast
+ 	   "\\(" ctoken "\\):?[ \t]*")
+ 	  6 'font-lock-function-name-face)
+     ;;
+     ;; fontify succeeding words of method names, provided they
+     ;; are written in the pattern
+     ;;    - firstWord: param
+     ;;      word: param
+     ;;      ...
+     ;;
+     ;; This looks bad when message expressions are formatted in the
+     ;; same way, e.g.
+     ;;    [receiver firstWord: param
+     ;;              word: param
+     ;;     ...]
+     (list (concat
+ 	   "^[ \t]+\\(" ctoken ":[ \t]*\\)")
+ 	  1 'font-lock-function-name-face)
+     ;;
+     ;;
+     ;; Fontify structure names (in structure definition form).
+     (list (concat "^\\(typedef[ \t]+struct\\|struct\\|static[ \t]+struct\\)"
+ 		  "[ \t]+\\(" ctoken "\\)[ \t]*\\(\{\\|$\\)")
+ 	  2 'font-lock-function-name-face)
+     ;;
+     ;; Fontify case clauses.  This is fast because its anchored on the left.
+     '("case[ \t]+\\(\\(\\sw\\|\\s_\\)+\\):". 1)
+     '("\\<\\(default\\):". 1)
+     ))
+ 
+   (setq objc-font-lock-keywords-2
+    (append objc-font-lock-keywords-1
+     (list
+      ;;
+      ;; fontify all storage classes and type specifiers
+      (cons (concat "\\<\\(" storage "\\)\\>") 'font-lock-type-face)
+      (cons (concat "\\<\\(" types "\\)\\>") 'font-lock-type-face)
+      (cons (concat "\\<\\(" prefixes "[ \t]+" types "\\)\\>")
+ 	   'font-lock-type-face)
+      ;;
+      ;; fontify all compiler directives
+      (cons (concat
+ 	    "^\\("
+ 	    (mapconcat 'identity
+ 		       '(
+ 			 "@interface" "@implementation" "@protocol" "@end"
+ 			 "@private" "@protected" "@public"
+ 			 "@class" "@selector" "@encode" "@defs"
+ 			 )
+ 		       "\\|")
+ 	    "\\)[ \t\n(){}		;,]")
+ 		  1)
+      ;;
+      ;; fontify all builtin tokens
+ 	    (cons (concat
+ 		   "[ \t]\\("
+ 		   (mapconcat 'identity
+ 			      '("for" "while" "do" "return" "goto"
+ 				"case" "break" "switch" "if" "then"
+ 				"else if" "else" "return" "default"
+ 				"continue" "default"
+ 				"@interface" "@implementation"
+ 				"@protocol" "@end" "@private"
+ 				"@protected" "@public" "@class"
+ 				"@selector" "@encode" "@defs"
+ 				)
+ 			      "\\|")
+ 		   "\\)[ \t\n(){};,]")
+ 		  1)
+ 	    ;;
+ 	    ;; fontify case targets and goto-tags.  This is slow because the
+ 	    ;; expression is anchored on the right.
+ 	    ;;"\\(\\(\\sw\\|\\s_\\)+\\):"
+ 	    ;;
+ 	    ;; Fontify variables declared with structures, or typedef names.
+ 	    '("}[ \t*]*\\(\\(\\sw\\|\\s_\\)+\\)[ \t]*[,;]"
+ 	      1 font-lock-function-name-face)
+ 	    ;;
+ 	    ;; Fontify global variables without a type.
+ 					;     '("^\\([_a-zA-Z0-9:~*]+\\)[ \t]*[[;={]" 1 font-lock-function-name-face)
+ 
+ 	    )))
+   )
+ 
+ ; default to the gaudier variety:
+ (defvar objc-font-lock-keywords objc-font-lock-keywords-2
+   "Additional expressions to highlight in Objective-C mode.")
+ 
+ (defvar perl-font-lock-keywords
+   (list
+    (cons (concat "[ \n\t{]*\\("
+ 		 (mapconcat 'identity
+ 			    '("if" "until" "while" "elsif" "else" "unless" "for"
+ 			      "foreach" "continue" "exit" "die" "last" "goto" "next"
+ 			      "redo" "return" "local" "exec")
+ 			    "\\|")
+ 		 "\\)[ \n\t;(]") 1)
+    (mapconcat 'identity
+ 	      '("#endif" "#else" "#ifdef" "#ifndef" "#if" "#include"
+ 		"#define" "#undef")
+ 	      "\\|")
+    '("^[ \n\t]*sub[ \t]+\\([^ \t{]+\\)[ \t]*[{]" 1 font-lock-function-name-face)
+    '("[ \n\t{]*\\(eval\\)[ \n\t(;]" 1 font-lock-function-name-face)
+    '("\\(--- .* ---\\|=== .* ===\\)" . font-lock-doc-string-face)
+    )
+   "Additional expressions to highlight in Perl mode.")
+ 
  (defvar tex-font-lock-keywords
  ;;   '("\\(\\\\\\([a-zA-Z@]+\\|.\\)\\)" 1 font-lock-keyword-face t)
  ;;   '("{\\\\em\\([^}]+\\)}" 1 font-lock-comment-face t)
***************
*** 969,974 ****
--- 1128,1169 ----
  		(setq slist (cdr slist))))))))
  
  ;; Install ourselves:
+ 
+ (defun font-lock-set-defaults ()
+   "Set `font-lock-keywords' to something appropriate for this mode."
+   (if (memq major-mode '(rmail-mode dired-mode compilation-mode shell-mode))
+       (setq font-lock-no-comments t))
+   (if (not font-lock-keywords)		; if not already set.
+       (setq font-lock-keywords
+ 	    (cond ((eq major-mode 'lisp-mode)	    lisp-font-lock-keywords)
+ 		  ((eq major-mode 'emacs-lisp-mode) lisp-font-lock-keywords)
+ 		  ((eq major-mode 'c-mode)
+ 		   (make-local-variable 'font-lock-syntax-table)
+ 		   (setq font-lock-syntax-table
+ 			 (copy-syntax-table (syntax-table)))
+ 		   (modify-syntax-entry ?_ "w" font-lock-syntax-table)
+ 		   c-font-lock-keywords)
+ 		  ((eq major-mode 'c++-c-mode)
+ 		   (make-local-variable 'font-lock-syntax-table)
+ 		   (setq font-lock-syntax-table
+ 			 (copy-syntax-table (syntax-table)))
+ 		   (modify-syntax-entry ?_ "w" font-lock-syntax-table)
+ 		   c-font-lock-keywords)
+ 		  ((eq major-mode 'c++-mode)	    c++-font-lock-keywords)
+                   ((eq major-mode 'objc-mode)       objc-font-lock-keywords)
+ 		  ((eq major-mode 'perl-mode) 	    perl-font-lock-keywords)
+ 		  ((eq major-mode 'plain-tex-mode)  tex-font-lock-keywords)
+ 		  ((eq major-mode 'latex-mode)      tex-font-lock-keywords)
+ 		  ((eq major-mode 'slitex-mode)     tex-font-lock-keywords)
+ 		  ((eq major-mode 'texinfo-mode)    texi-font-lock-keywords)
+ 		  ((eq major-mode 'shell-mode)      shell-font-lock-keywords)
+ 		  ((eq major-mode 'dired-mode)      dired-font-lock-keywords)
+ 		  ((eq major-mode 'rmail-mode)      rmail-font-lock-keywords)
+ 		  ((eq major-mode 'rmail-summary-mode)
+ 		   rmail-summary-font-lock-keywords)
+ 		  ((eq major-mode 'compilation-mode)
+ 		   compilation-mode-font-lock-keywords)
+ 		  (t nil)))))
  
  (or (assq 'font-lock-mode minor-mode-alist)
      (setq minor-mode-alist (cons '(font-lock-mode " Font") minor-mode-alist)))
Index: emacs/lisp/frame.el
diff -c emacs/lisp/frame.el:1.1.1.2 emacs/lisp/frame.el:1.3
*** emacs/lisp/frame.el:1.1.1.2	Mon Jul 22 01:33:13 1996
--- emacs/lisp/frame.el	Wed Jul 31 01:34:27 1996
***************
*** 584,589 ****
--- 584,598 ----
    ;; Update faces that want a bold or italic version of the default font.
    (frame-update-faces (selected-frame)))
  
+ (defun set-default-fontsize (font-name)
+   "Set the fontsize of the selected frame to FONT.
+ When called interactively, prompt for the fontsize to use."
+   (interactive "nFontsize: ")
+   (modify-frame-parameters (selected-frame)
+ 			   (list (cons 'fontsize font-name)))
+   ;; Update faces that want a bold or italic version of the default font.
+   (frame-update-faces (selected-frame)))
+ 
  (defun set-background-color (color-name)
    "Set the background color of the selected frame to COLOR.
  When called interactively, prompt for the name of the color to use."
***************
*** 606,611 ****
--- 615,627 ----
    (interactive "sColor: ")
    (modify-frame-parameters (selected-frame)
  			   (list (cons 'cursor-color color-name))))
+ 
+ (defun set-cursor-type (type)
+   "Set the text cursor type of the selected frame to TYPE.
+ When called interactively, prompt for the TYPE to use."
+   (interactive "sType: ")
+   (modify-frame-parameters (selected-frame)
+ 			   (list (cons 'cursor-type type))))
  
  (defun set-mouse-color (color-name)
    "Set the color of the mouse pointer of the selected frame to COLOR.
Index: emacs/lisp/gnus.el
diff -c emacs/lisp/gnus.el:1.1.1.2 emacs/lisp/gnus.el:1.3
*** emacs/lisp/gnus.el:1.1.1.2	Mon Jul 22 01:33:19 1996
--- emacs/lisp/gnus.el	Wed Jul 31 01:34:32 1996
***************
*** 951,956 ****
--- 951,957 ----
    (define-key gnus-group-mode-map "n" 'gnus-group-next-unread-group)
    (define-key gnus-group-mode-map "p" 'gnus-group-prev-unread-group)
    (define-key gnus-group-mode-map "\177" 'gnus-group-prev-unread-group)
+   (define-key gnus-group-mode-map [delete] 'gnus-group-prev-unread-group)
    (define-key gnus-group-mode-map "N" 'gnus-group-next-group)
    (define-key gnus-group-mode-map "P" 'gnus-group-prev-group)
    (define-key gnus-group-mode-map "\C-n" 'gnus-group-next-group)
***************
*** 1803,1808 ****
--- 1804,1810 ----
    (define-key gnus-summary-mode-map "#" 'gnus-uu-mark-article)
    (define-key gnus-summary-mode-map " " 'gnus-summary-next-page)
    (define-key gnus-summary-mode-map "\177" 'gnus-summary-prev-page)
+   (define-key gnus-summary-mode-map [delete] 'gnus-summary-prev-page)
    (define-key gnus-summary-mode-map "\r" 'gnus-summary-scroll-up)
    (define-key gnus-summary-mode-map "n" 'gnus-summary-next-unread-article)
    (define-key gnus-summary-mode-map "p" 'gnus-summary-prev-unread-article)
***************
*** 4342,4347 ****
--- 4344,4350 ----
    (suppress-keymap gnus-article-mode-map)
    (define-key gnus-article-mode-map " " 'gnus-article-next-page)
    (define-key gnus-article-mode-map "\177" 'gnus-article-prev-page)
+   (define-key gnus-article-mode-map [delete] 'gnus-article-prev-page)
    (define-key gnus-article-mode-map "r" 'gnus-article-refer-article)
    (define-key gnus-article-mode-map "o" 'gnus-article-pop-article)
    (define-key gnus-article-mode-map "h" 'gnus-article-show-summary)
Index: emacs/lisp/gnusmisc.el
diff -c emacs/lisp/gnusmisc.el:1.1.1.1 emacs/lisp/gnusmisc.el:1.2
*** emacs/lisp/gnusmisc.el:1.1.1.1	Fri Jul 19 01:50:06 1996
--- emacs/lisp/gnusmisc.el	Fri Jul 19 05:02:05 1996
***************
*** 63,68 ****
--- 63,69 ----
    (suppress-keymap gnus-browse-killed-mode-map t)
    (define-key gnus-browse-killed-mode-map " " 'gnus-group-next-group)
    (define-key gnus-browse-killed-mode-map "\177" 'gnus-group-prev-group)
+   (define-key gnus-browse-killed-mode-map [delete] 'gnus-group-prev-group)
    (define-key gnus-browse-killed-mode-map "\C-n" 'gnus-group-next-group)
    (define-key gnus-browse-killed-mode-map "\C-p" 'gnus-group-prev-group)
    (define-key gnus-browse-killed-mode-map "n" 'gnus-group-next-group)
Index: emacs/lisp/hilit19.el
diff -c emacs/lisp/hilit19.el:1.1.1.2 emacs/lisp/hilit19.el:1.3
*** emacs/lisp/hilit19.el:1.1.1.2	Mon Jul 22 01:33:42 1996
--- emacs/lisp/hilit19.el	Wed Jul 31 01:34:38 1996
***************
*** 235,241 ****
  ;;
  ;; twiddled some of the color defaults for dark backgrounds
  ;;
! ;; always get 'mono color defaults if (not (x-display-color-p))
  ;;
  ;; added hilit-rehighlight-buffer-quietly to dired-after-readin-hook
  ;;
--- 235,241 ----
  ;;
  ;; twiddled some of the color defaults for dark backgrounds
  ;;
! ;; always get 'mono color defaults if (not (display-color-p))
  ;;
  ;; added hilit-rehighlight-buffer-quietly to dired-after-readin-hook
  ;;
***************
*** 523,529 ****
  See also the documentation for hilit-lookup-face-create.")
  
  (defconst hilit-face-translation-table
!   (let ((index (or (and (x-display-color-p)
  			(cdr (assq hilit-background-mode
  				   '((light . 1) (dark . 2)))))
  		   3)))
--- 523,529 ----
  See also the documentation for hilit-lookup-face-create.")
  
  (defconst hilit-face-translation-table
!   (let ((index (or (and (display-color-p)
  			(cdr (assq hilit-background-mode
  				   '((light . 1) (dark . 2)))))
  		   3)))
Index: emacs/lisp/icon.el
diff -c emacs/lisp/icon.el:1.1.1.2 emacs/lisp/icon.el:1.3
*** emacs/lisp/icon.el:1.1.1.2	Mon Jul 22 01:33:48 1996
--- emacs/lisp/icon.el	Wed Jul 31 01:34:40 1996
***************
*** 43,48 ****
--- 43,49 ----
    (define-key icon-mode-map "\e\C-a" 'beginning-of-icon-defun)
    (define-key icon-mode-map "\e\C-e" 'end-of-icon-defun)
    (define-key icon-mode-map "\e\C-q" 'indent-icon-exp)
+   (define-key icon-mode-map [delete] 'backward-delete-char-untabify)
    (define-key icon-mode-map "\177" 'backward-delete-char-untabify)
    (define-key icon-mode-map "\t" 'icon-indent-command))
  
Index: emacs/lisp/ielm.el
diff -c emacs/lisp/ielm.el:1.1.1.2 emacs/lisp/ielm.el:1.3
*** emacs/lisp/ielm.el:1.1.1.2	Mon Jul 22 01:33:50 1996
--- emacs/lisp/ielm.el	Wed Jul 31 01:34:42 1996
***************
*** 110,115 ****
--- 110,116 ----
    ;; from more than one keymap??
    (define-key ielm-map "\e\C-q" 'indent-sexp)      
    (define-key ielm-map "\eq" 'lisp-fill-paragraph) 
+   (define-key ielm-map [delete] 'backward-delete-char-untabify)
    (define-key ielm-map "\177" 'backward-delete-char-untabify)
    ;; Some convenience bindings for setting the working buffer
    (define-key ielm-map "\C-c\C-b" 'ielm-change-working-buffer)
Index: emacs/lisp/imenu.el
diff -c emacs/lisp/imenu.el:1.1.1.2 emacs/lisp/imenu.el:1.3
*** emacs/lisp/imenu.el:1.1.1.2	Mon Jul 22 01:33:51 1996
--- emacs/lisp/imenu.el	Wed Jul 31 01:34:44 1996
***************
*** 703,709 ****
  		   index-alist)
  		 (or title (buffer-name))))
  	 position)
!     (setq position (x-popup-menu event menu))
      (cond
       ((eq position nil)
        position)
--- 703,709 ----
  		   index-alist)
  		 (or title (buffer-name))))
  	 position)
!     (setq position (popup-menu event menu))
      (cond
       ((eq position nil)
        position)
Index: emacs/lisp/info.el
diff -c emacs/lisp/info.el:1.1.1.2 emacs/lisp/info.el:1.3
*** emacs/lisp/info.el:1.1.1.2	Mon Jul 22 01:33:56 1996
--- emacs/lisp/info.el	Wed Jul 31 01:34:46 1996
***************
*** 1457,1462 ****
--- 1457,1463 ----
    (define-key Info-mode-map "t" 'Info-top-node)
    (define-key Info-mode-map "u" 'Info-up)
    (define-key Info-mode-map "," 'Info-index-next)
+   (define-key Info-mode-map [delete] 'Info-scroll-down)
    (define-key Info-mode-map "\177" 'Info-scroll-down)
    (define-key Info-mode-map [mouse-2] 'Info-mouse-follow-nearest-node)
    )
***************
*** 1522,1528 ****
    (make-local-variable 'Info-tag-table-marker)
    (make-local-variable 'Info-history)
    (make-local-variable 'Info-index-alternatives)
!   (if (memq (framep (selected-frame)) '(x pc))
        (progn
  	(make-face 'info-node)
  	(make-face 'info-menu-5)
--- 1523,1529 ----
    (make-local-variable 'Info-tag-table-marker)
    (make-local-variable 'Info-history)
    (make-local-variable 'Info-index-alternatives)
!   (if (not (eq (framep (selected-frame)) t))
        (progn
  	(make-face 'info-node)
  	(make-face 'info-menu-5)
Index: emacs/lisp/isearch.el
diff -c emacs/lisp/isearch.el:1.1.1.2 emacs/lisp/isearch.el:1.3
*** emacs/lisp/isearch.el:1.1.1.2	Mon Jul 22 01:33:59 1996
--- emacs/lisp/isearch.el	Wed Jul 31 01:34:48 1996
***************
*** 214,219 ****
--- 214,220 ----
        (define-key map "\C-s" 'isearch-repeat-forward)
        (define-key map "\C-r" 'isearch-repeat-backward)
        (define-key map "\177" 'isearch-delete-char)
+       (define-key map [delete] 'isearch-delete-char)
        (define-key map "\C-g" 'isearch-abort)
        ;; This assumes \e is the meta-prefix-char.
        (or (= ?\e meta-prefix-char)
***************
*** 236,266 ****
        ;; As a result, these keys translate thru function-key-map
        ;; as normal, and they have the effect of the equivalent ASCII char.
        ;; We bind [escape] below.
!       (define-key map [tab] 'nil)
!       (define-key map [kp-0] 'nil)
!       (define-key map [kp-1] 'nil)
!       (define-key map [kp-2] 'nil)
!       (define-key map [kp-3] 'nil)
!       (define-key map [kp-4] 'nil)
!       (define-key map [kp-5] 'nil)
!       (define-key map [kp-6] 'nil)
!       (define-key map [kp-7] 'nil)
!       (define-key map [kp-8] 'nil)
!       (define-key map [kp-9] 'nil)
!       (define-key map [kp-add] 'nil)
!       (define-key map [kp-subtract] 'nil)
!       (define-key map [kp-multiply] 'nil)
!       (define-key map [kp-divide] 'nil)
!       (define-key map [kp-decimal] 'nil)
        (define-key map [kp-separator] 'nil)
!       (define-key map [kp-equal] 'nil)
!       (define-key map [kp-tab] 'nil)
!       (define-key map [kp-space] 'nil)
!       (define-key map [kp-enter] 'nil)
!       (define-key map [delete] 'nil)
!       (define-key map [backspace] 'nil)
!       (define-key map [return] 'nil)
!       (define-key map [newline] 'nil)
  
        ;; Define keys for regexp chars * ? |.
        ;; Nothing special for + because it matches at least once.
--- 237,274 ----
        ;; As a result, these keys translate thru function-key-map
        ;; as normal, and they have the effect of the equivalent ASCII char.
        ;; We bind [escape] below.
!       (define-key map [tab]          'nil)
!       (define-key map [kp-0]         'nil)
!       (define-key map [kp-1]         'nil)
!       (define-key map [kp-2]         'nil)
!       (define-key map [kp-3]         'nil)
!       (define-key map [kp-4]         'nil)
!       (define-key map [kp-5]         'nil)
!       (define-key map [kp-6]         'nil)
!       (define-key map [kp-7]         'nil)
!       (define-key map [kp-8]         'nil)
!       (define-key map [kp-9]         'nil)
!       (define-key map [kp-add]       'nil)
!       (define-key map [kp-subtract]  'nil)
!       (define-key map [kp-multiply]  'nil)
!       (define-key map [kp-divide]    'nil)
!       (define-key map [kp-decimal]   'nil)
        (define-key map [kp-separator] 'nil)
!       (define-key map [kp-equal]     'nil)
!       (define-key map [kp-tab]       'nil)
!       (define-key map [kp-space]     'nil)
!       (define-key map [kp-backslash] 'nil)
!       (define-key map [kp-backtick]  'nil)
!       (define-key map [kp-bar]       'nil)
!       (define-key map [kp-less]      'nil)
!       (define-key map [kp-more]      'nil)
!       (define-key map [kp-hash]      'nil)
!       (define-key map [kp-at]        'nil)
!       (define-key map [kp-tilde]     'nil)
!       (define-key map [kp-enter]     'nil)
!       (define-key map [backspace]    'nil)
!       (define-key map [return]       'nil)
!       (define-key map [newline]      'nil)
  
        ;; Define keys for regexp chars * ? |.
        ;; Nothing special for + because it matches at least once.
Index: emacs/lisp/iso-acc.el
diff -c emacs/lisp/iso-acc.el:1.1.1.2 emacs/lisp/iso-acc.el:1.3
*** emacs/lisp/iso-acc.el:1.1.1.2	Mon Jul 22 01:34:01 1996
--- emacs/lisp/iso-acc.el	Wed Jul 31 01:34:51 1996
***************
*** 156,161 ****
--- 156,163 ----
    (if iso-accents-mode
        (iso-accents-compose prompt)
      (char-to-string last-input-char)))
+     ;;;FIXME/cl isoacc
+     ;;;(char-to-string (iso-accents-last-input-char))))
  
  (defun iso-accents-compose-key (prompt)
    "Modify the following character by adding an accent to it."
***************
*** 170,175 ****
--- 172,179 ----
      combined))
  
  (defun iso-accents-compose (prompt)
+   ;;;FIXME/cl isoacc
+   ;;;(let* ((first-char (iso-accents-last-input-char))
    (let* ((first-char last-input-char)
  	 ;; Wait for the second key and look up the combination.
  	 (second-char (if (or prompt
Index: emacs/lisp/lisp-mode.el
diff -c emacs/lisp/lisp-mode.el:1.1.1.2 emacs/lisp/lisp-mode.el:1.3
*** emacs/lisp/lisp-mode.el:1.1.1.2	Mon Jul 22 01:34:21 1996
--- emacs/lisp/lisp-mode.el	Wed Jul 31 01:34:53 1996
***************
*** 115,120 ****
--- 115,121 ----
     (setq shared-lisp-mode-map (make-sparse-keymap))
     (define-key shared-lisp-mode-map "\e\C-q" 'indent-sexp)
     (define-key shared-lisp-mode-map "\177" 'backward-delete-char-untabify)
+    (define-key shared-lisp-mode-map [delete] 'backward-delete-char-untabify)
     (define-key shared-lisp-mode-map "\t" 'lisp-indent-line))
  
  (defvar emacs-lisp-mode-map ()
Index: emacs/lisp/lmenu.el
diff -c emacs/lisp/lmenu.el:1.1.1.2 emacs/lisp/lmenu.el:1.3
*** emacs/lisp/lmenu.el:1.1.1.2	Mon Jul 22 01:34:24 1996
--- emacs/lisp/lmenu.el	Wed Jul 31 01:34:55 1996
***************
*** 191,200 ****
  	(pos (mouse-pixel-position))
  	answer cmd)
      (while (and menu
! 		(setq answer (x-popup-menu (list (list (nth 1 pos)
! 						       (nthcdr 2 pos))
! 						 (car pos))
! 					   menu)))
        (setq cmd (lookup-key menu (apply 'vector answer)))
        (setq menu nil)
        (and cmd
--- 191,200 ----
  	(pos (mouse-pixel-position))
  	answer cmd)
      (while (and menu
! 		(setq answer (popup-menu (list (list (nth 1 pos)
!                                                      (nthcdr 2 pos))
!                                                (car pos))
!                                          menu)))
        (setq cmd (lookup-key menu (apply 'vector answer)))
        (setq menu nil)
        (and cmd
***************
*** 245,251 ****
  		(cons (if enable (cons item callback) item)
  		      converted))))
        (setq tail (cdr tail)))
!     (setq choice (x-popup-dialog t (cons name (nreverse converted))))
      (if choice
  	(if (symbolp choice)
  	    (call-interactively choice)
--- 245,251 ----
  		(cons (if enable (cons item callback) item)
  		      converted))))
        (setq tail (cdr tail)))
!     (setq choice (popup-dialog t (cons name (nreverse converted))))
      (if choice
  	(if (symbolp choice)
  	    (call-interactively choice)
Index: emacs/lisp/loaddefs.el
diff -c emacs/lisp/loaddefs.el:1.1.1.2 emacs/lisp/loaddefs.el:1.3
*** emacs/lisp/loaddefs.el:1.1.1.2	Mon Jul 22 01:34:27 1996
--- emacs/lisp/loaddefs.el	Wed Jul 31 01:34:58 1996
***************
*** 384,389 ****
--- 384,390 ----
  (define-key esc-map "b" 'backward-word)
  (define-key esc-map "d" 'kill-word)
  (define-key esc-map "\177" 'backward-kill-word)
+ (define-key esc-map [delete] 'backward-kill-word)
  
  (define-key esc-map "<" 'beginning-of-buffer)
  (define-key esc-map ">" 'end-of-buffer)
***************
*** 465,470 ****
--- 466,472 ----
  (define-key esc-map "e" 'forward-sentence)
  (define-key esc-map "k" 'kill-sentence)
  (define-key ctl-x-map "\177" 'backward-kill-sentence)
+ (define-key ctl-x-map [delete] 'backward-kill-sentence)
  
  (define-key ctl-x-map "[" 'backward-page)
  (define-key ctl-x-map "]" 'forward-page)
***************
*** 500,506 ****
  ;;;(sort-regexp-fields nil "\n*.*\n.*from \\(.*\\)[^]*" "\\1"
  ;;;		    (point-min) (point-max))
  
! ;;;### (autoloads (ada-make-filename-from-adaname ada-mode) "ada-mode" "ada-mode.el" (12238 20855))
  ;;; Generated autoloads from ada-mode.el
  
  (autoload (quote ada-mode) "ada-mode" "\
--- 502,508 ----
  ;;;(sort-regexp-fields nil "\n*.*\n.*from \\(.*\\)[^]*" "\\1"
  ;;;		    (point-min) (point-max))
  
! ;;;### (autoloads (ada-make-filename-from-adaname ada-mode) "ada-mode" "ada-mode.el" (12786 48498))
  ;;; Generated autoloads from ada-mode.el
  
  (autoload (quote ada-mode) "ada-mode" "\
***************
*** 558,564 ****
  
  ;;;***
  
! ;;;### (autoloads (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" "add-log.el" (12247 41876))
  ;;; Generated autoloads from add-log.el
  
  (autoload (quote prompt-for-change-log-name) "add-log" "\
--- 560,566 ----
  
  ;;;***
  
! ;;;### (autoloads (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" "add-log.el" (12786 48499))
  ;;; Generated autoloads from add-log.el
  
  (autoload (quote prompt-for-change-log-name) "add-log" "\
***************
*** 615,621 ****
  
  ;;;***
  
! ;;;### (autoloads (defadvice ad-add-advice) "advice" "advice.el" (12135 49154))
  ;;; Generated autoloads from advice.el
  
  (defvar ad-redefinition-action (quote warn) "\
--- 617,623 ----
  
  ;;;***
  
! ;;;### (autoloads (defadvice ad-add-advice) "advice" "advice.el" (12786 48502))
  ;;; Generated autoloads from advice.el
  
  (defvar ad-redefinition-action (quote warn) "\
***************
*** 704,710 ****
  
  ;;;***
  
! ;;;### (autoloads (ange-ftp-hook-function) "ange-ftp" "ange-ftp.el" (12167 13043))
  ;;; Generated autoloads from ange-ftp.el
  
  (autoload (quote ange-ftp-hook-function) "ange-ftp" nil nil nil)
--- 706,712 ----
  
  ;;;***
  
! ;;;### (autoloads (ange-ftp-hook-function) "ange-ftp" "ange-ftp.el" (12786 48511))
  ;;; Generated autoloads from ange-ftp.el
  
  (autoload (quote ange-ftp-hook-function) "ange-ftp" nil nil nil)
***************
*** 715,721 ****
  
  ;;;***
  
! ;;;### (autoloads (appt-make-list) "appt" "appt.el" (12189 22731))
  ;;; Generated autoloads from appt.el
  
  (defvar appt-issue-message t "\
--- 717,723 ----
  
  ;;;***
  
! ;;;### (autoloads (appt-make-list) "appt" "appt.el" (12786 48515))
  ;;; Generated autoloads from appt.el
  
  (defvar appt-issue-message t "\
***************
*** 749,755 ****
  
  ;;;***
  
! ;;;### (autoloads (super-apropos apropos) "apropos" "apropos.el" (12221 30949))
  ;;; Generated autoloads from apropos.el
  
  (autoload (quote apropos) "apropos" "\
--- 751,757 ----
  
  ;;;***
  
! ;;;### (autoloads (super-apropos apropos) "apropos" "apropos.el" (12786 48517))
  ;;; Generated autoloads from apropos.el
  
  (autoload (quote apropos) "apropos" "\
***************
*** 777,783 ****
  
  ;;;***
  
! ;;;### (autoloads (asm-mode) "asm-mode" "asm-mode.el" (12145 57463))
  ;;; Generated autoloads from asm-mode.el
  
  (autoload (quote asm-mode) "asm-mode" "\
--- 779,785 ----
  
  ;;;***
  
! ;;;### (autoloads (asm-mode) "asm-mode" "asm-mode.el" (12786 48520))
  ;;; Generated autoloads from asm-mode.el
  
  (autoload (quote asm-mode) "asm-mode" "\
***************
*** 803,809 ****
  
  ;;;***
  
! ;;;### (autoloads (auto-show-mode) "auto-show" "auto-show.el" (12130 48012))
  ;;; Generated autoloads from auto-show.el
  
  (autoload (quote auto-show-mode) "auto-show" "\
--- 805,811 ----
  
  ;;;***
  
! ;;;### (autoloads (auto-show-mode) "auto-show" "auto-show.el" (12786 48522))
  ;;; Generated autoloads from auto-show.el
  
  (autoload (quote auto-show-mode) "auto-show" "\
***************
*** 812,818 ****
  
  ;;;***
  
! ;;;### (autoloads (batch-update-autoloads update-directory-autoloads update-autoloads-here update-file-autoloads) "autoload" "autoload.el" (11899 19253))
  ;;; Generated autoloads from autoload.el
  
  (autoload (quote update-file-autoloads) "autoload" "\
--- 814,820 ----
  
  ;;;***
  
! ;;;### (autoloads (batch-update-autoloads update-directory-autoloads update-autoloads-here update-file-autoloads) "autoload" "autoload.el" (12786 48524))
  ;;; Generated autoloads from autoload.el
  
  (autoload (quote update-file-autoloads) "autoload" "\
***************
*** 834,840 ****
  
  ;;;***
  
! ;;;### (autoloads (mouse-avoidance-mode) "avoid" "avoid.el" (12243 27750))
  ;;; Generated autoloads from avoid.el
  
  (autoload (quote mouse-avoidance-mode) "avoid" "\
--- 836,842 ----
  
  ;;;***
  
! ;;;### (autoloads (mouse-avoidance-mode) "avoid" "avoid.el" (12786 48526))
  ;;; Generated autoloads from avoid.el
  
  (autoload (quote mouse-avoidance-mode) "avoid" "\
***************
*** 864,870 ****
  
  ;;;***
  
! ;;;### (autoloads (awk-mode) "awk-mode" "awk-mode.el" (12116 38333))
  ;;; Generated autoloads from awk-mode.el
  
  (autoload (quote awk-mode) "awk-mode" "\
--- 866,872 ----
  
  ;;;***
  
! ;;;### (autoloads (awk-mode) "awk-mode" "awk-mode.el" (12786 48527))
  ;;; Generated autoloads from awk-mode.el
  
  (autoload (quote awk-mode) "awk-mode" "\
***************
*** 878,884 ****
  
  ;;;***
  
! ;;;### (autoloads (backquote) "backquote" "backquote.el" (12256 39749))
  ;;; Generated autoloads from backquote.el
  
  (autoload (quote backquote) "backquote" "\
--- 880,886 ----
  
  ;;;***
  
! ;;;### (autoloads (backquote) "backquote" "backquote.el" (12786 48528))
  ;;; Generated autoloads from backquote.el
  
  (autoload (quote backquote) "backquote" "\
***************
*** 900,906 ****
  
  ;;;***
  
! ;;;### (autoloads (bibtex-mode) "bibtex" "bibtex.el" (12235 40496))
  ;;; Generated autoloads from bibtex.el
  
  (autoload (quote bibtex-mode) "bibtex" "\
--- 902,908 ----
  
  ;;;***
  
! ;;;### (autoloads (bibtex-mode) "bibtex" "bibtex.el" (12786 48531))
  ;;; Generated autoloads from bibtex.el
  
  (autoload (quote bibtex-mode) "bibtex" "\
***************
*** 961,967 ****
  
  ;;;***
  
! ;;;### (autoloads (blackbox) "blackbox" "blackbox.el" (11356 18211))
  ;;; Generated autoloads from blackbox.el
  
  (autoload (quote blackbox) "blackbox" "\
--- 963,969 ----
  
  ;;;***
  
! ;;;### (autoloads (blackbox) "blackbox" "blackbox.el" (12782 52601))
  ;;; Generated autoloads from blackbox.el
  
  (autoload (quote blackbox) "blackbox" "\
***************
*** 1078,1084 ****
  
  ;;;***
  
! ;;;### (autoloads (bookmark-menu-delete bookmark-menu-rename bookmark-menu-locate bookmark-menu-jump bookmark-menu-insert bookmark-bmenu-list bookmark-load bookmark-save bookmark-write bookmark-delete bookmark-insert bookmark-rename bookmark-insert-location bookmark-relocate bookmark-jump bookmark-set) "bookmark" "bookmark.el" (12260 44099))
  ;;; Generated autoloads from bookmark.el
  
  (if (symbolp (key-binding "r")) nil (progn (define-key ctl-x-map "rb" (quote bookmark-jump)) (define-key ctl-x-map "rm" (quote bookmark-set)) (define-key ctl-x-map "rl" (quote bookmark-bmenu-list))))
--- 1080,1086 ----
  
  ;;;***
  
! ;;;### (autoloads (bookmark-menu-delete bookmark-menu-rename bookmark-menu-locate bookmark-menu-jump bookmark-menu-insert bookmark-bmenu-list bookmark-load bookmark-save bookmark-write bookmark-delete bookmark-insert bookmark-rename bookmark-insert-location bookmark-relocate bookmark-jump bookmark-set) "bookmark" "bookmark.el" (12786 60375))
  ;;; Generated autoloads from bookmark.el
  
  (if (symbolp (key-binding "r")) nil (progn (define-key ctl-x-map "rb" (quote bookmark-jump)) (define-key ctl-x-map "rm" (quote bookmark-set)) (define-key ctl-x-map "rl" (quote bookmark-bmenu-list))))
***************
*** 1323,1329 ****
  
  ;;;***
  
! ;;;### (autoloads (batch-byte-recompile-directory batch-byte-compile display-call-tree byte-compile compile-defun byte-compile-file byte-recompile-directory) "bytecomp" "bytecomp.el" (12229 20890))
  ;;; Generated autoloads from bytecomp.el
  
  (autoload (quote byte-recompile-directory) "bytecomp" "\
--- 1325,1331 ----
  
  ;;;***
  
! ;;;### (autoloads (batch-byte-recompile-directory batch-byte-compile display-call-tree byte-compile compile-defun byte-compile-file byte-recompile-directory) "bytecomp" "bytecomp.el" (12786 50561))
  ;;; Generated autoloads from bytecomp.el
  
  (autoload (quote byte-recompile-directory) "bytecomp" "\
***************
*** 1381,1387 ****
  
  ;;;***
  
! ;;;### (autoloads nil "cal-dst" "cal-dst.el" (11753 48906))
  ;;; Generated autoloads from cal-dst.el
  
  (put (quote calendar-daylight-savings-starts) (quote risky-local-variable) t)
--- 1383,1389 ----
  
  ;;;***
  
! ;;;### (autoloads nil "cal-dst" "cal-dst.el" (12782 52605))
  ;;; Generated autoloads from cal-dst.el
  
  (put (quote calendar-daylight-savings-starts) (quote risky-local-variable) t)
***************
*** 1390,1396 ****
  
  ;;;***
  
! ;;;### (autoloads nil "cal-x" "cal-x.el" (12239 8764))
  ;;; Generated autoloads from cal-x.el
  
  (defvar calendar-setup (quote one-frame) "\
--- 1392,1398 ----
  
  ;;;***
  
! ;;;### (autoloads nil "cal-x" "cal-x.el" (12786 48553))
  ;;; Generated autoloads from cal-x.el
  
  (defvar calendar-setup (quote one-frame) "\
***************
*** 1401,1407 ****
  
  ;;;***
  
! ;;;### (autoloads (list-yahrzeit-dates calendar) "calendar" "calendar.el" (12240 42375))
  ;;; Generated autoloads from calendar.el
  
  (defvar calendar-week-start-day 0 "\
--- 1403,1409 ----
  
  ;;;***
  
! ;;;### (autoloads (list-yahrzeit-dates calendar) "calendar" "calendar.el" (12786 60423))
  ;;; Generated autoloads from calendar.el
  
  (defvar calendar-week-start-day 0 "\
***************
*** 1870,1876 ****
  
  ;;;***
  
! ;;;### (autoloads (set-case-syntax set-case-syntax-pair set-case-syntax-delims describe-buffer-case-table) "case-table" "case-table.el" (11968 14083))
  ;;; Generated autoloads from case-table.el
  
  (autoload (quote describe-buffer-case-table) "case-table" "\
--- 1872,1878 ----
  
  ;;;***
  
! ;;;### (autoloads (set-case-syntax set-case-syntax-pair set-case-syntax-delims describe-buffer-case-table) "case-table" "case-table.el" (12786 48557))
  ;;; Generated autoloads from case-table.el
  
  (autoload (quote describe-buffer-case-table) "case-table" "\
***************
*** 1899,1905 ****
  
  ;;;***
  
! ;;;### (autoloads (objc-mode c-mode) "cc-mode" "cc-mode.el" (12262 10681))
  ;;; Generated autoloads from cc-mode.el
  
  (defconst c-list-of-mode-names nil)
--- 1901,1907 ----
  
  ;;;***
  
! ;;;### (autoloads (objc-mode c-mode) "cc-mode" "cc-mode.el" (12786 48560))
  ;;; Generated autoloads from cc-mode.el
  
  (defconst c-list-of-mode-names nil)
***************
*** 1949,1955 ****
  
  ;;;***
  
! ;;;### (autoloads (command-history-mode list-command-history repeat-matching-complex-command) "chistory" "chistory.el" (11942 52235))
  ;;; Generated autoloads from chistory.el
  
  (autoload (quote repeat-matching-complex-command) "chistory" "\
--- 1951,1957 ----
  
  ;;;***
  
! ;;;### (autoloads (command-history-mode list-command-history repeat-matching-complex-command) "chistory" "chistory.el" (12786 50580))
  ;;; Generated autoloads from chistory.el
  
  (autoload (quote repeat-matching-complex-command) "chistory" "\
***************
*** 1981,1994 ****
  
  ;;;***
  
! ;;;### (autoloads (common-lisp-indent-function) "cl-indent" "cl-indent.el" (11285 49748))
  ;;; Generated autoloads from cl-indent.el
  
  (autoload (quote common-lisp-indent-function) "cl-indent" nil nil nil)
  
  ;;;***
  
! ;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (11939 27750))
  ;;; Generated autoloads from cmuscheme.el
  
  (autoload (quote run-scheme) "cmuscheme" "\
--- 1983,1996 ----
  
  ;;;***
  
! ;;;### (autoloads (common-lisp-indent-function) "cl-indent" "cl-indent.el" (12782 52612))
  ;;; Generated autoloads from cl-indent.el
  
  (autoload (quote common-lisp-indent-function) "cl-indent" nil nil nil)
  
  ;;;***
  
! ;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (12786 48579))
  ;;; Generated autoloads from cmuscheme.el
  
  (autoload (quote run-scheme) "cmuscheme" "\
***************
*** 2001,2007 ****
  
  ;;;***
  
! ;;;### (autoloads (comint-run make-comint) "comint" "comint.el" (12254 7190))
  ;;; Generated autoloads from comint.el
  
  (autoload (quote make-comint) "comint" "\
--- 2003,2009 ----
  
  ;;;***
  
! ;;;### (autoloads (comint-run make-comint) "comint" "comint.el" (12786 48584))
  ;;; Generated autoloads from comint.el
  
  (autoload (quote make-comint) "comint" "\
***************
*** 2024,2030 ****
  
  ;;;***
  
! ;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (11983 50606))
  ;;; Generated autoloads from compare-w.el
  
  (autoload (quote compare-windows) "compare-w" "\
--- 2026,2032 ----
  
  ;;;***
  
! ;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (12786 48591))
  ;;; Generated autoloads from compare-w.el
  
  (autoload (quote compare-windows) "compare-w" "\
***************
*** 2044,2050 ****
  
  ;;;***
  
! ;;;### (autoloads (next-error compilation-minor-mode grep compile) "compile" "compile.el" (12256 56504))
  ;;; Generated autoloads from compile.el
  
  (defvar compilation-mode-hook nil "\
--- 2046,2052 ----
  
  ;;;***
  
! ;;;### (autoloads (next-error compilation-minor-mode grep compile) "compile" "compile.el" (12786 50595))
  ;;; Generated autoloads from compile.el
  
  (defvar compilation-mode-hook nil "\
***************
*** 2125,2131 ****
  
  ;;;***
  
! ;;;### (autoloads (shuffle-vector cookie-snarf cookie-insert cookie) "cookie1" "cookie1.el" (11418 1804))
  ;;; Generated autoloads from cookie1.el
  
  (autoload (quote cookie) "cookie1" "\
--- 2127,2133 ----
  
  ;;;***
  
! ;;;### (autoloads (shuffle-vector cookie-snarf cookie-insert cookie) "cookie1" "cookie1.el" (12782 52621))
  ;;; Generated autoloads from cookie1.el
  
  (autoload (quote cookie) "cookie1" "\
***************
*** 2146,2152 ****
  
  ;;;***
  
! ;;;### (autoloads (c++-mode) "cplus-md" "cplus-md.el" (12175 1047))
  ;;; Generated autoloads from cplus-md.el
  
  (autoload (quote c++-mode) "cplus-md" "\
--- 2148,2154 ----
  
  ;;;***
  
! ;;;### (autoloads (c++-mode) "cplus-md" "cplus-md.el" (12786 50598))
  ;;; Generated autoloads from cplus-md.el
  
  (autoload (quote c++-mode) "cplus-md" "\
***************
*** 2217,2223 ****
  
  ;;;***
  
! ;;;### (autoloads (cpp-parse-edit cpp-highlight-buffer) "cpp" "cpp.el" (12180 44882))
  ;;; Generated autoloads from cpp.el
  
  (autoload (quote cpp-highlight-buffer) "cpp" "\
--- 2219,2225 ----
  
  ;;;***
  
! ;;;### (autoloads (cpp-parse-edit cpp-highlight-buffer) "cpp" "cpp.el" (12786 48602))
  ;;; Generated autoloads from cpp.el
  
  (autoload (quote cpp-highlight-buffer) "cpp" "\
***************
*** 2231,2242 ****
  
  ;;;***
  
! ;;;### (autoloads (dabbrev-expand dabbrev-completion) "dabbrev" "dabbrev.el" (12233 26589))
  ;;; Generated autoloads from dabbrev.el
  
  (define-key esc-map "/" (quote dabbrev-expand))
  
! (define-key esc-map [67108911] (quote dabbrev-completion))
  
  (autoload (quote dabbrev-completion) "dabbrev" "\
  Completion on current word.
--- 2233,2244 ----
  
  ;;;***
  
! ;;;### (autoloads (dabbrev-expand dabbrev-completion) "dabbrev" "dabbrev.el" (12786 48605))
  ;;; Generated autoloads from dabbrev.el
  
  (define-key esc-map "/" (quote dabbrev-expand))
  
! (define-key esc-map [4194351] (quote dabbrev-completion))
  
  (autoload (quote dabbrev-completion) "dabbrev" "\
  Completion on current word.
***************
*** 2276,2282 ****
  
  ;;;***
  
! ;;;### (autoloads (cancel-debug-on-entry debug-on-entry debug) "debug" "debug.el" (12141 3542))
  ;;; Generated autoloads from debug.el
  
  (setq debugger (quote debug))
--- 2278,2284 ----
  
  ;;;***
  
! ;;;### (autoloads (cancel-debug-on-entry debug-on-entry debug) "debug" "debug.el" (12786 48607))
  ;;; Generated autoloads from debug.el
  
  (setq debugger (quote debug))
***************
*** 2304,2310 ****
  
  ;;;***
  
! ;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (12189 23067))
  ;;; Generated autoloads from delsel.el
  
  (defalias (quote pending-delete-mode) (quote delete-selection-mode))
--- 2306,2312 ----
  
  ;;;***
  
! ;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (12786 48609))
  ;;; Generated autoloads from delsel.el
  
  (defalias (quote pending-delete-mode) (quote delete-selection-mode))
***************
*** 2316,2322 ****
  
  ;;;***
  
! ;;;### (autoloads (derived-mode-init-mode-variables define-derived-mode) "derived" "derived.el" (12174 3681))
  ;;; Generated autoloads from derived.el
  
  (autoload (quote define-derived-mode) "derived" "\
--- 2318,2324 ----
  
  ;;;***
  
! ;;;### (autoloads (derived-mode-init-mode-variables define-derived-mode) "derived" "derived.el" (12786 48610))
  ;;; Generated autoloads from derived.el
  
  (autoload (quote define-derived-mode) "derived" "\
***************
*** 2358,2364 ****
  
  ;;;***
  
! ;;;### (autoloads (diary) "diary-lib" "diary-lib.el" (12239 8656))
  ;;; Generated autoloads from diary-lib.el
  
  (autoload (quote diary) "diary-lib" "\
--- 2360,2366 ----
  
  ;;;***
  
! ;;;### (autoloads (diary) "diary-lib" "diary-lib.el" (12786 48615))
  ;;; Generated autoloads from diary-lib.el
  
  (autoload (quote diary) "diary-lib" "\
***************
*** 2369,2375 ****
  
  ;;;***
  
! ;;;### (autoloads (diff-backup diff) "diff" "diff.el" (11949 32903))
  ;;; Generated autoloads from diff.el
  
  (autoload (quote diff) "diff" "\
--- 2371,2377 ----
  
  ;;;***
  
! ;;;### (autoloads (diff-backup diff) "diff" "diff.el" (12786 48618))
  ;;; Generated autoloads from diff.el
  
  (autoload (quote diff) "diff" "\
***************
*** 2386,2392 ****
  
  ;;;***
  
! ;;;### (autoloads (dired-noselect dired-other-frame dired-other-window dired) "dired" "dired.el" (12254 52206))
  ;;; Generated autoloads from dired.el
  
  (defvar dired-listing-switches "-al" "\
--- 2388,2394 ----
  
  ;;;***
  
! ;;;### (autoloads (dired-noselect dired-other-frame dired-other-window dired) "dired" "dired.el" (12786 60469))
  ;;; Generated autoloads from dired.el
  
  (defvar dired-listing-switches "-al" "\
***************
*** 2477,2483 ****
  
  ;;;***
  
! ;;;### (autoloads (dired-do-query-replace dired-do-search dired-hide-all dired-hide-subdir dired-tree-down dired-tree-up dired-kill-subdir dired-mark-subdir-files dired-goto-subdir dired-prev-subdir dired-maybe-insert-subdir dired-downcase dired-upcase dired-do-symlink-regexp dired-do-hardlink-regexp dired-do-copy-regexp dired-do-rename-regexp dired-do-rename dired-do-hardlink dired-do-symlink dired-do-copy dired-create-directory dired-rename-file dired-copy-file dired-relist-file dired-remove-file dired-add-file dired-do-redisplay dired-do-load dired-do-byte-compile dired-do-compress dired-compress-file dired-do-kill-lines dired-do-shell-command dired-do-print dired-do-chown dired-do-chgrp dired-do-chmod dired-backup-diff dired-diff) "dired-aux" "dired-aux.el" (12175 23741))
  ;;; Generated autoloads from dired-aux.el
  
  (autoload (quote dired-diff) "dired-aux" "\
--- 2479,2485 ----
  
  ;;;***
  
! ;;;### (autoloads (dired-do-query-replace dired-do-search dired-hide-all dired-hide-subdir dired-tree-down dired-tree-up dired-kill-subdir dired-mark-subdir-files dired-goto-subdir dired-prev-subdir dired-maybe-insert-subdir dired-downcase dired-upcase dired-do-symlink-regexp dired-do-hardlink-regexp dired-do-copy-regexp dired-do-rename-regexp dired-do-rename dired-do-hardlink dired-do-symlink dired-do-copy dired-create-directory dired-rename-file dired-copy-file dired-relist-file dired-remove-file dired-add-file dired-do-redisplay dired-do-load dired-do-byte-compile dired-do-compress dired-compress-file dired-do-kill-lines dired-do-shell-command dired-do-print dired-do-chown dired-do-chgrp dired-do-chmod dired-backup-diff dired-diff) "dired-aux" "dired-aux.el" (12786 48619))
  ;;; Generated autoloads from dired-aux.el
  
  (autoload (quote dired-diff) "dired-aux" "\
***************
*** 2673,2679 ****
  
  ;;;***
  
! ;;;### (autoloads (dired-jump) "dired-x" "dired-x.el" (12229 22420))
  ;;; Generated autoloads from dired-x.el
  
  (autoload (quote dired-jump) "dired-x" "\
--- 2675,2681 ----
  
  ;;;***
  
! ;;;### (autoloads (dired-jump) "dired-x" "dired-x.el" (12786 48622))
  ;;; Generated autoloads from dired-x.el
  
  (autoload (quote dired-jump) "dired-x" "\
***************
*** 2685,2691 ****
  
  ;;;***
  
! ;;;### (autoloads (disassemble) "disass" "disass.el" (11820 46869))
  ;;; Generated autoloads from disass.el
  
  (autoload (quote disassemble) "disass" "\
--- 2687,2693 ----
  
  ;;;***
  
! ;;;### (autoloads (disassemble) "disass" "disass.el" (12782 52630))
  ;;; Generated autoloads from disass.el
  
  (autoload (quote disassemble) "disass" "\
***************
*** 2697,2703 ****
  
  ;;;***
  
! ;;;### (autoloads (standard-display-european create-glyph standard-display-underline standard-display-graphic standard-display-g1 standard-display-ascii standard-display-default standard-display-8bit make-display-table describe-current-display-table) "disp-table" "disp-table.el" (12058 63834))
  ;;; Generated autoloads from disp-table.el
  
  (autoload (quote describe-current-display-table) "disp-table" "\
--- 2699,2705 ----
  
  ;;;***
  
! ;;;### (autoloads (standard-display-european create-glyph standard-display-underline standard-display-graphic standard-display-g1 standard-display-ascii standard-display-default standard-display-8bit make-display-table describe-current-display-table) "disp-table" "disp-table.el" (12786 48627))
  ;;; Generated autoloads from disp-table.el
  
  (autoload (quote describe-current-display-table) "disp-table" "\
***************
*** 2738,2744 ****
  
  ;;;***
  
! ;;;### (autoloads (dissociated-press) "dissociate" "dissociate.el" (11829 12540))
  ;;; Generated autoloads from dissociate.el
  
  (autoload (quote dissociated-press) "dissociate" "\
--- 2740,2746 ----
  
  ;;;***
  
! ;;;### (autoloads (dissociated-press) "dissociate" "dissociate.el" (12782 52631))
  ;;; Generated autoloads from dissociate.el
  
  (autoload (quote dissociated-press) "dissociate" "\
***************
*** 2752,2758 ****
  
  ;;;***
  
! ;;;### (autoloads (docref-setup) "docref" "docref.el" (12165 44635))
  ;;; Generated autoloads from docref.el
  
  (autoload (quote docref-setup) "docref" "\
--- 2754,2760 ----
  
  ;;;***
  
! ;;;### (autoloads (docref-setup) "docref" "docref.el" (12786 48629))
  ;;; Generated autoloads from docref.el
  
  (autoload (quote docref-setup) "docref" "\
***************
*** 2761,2767 ****
  
  ;;;***
  
! ;;;### (autoloads (doctor) "doctor" "doctor.el" (11718 57582))
  ;;; Generated autoloads from doctor.el
  
  (autoload (quote doctor) "doctor" "\
--- 2763,2769 ----
  
  ;;;***
  
! ;;;### (autoloads (doctor) "doctor" "doctor.el" (12782 52632))
  ;;; Generated autoloads from doctor.el
  
  (autoload (quote doctor) "doctor" "\
***************
*** 2769,2775 ****
  
  ;;;***
  
! ;;;### (autoloads (double-mode) "double" "double.el" (12189 23391))
  ;;; Generated autoloads from double.el
  
  (autoload (quote double-mode) "double" "\
--- 2771,2777 ----
  
  ;;;***
  
! ;;;### (autoloads (double-mode) "double" "double.el" (12786 48633))
  ;;; Generated autoloads from double.el
  
  (autoload (quote double-mode) "double" "\
***************
*** 2781,2787 ****
  
  ;;;***
  
! ;;;### (autoloads (dunnet) "dunnet" "dunnet.el" (11404 48775))
  ;;; Generated autoloads from dunnet.el
  
  (autoload (quote dunnet) "dunnet" "\
--- 2783,2789 ----
  
  ;;;***
  
! ;;;### (autoloads (dunnet) "dunnet" "dunnet.el" (12782 52634))
  ;;; Generated autoloads from dunnet.el
  
  (autoload (quote dunnet) "dunnet" "\
***************
*** 2789,2795 ****
  
  ;;;***
  
! ;;;### (autoloads (easy-menu-create-keymaps easy-menu-do-define easy-menu-define) "easymenu" "easymenu.el" (12221 28588))
  ;;; Generated autoloads from easymenu.el
  
  (autoload (quote easy-menu-define) "easymenu" "\
--- 2791,2797 ----
  
  ;;;***
  
! ;;;### (autoloads (easy-menu-create-keymaps easy-menu-do-define easy-menu-define) "easymenu" "easymenu.el" (12786 48635))
  ;;; Generated autoloads from easymenu.el
  
  (autoload (quote easy-menu-define) "easymenu" "\
***************
*** 2862,2868 ****
  
  ;;;***
  
! ;;;### (autoloads (electric-buffer-list) "ebuff-menu" "ebuff-menu.el" (12165 47552))
  ;;; Generated autoloads from ebuff-menu.el
  
  (autoload (quote electric-buffer-list) "ebuff-menu" "\
--- 2864,2870 ----
  
  ;;;***
  
! ;;;### (autoloads (electric-buffer-list) "ebuff-menu" "ebuff-menu.el" (12786 50618))
  ;;; Generated autoloads from ebuff-menu.el
  
  (autoload (quote electric-buffer-list) "ebuff-menu" "\
***************
*** 2884,2890 ****
  
  ;;;***
  
! ;;;### (autoloads (Electric-command-history-redo-expression) "echistory" "echistory.el" (11722 62680))
  ;;; Generated autoloads from echistory.el
  
  (autoload (quote Electric-command-history-redo-expression) "echistory" "\
--- 2886,2892 ----
  
  ;;;***
  
! ;;;### (autoloads (Electric-command-history-redo-expression) "echistory" "echistory.el" (12782 64137))
  ;;; Generated autoloads from echistory.el
  
  (autoload (quote Electric-command-history-redo-expression) "echistory" "\
***************
*** 2893,2899 ****
  
  ;;;***
  
! ;;;### (autoloads (edebug-eval-top-level-form def-edebug-spec) "edebug" "edebug.el" (12202 53400))
  ;;; Generated autoloads from edebug.el
  
  (autoload (quote def-edebug-spec) "edebug" "\
--- 2895,2901 ----
  
  ;;;***
  
! ;;;### (autoloads (edebug-eval-top-level-form def-edebug-spec) "edebug" "edebug.el" (12786 50625))
  ;;; Generated autoloads from edebug.el
  
  (autoload (quote def-edebug-spec) "edebug" "\
***************
*** 2911,2917 ****
  
  ;;;***
  
! ;;;### (autoloads (vc-ediff ediff-revision ediff-patch-buffer ediff-merge-revisions-with-ancestor ediff-merge-revisions ediff-merge-buffers-with-ancestor ediff-merge-buffers ediff-merge-files-with-ancestor ediff-merge-files ediff-regions-linewise ediff-regions-wordwise ediff-windows-linewise ediff-windows-wordwise ediff-buffers3 ediff-buffers ediff-files3 ediff-files ediff-patch-file) "ediff" "ediff.el" (12258 30505))
  ;;; Generated autoloads from ediff.el
  
  (autoload (quote ediff-patch-file) "ediff" "\
--- 2913,2919 ----
  
  ;;;***
  
! ;;;### (autoloads (vc-ediff ediff-revision ediff-patch-buffer ediff-merge-revisions-with-ancestor ediff-merge-revisions ediff-merge-buffers-with-ancestor ediff-merge-buffers ediff-merge-files-with-ancestor ediff-merge-files ediff-regions-linewise ediff-regions-wordwise ediff-windows-linewise ediff-windows-wordwise ediff-buffers3 ediff-buffers ediff-files3 ediff-files ediff-patch-file) "ediff" "ediff.el" (12786 61001))
  ;;; Generated autoloads from ediff.el
  
  (autoload (quote ediff-patch-file) "ediff" "\
***************
*** 3012,3018 ****
  
  ;;;***
  
! ;;;### (autoloads (insert-kbd-macro format-kbd-macro read-kbd-macro edit-named-kbd-macro edit-last-kbd-macro edit-kbd-macro) "edmacro" "edmacro.el" (12225 2854))
  ;;; Generated autoloads from edmacro.el
  (define-key ctl-x-map "\C-k" 'edit-kbd-macro)
  
--- 3014,3020 ----
  
  ;;;***
  
! ;;;### (autoloads (insert-kbd-macro format-kbd-macro read-kbd-macro edit-named-kbd-macro edit-last-kbd-macro edit-kbd-macro) "edmacro" "edmacro.el" (12786 48652))
  ;;; Generated autoloads from edmacro.el
  (define-key ctl-x-map "\C-k" 'edit-kbd-macro)
  
***************
*** 3069,3075 ****
  
  ;;;***
  
! ;;;### (autoloads (edt-emulation-on) "edt" "edt.el" (12189 23559))
  ;;; Generated autoloads from edt.el
  
  (autoload (quote edt-emulation-on) "edt" "\
--- 3071,3077 ----
  
  ;;;***
  
! ;;;### (autoloads (edt-emulation-on) "edt" "edt.el" (12786 48654))
  ;;; Generated autoloads from edt.el
  
  (autoload (quote edt-emulation-on) "edt" "\
***************
*** 3077,3083 ****
  
  ;;;***
  
! ;;;### (autoloads (elp-submit-bug-report elp-results elp-instrument-package elp-instrument-list elp-restore-function elp-instrument-function) "elp" "elp.el" (12033 65120))
  ;;; Generated autoloads from elp.el
  
  (autoload (quote elp-instrument-function) "elp" "\
--- 3079,3085 ----
  
  ;;;***
  
! ;;;### (autoloads (elp-submit-bug-report elp-results elp-instrument-package elp-instrument-list elp-restore-function elp-instrument-function) "elp" "elp.el" (12786 48658))
  ;;; Generated autoloads from elp.el
  
  (autoload (quote elp-instrument-function) "elp" "\
***************
*** 3109,3115 ****
  
  ;;;***
  
! ;;;### (autoloads (report-emacs-bug) "emacsbug" "emacsbug.el" (12247 41646))
  ;;; Generated autoloads from emacsbug.el
  
  (autoload (quote report-emacs-bug) "emacsbug" "\
--- 3111,3117 ----
  
  ;;;***
  
! ;;;### (autoloads (report-emacs-bug) "emacsbug" "emacsbug.el" (12786 48659))
  ;;; Generated autoloads from emacsbug.el
  
  (autoload (quote report-emacs-bug) "emacsbug" "\
***************
*** 3118,3124 ****
  
  ;;;***
  
! ;;;### (autoloads (emerge-merge-directories emerge-revisions-with-ancestor 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" (12189 23987))
  ;;; Generated autoloads from emerge.el
  
  (defvar menu-bar-emerge-menu (make-sparse-keymap "Emerge"))
--- 3120,3126 ----
  
  ;;;***
  
! ;;;### (autoloads (emerge-merge-directories emerge-revisions-with-ancestor 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" (12786 50649))
  ;;; Generated autoloads from emerge.el
  
  (defvar menu-bar-emerge-menu (make-sparse-keymap "Emerge"))
***************
*** 3169,3175 ****
  
  ;;;***
  
! ;;;### (autoloads (enriched-decode enriched-encode enriched-mode) "enriched" "enriched.el" (12243 27689))
  ;;; Generated autoloads from enriched.el
  
  (autoload (quote enriched-mode) "enriched" "\
--- 3171,3177 ----
  
  ;;;***
  
! ;;;### (autoloads (enriched-decode enriched-encode enriched-mode) "enriched" "enriched.el" (12786 48664))
  ;;; Generated autoloads from enriched.el
  
  (autoload (quote enriched-mode) "enriched" "\
***************
*** 3191,3197 ****
  
  ;;;***
  
! ;;;### (autoloads (setenv) "env" "env.el" (11922 18362))
  ;;; Generated autoloads from env.el
  
  (autoload (quote setenv) "env" "\
--- 3193,3199 ----
  
  ;;;***
  
! ;;;### (autoloads (grabenv setenv) "env" "env.el" (12786 50651))
  ;;; Generated autoloads from env.el
  
  (autoload (quote setenv) "env" "\
***************
*** 3205,3213 ****
  
  This function works by modifying `process-environment'." t nil)
  
  ;;;***
  
! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (12209 33888))
  ;;; Generated autoloads from etags.el
  
  (defvar tags-file-name nil "\
--- 3207,3222 ----
  
  This function works by modifying `process-environment'." t nil)
  
+ (autoload (quote grabenv) "env" "\
+ Run a shell subprocess, and interpret its output as a series of environment
+ variables to insert into the emacs environment.  The first optional argument
+ gives the path to the shell (defaults to \"/bin/csh\").  The remaining arguments
+ are interpreted as a list of commands for it to execute (defaults to
+ \"source /etc/login.std\", \"source ~/.login\" and \"setenv\")." nil nil)
+ 
  ;;;***
  
! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (12786 50655))
  ;;; Generated autoloads from etags.el
  
  (defvar tags-file-name nil "\
***************
*** 3393,3399 ****
  
  ;;;***
  
! ;;;### (autoloads (f90-mode) "f90" "f90.el" (12235 41121))
  ;;; Generated autoloads from f90.el
  
  (autoload (quote f90-mode) "f90" "\
--- 3402,3408 ----
  
  ;;;***
  
! ;;;### (autoloads (f90-mode) "f90" "f90.el" (12786 48669))
  ;;; Generated autoloads from f90.el
  
  (autoload (quote f90-mode) "f90" "\
***************
*** 3459,3465 ****
  
  ;;;***
  
! ;;;### (autoloads (list-colors-display facemenu-read-color list-text-properties-at facemenu-remove-special facemenu-remove-all facemenu-remove-props facemenu-set-read-only facemenu-set-intangible facemenu-set-invisible facemenu-set-face-from-menu facemenu-set-background facemenu-set-foreground facemenu-set-face) "facemenu" "facemenu.el" (12257 17905))
  ;;; Generated autoloads from facemenu.el
  (define-key global-map "\M-g" 'facemenu-keymap)
  (autoload 'facemenu-keymap "facemenu" "Keymap for face-changing commands." t 'keymap)
--- 3468,3474 ----
  
  ;;;***
  
! ;;;### (autoloads (list-colors-display facemenu-read-color list-text-properties-at facemenu-remove-special facemenu-remove-all facemenu-remove-props facemenu-set-read-only facemenu-set-intangible facemenu-set-invisible facemenu-set-face-from-menu facemenu-set-background facemenu-set-foreground facemenu-set-face) "facemenu" "facemenu.el" (12786 48670))
  ;;; Generated autoloads from facemenu.el
  (define-key global-map "\M-g" 'facemenu-keymap)
  (autoload 'facemenu-keymap "facemenu" "Keymap for face-changing commands." t 'keymap)
***************
*** 3588,3594 ****
  
  ;;;***
  
! ;;;### (autoloads (turn-on-fast-lock fast-lock-mode) "fast-lock" "fast-lock.el" (12237 34753))
  ;;; Generated autoloads from fast-lock.el
  
  (defvar fast-lock-mode nil)
--- 3597,3603 ----
  
  ;;;***
  
! ;;;### (autoloads (turn-on-fast-lock fast-lock-mode) "fast-lock" "fast-lock.el" (12786 48673))
  ;;; Generated autoloads from fast-lock.el
  
  (defvar fast-lock-mode nil)
***************
*** 3625,3631 ****
  
  ;;;***
  
! ;;;### (autoloads (find-grep-dired find-name-dired find-dired) "find-dired" "find-dired.el" (12234 9310))
  ;;; Generated autoloads from find-dired.el
  
  (defvar find-ls-option (if (eq system-type (quote berkeley-unix)) (quote ("-ls" . "-gilsb")) (quote ("-exec ls -ld {} \\;" . "-ld"))) "\
--- 3634,3640 ----
  
  ;;;***
  
! ;;;### (autoloads (find-grep-dired find-name-dired find-dired) "find-dired" "find-dired.el" (12786 48678))
  ;;; Generated autoloads from find-dired.el
  
  (defvar find-ls-option (if (eq system-type (quote berkeley-unix)) (quote ("-ls" . "-gilsb")) (quote ("-exec ls -ld {} \\;" . "-ld"))) "\
***************
*** 3663,3669 ****
  
  ;;;***
  
! ;;;### (autoloads (ff-find-other-file ff-get-other-file) "find-file" "find-file.el" (12165 45947))
  ;;; Generated autoloads from find-file.el
  
  (autoload (quote ff-get-other-file) "find-file" "\
--- 3672,3678 ----
  
  ;;;***
  
! ;;;### (autoloads (ff-find-other-file ff-get-other-file) "find-file" "find-file.el" (12786 48679))
  ;;; Generated autoloads from find-file.el
  
  (autoload (quote ff-get-other-file) "find-file" "\
***************
*** 3727,3733 ****
  
  ;;;***
  
! ;;;### (autoloads (enable-flow-control-on enable-flow-control) "flow-ctrl" "flow-ctrl.el" (11950 46823))
  ;;; Generated autoloads from flow-ctrl.el
  
  (autoload (quote enable-flow-control) "flow-ctrl" "\
--- 3736,3742 ----
  
  ;;;***
  
! ;;;### (autoloads (enable-flow-control-on enable-flow-control) "flow-ctrl" "flow-ctrl.el" (12786 48685))
  ;;; Generated autoloads from flow-ctrl.el
  
  (autoload (quote enable-flow-control) "flow-ctrl" "\
***************
*** 3744,3750 ****
  
  ;;;***
  
! ;;;### (autoloads (font-lock-fontify-buffer turn-on-font-lock font-lock-mode) "font-lock" "font-lock.el" (12257 13993))
  ;;; Generated autoloads from font-lock.el
  
  (defvar font-lock-maximum-decoration nil "\
--- 3753,3759 ----
  
  ;;;***
  
! ;;;### (autoloads (font-lock-fontify-buffer turn-on-font-lock font-lock-mode) "font-lock" "font-lock.el" (12786 61394))
  ;;; Generated autoloads from font-lock.el
  
  (defvar font-lock-maximum-decoration nil "\
***************
*** 3796,3802 ****
  
  ;;;***
  
! ;;;### (autoloads (forms-find-file-other-window forms-find-file forms-mode) "forms" "forms.el" (12260 15248))
  ;;; Generated autoloads from forms.el
  
  (autoload (quote forms-mode) "forms" "\
--- 3805,3811 ----
  
  ;;;***
  
! ;;;### (autoloads (forms-find-file-other-window forms-find-file forms-mode) "forms" "forms.el" (12786 48692))
  ;;; Generated autoloads from forms.el
  
  (autoload (quote forms-mode) "forms" "\
***************
*** 3827,3833 ****
  
  ;;;***
  
! ;;;### (autoloads (fortran-mode) "fortran" "fortran.el" (12211 3234))
  ;;; Generated autoloads from fortran.el
  
  (defvar fortran-tab-mode-default nil "\
--- 3836,3842 ----
  
  ;;;***
  
! ;;;### (autoloads (fortran-mode) "fortran" "fortran.el" (12786 48695))
  ;;; Generated autoloads from fortran.el
  
  (defvar fortran-tab-mode-default nil "\
***************
*** 3909,3915 ****
  
  ;;;***
  
! ;;;### (autoloads (gnus) "gnus" "gnus.el" (12225 3839))
  ;;; Generated autoloads from gnus.el
  
  (autoload (quote gnus) "gnus" "\
--- 3918,3924 ----
  
  ;;;***
  
! ;;;### (autoloads (gnus) "gnus" "gnus.el" (12786 50690))
  ;;; Generated autoloads from gnus.el
  
  (autoload (quote gnus) "gnus" "\
***************
*** 3918,3924 ****
  
  ;;;***
  
! ;;;### (autoloads (gnus-post-news) "gnuspost" "gnuspost.el" (12248 23474))
  ;;; Generated autoloads from gnuspost.el
  
  (defalias (quote sendnews) (quote gnus-post-news))
--- 3927,3933 ----
  
  ;;;***
  
! ;;;### (autoloads (gnus-post-news) "gnuspost" "gnuspost.el" (12786 48710))
  ;;; Generated autoloads from gnuspost.el
  
  (defalias (quote sendnews) (quote gnus-post-news))
***************
*** 3931,3937 ****
  
  ;;;***
  
! ;;;### (autoloads (gomoku) "gomoku" "gomoku.el" (12201 8918))
  ;;; Generated autoloads from gomoku.el
  
  (autoload (quote gomoku) "gomoku" "\
--- 3940,3946 ----
  
  ;;;***
  
! ;;;### (autoloads (gomoku) "gomoku" "gomoku.el" (12786 48712))
  ;;; Generated autoloads from gomoku.el
  
  (autoload (quote gomoku) "gomoku" "\
***************
*** 3949,3955 ****
  
  ;;;***
  
! ;;;### (autoloads (perldb xdb dbx sdb gdb) "gud" "gud.el" (12246 8502))
  ;;; Generated autoloads from gud.el
  
  (autoload (quote gdb) "gud" "\
--- 3958,3964 ----
  
  ;;;***
  
! ;;;### (autoloads (perldb xdb dbx sdb gdb) "gud" "gud.el" (12786 48714))
  ;;; Generated autoloads from gud.el
  
  (autoload (quote gdb) "gud" "\
***************
*** 3982,3988 ****
  
  ;;;***
  
! ;;;### (autoloads (hanoi) "hanoi" "hanoi.el" (12189 24430))
  ;;; Generated autoloads from hanoi.el
  
  (autoload (quote hanoi) "hanoi" "\
--- 3991,3997 ----
  
  ;;;***
  
! ;;;### (autoloads (hanoi) "hanoi" "hanoi.el" (12786 48716))
  ;;; Generated autoloads from hanoi.el
  
  (autoload (quote hanoi) "hanoi" "\
***************
*** 3990,3996 ****
  
  ;;;***
  
! ;;;### (autoloads nil "help-macro" "help-macro.el" (12170 3684))
  ;;; Generated autoloads from help-macro.el
  
  (defvar three-step-help nil "\
--- 3999,4005 ----
  
  ;;;***
  
! ;;;### (autoloads nil "help-macro" "help-macro.el" (12786 48717))
  ;;; Generated autoloads from help-macro.el
  
  (defvar three-step-help nil "\
***************
*** 4002,4008 ****
  
  ;;;***
  
! ;;;### (autoloads (Helper-help Helper-describe-bindings) "helper" "helper.el" (12203 7388))
  ;;; Generated autoloads from helper.el
  
  (autoload (quote Helper-describe-bindings) "helper" "\
--- 4011,4017 ----
  
  ;;;***
  
! ;;;### (autoloads (Helper-help Helper-describe-bindings) "helper" "helper.el" (12786 48720))
  ;;; Generated autoloads from helper.el
  
  (autoload (quote Helper-describe-bindings) "helper" "\
***************
*** 4013,4019 ****
  
  ;;;***
  
! ;;;### (autoloads (hexlify-buffer hexl-find-file hexl-mode) "hexl" "hexl.el" (12189 30793))
  ;;; Generated autoloads from hexl.el
  
  (autoload (quote hexl-mode) "hexl" "\
--- 4022,4028 ----
  
  ;;;***
  
! ;;;### (autoloads (hexlify-buffer hexl-find-file hexl-mode) "hexl" "hexl.el" (12786 48722))
  ;;; Generated autoloads from hexl.el
  
  (autoload (quote hexl-mode) "hexl" "\
***************
*** 4097,4103 ****
  
  ;;;***
  
! ;;;### (autoloads (hide-ifdef-mode) "hideif" "hideif.el" (12197 44448))
  ;;; Generated autoloads from hideif.el
  
  (autoload (quote hide-ifdef-mode) "hideif" "\
--- 4106,4112 ----
  
  ;;;***
  
! ;;;### (autoloads (hide-ifdef-mode) "hideif" "hideif.el" (12786 48723))
  ;;; Generated autoloads from hideif.el
  
  (autoload (quote hide-ifdef-mode) "hideif" "\
***************
*** 4144,4150 ****
  
  ;;;***
  
! ;;;### (autoloads (hs-minor-mode hs-hide-block hs-hide-all) "hideshow" "hideshow.el" (12235 41891))
  ;;; Generated autoloads from hideshow.el
  
  (autoload (quote hs-hide-all) "hideshow" "\
--- 4153,4159 ----
  
  ;;;***
  
! ;;;### (autoloads (hs-minor-mode hs-hide-block hs-hide-all) "hideshow" "hideshow.el" (12786 48725))
  ;;; Generated autoloads from hideshow.el
  
  (autoload (quote hs-hide-all) "hideshow" "\
***************
*** 4175,4181 ****
  
  ;;;***
  
! ;;;### (autoloads (make-hippie-expand-function hippie-expand) "hippie-exp" "hippie-exp.el" (11743 54734))
  ;;; Generated autoloads from hippie-exp.el
  
  (defvar hippie-expand-try-functions-list (quote (try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-complete-lisp-symbol)) "\
--- 4184,4190 ----
  
  ;;;***
  
! ;;;### (autoloads (make-hippie-expand-function hippie-expand) "hippie-exp" "hippie-exp.el" (12782 52661))
  ;;; Generated autoloads from hippie-exp.el
  
  (defvar hippie-expand-try-functions-list (quote (try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-complete-lisp-symbol)) "\
***************
*** 4212,4218 ****
  
  ;;;***
  
! ;;;### (autoloads (icomplete-minibuffer-setup icomplete-mode) "icomplete" "icomplete.el" (12135 48572))
  ;;; Generated autoloads from icomplete.el
  
  (autoload (quote icomplete-mode) "icomplete" "\
--- 4221,4227 ----
  
  ;;;***
  
! ;;;### (autoloads (icomplete-minibuffer-setup icomplete-mode) "icomplete" "icomplete.el" (12786 48730))
  ;;; Generated autoloads from icomplete.el
  
  (autoload (quote icomplete-mode) "icomplete" "\
***************
*** 4226,4232 ****
  
  ;;;***
  
! ;;;### (autoloads (icon-mode) "icon" "icon.el" (12116 39482))
  ;;; Generated autoloads from icon.el
  
  (autoload (quote icon-mode) "icon" "\
--- 4235,4241 ----
  
  ;;;***
  
! ;;;### (autoloads (icon-mode) "icon" "icon.el" (12786 50704))
  ;;; Generated autoloads from icon.el
  
  (autoload (quote icon-mode) "icon" "\
***************
*** 4264,4270 ****
  
  ;;;***
  
! ;;;### (autoloads (ielm) "ielm" "ielm.el" (12131 16083))
  ;;; Generated autoloads from ielm.el
  (add-hook 'same-window-buffer-names "*ielm*")
  
--- 4273,4279 ----
  
  ;;;***
  
! ;;;### (autoloads (ielm) "ielm" "ielm.el" (12786 50706))
  ;;; Generated autoloads from ielm.el
  (add-hook 'same-window-buffer-names "*ielm*")
  
***************
*** 4274,4280 ****
  
  ;;;***
  
! ;;;### (autoloads (imenu) "imenu" "imenu.el" (12102 19762))
  ;;; Generated autoloads from imenu.el
  
  (autoload (quote imenu) "imenu" "\
--- 4283,4289 ----
  
  ;;;***
  
! ;;;### (autoloads (imenu) "imenu" "imenu.el" (12786 50709))
  ;;; Generated autoloads from imenu.el
  
  (autoload (quote imenu) "imenu" "\
***************
*** 4283,4289 ****
  
  ;;;***
  
! ;;;### (autoloads (inferior-lisp) "inf-lisp" "inf-lisp.el" (11743 54750))
  ;;; Generated autoloads from inf-lisp.el
  
  (defvar inferior-lisp-filter-regexp "\\`\\s *\\(:\\(\\w\\|\\s_\\)\\)?\\s *\\'" "\
--- 4292,4298 ----
  
  ;;;***
  
! ;;;### (autoloads (inferior-lisp) "inf-lisp" "inf-lisp.el" (12782 52666))
  ;;; Generated autoloads from inf-lisp.el
  
  (defvar inferior-lisp-filter-regexp "\\`\\s *\\(:\\(\\w\\|\\s_\\)\\)?\\s *\\'" "\
***************
*** 4334,4340 ****
  
  ;;;***
  
! ;;;### (autoloads (Info-goto-emacs-key-command-node Info-goto-emacs-command-node info-standalone info) "info" "info.el" (12259 10507))
  ;;; Generated autoloads from info.el
  (add-hook 'same-window-buffer-names "*info*")
  
--- 4343,4349 ----
  
  ;;;***
  
! ;;;### (autoloads (Info-goto-emacs-key-command-node Info-goto-emacs-command-node info-standalone info) "info" "info.el" (12786 61552))
  ;;; Generated autoloads from info.el
  (add-hook 'same-window-buffer-names "*info*")
  
***************
*** 4362,4368 ****
  
  ;;;***
  
! ;;;### (autoloads (batch-info-validate Info-validate Info-split Info-tagify) "informat" "informat.el" (12014 26766))
  ;;; Generated autoloads from informat.el
  
  (autoload (quote Info-tagify) "informat" "\
--- 4371,4377 ----
  
  ;;;***
  
! ;;;### (autoloads (batch-info-validate Info-validate Info-split Info-tagify) "informat" "informat.el" (12786 48742))
  ;;; Generated autoloads from informat.el
  
  (autoload (quote Info-tagify) "informat" "\
***************
*** 4393,4399 ****
  
  ;;;***
  
! ;;;### (autoloads (iso-accents-mode) "iso-acc" "iso-acc.el" (12197 33309))
  ;;; Generated autoloads from iso-acc.el
  
  (autoload (quote iso-accents-mode) "iso-acc" "\
--- 4402,4408 ----
  
  ;;;***
  
! ;;;### (autoloads (iso-accents-mode) "iso-acc" "iso-acc.el" (12786 61601))
  ;;; Generated autoloads from iso-acc.el
  
  (autoload (quote iso-accents-mode) "iso-acc" "\
***************
*** 4422,4428 ****
  
  ;;;***
  
! ;;;### (autoloads (ispell-message ispell-minor-mode ispell-complete-word-interior-frag ispell-complete-word ispell-continue ispell-buffer ispell-region ispell-change-dictionary ispell-kill-ispell ispell-help ispell-word) "ispell" "ispell.el" (12257 45139))
  ;;; Generated autoloads from ispell.el
  
  (defvar ispell-personal-dictionary nil "\
--- 4431,4437 ----
  
  ;;;***
  
! ;;;### (autoloads (ispell-message ispell-minor-mode ispell-complete-word-interior-frag ispell-complete-word ispell-continue ispell-buffer ispell-region ispell-change-dictionary ispell-kill-ispell ispell-help ispell-word) "ispell" "ispell.el" (12786 48753))
  ;;; Generated autoloads from ispell.el
  
  (defvar ispell-personal-dictionary nil "\
***************
*** 4595,4601 ****
  
  ;;;***
  
! ;;;### (autoloads (ledit-from-lisp-mode ledit-mode) "ledit" "ledit.el" (11181 53296))
  ;;; Generated autoloads from ledit.el
  
  (defconst ledit-save-files t "\
--- 4604,4610 ----
  
  ;;;***
  
! ;;;### (autoloads (ledit-from-lisp-mode ledit-mode) "ledit" "ledit.el" (12782 52672))
  ;;; Generated autoloads from ledit.el
  
  (defconst ledit-save-files t "\
***************
*** 4624,4630 ****
  
  ;;;***
  
! ;;;### (autoloads (life) "life" "life.el" (11356 11391))
  ;;; Generated autoloads from life.el
  
  (autoload (quote life) "life" "\
--- 4633,4639 ----
  
  ;;;***
  
! ;;;### (autoloads (life) "life" "life.el" (12782 52672))
  ;;; Generated autoloads from life.el
  
  (autoload (quote life) "life" "\
***************
*** 4635,4641 ****
  
  ;;;***
  
! ;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (12219 31447))
  ;;; Generated autoloads from loadhist.el
  
  (autoload (quote unload-feature) "loadhist" "\
--- 4644,4650 ----
  
  ;;;***
  
! ;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (12786 48777))
  ;;; Generated autoloads from loadhist.el
  
  (autoload (quote unload-feature) "loadhist" "\
***************
*** 4645,4651 ****
  
  ;;;***
  
! ;;;### (autoloads (print-region lpr-region print-buffer lpr-buffer) "lpr" "lpr.el" (12217 8152))
  ;;; Generated autoloads from lpr.el
  
  (defvar lpr-switches nil "\
--- 4654,4660 ----
  
  ;;;***
  
! ;;;### (autoloads (print-region lpr-region print-buffer lpr-buffer) "lpr" "lpr.el" (12786 48782))
  ;;; Generated autoloads from lpr.el
  
  (defvar lpr-switches nil "\
***************
*** 4672,4678 ****
  
  ;;;***
  
! ;;;### (autoloads (phases-of-moon) "lunar" "lunar.el" (11954 59432))
  ;;; Generated autoloads from lunar.el
  
  (autoload (quote phases-of-moon) "lunar" "\
--- 4681,4687 ----
  
  ;;;***
  
! ;;;### (autoloads (phases-of-moon) "lunar" "lunar.el" (12786 48788))
  ;;; Generated autoloads from lunar.el
  
  (autoload (quote phases-of-moon) "lunar" "\
***************
*** 4683,4689 ****
  
  ;;;***
  
! ;;;### (autoloads (apply-macro-to-region-lines kbd-macro-query insert-kbd-macro name-last-kbd-macro) "macros" "macros.el" (12164 38127))
  ;;; Generated autoloads from macros.el
  
  (autoload (quote name-last-kbd-macro) "macros" "\
--- 4692,4698 ----
  
  ;;;***
  
! ;;;### (autoloads (apply-macro-to-region-lines kbd-macro-query insert-kbd-macro name-last-kbd-macro) "macros" "macros.el" (12786 48790))
  ;;; Generated autoloads from macros.el
  
  (autoload (quote name-last-kbd-macro) "macros" "\
***************
*** 4763,4769 ****
  
  ;;;***
  
! ;;;### (autoloads (what-domain mail-extract-address-components) "mail-extr" "mail-extr.el" (12233 29328))
  ;;; Generated autoloads from mail-extr.el
  
  (autoload (quote mail-extract-address-components) "mail-extr" "\
--- 4772,4778 ----
  
  ;;;***
  
! ;;;### (autoloads (what-domain mail-extract-address-components) "mail-extr" "mail-extr.el" (12786 48792))
  ;;; Generated autoloads from mail-extr.el
  
  (autoload (quote mail-extract-address-components) "mail-extr" "\
***************
*** 4783,4789 ****
  
  ;;;***
  
! ;;;### (autoloads (mail-hist-put-headers-into-history mail-hist-define-keys) "mail-hist" "mail-hist.el" (12171 2539))
  ;;; Generated autoloads from mail-hist.el
  
  (autoload (quote mail-hist-define-keys) "mail-hist" "\
--- 4792,4798 ----
  
  ;;;***
  
! ;;;### (autoloads (mail-hist-put-headers-into-history mail-hist-define-keys) "mail-hist" "mail-hist.el" (12786 48794))
  ;;; Generated autoloads from mail-hist.el
  
  (autoload (quote mail-hist-define-keys) "mail-hist" "\
***************
*** 4807,4813 ****
  
  ;;;***
  
! ;;;### (autoloads (mail-fetch-field) "mail-utils" "mail-utils.el" (11612 266))
  ;;; Generated autoloads from mail-utils.el
  
  (defvar mail-use-rfc822 nil "\
--- 4816,4822 ----
  
  ;;;***
  
! ;;;### (autoloads (mail-fetch-field) "mail-utils" "mail-utils.el" (12782 52681))
  ;;; Generated autoloads from mail-utils.el
  
  (defvar mail-use-rfc822 nil "\
***************
*** 4823,4829 ****
  
  ;;;***
  
! ;;;### (autoloads (define-mail-abbrev build-mail-abbrevs mail-abbrevs-setup) "mailabbrev" "mailabbrev.el" (12182 63973))
  ;;; Generated autoloads from mailabbrev.el
  
  (autoload (quote mail-abbrevs-setup) "mailabbrev" nil nil nil)
--- 4832,4838 ----
  
  ;;;***
  
! ;;;### (autoloads (define-mail-abbrev build-mail-abbrevs mail-abbrevs-setup) "mailabbrev" "mailabbrev.el" (12786 48796))
  ;;; Generated autoloads from mailabbrev.el
  
  (autoload (quote mail-abbrevs-setup) "mailabbrev" nil nil nil)
***************
*** 4838,4844 ****
  
  ;;;***
  
! ;;;### (autoloads (define-mail-alias) "mailalias" "mailalias.el" (12220 59725))
  ;;; Generated autoloads from mailalias.el
  
  (autoload (quote define-mail-alias) "mailalias" "\
--- 4847,4853 ----
  
  ;;;***
  
! ;;;### (autoloads (define-mail-alias) "mailalias" "mailalias.el" (12786 48798))
  ;;; Generated autoloads from mailalias.el
  
  (autoload (quote define-mail-alias) "mailalias" "\
***************
*** 4849,4855 ****
  
  ;;;***
  
! ;;;### (autoloads (makefile-mode) "makefile" "makefile.el" (12256 56045))
  ;;; Generated autoloads from makefile.el
  
  (autoload (quote makefile-mode) "makefile" "\
--- 4858,4864 ----
  
  ;;;***
  
! ;;;### (autoloads (makefile-mode) "makefile" "makefile.el" (12786 48800))
  ;;; Generated autoloads from makefile.el
  
  (autoload (quote makefile-mode) "makefile" "\
***************
*** 4930,4936 ****
  
  ;;;***
  
! ;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (11181 53304))
  ;;; Generated autoloads from makesum.el
  
  (autoload (quote make-command-summary) "makesum" "\
--- 4939,4945 ----
  
  ;;;***
  
! ;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (12782 52683))
  ;;; Generated autoloads from makesum.el
  
  (autoload (quote make-command-summary) "makesum" "\
***************
*** 4939,4945 ****
  
  ;;;***
  
! ;;;### (autoloads (man) "man" "man.el" (12235 25043))
  ;;; Generated autoloads from man.el
  
  (defalias (quote manual-entry) (quote man))
--- 4948,4954 ----
  
  ;;;***
  
! ;;;### (autoloads (man) "man" "man.el" (12786 50763))
  ;;; Generated autoloads from man.el
  
  (defalias (quote manual-entry) (quote man))
***************
*** 4954,4960 ****
  
  ;;;***
  
! ;;;### (autoloads (map-y-or-n-p) "map-ynp" "map-ynp.el" (12247 10697))
  ;;; Generated autoloads from map-ynp.el
  
  (autoload (quote map-y-or-n-p) "map-ynp" "\
--- 4963,4969 ----
  
  ;;;***
  
! ;;;### (autoloads (map-y-or-n-p) "map-ynp" "map-ynp.el" (12786 62096))
  ;;; Generated autoloads from map-ynp.el
  
  (autoload (quote map-y-or-n-p) "map-ynp" "\
***************
*** 5001,5007 ****
  
  ;;;***
  
! ;;;### (autoloads (mh-letter-mode mh-smail-other-window mh-smail) "mh-comp" "mh-comp.el" (12189 30603))
  ;;; Generated autoloads from mh-comp.el
  
  (autoload (quote mh-smail) "mh-comp" "\
--- 5010,5016 ----
  
  ;;;***
  
! ;;;### (autoloads (mh-letter-mode mh-smail-other-window mh-smail) "mh-comp" "mh-comp.el" (12786 48810))
  ;;; Generated autoloads from mh-comp.el
  
  (autoload (quote mh-smail) "mh-comp" "\
***************
*** 5051,5057 ****
  
  ;;;***
  
! ;;;### (autoloads (mh-version mh-rmail) "mh-e" "mh-e.el" (12189 30582))
  ;;; Generated autoloads from mh-e.el
  
  (autoload (quote mh-rmail) "mh-e" "\
--- 5060,5066 ----
  
  ;;;***
  
! ;;;### (autoloads (mh-version mh-rmail) "mh-e" "mh-e.el" (12786 50772))
  ;;; Generated autoloads from mh-e.el
  
  (autoload (quote mh-rmail) "mh-e" "\
***************
*** 5064,5070 ****
  
  ;;;***
  
! ;;;### (autoloads nil "mh-mime" "mh-mime.el" (12182 61375))
  ;;; Generated autoloads from mh-mime.el
  
  (defvar mh-mime-content-types (quote (("text/plain") ("text/richtext") ("multipart/mixed") ("multipart/alternative") ("multipart/digest") ("multipart/parallel") ("message/rfc822") ("message/partial") ("message/external-body") ("application/octet-stream") ("application/postscript") ("image/jpeg") ("image/gif") ("audio/basic") ("video/mpeg"))) "\
--- 5073,5079 ----
  
  ;;;***
  
! ;;;### (autoloads nil "mh-mime" "mh-mime.el" (12786 48816))
  ;;; Generated autoloads from mh-mime.el
  
  (defvar mh-mime-content-types (quote (("text/plain") ("text/richtext") ("multipart/mixed") ("multipart/alternative") ("multipart/digest") ("multipart/parallel") ("message/rfc822") ("message/partial") ("message/external-body") ("application/octet-stream") ("application/postscript") ("image/jpeg") ("image/gif") ("audio/basic") ("video/mpeg"))) "\
***************
*** 5072,5078 ****
  
  ;;;***
  
! ;;;### (autoloads nil "mh-utils" "mh-utils.el" (12189 30563))
  ;;; Generated autoloads from mh-utils.el
  
  (put (quote mh-progs) (quote risky-local-variable) t)
--- 5081,5087 ----
  
  ;;;***
  
! ;;;### (autoloads nil "mh-utils" "mh-utils.el" (12786 48821))
  ;;; Generated autoloads from mh-utils.el
  
  (put (quote mh-progs) (quote risky-local-variable) t)
***************
*** 5081,5087 ****
  
  ;;;***
  
! ;;;### (autoloads (convert-mocklisp-buffer) "mlconvert" "mlconvert.el" (12144 35507))
  ;;; Generated autoloads from mlconvert.el
  
  (autoload (quote convert-mocklisp-buffer) "mlconvert" "\
--- 5090,5096 ----
  
  ;;;***
  
! ;;;### (autoloads (convert-mocklisp-buffer) "mlconvert" "mlconvert.el" (12786 48824))
  ;;; Generated autoloads from mlconvert.el
  
  (autoload (quote convert-mocklisp-buffer) "mlconvert" "\
***************
*** 5089,5095 ****
  
  ;;;***
  
! ;;;### (autoloads (modula-2-mode) "modula2" "modula2.el" (12117 58609))
  ;;; Generated autoloads from modula2.el
  
  (autoload (quote modula-2-mode) "modula2" "\
--- 5098,5104 ----
  
  ;;;***
  
! ;;;### (autoloads (modula-2-mode) "modula2" "modula2.el" (12786 48828))
  ;;; Generated autoloads from modula2.el
  
  (autoload (quote modula-2-mode) "modula2" "\
***************
*** 5118,5124 ****
  
  ;;;***
  
! ;;;### (autoloads (mpuz) "mpuz" "mpuz.el" (11684 27378))
  ;;; Generated autoloads from mpuz.el
  
  (autoload (quote mpuz) "mpuz" "\
--- 5127,5133 ----
  
  ;;;***
  
! ;;;### (autoloads (mpuz) "mpuz" "mpuz.el" (12782 52693))
  ;;; Generated autoloads from mpuz.el
  
  (autoload (quote mpuz) "mpuz" "\
***************
*** 5126,5132 ****
  
  ;;;***
  
! ;;;### (autoloads (disable-command enable-command disabled-command-hook) "novice" "novice.el" (12088 17075))
  ;;; Generated autoloads from novice.el
  
  (setq disabled-command-hook (quote disabled-command-hook))
--- 5135,5141 ----
  
  ;;;***
  
! ;;;### (autoloads (disable-command enable-command disabled-command-hook) "novice" "novice.el" (12786 48839))
  ;;; Generated autoloads from novice.el
  
  (setq disabled-command-hook (quote disabled-command-hook))
***************
*** 5145,5151 ****
  
  ;;;***
  
! ;;;### (autoloads (nroff-mode) "nroff-mode" "nroff-mode.el" (12117 58665))
  ;;; Generated autoloads from nroff-mode.el
  
  (autoload (quote nroff-mode) "nroff-mode" "\
--- 5154,5160 ----
  
  ;;;***
  
! ;;;### (autoloads (nroff-mode) "nroff-mode" "nroff-mode.el" (12786 48840))
  ;;; Generated autoloads from nroff-mode.el
  
  (autoload (quote nroff-mode) "nroff-mode" "\
***************
*** 5157,5163 ****
  
  ;;;***
  
! ;;;### (autoloads (edit-options list-options) "options" "options.el" (12135 28451))
  ;;; Generated autoloads from options.el
  
  (autoload (quote list-options) "options" "\
--- 5166,5172 ----
  
  ;;;***
  
! ;;;### (autoloads (edit-options list-options) "options" "options.el" (12786 48842))
  ;;; Generated autoloads from options.el
  
  (autoload (quote list-options) "options" "\
***************
*** 5171,5177 ****
  
  ;;;***
  
! ;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el" (12197 36782))
  ;;; Generated autoloads from outline.el
  
  (autoload (quote outline-mode) "outline" "\
--- 5180,5186 ----
  
  ;;;***
  
! ;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el" (12786 48844))
  ;;; Generated autoloads from outline.el
  
  (autoload (quote outline-mode) "outline" "\
***************
*** 5221,5227 ****
  
  ;;;***
  
! ;;;### (autoloads (pascal-mode) "pascal" "pascal.el" (12164 38325))
  ;;; Generated autoloads from pascal.el
  
  (autoload (quote pascal-mode) "pascal" "\
--- 5230,5236 ----
  
  ;;;***
  
! ;;;### (autoloads (pascal-mode) "pascal" "pascal.el" (12786 62671))
  ;;; Generated autoloads from pascal.el
  
  (autoload (quote pascal-mode) "pascal" "\
***************
*** 5269,5275 ****
  
  ;;;***
  
! ;;;### (autoloads (perl-mode) "perl-mode" "perl-mode.el" (12169 61581))
  ;;; Generated autoloads from perl-mode.el
  
  (autoload (quote perl-mode) "perl-mode" "\
--- 5278,5284 ----
  
  ;;;***
  
! ;;;### (autoloads (perl-mode) "perl-mode" "perl-mode.el" (12786 50804))
  ;;; Generated autoloads from perl-mode.el
  
  (autoload (quote perl-mode) "perl-mode" "\
***************
*** 5320,5326 ****
  
  ;;;***
  
! ;;;### (autoloads (picture-mode) "picture" "picture.el" (12189 27091))
  ;;; Generated autoloads from picture.el
  
  (autoload (quote picture-mode) "picture" "\
--- 5329,5335 ----
  
  ;;;***
  
! ;;;### (autoloads (picture-mode) "picture" "picture.el" (12786 48858))
  ;;; Generated autoloads from picture.el
  
  (autoload (quote picture-mode) "picture" "\
***************
*** 5384,5390 ****
  
  ;;;***
  
! ;;;### (autoloads (pp-eval-last-sexp pp-eval-expression pp) "pp" "pp.el" (12204 5726))
  ;;; Generated autoloads from pp.el
  
  (autoload (quote pp) "pp" "\
--- 5393,5399 ----
  
  ;;;***
  
! ;;;### (autoloads (pp-eval-last-sexp pp-eval-expression pp) "pp" "pp.el" (12786 48860))
  ;;; Generated autoloads from pp.el
  
  (autoload (quote pp) "pp" "\
***************
*** 5406,5412 ****
  
  ;;;***
  
! ;;;### (autoloads (run-prolog prolog-mode) "prolog" "prolog.el" (12117 59000))
  ;;; Generated autoloads from prolog.el
  
  (autoload (quote prolog-mode) "prolog" "\
--- 5415,5421 ----
  
  ;;;***
  
! ;;;### (autoloads (run-prolog prolog-mode) "prolog" "prolog.el" (12786 48862))
  ;;; Generated autoloads from prolog.el
  
  (autoload (quote prolog-mode) "prolog" "\
***************
*** 5422,5428 ****
  
  ;;;***
  
! ;;;### (autoloads (ps-despool ps-spool-region-with-faces 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" "ps-print.el" (12210 50408))
  ;;; Generated autoloads from ps-print.el
  
  (autoload (quote ps-print-buffer) "ps-print" "\
--- 5431,5437 ----
  
  ;;;***
  
! ;;;### (autoloads (ps-despool ps-spool-region-with-faces 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" "ps-print.el" (12786 48863))
  ;;; Generated autoloads from ps-print.el
  
  (autoload (quote ps-print-buffer) "ps-print" "\
***************
*** 5499,5505 ****
  
  ;;;***
  
! ;;;### (autoloads (remote-compile) "rcompile" "rcompile.el" (12061 28317))
  ;;; Generated autoloads from rcompile.el
  
  (autoload (quote remote-compile) "rcompile" "\
--- 5508,5514 ----
  
  ;;;***
  
! ;;;### (autoloads (remote-compile) "rcompile" "rcompile.el" (12786 48864))
  ;;; Generated autoloads from rcompile.el
  
  (autoload (quote remote-compile) "rcompile" "\
***************
*** 5508,5514 ****
  
  ;;;***
  
! ;;;### (autoloads (clear-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "rect.el" (11969 21329))
  ;;; Generated autoloads from rect.el
  
  (autoload (quote delete-rectangle) "rect" "\
--- 5517,5523 ----
  
  ;;;***
  
! ;;;### (autoloads (clear-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "rect.el" (12786 48865))
  ;;; Generated autoloads from rect.el
  
  (autoload (quote delete-rectangle) "rect" "\
***************
*** 5560,5573 ****
  
  ;;;***
  
! ;;;### (autoloads (reporter-submit-bug-report) "reporter" "reporter.el" (12169 48728))
  ;;; Generated autoloads from reporter.el
  
  (autoload (quote reporter-submit-bug-report) "reporter" nil nil nil)
  
  ;;;***
  
! ;;;### (autoloads (reposition-window) "reposition" "reposition.el" (11718 57433))
  ;;; Generated autoloads from reposition.el
  
  (autoload (quote reposition-window) "reposition" "\
--- 5569,5582 ----
  
  ;;;***
  
! ;;;### (autoloads (reporter-submit-bug-report) "reporter" "reporter.el" (12786 48874))
  ;;; Generated autoloads from reporter.el
  
  (autoload (quote reporter-submit-bug-report) "reporter" nil nil nil)
  
  ;;;***
  
! ;;;### (autoloads (reposition-window) "reposition" "reposition.el" (12782 52704))
  ;;; Generated autoloads from reposition.el
  
  (autoload (quote reposition-window) "reposition" "\
***************
*** 5592,5598 ****
  
  ;;;***
  
! ;;;### (autoloads (resume-suspend-hook) "resume" "resume.el" (12256 39758))
  ;;; Generated autoloads from resume.el
  
  (autoload (quote resume-suspend-hook) "resume" "\
--- 5601,5607 ----
  
  ;;;***
  
! ;;;### (autoloads (resume-suspend-hook) "resume" "resume.el" (12786 48877))
  ;;; Generated autoloads from resume.el
  
  (autoload (quote resume-suspend-hook) "resume" "\
***************
*** 5600,5606 ****
  
  ;;;***
  
! ;;;### (autoloads (make-ring ring-p) "ring" "ring.el" (11786 5543))
  ;;; Generated autoloads from ring.el
  
  (autoload (quote ring-p) "ring" "\
--- 5609,5615 ----
  
  ;;;***
  
! ;;;### (autoloads (make-ring ring-p) "ring" "ring.el" (12782 52706))
  ;;; Generated autoloads from ring.el
  
  (autoload (quote ring-p) "ring" "\
***************
*** 5611,5617 ****
  
  ;;;***
  
! ;;;### (autoloads (rlogin) "rlogin" "rlogin.el" (12246 62740))
  ;;; Generated autoloads from rlogin.el
  (add-hook 'same-window-regexps "^\\*rlogin-.*\\*\\(\\|<[0-9]+>\\)")
  
--- 5620,5626 ----
  
  ;;;***
  
! ;;;### (autoloads (rlogin) "rlogin" "rlogin.el" (12786 48880))
  ;;; Generated autoloads from rlogin.el
  (add-hook 'same-window-regexps "^\\*rlogin-.*\\*\\(\\|<[0-9]+>\\)")
  
***************
*** 5651,5657 ****
  
  ;;;***
  
! ;;;### (autoloads (rmail-input rmail-mode rmail) "rmail" "rmail.el" (12252 62727))
  ;;; Generated autoloads from rmail.el
  
  (defvar rmail-dont-reply-to-names nil "\
--- 5660,5666 ----
  
  ;;;***
  
! ;;;### (autoloads (rmail-input rmail-mode rmail) "rmail" "rmail.el" (12786 62717))
  ;;; Generated autoloads from rmail.el
  
  (defvar rmail-dont-reply-to-names nil "\
***************
*** 5768,5781 ****
  
  ;;;***
  
! ;;;### (autoloads (rmail-file-p) "rmailout" "rmailout.el" (11998 33073))
  ;;; Generated autoloads from rmailout.el
  
  (autoload (quote rmail-file-p) "rmailout" nil nil nil)
  
  ;;;***
  
! ;;;### (autoloads (news-post-news) "rnewspost" "rnewspost.el" (12206 60016))
  ;;; Generated autoloads from rnewspost.el
  
  (autoload (quote news-post-news) "rnewspost" "\
--- 5777,5790 ----
  
  ;;;***
  
! ;;;### (autoloads (rmail-file-p) "rmailout" "rmailout.el" (12786 48890))
  ;;; Generated autoloads from rmailout.el
  
  (autoload (quote rmail-file-p) "rmailout" nil nil nil)
  
  ;;;***
  
! ;;;### (autoloads (news-post-news) "rnewspost" "rnewspost.el" (12786 48896))
  ;;; Generated autoloads from rnewspost.el
  
  (autoload (quote news-post-news) "rnewspost" "\
***************
*** 5784,5790 ****
  
  ;;;***
  
! ;;;### (autoloads (toggle-rot13-mode rot13-other-window) "rot13" "rot13.el" (11869 10108))
  ;;; Generated autoloads from rot13.el
  
  (autoload (quote rot13-other-window) "rot13" "\
--- 5793,5799 ----
  
  ;;;***
  
! ;;;### (autoloads (toggle-rot13-mode rot13-other-window) "rot13" "rot13.el" (12782 52711))
  ;;; Generated autoloads from rot13.el
  
  (autoload (quote rot13-other-window) "rot13" "\
***************
*** 5796,5802 ****
  
  ;;;***
  
! ;;;### (autoloads (resize-minibuffer-mode) "rsz-mini" "rsz-mini.el" (12166 18351))
  ;;; Generated autoloads from rsz-mini.el
  
  (defvar resize-minibuffer-mode nil "\
--- 5805,5811 ----
  
  ;;;***
  
! ;;;### (autoloads (resize-minibuffer-mode) "rsz-mini" "rsz-mini.el" (12786 48898))
  ;;; Generated autoloads from rsz-mini.el
  
  (defvar resize-minibuffer-mode nil "\
***************
*** 5856,5862 ****
  
  ;;;***
  
! ;;;### (autoloads (scheme-mode) "scheme" "scheme.el" (12156 22189))
  ;;; Generated autoloads from scheme.el
  
  (autoload (quote scheme-mode) "scheme" "\
--- 5865,5871 ----
  
  ;;;***
  
! ;;;### (autoloads (scheme-mode) "scheme" "scheme.el" (12786 50826))
  ;;; Generated autoloads from scheme.el
  
  (autoload (quote scheme-mode) "scheme" "\
***************
*** 5879,5885 ****
  
  ;;;***
  
! ;;;### (autoloads (scribe-mode) "scribe" "scribe.el" (12198 51390))
  ;;; Generated autoloads from scribe.el
  
  (autoload (quote scribe-mode) "scribe" "\
--- 5888,5894 ----
  
  ;;;***
  
! ;;;### (autoloads (scribe-mode) "scribe" "scribe.el" (12786 48904))
  ;;; Generated autoloads from scribe.el
  
  (autoload (quote scribe-mode) "scribe" "\
***************
*** 5901,5907 ****
  
  ;;;***
  
! ;;;### (autoloads (mail-other-frame mail-other-window mail mail-mode) "sendmail" "sendmail.el" (12230 30395))
  ;;; Generated autoloads from sendmail.el
  
  (defvar mail-from-style (quote angles) "\
--- 5910,5916 ----
  
  ;;;***
  
! ;;;### (autoloads (mail-other-frame mail-other-window mail mail-mode) "sendmail" "sendmail.el" (12786 48908))
  ;;; Generated autoloads from sendmail.el
  
  (defvar mail-from-style (quote angles) "\
***************
*** 6024,6030 ****
  
  ;;;***
  
! ;;;### (autoloads (server-start) "server" "server.el" (12168 11732))
  ;;; Generated autoloads from server.el
  
  (autoload (quote server-start) "server" "\
--- 6033,6039 ----
  
  ;;;***
  
! ;;;### (autoloads (server-start) "server" "server.el" (12786 48910))
  ;;; Generated autoloads from server.el
  
  (autoload (quote server-start) "server" "\
***************
*** 6038,6044 ****
  
  ;;;***
  
! ;;;### (autoloads (sgml-mode) "sgml-mode" "sgml-mode.el" (12256 39759))
  ;;; Generated autoloads from sgml-mode.el
  
  (autoload (quote sgml-mode) "sgml-mode" "\
--- 6047,6053 ----
  
  ;;;***
  
! ;;;### (autoloads (sgml-mode) "sgml-mode" "sgml-mode.el" (12786 48912))
  ;;; Generated autoloads from sgml-mode.el
  
  (autoload (quote sgml-mode) "sgml-mode" "\
***************
*** 6048,6054 ****
  
  ;;;***
  
! ;;;### (autoloads (shell) "shell" "shell.el" (12261 65275))
  ;;; Generated autoloads from shell.el
  
  (defvar shell-prompt-pattern "^[^#$%>\n]*[#$%>] *" "\
--- 6057,6063 ----
  
  ;;;***
  
! ;;;### (autoloads (shell) "shell" "shell.el" (12786 48917))
  ;;; Generated autoloads from shell.el
  
  (defvar shell-prompt-pattern "^[^#$%>\n]*[#$%>] *" "\
***************
*** 6086,6093 ****
  (add-hook 'same-window-buffer-names "*shell*")
  
  ;;;***
  
! ;;;### (autoloads (pair-insert-maybe skeleton-insert define-skeleton) "skeleton" "skeleton.el" (11723 10167))
  ;;; Generated autoloads from skeleton.el
  
  (autoload (quote define-skeleton) "skeleton" "\
--- 6095,6155 ----
  (add-hook 'same-window-buffer-names "*shell*")
  
  ;;;***
+ 
+ (autoload (quote define-skeleton) "skeleton" "\
+ Define a user-configurable COMMAND that enters a statement skeleton.
+ DOCUMENTATION is that of the command, while the variable of the same name,
+ which contains the definition, has a documentation to that effect.
+ PROMPT and ELEMENT ... are as defined under `skeleton-insert'." nil (quote macro))
+ 
+ (autoload (quote skeleton-insert) "skeleton" "\
+ Insert the complex statement skeleton DEFINITION describes very concisely.
+ If optional NO-NEWLINE is nil the skeleton will end on a line of its own.
+ 
+ DEFINITION is made up as (PROMPT ELEMENT ...).  PROMPT may be nil if not
+ needed, a prompt-string or an expression for complex read functions.
+ 
+ If ELEMENT is a string or a character it gets inserted (see also
+ `skeleton-transformation').  Other possibilities are:
+ 
+ 	\\n	go to next line and align cursor
+ 	>	indent according to major mode
+ 	<	undent tab-width spaces but not beyond beginning of line
+ 	_	cursor after termination
+ 	&	skip next ELEMENT if previous didn't move point
+ 	|	skip next ELEMENT if previous moved point
+ 	-num	delete num preceding characters
+ 	resume:	skipped, continue here if quit is signaled
+ 	nil	skipped
+ 
+ ELEMENT may itself be DEFINITION with a PROMPT.  The user is prompted
+ repeatedly for different inputs.  The DEFINITION is processed as often
+ as the user enters a non-empty string.  \\[keyboard-quit] terminates
+ skeleton insertion, but continues after `resume:' and positions at `_'
+ if any.  If PROMPT in such a sub-definition contains a \".. %s ..\" it
+ is replaced by `skeleton-subprompt'.
+ 
+ Other lisp-expressions are evaluated and the value treated as above.
+ The following local variables are available:
+ 
+ 	str	first time: read a string prompting with PROMPT and insert it
+ 			    if PROMPT is not a string it is evaluated instead
+ 		then: insert previously read string once more
+ 	quit	non-nil when resume: section is entered by keyboard quit
+ 	v1, v2	local variables for memorising anything you want" nil nil)
+ 
+ (autoload (quote pair-insert-maybe) "skeleton" "\
+ Insert the character you type ARG times.
+ 
+ With no ARG, if `pair' is non-nil, and if
+ `pair-on-word' is non-nil or we are not before or inside a
+ word, and if `pair-filter' returns nil, pairing is performed.
+ 
+ If a match is found in `pair-alist', that is inserted, else
+ the defaults are used.  These are (), [], {}, <> and `' for the
+ symmetrical ones, and the same character twice for the others." t nil)
  
! ;;;### (autoloads (pair-insert-maybe skeleton-insert define-skeleton) "skeleton" "skeleton.el" (12782 52719))
  ;;; Generated autoloads from skeleton.el
  
  (autoload (quote define-skeleton) "skeleton" "\
***************
*** 6145,6151 ****
  
  ;;;***
  
! ;;;### (autoloads (solar-equinoxes-solstices sunrise-sunset) "solar" "solar.el" (12261 39172))
  ;;; Generated autoloads from solar.el
  
  (defvar calendar-time-display-form (quote (12-hours ":" minutes am-pm (if time-zone " (") time-zone (if time-zone ")"))) "\
--- 6207,6213 ----
  
  ;;;***
  
! ;;;### (autoloads (solar-equinoxes-solstices sunrise-sunset) "solar" "solar.el" (12786 48927))
  ;;; Generated autoloads from solar.el
  
  (defvar calendar-time-display-form (quote (12-hours ":" minutes am-pm (if time-zone " (") time-zone (if time-zone ")"))) "\
***************
*** 6204,6210 ****
  
  ;;;***
  
! ;;;### (autoloads (reverse-region sort-columns sort-regexp-fields sort-fields sort-numeric-fields sort-pages sort-paragraphs sort-lines sort-subr) "sort" "sort.el" (12164 38924))
  ;;; Generated autoloads from sort.el
  
  (autoload (quote sort-subr) "sort" "\
--- 6266,6272 ----
  
  ;;;***
  
! ;;;### (autoloads (reverse-region sort-columns sort-regexp-fields sort-fields sort-numeric-fields sort-pages sort-paragraphs sort-lines sort-subr) "sort" "sort.el" (12786 48928))
  ;;; Generated autoloads from sort.el
  
  (autoload (quote sort-subr) "sort" "\
***************
*** 6309,6315 ****
  
  ;;;***
  
! ;;;### (autoloads (spell-string spell-region spell-word spell-buffer) "spell" "spell.el" (12040 61663))
  ;;; Generated autoloads from spell.el
  
  (put (quote spell-filter) (quote risky-local-variable) t)
--- 6371,6377 ----
  
  ;;;***
  
! ;;;### (autoloads (spell-string spell-region spell-word spell-buffer) "spell" "spell.el" (12786 48930))
  ;;; Generated autoloads from spell.el
  
  (put (quote spell-filter) (quote risky-local-variable) t)
***************
*** 6337,6343 ****
  
  ;;;***
  
! ;;;### (autoloads (snarf-spooks spook) "spook" "spook.el" (11332 39077))
  ;;; Generated autoloads from spook.el
  
  (autoload (quote spook) "spook" "\
--- 6399,6405 ----
  
  ;;;***
  
! ;;;### (autoloads (snarf-spooks spook) "spook" "spook.el" (12782 52721))
  ;;; Generated autoloads from spook.el
  
  (autoload (quote spook) "spook" "\
***************
*** 6348,6354 ****
  
  ;;;***
  
! ;;;### (autoloads (sc-cite-original) "supercite" "supercite.el" (12206 59894))
  ;;; Generated autoloads from supercite.el
  
  (autoload (quote sc-cite-original) "supercite" "\
--- 6410,6416 ----
  
  ;;;***
  
! ;;;### (autoloads (sc-cite-original) "supercite" "supercite.el" (12786 48936))
  ;;; Generated autoloads from supercite.el
  
  (autoload (quote sc-cite-original) "supercite" "\
***************
*** 6377,6383 ****
  
  ;;;***
  
! ;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (12170 7254))
  ;;; Generated autoloads from tabify.el
  
  (autoload (quote untabify) "tabify" "\
--- 6439,6445 ----
  
  ;;;***
  
! ;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (12786 48939))
  ;;; Generated autoloads from tabify.el
  
  (autoload (quote untabify) "tabify" "\
***************
*** 6396,6402 ****
  
  ;;;***
  
! ;;;### (autoloads (talk-connect) "talk" "talk.el" (12201 3538))
  ;;; Generated autoloads from talk.el
  
  (autoload (quote talk-connect) "talk" "\
--- 6458,6464 ----
  
  ;;;***
  
! ;;;### (autoloads (talk-connect) "talk" "talk.el" (12786 48940))
  ;;; Generated autoloads from talk.el
  
  (autoload (quote talk-connect) "talk" "\
***************
*** 6404,6410 ****
  
  ;;;***
  
! ;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (12235 40354))
  ;;; Generated autoloads from tar-mode.el
  
  (autoload (quote tar-mode) "tar-mode" "\
--- 6466,6472 ----
  
  ;;;***
  
! ;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (12786 50847))
  ;;; Generated autoloads from tar-mode.el
  
  (autoload (quote tar-mode) "tar-mode" "\
***************
*** 6425,6431 ****
  
  ;;;***
  
! ;;;### (autoloads (tcl-mode) "tcl-mode" "tcl-mode.el" (11878 15566))
  ;;; Generated autoloads from tcl-mode.el
  
  (autoload (quote tcl-mode) "tcl-mode" "\
--- 6487,6493 ----
  
  ;;;***
  
! ;;;### (autoloads (tcl-mode) "tcl-mode" "tcl-mode.el" (12782 52725))
  ;;; Generated autoloads from tcl-mode.el
  
  (autoload (quote tcl-mode) "tcl-mode" "\
***************
*** 6436,6442 ****
  
  ;;;***
  
! ;;;### (autoloads (rsh telnet) "telnet" "telnet.el" (12131 55286))
  ;;; Generated autoloads from telnet.el
  (add-hook 'same-window-regexps "\\*telnet-.*\\*\\(\\|<[0-9]+>\\)")
  
--- 6498,6504 ----
  
  ;;;***
  
! ;;;### (autoloads (rsh telnet) "telnet" "telnet.el" (12786 48944))
  ;;; Generated autoloads from telnet.el
  (add-hook 'same-window-regexps "\\*telnet-.*\\*\\(\\|<[0-9]+>\\)")
  
***************
*** 6453,6459 ****
  
  ;;;***
  
! ;;;### (autoloads (term make-term) "term" "term.el" (12255 25254))
  ;;; Generated autoloads from term.el
  
  (autoload (quote make-term) "term" "\
--- 6515,6521 ----
  
  ;;;***
  
! ;;;### (autoloads (term make-term) "term" "term.el" (12786 48947))
  ;;; Generated autoloads from term.el
  
  (autoload (quote make-term) "term" "\
***************
*** 6468,6474 ****
  
  ;;;***
  
! ;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (12189 27351))
  ;;; Generated autoloads from terminal.el
  
  (autoload (quote terminal-emulator) "terminal" "\
--- 6530,6536 ----
  
  ;;;***
  
! ;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (12786 50852))
  ;;; Generated autoloads from terminal.el
  
  (autoload (quote terminal-emulator) "terminal" "\
***************
*** 6502,6508 ****
  
  ;;;***
  
! ;;;### (autoloads (tex-start-shell slitex-mode latex-mode plain-tex-mode tex-mode) "tex-mode" "tex-mode.el" (12194 27029))
  ;;; Generated autoloads from tex-mode.el
  
  (defvar tex-shell-file-name nil "\
--- 6564,6570 ----
  
  ;;;***
  
! ;;;### (autoloads (tex-start-shell slitex-mode latex-mode plain-tex-mode tex-mode) "tex-mode" "tex-mode.el" (12786 50855))
  ;;; Generated autoloads from tex-mode.el
  
  (defvar tex-shell-file-name nil "\
***************
*** 6570,6576 ****
  window system being used.  For example,
  
      (setq tex-dvi-view-command
!           (if (eq window-system 'x) \"xdvi\" \"dvi2tty * | cat -s\"))
  
  would tell \\[tex-view] to use xdvi under X windows and to use dvi2tty
  otherwise.")
--- 6632,6641 ----
  window system being used.  For example,
  
      (setq tex-dvi-view-command
!           (cond
!            ((eq window-system 'x)  \"xdvi\")
!            ((eq window-system 'ns) \"open *\")
!            (t                      \"dvi2tty * | cat -s\")))
  
  would tell \\[tex-view] to use xdvi under X windows and to use dvi2tty
  otherwise.")
***************
*** 6733,6739 ****
  
  ;;;***
  
! ;;;### (autoloads (texinfo-format-region texinfo-format-buffer) "texinfmt" "texinfmt.el" (12245 54825))
  ;;; Generated autoloads from texinfmt.el
  
  (autoload (quote texinfo-format-buffer) "texinfmt" "\
--- 6798,6804 ----
  
  ;;;***
  
! ;;;### (autoloads (texinfo-format-region texinfo-format-buffer) "texinfmt" "texinfmt.el" (12786 48953))
  ;;; Generated autoloads from texinfmt.el
  
  (autoload (quote texinfo-format-buffer) "texinfmt" "\
***************
*** 6753,6759 ****
  
  ;;;***
  
! ;;;### (autoloads (texinfo-mode) "texinfo" "texinfo.el" (12260 22503))
  ;;; Generated autoloads from texinfo.el
  
  (autoload (quote texinfo-mode) "texinfo" "\
--- 6818,6824 ----
  
  ;;;***
  
! ;;;### (autoloads (texinfo-mode) "texinfo" "texinfo.el" (12786 48957))
  ;;; Generated autoloads from texinfo.el
  
  (autoload (quote texinfo-mode) "texinfo" "\
***************
*** 6825,6831 ****
  
  ;;;***
  
! ;;;### (autoloads (texinfo-sequential-node-update texinfo-every-node-update texinfo-update-node) "texnfo-upd" "texnfo-upd.el" (12229 21049))
  ;;; Generated autoloads from texnfo-upd.el
  
  (autoload (quote texinfo-update-node) "texnfo-upd" "\
--- 6890,6896 ----
  
  ;;;***
  
! ;;;### (autoloads (texinfo-sequential-node-update texinfo-every-node-update texinfo-update-node) "texnfo-upd" "texnfo-upd.el" (12786 48959))
  ;;; Generated autoloads from texnfo-upd.el
  
  (autoload (quote texinfo-update-node) "texnfo-upd" "\
***************
*** 6871,6877 ****
  
  ;;;***
  
! ;;;### (autoloads (thing-at-point bounds-of-thing-at-point forward-thing) "thingatpt" "thingatpt.el" (11976 13888))
  ;;; Generated autoloads from thingatpt.el
  
  (autoload (quote forward-thing) "thingatpt" "\
--- 6936,6942 ----
  
  ;;;***
  
! ;;;### (autoloads (thing-at-point bounds-of-thing-at-point forward-thing) "thingatpt" "thingatpt.el" (12786 48962))
  ;;; Generated autoloads from thingatpt.el
  
  (autoload (quote forward-thing) "thingatpt" "\
***************
*** 6890,6896 ****
  
  ;;;***
  
! ;;;### (autoloads (display-time) "time" "time.el" (12245 61739))
  ;;; Generated autoloads from time.el
  
  (defvar display-time-day-and-date nil "\
--- 6955,6961 ----
  
  ;;;***
  
! ;;;### (autoloads (display-time) "time" "time.el" (12786 48964))
  ;;; Generated autoloads from time.el
  
  (defvar display-time-day-and-date nil "\
***************
*** 6905,6911 ****
  
  ;;;***
  
! ;;;### (autoloads (time-stamp-toggle-active time-stamp) "time-stamp" "time-stamp.el" (12236 51946))
  ;;; Generated autoloads from time-stamp.el
  
  (autoload (quote time-stamp) "time-stamp" "\
--- 6970,6976 ----
  
  ;;;***
  
! ;;;### (autoloads (time-stamp-toggle-active time-stamp) "time-stamp" "time-stamp.el" (12786 48963))
  ;;; Generated autoloads from time-stamp.el
  
  (autoload (quote time-stamp) "time-stamp" "\
***************
*** 6929,6935 ****
  
  ;;;***
  
! ;;;### (autoloads (run-at-time) "timer" "timer.el" (11985 30147))
  ;;; Generated autoloads from timer.el
  
  (autoload (quote run-at-time) "timer" "\
--- 6994,7000 ----
  
  ;;;***
  
! ;;;### (autoloads (run-at-time) "timer" "timer.el" (12786 48966))
  ;;; Generated autoloads from timer.el
  
  (autoload (quote run-at-time) "timer" "\
***************
*** 6954,6960 ****
  
  ;;;***
  
! ;;;### (autoloads (tmm-prompt tmm-menubar) "tmm" "tmm.el" (12129 8162))
  ;;; Generated autoloads from tmm.el
  
  (autoload (quote tmm-menubar) "tmm" "\
--- 7019,7025 ----
  
  ;;;***
  
! ;;;### (autoloads (tmm-prompt tmm-menubar) "tmm" "tmm.el" (12786 48968))
  ;;; Generated autoloads from tmm.el
  
  (autoload (quote tmm-menubar) "tmm" "\
***************
*** 6973,6979 ****
  
  ;;;***
  
! ;;;### (autoloads (tpu-edt-on) "tpu-edt" "tpu-edt.el" (12193 52754))
  ;;; Generated autoloads from tpu-edt.el
  
  (fset (quote tpu-edt-mode) (quote tpu-edt-on))
--- 7038,7044 ----
  
  ;;;***
  
! ;;;### (autoloads (tpu-edt-on) "tpu-edt" "tpu-edt.el" (12786 62920))
  ;;; Generated autoloads from tpu-edt.el
  
  (fset (quote tpu-edt-mode) (quote tpu-edt-on))
***************
*** 6985,6991 ****
  
  ;;;***
  
! ;;;### (autoloads (tpu-set-cursor-bound tpu-set-cursor-free tpu-set-scroll-margins) "tpu-extras" "tpu-extras.el" (12189 49750))
  ;;; Generated autoloads from tpu-extras.el
  
  (autoload (quote tpu-set-scroll-margins) "tpu-extras" "\
--- 7050,7056 ----
  
  ;;;***
  
! ;;;### (autoloads (tpu-set-cursor-bound tpu-set-cursor-free tpu-set-scroll-margins) "tpu-extras" "tpu-extras.el" (12786 48972))
  ;;; Generated autoloads from tpu-extras.el
  
  (autoload (quote tpu-set-scroll-margins) "tpu-extras" "\
***************
*** 6999,7005 ****
  
  ;;;***
  
! ;;;### (autoloads (tq-create) "tq" "tq.el" (12215 52362))
  ;;; Generated autoloads from tq.el
  
  (autoload (quote tq-create) "tq" "\
--- 7064,7070 ----
  
  ;;;***
  
! ;;;### (autoloads (tq-create) "tq" "tq.el" (12786 48975))
  ;;; Generated autoloads from tq.el
  
  (autoload (quote tq-create) "tq" "\
***************
*** 7010,7016 ****
  
  ;;;***
  
! ;;;### (autoloads (trace-function-background trace-function) "trace" "trace.el" (12201 32675))
  ;;; Generated autoloads from trace.el
  
  (defvar trace-buffer "*trace-output*" "\
--- 7075,7081 ----
  
  ;;;***
  
! ;;;### (autoloads (trace-function-background trace-function) "trace" "trace.el" (12786 48976))
  ;;; Generated autoloads from trace.el
  
  (defvar trace-buffer "*trace-output*" "\
***************
*** 7035,7047 ****
  
  ;;;***
  
! ;;;### (autoloads (tc-recenter tc-scroll-down tc-scroll-up tc-scroll-line tc-associated-buffer tc-merge tc-dissociate tc-split tc-associate-buffer tc-two-columns) "two-column" "two-column.el" (11718 57849))
  ;;; Generated autoloads from two-column.el
  
  (defvar tc-mode-map nil "\
  Keymap for commands for two-column mode.")
  
! (if tc-mode-map nil (setq tc-mode-map (make-sparse-keymap)) (define-key tc-mode-map "1" (quote tc-merge)) (define-key tc-mode-map "2" (quote tc-two-columns)) (define-key tc-mode-map "b" (quote tc-associate-buffer)) (define-key tc-mode-map "d" (quote tc-dissociate)) (define-key tc-mode-map "\f" (quote tc-recenter)) (define-key tc-mode-map "o" (quote tc-associated-buffer)) (define-key tc-mode-map "s" (quote tc-split)) (define-key tc-mode-map "{" (quote shrink-window-horizontally)) (define-key tc-mode-map "}" (quote enlarge-window-horizontally)) (define-key tc-mode-map " " (quote tc-scroll-up)) (define-key tc-mode-map "" (quote tc-scroll-down)) (define-key tc-mode-map "
" (quote tc-scroll-line)))
  
  (global-set-key "6" tc-mode-map)
  
--- 7100,7112 ----
  
  ;;;***
  
! ;;;### (autoloads (tc-recenter tc-scroll-down tc-scroll-up tc-scroll-line tc-associated-buffer tc-merge tc-dissociate tc-split tc-associate-buffer tc-two-columns) "two-column" "two-column.el" (12782 64298))
  ;;; Generated autoloads from two-column.el
  
  (defvar tc-mode-map nil "\
  Keymap for commands for two-column mode.")
  
! (if tc-mode-map nil (setq tc-mode-map (make-sparse-keymap)) (define-key tc-mode-map "1" (quote tc-merge)) (define-key tc-mode-map "2" (quote tc-two-columns)) (define-key tc-mode-map "b" (quote tc-associate-buffer)) (define-key tc-mode-map "d" (quote tc-dissociate)) (define-key tc-mode-map "\f" (quote tc-recenter)) (define-key tc-mode-map "o" (quote tc-associated-buffer)) (define-key tc-mode-map "s" (quote tc-split)) (define-key tc-mode-map "{" (quote shrink-window-horizontally)) (define-key tc-mode-map "}" (quote enlarge-window-horizontally)) (define-key tc-mode-map " " (quote tc-scroll-up)) (define-key tc-mode-map "" (quote tc-scroll-down)) (define-key tc-mode-map [delete] (quote tc-scroll-down)) (define-key tc-mode-map "
" (quote tc-scroll-line)))
  
  (global-set-key "6" tc-mode-map)
  
***************
*** 7146,7152 ****
  
  ;;;***
  
! ;;;### (autoloads (type-break-guestimate-keystroke-threshold type-break-statistics type-break type-break-mode) "type-break" "type-break.el" (12003 12693))
  ;;; Generated autoloads from type-break.el
  
  (defvar type-break-mode nil "\
--- 7211,7217 ----
  
  ;;;***
  
! ;;;### (autoloads (type-break-guestimate-keystroke-threshold type-break-statistics type-break type-break-mode) "type-break" "type-break.el" (12786 48978))
  ;;; Generated autoloads from type-break.el
  
  (defvar type-break-mode nil "\
***************
*** 7285,7291 ****
  
  ;;;***
  
! ;;;### (autoloads (ununderline-region underline-region) "underline" "underline.el" (11652 54624))
  ;;; Generated autoloads from underline.el
  
  (autoload (quote underline-region) "underline" "\
--- 7350,7356 ----
  
  ;;;***
  
! ;;;### (autoloads (ununderline-region underline-region) "underline" "underline.el" (12782 52739))
  ;;; Generated autoloads from underline.el
  
  (autoload (quote underline-region) "underline" "\
***************
*** 7301,7307 ****
  
  ;;;***
  
! ;;;### (autoloads (unrmail batch-unrmail) "unrmail" "unrmail.el" (12156 56720))
  ;;; Generated autoloads from unrmail.el
  
  (autoload (quote batch-unrmail) "unrmail" "\
--- 7366,7372 ----
  
  ;;;***
  
! ;;;### (autoloads (unrmail batch-unrmail) "unrmail" "unrmail.el" (12786 48982))
  ;;; Generated autoloads from unrmail.el
  
  (autoload (quote batch-unrmail) "unrmail" "\
***************
*** 7316,7322 ****
  
  ;;;***
  
! ;;;### (autoloads (ask-to-update-copyright update-copyright) "upd-copyr" "upd-copyr.el" (12065 4870))
  ;;; Generated autoloads from upd-copyr.el
  
  (defvar replace-copying-with nil "\
--- 7381,7387 ----
  
  ;;;***
  
! ;;;### (autoloads (ask-to-update-copyright update-copyright) "upd-copyr" "upd-copyr.el" (12786 48985))
  ;;; Generated autoloads from upd-copyr.el
  
  (defvar replace-copying-with nil "\
***************
*** 7342,7348 ****
  
  ;;;***
  
! ;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock) "userlock" "userlock.el" (11968 23424))
  ;;; Generated autoloads from userlock.el
  
  (autoload (quote ask-user-about-lock) "userlock" "\
--- 7407,7413 ----
  
  ;;;***
  
! ;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock) "userlock" "userlock.el" (12786 48987))
  ;;; Generated autoloads from userlock.el
  
  (autoload (quote ask-user-about-lock) "userlock" "\
***************
*** 7365,7371 ****
  
  ;;;***
  
! ;;;### (autoloads (vc-update-change-log vc-rename-file vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-version-other-window vc-diff vc-register vc-next-action) "vc" "vc.el" (12259 1587))
  ;;; Generated autoloads from vc.el
  
  (defvar vc-checkin-hook nil "\
--- 7430,7436 ----
  
  ;;;***
  
! ;;;### (autoloads (vc-update-change-log vc-rename-file vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-version-other-window vc-diff vc-register vc-next-action) "vc" "vc.el" (12786 48990))
  ;;; Generated autoloads from vc.el
  
  (defvar vc-checkin-hook nil "\
***************
*** 7475,7481 ****
  
  ;;;***
  
! ;;;### (autoloads (vi-mode) "vi" "vi.el" (12189 27600))
  ;;; Generated autoloads from vi.el
  
  (autoload (quote vi-mode) "vi" "\
--- 7540,7546 ----
  
  ;;;***
  
! ;;;### (autoloads (vi-mode) "vi" "vi.el" (12786 50875))
  ;;; Generated autoloads from vi.el
  
  (autoload (quote vi-mode) "vi" "\
***************
*** 7525,7531 ****
  
  ;;;***
  
! ;;;### (autoloads (view-mode view-buffer-other-window view-buffer view-file-other-window view-file) "view" "view.el" (11944 7650))
  ;;; Generated autoloads from view.el
  
  (autoload (quote view-file) "view" "\
--- 7590,7596 ----
  
  ;;;***
  
! ;;;### (autoloads (view-mode view-buffer-other-window view-buffer view-file-other-window view-file) "view" "view.el" (12786 50877))
  ;;; Generated autoloads from view.el
  
  (autoload (quote view-file) "view" "\
***************
*** 7613,7619 ****
  
  ;;;***
  
! ;;;### (autoloads (vip-mode) "vip" "vip.el" (12189 27683))
  ;;; Generated autoloads from vip.el
  
  (autoload (quote vip-mode) "vip" "\
--- 7678,7684 ----
  
  ;;;***
  
! ;;;### (autoloads (vip-mode) "vip" "vip.el" (12786 50881))
  ;;; Generated autoloads from vip.el
  
  (autoload (quote vip-mode) "vip" "\
***************
*** 7621,7627 ****
  
  ;;;***
  
! ;;;### (autoloads (viper-mode) "viper" "viper.el" (12254 194))
  ;;; Generated autoloads from viper.el
  
  (autoload (quote viper-mode) "viper" "\
--- 7686,7692 ----
  
  ;;;***
  
! ;;;### (autoloads (viper-mode) "viper" "viper.el" (12786 49001))
  ;;; Generated autoloads from viper.el
  
  (autoload (quote viper-mode) "viper" "\
***************
*** 7631,7637 ****
  
  ;;;***
  
! ;;;### (autoloads (wordstar-mode) "ws-mode" "ws-mode.el" (11748 56920))
  ;;; Generated autoloads from ws-mode.el
  
  (autoload (quote wordstar-mode) "ws-mode" "\
--- 7696,7702 ----
  
  ;;;***
  
! ;;;### (autoloads (wordstar-mode) "ws-mode" "ws-mode.el" (12782 64309))
  ;;; Generated autoloads from ws-mode.el
  
  (autoload (quote wordstar-mode) "ws-mode" "\
***************
*** 7742,7748 ****
  
  ;;;***
  
! ;;;### (autoloads (psychoanalyze-pinhead insert-zippyism yow) "yow" "yow.el" (11968 23503))
  ;;; Generated autoloads from yow.el
  
  (autoload (quote yow) "yow" "\
--- 7807,7813 ----
  
  ;;;***
  
! ;;;### (autoloads (psychoanalyze-pinhead insert-zippyism yow) "yow" "yow.el" (12786 49015))
  ;;; Generated autoloads from yow.el
  
  (autoload (quote yow) "yow" "\
Index: emacs/lisp/loadup.el
diff -c emacs/lisp/loadup.el:1.1.1.2 emacs/lisp/loadup.el:1.4
*** emacs/lisp/loadup.el:1.1.1.2	Mon Jul 22 01:34:36 1996
--- emacs/lisp/loadup.el	Fri Aug  2 02:56:15 1996
***************
*** 59,76 ****
      (progn
        (garbage-collect)
        (load "frame")))
! (if (fboundp 'frame-face-alist)
!     (progn
!       (garbage-collect)
!       (load "faces")
!       (load "facemenu")))
  (if (fboundp 'track-mouse)
      (progn
        (garbage-collect)
        (load "mouse")
        (garbage-collect)
!       (load "menu-bar")
!       (load "scroll-bar")
        (load "select")))
  (garbage-collect)
  (load "paths.el")  ;Don't get confused if someone compiled paths by mistake.
--- 59,76 ----
      (progn
        (garbage-collect)
        (load "frame")))
! ;;;(if (fboundp 'frame-face-alist)
! ;;;    (progn
! ;;;      (garbage-collect)
! ;;;      (load "faces")
! ;;;      (load "facemenu")))
  (if (fboundp 'track-mouse)
      (progn
        (garbage-collect)
        (load "mouse")
        (garbage-collect)
! ;;;      (load "menu-bar")
! ;;;      (load "scroll-bar")
        (load "select")))
  (garbage-collect)
  (load "paths.el")  ;Don't get confused if someone compiled paths by mistake.
Index: emacs/lisp/lselect.el
diff -c emacs/lisp/lselect.el:1.1.1.1 emacs/lisp/lselect.el:1.2
*** emacs/lisp/lselect.el:1.1.1.1	Fri Jul 19 01:50:30 1996
--- emacs/lisp/lselect.el	Fri Jul 19 05:02:35 1996
***************
*** 28,35 ****
  ;;; all upper-case; this may seem tasteless, but it makes there be a 1:1
  ;;; correspondence between these symbols and X Atoms (which are upcased.)
  
! (defalias 'x-get-cutbuffer 'x-get-cut-buffer)
! (defalias 'x-store-cutbuffer 'x-set-cut-buffer)
  
  (or (find-face 'primary-selection)
      (make-face 'primary-selection))
--- 28,35 ----
  ;;; all upper-case; this may seem tasteless, but it makes there be a 1:1
  ;;; correspondence between these symbols and X Atoms (which are upcased.)
  
! (defalias 'get-cutbuffer 'get-cut-buffer)
! (defalias 'store-cutbuffer 'set-cut-buffer)
  
  (or (find-face 'primary-selection)
      (make-face 'primary-selection))
***************
*** 37,45 ****
  (or (find-face 'secondary-selection)
      (make-face 'secondary-selection))
  
! (defun x-get-secondary-selection ()
    "Return text selected from some X window."
!   (x-get-selection-internal 'SECONDARY 'STRING))
  
  (defvar primary-selection-extent nil
    "The extent of the primary selection; don't use this.")
--- 37,45 ----
  (or (find-face 'secondary-selection)
      (make-face 'secondary-selection))
  
! (defun get-secondary-selection ()
    "Return text selected from some X window."
!   (get-selection-internal 'SECONDARY 'STRING))
  
  (defvar primary-selection-extent nil
    "The extent of the primary selection; don't use this.")
***************
*** 48,54 ****
    "The extent of the secondary selection; don't use this.")
  
  
! (defun x-select-make-extent-for-selection (selection previous-extent face)
    ;; Given a selection, this makes an extent in the buffer which holds that
    ;; selection, for highlighting purposes.  If the selection isn't associated
    ;; with a buffer, this does nothing.
--- 48,54 ----
    "The extent of the secondary selection; don't use this.")
  
  
! (defun select-make-extent-for-selection (selection previous-extent face)
    ;; Given a selection, this makes an extent in the buffer which holds that
    ;; selection, for highlighting purposes.  If the selection isn't associated
    ;; with a buffer, this does nothing.
***************
*** 95,101 ****
  	(set-extent-face previous-extent face)))))
  
  
! (defun x-own-selection (selection &optional type)
    "Make a primary X Selection of the given argument.  
  The argument may be a string, a cons of two markers, or an extent.  
  In the latter cases the selection is considered to be the text 
--- 95,101 ----
  	(set-extent-face previous-extent face)))))
  
  
! (defun own-selection (selection &optional type)
    "Make a primary X Selection of the given argument.  
  The argument may be a string, a cons of two markers, or an extent.  
  In the latter cases the selection is considered to be the text 
***************
*** 106,124 ****
  			(copy-marker (point-marker))
  			(copy-marker (mark-marker))))))
    (or type (setq type 'PRIMARY))
!   (x-set-selection selection type)
    (cond ((eq type 'PRIMARY)
  	 (setq primary-selection-extent
! 	       (x-select-make-extent-for-selection
  		selection primary-selection-extent 'primary-selection)))
  	((eq type 'SECONDARY)
  	 (setq secondary-selection-extent
! 	       (x-select-make-extent-for-selection
  		selection secondary-selection-extent 'secondary-selection))))
    selection)
  
  
! (defun x-own-secondary-selection (selection &optional type)
    "Make a secondary X Selection of the given argument.  The argument may be a 
  string or a cons of two markers (in which case the selection is considered to
  be the text between those markers.)"
--- 106,124 ----
  			(copy-marker (point-marker))
  			(copy-marker (mark-marker))))))
    (or type (setq type 'PRIMARY))
!   (set-selection selection type)
    (cond ((eq type 'PRIMARY)
  	 (setq primary-selection-extent
! 	       (select-make-extent-for-selection
  		selection primary-selection-extent 'primary-selection)))
  	((eq type 'SECONDARY)
  	 (setq secondary-selection-extent
! 	       (select-make-extent-for-selection
  		selection secondary-selection-extent 'secondary-selection))))
    selection)
  
  
! (defun own-secondary-selection (selection &optional type)
    "Make a secondary X Selection of the given argument.  The argument may be a 
  string or a cons of two markers (in which case the selection is considered to
  be the text between those markers.)"
***************
*** 127,147 ****
  		 (list (cons ;; these need not be ordered.
  			(copy-marker (point-marker))
  			(copy-marker (mark-marker))))))
!   (x-own-selection selection 'SECONDARY))
  
  
! (defun x-own-clipboard (string)
    "Paste the given string to the X Clipboard."
!   (x-own-selection string 'CLIPBOARD))
  
  
! (defun x-disown-selection (&optional secondary-p)
    "Assuming we own the selection, disown it.  With an argument, discard the
  secondary selection instead of the primary selection."
!   (x-disown-selection-internal (if secondary-p 'SECONDARY 'PRIMARY)))
  
! (defun x-dehilight-selection (selection)
!   "for use as a value of x-lost-selection-hooks."
    (cond ((eq selection 'PRIMARY)
  	 (if primary-selection-extent
  	     (let ((inhibit-quit t))
--- 127,147 ----
  		 (list (cons ;; these need not be ordered.
  			(copy-marker (point-marker))
  			(copy-marker (mark-marker))))))
!   (own-selection selection 'SECONDARY))
  
  
! (defun own-clipboard (string)
    "Paste the given string to the X Clipboard."
!   (own-selection string 'CLIPBOARD))
  
  
! (defun disown-selection (&optional secondary-p)
    "Assuming we own the selection, disown it.  With an argument, discard the
  secondary selection instead of the primary selection."
!   (disown-selection-internal (if secondary-p 'SECONDARY 'PRIMARY)))
  
! (defun dehilight-selection (selection)
!   "for use as a value of lost-selection-hooks."
    (cond ((eq selection 'PRIMARY)
  	 (if primary-selection-extent
  	     (let ((inhibit-quit t))
***************
*** 155,186 ****
  	       (setq secondary-selection-extent nil)))))
    nil)
  
! (setq x-lost-selection-hooks 'x-dehilight-selection)
  
! (defun x-notice-selection-requests (selection type successful)
!   "for possible use as the value of x-sent-selection-hooks."
    (if (not successful)
        (message "Selection request failed to convert %s to %s"
  	       selection type)
      (message "Sent selection %s as %s" selection type)))
  
! (defun x-notice-selection-failures (selection type successful)
!   "for possible use as the value of x-sent-selection-hooks."
    (or successful
        (message "Selection request failed to convert %s to %s"
  	       selection type)))
  
! ;(setq x-sent-selection-hooks 'x-notice-selection-requests)
! ;(setq x-sent-selection-hooks 'x-notice-selection-failures)
  
  
  ;;; Random utility functions
  
! (defun x-kill-primary-selection ()
    "If there is a selection, delete the text it covers, and copy it to 
  both the kill ring and the Clipboard."
    (interactive)
!   (or (x-selection-owner-p) (error "emacs does not own the primary selection"))
    (setq last-command nil)
    (or primary-selection-extent
        (error "the primary selection is not an extent?"))
--- 155,186 ----
  	       (setq secondary-selection-extent nil)))))
    nil)
  
! (setq lost-selection-hooks 'dehilight-selection)
  
! (defun notice-selection-requests (selection type successful)
!   "for possible use as the value of sent-selection-hooks."
    (if (not successful)
        (message "Selection request failed to convert %s to %s"
  	       selection type)
      (message "Sent selection %s as %s" selection type)))
  
! (defun notice-selection-failures (selection type successful)
!   "for possible use as the value of sent-selection-hooks."
    (or successful
        (message "Selection request failed to convert %s to %s"
  	       selection type)))
  
! ;(setq sent-selection-hooks 'notice-selection-requests)
! ;(setq sent-selection-hooks 'notice-selection-failures)
  
  
  ;;; Random utility functions
  
! (defun kill-primary-selection ()
    "If there is a selection, delete the text it covers, and copy it to 
  both the kill ring and the Clipboard."
    (interactive)
!   (or (selection-owner-p) (error "emacs does not own the primary selection"))
    (setq last-command nil)
    (or primary-selection-extent
        (error "the primary selection is not an extent?"))
***************
*** 188,200 ****
      (set-buffer (extent-buffer primary-selection-extent))
      (kill-region (extent-start-position primary-selection-extent)
  		 (extent-end-position primary-selection-extent)))
!   (x-disown-selection nil))
  
! (defun x-delete-primary-selection ()
    "If there is a selection, delete the text it covers *without* copying it to
  the kill ring or the Clipboard."
    (interactive)
!   (or (x-selection-owner-p) (error "emacs does not own the primary selection"))
    (setq last-command nil)
    (or primary-selection-extent
        (error "the primary selection is not an extent?"))
--- 188,200 ----
      (set-buffer (extent-buffer primary-selection-extent))
      (kill-region (extent-start-position primary-selection-extent)
  		 (extent-end-position primary-selection-extent)))
!   (disown-selection nil))
  
! (defun delete-primary-selection ()
    "If there is a selection, delete the text it covers *without* copying it to
  the kill ring or the Clipboard."
    (interactive)
!   (or (selection-owner-p) (error "emacs does not own the primary selection"))
    (setq last-command nil)
    (or primary-selection-extent
        (error "the primary selection is not an extent?"))
***************
*** 202,214 ****
      (set-buffer (extent-buffer primary-selection-extent))
      (delete-region (extent-start-position primary-selection-extent)
  		   (extent-end-position primary-selection-extent)))
!   (x-disown-selection nil))
  
! (defun x-copy-primary-selection ()
    "If there is a selection, copy it to both the kill ring and the Clipboard."
    (interactive)
    (setq last-command nil)
!   (or (x-selection-owner-p) (error "emacs does not own the primary selection"))
    (or primary-selection-extent
        (error "the primary selection is not an extent?"))
    (save-excursion
--- 202,214 ----
      (set-buffer (extent-buffer primary-selection-extent))
      (delete-region (extent-start-position primary-selection-extent)
  		   (extent-end-position primary-selection-extent)))
!   (disown-selection nil))
  
! (defun copy-primary-selection ()
    "If there is a selection, copy it to both the kill ring and the Clipboard."
    (interactive)
    (setq last-command nil)
!   (or (selection-owner-p) (error "emacs does not own the primary selection"))
    (or primary-selection-extent
        (error "the primary selection is not an extent?"))
    (save-excursion
***************
*** 216,226 ****
      (copy-region-as-kill (extent-start-position primary-selection-extent)
  			 (extent-end-position primary-selection-extent))))
  
! (defun x-yank-clipboard-selection ()
    "If someone owns a Clipboard selection, insert it at point."
    (interactive)
    (setq last-command nil)
!   (let ((clip (x-get-clipboard)))
      (or clip (error "there is no clipboard selection"))
      (push-mark)
      (insert clip)))
--- 216,226 ----
      (copy-region-as-kill (extent-start-position primary-selection-extent)
  			 (extent-end-position primary-selection-extent))))
  
! (defun yank-clipboard-selection ()
    "If someone owns a Clipboard selection, insert it at point."
    (interactive)
    (setq last-command nil)
!   (let ((clip (get-clipboard)))
      (or clip (error "there is no clipboard selection"))
      (push-mark)
      (insert clip)))
Index: emacs/lisp/lucid.el
diff -c emacs/lisp/lucid.el:1.1.1.2 emacs/lisp/lucid.el:1.3
*** emacs/lisp/lucid.el:1.1.1.2	Mon Jul 22 01:34:42 1996
--- emacs/lisp/lucid.el	Wed Jul 31 01:35:18 1996
***************
*** 231,237 ****
  ;; (defalias 'unfocus-screen 'unfocus-frame)
  (defalias 'visible-screen-list 'visible-frame-list)
  (defalias 'window-screen 'window-frame)
! (defalias 'x-create-screen 'x-create-frame)
  (defalias 'x-new-screen 'make-frame)
  
  (provide 'lucid)
--- 231,237 ----
  ;; (defalias 'unfocus-screen 'unfocus-frame)
  (defalias 'visible-screen-list 'visible-frame-list)
  (defalias 'window-screen 'window-frame)
! (defalias 'x-create-screen 'create-frame)
  (defalias 'x-new-screen 'make-frame)
  
  (provide 'lucid)
Index: emacs/lisp/man.el
diff -c emacs/lisp/man.el:1.1.1.2 emacs/lisp/man.el:1.3
*** emacs/lisp/man.el:1.1.1.2	Mon Jul 22 01:34:59 1996
--- emacs/lisp/man.el	Wed Jul 31 01:35:21 1996
***************
*** 282,287 ****
--- 282,288 ----
    (suppress-keymap Man-mode-map)
    (define-key Man-mode-map " "    'scroll-up)
    (define-key Man-mode-map "\177" 'scroll-down)
+   (define-key Man-mode-map [delete] 'scroll-down)
    (define-key Man-mode-map "n"    'Man-next-section)
    (define-key Man-mode-map "p"    'Man-previous-section)
    (define-key Man-mode-map "\en"  'Man-next-manpage)
Index: emacs/lisp/map-ynp.el
diff -c emacs/lisp/map-ynp.el:1.1.1.2 emacs/lisp/map-ynp.el:1.3
*** emacs/lisp/map-ynp.el:1.1.1.2	Mon Jul 22 01:35:02 1996
--- emacs/lisp/map-ynp.el	Wed Jul 31 01:35:23 1996
***************
*** 133,139 ****
  		   ;; Prompt the user about this object.
  		   (setq quit-flag nil)
  		   (if mouse-event
! 		       (setq def (or (x-popup-dialog mouse-event
  						     (cons prompt map))
  				     'quit))
  		     ;; Prompt in the echo area.
--- 133,139 ----
  		   ;; Prompt the user about this object.
  		   (setq quit-flag nil)
  		   (if mouse-event
! 		       (setq def (or (popup-dialog mouse-event
  						     (cons prompt map))
  				     'quit))
  		     ;; Prompt in the echo area.
Index: emacs/lisp/menu-bar.el
diff -c emacs/lisp/menu-bar.el:1.1.1.2 emacs/lisp/menu-bar.el:1.3
*** emacs/lisp/menu-bar.el:1.1.1.2	Mon Jul 22 01:35:04 1996
--- emacs/lisp/menu-bar.el	Wed Jul 31 01:35:25 1996
***************
*** 238,244 ****
  (put 'fill-region 'menu-enable 'mark-active)
  (put 'kill-region 'menu-enable 'mark-active)
  (put 'menu-bar-kill-ring-save 'menu-enable 'mark-active)
! (put 'yank 'menu-enable '(x-selection-exists-p))
  (put 'yank-menu 'menu-enable '(cdr yank-menu))
  (put 'delete-region 'menu-enable '(and mark-active
  				       (not (mouse-region-match))))
--- 238,244 ----
  (put 'fill-region 'menu-enable 'mark-active)
  (put 'kill-region 'menu-enable 'mark-active)
  (put 'menu-bar-kill-ring-save 'menu-enable 'mark-active)
! (put 'yank 'menu-enable '(selection-exists-p))
  (put 'yank-menu 'menu-enable '(cdr yank-menu))
  (put 'delete-region 'menu-enable '(and mark-active
  				       (not (mouse-region-match))))
***************
*** 255,278 ****
  (put 'clipboard-kill-region 'menu-enable 'mark-active)
  (put 'clipboard-kill-ring-save 'menu-enable 'mark-active)
  (put 'clipboard-yank 'menu-enable
!      '(or (x-selection-exists-p) (x-selection-exists-p 'CLIPBOARD)))
  
  (defun clipboard-yank ()
    "Reinsert the last stretch of killed text, or the clipboard contents."
    (interactive)
!   (let ((x-select-enable-clipboard t))
      (yank)))
  
  (defun clipboard-kill-ring-save (beg end)
    "Copy region to kill ring, and save in the X clipboard."
    (interactive "r")
!   (let ((x-select-enable-clipboard t))
      (kill-ring-save beg end)))
  
  (defun clipboard-kill-region (beg end)
    "Kill the region, and save it in the X clipboard."
    (interactive "r")
!   (let ((x-select-enable-clipboard t))
      (kill-region beg end)))
  
  (defun menu-bar-enable-clipboard ()
--- 255,278 ----
  (put 'clipboard-kill-region 'menu-enable 'mark-active)
  (put 'clipboard-kill-ring-save 'menu-enable 'mark-active)
  (put 'clipboard-yank 'menu-enable
!      '(or (selection-exists-p) (selection-exists-p 'CLIPBOARD)))
  
  (defun clipboard-yank ()
    "Reinsert the last stretch of killed text, or the clipboard contents."
    (interactive)
!   (let ((select-enable-clipboard t))
      (yank)))
  
  (defun clipboard-kill-ring-save (beg end)
    "Copy region to kill ring, and save in the X clipboard."
    (interactive "r")
!   (let ((select-enable-clipboard t))
      (kill-ring-save beg end)))
  
  (defun clipboard-kill-region (beg end)
    "Kill the region, and save it in the X clipboard."
    (interactive "r")
!   (let ((select-enable-clipboard t))
      (kill-region beg end)))
  
  (defun menu-bar-enable-clipboard ()
Index: emacs/lisp/mh-e.el
diff -c emacs/lisp/mh-e.el:1.1.1.2 emacs/lisp/mh-e.el:1.3
*** emacs/lisp/mh-e.el:1.1.1.2	Mon Jul 22 01:35:09 1996
--- emacs/lisp/mh-e.el	Wed Jul 31 01:35:27 1996
***************
*** 1288,1293 ****
--- 1288,1294 ----
  (define-key mh-folder-mode-map "\eu" 'mh-undo-folder)
  (define-key mh-folder-mode-map "\e " 'mh-page-digest)
  (define-key mh-folder-mode-map "\e\177" 'mh-page-digest-backwards)
+ (define-key mh-folder-mode-map [escape delete] 'mh-page-digest-backwards)
  (define-key mh-folder-mode-map "\ed" 'mh-redistribute)
  (define-key mh-folder-mode-map "\ee" 'mh-extract-rejected-mail)
  (define-key mh-folder-mode-map "\ef" 'mh-visit-folder)
***************
*** 1314,1319 ****
--- 1315,1321 ----
  (define-key mh-folder-mode-map "\e<" 'mh-first-msg)
  (define-key mh-folder-mode-map "\e>" 'mh-last-msg)
  (define-key mh-folder-mode-map "\177" 'mh-previous-page)
+ (define-key mh-folder-mode-map [delete] 'mh-previous-page)
  (define-key mh-folder-mode-map " " 'mh-page-msg)
  (define-key mh-folder-mode-map "\r" 'mh-show)
  (define-key mh-folder-mode-map "." 'mh-show)
Index: emacs/lisp/mouse-sel.el
diff -c emacs/lisp/mouse-sel.el:1.1.1.2 emacs/lisp/mouse-sel.el:1.3
*** emacs/lisp/mouse-sel.el:1.1.1.2	Mon Jul 22 01:35:26 1996
--- emacs/lisp/mouse-sel.el	Wed Jul 31 01:35:29 1996
***************
*** 92,99 ****
  ;; 	   mouse-3		mouse-extend
  ;;  
  ;;       Selection/kill-ring interaction is retained
! ;;         interprogram-cut-function   = x-select-text
! ;;         interprogram-paste-function = x-cut-buffer-or-selection-value
  ;;         
  ;;       What you lose is the ability to select some text in
  ;;       delete-selection-mode and yank over the top of it.
--- 92,99 ----
  ;; 	   mouse-3		mouse-extend
  ;;  
  ;;       Selection/kill-ring interaction is retained
! ;;         interprogram-cut-function   = select-text
! ;;         interprogram-paste-function = cut-buffer-or-selection-value
  ;;         
  ;;       What you lose is the ability to select some text in
  ;;       delete-selection-mode and yank over the top of it.
***************
*** 181,188 ****
   				  type for this selection should be stored.")
      
  (defvar mouse-sel-set-selection-function 
!   (if (fboundp 'x-set-selection)
!       'x-set-selection)
    "Function to call to set selection.
  Called with two arguments:
  
--- 181,188 ----
   				  type for this selection should be stored.")
      
  (defvar mouse-sel-set-selection-function 
!   (if (fboundp 'set-selection)
!       'set-selection)
    "Function to call to set selection.
  Called with two arguments:
  
***************
*** 190,205 ****
    VALUE, the text to store.")
  
  (defvar mouse-sel-get-selection-function
!   (if (fboundp 'x-get-selection)
!       'x-get-selection)
    "Function to call to get the selection.
  Called with one argument:
  
     SELECTION: the name of the selection concerned.")
  
  (defvar mouse-sel-selection-owner-p-function
!   (if (fboundp 'x-selection-owner-p)
!       'x-selection-owner-p)
    "Function to check whether Emacs still owns the selection.
  Called with one argument:
  
--- 190,205 ----
    VALUE, the text to store.")
  
  (defvar mouse-sel-get-selection-function
!   (if (fboundp 'get-selection)
!       'get-selection)
    "Function to call to get the selection.
  Called with one argument:
  
     SELECTION: the name of the selection concerned.")
  
  (defvar mouse-sel-selection-owner-p-function
!   (if (fboundp 'selection-owner-p)
!       'selection-owner-p)
    "Function to check whether Emacs still owns the selection.
  Called with one argument:
  
Index: emacs/lisp/mouse.el
diff -c emacs/lisp/mouse.el:1.1.1.2 emacs/lisp/mouse.el:1.3
*** emacs/lisp/mouse.el:1.1.1.2	Mon Jul 22 01:35:28 1996
--- emacs/lisp/mouse.el	Wed Jul 31 01:35:31 1996
***************
*** 27,33 ****
  ;; system access) through the mouse.  All this code assumes that mouse
  ;; interpretation has been abstracted into Emacs input events.
  ;;
! ;; The code is rather X-dependent.
  
  ;;; Code:
  
--- 27,33 ----
  ;; system access) through the mouse.  All this code assumes that mouse
  ;; interpretation has been abstracted into Emacs input events.
  ;;
! ;; The code is rather GUI dependent.
  
  ;;; Code:
  
***************
*** 66,72 ****
  ;; Compute and cache the equivalent keys in MENU and all its submenus.
  (defun mouse-major-mode-menu-compute-equiv-keys (menu)
    (and (eq (car menu) 'keymap)
!        (x-popup-menu nil menu))
    (while menu
      (and (consp (car menu))
  	 (consp (cdr (car menu)))
--- 66,72 ----
  ;; Compute and cache the equivalent keys in MENU and all its submenus.
  (defun mouse-major-mode-menu-compute-equiv-keys (menu)
    (and (eq (car menu) 'keymap)
!        (popup-menu nil menu))
    (while menu
      (and (consp (car menu))
  	 (consp (cdr (car menu)))
***************
*** 122,129 ****
      (raise-frame frame)
      (select-frame frame)
      (or (eq frame oframe)
! 	(set-mouse-position (selected-frame) (1- (frame-width)) 0))
!     (unfocus-frame)))
  
  (defun mouse-tear-off-window (click)
    "Delete the window clicked on, and create a new frame displaying its buffer."
--- 122,128 ----
      (raise-frame frame)
      (select-frame frame)
      (or (eq frame oframe)
! 	(set-mouse-position (selected-frame) (1- (frame-width)) 0))))
  
  (defun mouse-tear-off-window (click)
    "Delete the window clicked on, and create a new frame displaying its buffer."
***************
*** 316,323 ****
  	(goto-char (posn-point posn)))
      ;; If mark is highlighted, no need to bounce the cursor.
      ;; On X, we highlight while dragging, thus once again no need to bounce.
!     (or transient-mark-mode
! 	(eq (framep (selected-frame)) 'x)
  	(sit-for 1))
      (push-mark)
      (set-mark (point))
--- 315,322 ----
  	(goto-char (posn-point posn)))
      ;; If mark is highlighted, no need to bounce the cursor.
      ;; On X, we highlight while dragging, thus once again no need to bounce.
!     (or (and transient-mark-mode
! 	     (not (eq (framep (selected-frame)) t)))
  	(sit-for 1))
      (push-mark)
      (set-mark (point))
***************
*** 854,865 ****
  	    (if (marker-position mouse-secondary-start)
  		(save-window-excursion
  		  (delete-overlay mouse-secondary-overlay)
! 		  (x-set-selection 'SECONDARY nil)
  		  (select-window start-window)
  		  (save-excursion
  		    (goto-char mouse-secondary-start)
  		    (sit-for 1)))
! 	      (x-set-selection
  	       'SECONDARY
  	       (buffer-substring (overlay-start mouse-secondary-overlay)
  				 (overlay-end mouse-secondary-overlay)))))))))
--- 853,864 ----
  	    (if (marker-position mouse-secondary-start)
  		(save-window-excursion
  		  (delete-overlay mouse-secondary-overlay)
! 		  (set-selection 'SECONDARY nil)
  		  (select-window start-window)
  		  (save-excursion
  		    (goto-char mouse-secondary-start)
  		    (sit-for 1)))
! 	      (set-selection
  	       'SECONDARY
  	       (buffer-substring (overlay-start mouse-secondary-overlay)
  				 (overlay-end mouse-secondary-overlay)))))))))
***************
*** 873,879 ****
    ;; Give temporary modes such as isearch a chance to turn off.
    (run-hooks 'mouse-leave-buffer-hook)
    (or mouse-yank-at-point (mouse-set-point click))
!   (insert (x-get-selection 'SECONDARY)))
  
  (defun mouse-kill-secondary ()
    "Kill the text in the secondary selection.
--- 872,878 ----
    ;; Give temporary modes such as isearch a chance to turn off.
    (run-hooks 'mouse-leave-buffer-hook)
    (or mouse-yank-at-point (mouse-set-point click))
!   (insert (get-selection 'SECONDARY)))
  
  (defun mouse-kill-secondary ()
    "Kill the text in the secondary selection.
***************
*** 897,903 ****
        (kill-region (overlay-start mouse-secondary-overlay)
  		   (overlay-end mouse-secondary-overlay))))
    (delete-overlay mouse-secondary-overlay)
! ;;;  (x-set-selection 'SECONDARY nil)
    (setq mouse-secondary-overlay nil))
  
  (defun mouse-secondary-save-then-kill (click)
--- 896,902 ----
        (kill-region (overlay-start mouse-secondary-overlay)
  		   (overlay-end mouse-secondary-overlay))))
    (delete-overlay mouse-secondary-overlay)
! ;;;  (set-selection 'SECONDARY nil)
    (setq mouse-secondary-overlay nil))
  
  (defun mouse-secondary-save-then-kill (click)
***************
*** 1012,1018 ****
  	  (setq mouse-save-then-kill-posn
  		(list (car kill-ring) (point) click-posn))))
        (if (overlay-buffer mouse-secondary-overlay)
! 	  (x-set-selection 'SECONDARY
  			   (buffer-substring
  			    (overlay-start mouse-secondary-overlay)
  			    (overlay-end mouse-secondary-overlay)))))))
--- 1011,1017 ----
  	  (setq mouse-save-then-kill-posn
  		(list (car kill-ring) (point) click-posn))))
        (if (overlay-buffer mouse-secondary-overlay)
! 	  (set-selection 'SECONDARY
  			   (buffer-substring
  			    (overlay-start mouse-secondary-overlay)
  			    (overlay-end mouse-secondary-overlay)))))))
***************
*** 1061,1067 ****
  				 head))))
  			 (setq tail (cdr tail)))
  		       (reverse head))))))
!     (let ((buf (x-popup-menu event menu))
  	  (window (posn-window (event-start event))))
        (if buf
  	  (progn
--- 1060,1066 ----
  				 head))))
  			 (setq tail (cdr tail)))
  		       (reverse head))))))
!     (let ((buf (popup-menu event menu))
  	  (window (posn-window (event-start event))))
        (if buf
  	  (progn
***************
*** 1516,1522 ****
  (defun mouse-set-font (&rest fonts)
    "Select an emacs font from a list of known good fonts"
    (interactive
!    (x-popup-menu last-nonmenu-event x-fixed-font-alist))
    (if fonts
        (let (font)
  	(while fonts
--- 1515,1521 ----
  (defun mouse-set-font (&rest fonts)
    "Select an emacs font from a list of known good fonts"
    (interactive
!    (popup-menu last-nonmenu-event x-fixed-font-alist))
    (if fonts
        (let (font)
  	(while fonts
Index: emacs/lisp/ns-compat.el
diff -c /dev/null emacs/lisp/ns-compat.el:1.2
*** /dev/null	Fri Aug  2 20:40:15 1996
--- emacs/lisp/ns-compat.el	Wed Jul 31 01:35:35 1996
***************
*** 0 ****
--- 1,58 ----
+ ; -*-Emacs-Lisp-*-
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;
+ ; File:         ns-compat.el
+ ; RCS:          /usr/local/lib/cvs/emacs-19/lisp/ns-compat.el,v 1.1.2.4 1995/05/15 15:25:52 cedman Exp
+ ; Description:  Patch x-foo to always call the generic foo
+ ; Author:       Carl Edman
+ ; Created:      Thu Nov 10 20:46:01 1994
+ ; Modified:     Tue Jul 30 04:54:19 1996 (Christian Limpach) chris@nice.ch
+ ; Language:     Emacs-Lisp
+ ; Package:      N/A
+ ; Status:       Experimental (Do Not Distribute)
+ ;
+ ; (C) Copyright 1994, but otherwise this file is perfect freeware.
+ ;
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ 
+ (defalias 'x-close-current-connection 'close-current-connection)
+ (defalias 'x-color-defined-p 'color-defined-p)
+ (defalias 'x-color-values 'color-values)
+ (defalias 'x-create-frame 'create-frame)
+ (defalias 'x-defined-colors 'defined-colors)
+ (defalias 'x-disown-selection-internal 'disown-selection-internal)
+ (defalias 'x-display-backing-store 'display-backing-store)
+ (defalias 'x-display-color-cells 'display-color-cells)
+ (defalias 'x-display-color-p 'display-color-p)
+ (defalias 'x-display-mm-height 'display-mm-height)
+ (defalias 'x-display-mm-width 'display-mm-width)
+ (defalias 'x-display-pixel-height 'display-pixel-height)
+ (defalias 'x-display-pixel-width 'display-pixel-width)
+ (defalias 'x-display-planes 'display-planes)
+ (defalias 'x-display-save-under 'display-save-under)
+ (defalias 'x-display-screens 'display-screens)
+ (defalias 'x-display-visual-class 'display-visual-class)
+ (defalias 'x-get-cut-buffer-internal 'get-cut-buffer-internal)
+ (defalias 'x-set-resource 'set-resource)
+ (defalias 'x-get-resource 'get-resource)
+ (defalias 'x-get-selection-internal 'get-selection-internal)
+ (defalias 'x-hide-emacs 'hide-emacs)
+ (defalias 'x-internal-next-face-id 'internal-next-face-id)
+ (defalias 'x-list-fonts 'list-fonts)
+ (defalias 'x-make-face-internal 'make-face-internal)
+ (defalias 'x-open-connection 'open-connection)
+ (defalias 'x-own-selection-internal 'own-selection-internal)
+ (defalias 'x-popup-menu 'popup-menu)
+ (defalias 'x-popup-dialog 'popup-dialog)
+ (defalias 'x-rotate-cut-buffers-internal 'rotate-cut-buffers-internal)
+ (defalias 'x-selection-exists-p 'selection-exists-p)
+ (defalias 'x-selection-owner-p 'selection-owner-p)
+ (defalias 'x-server-max-request-size 'server-max-request-size)
+ (defalias 'x-server-vendor 'server-vendor)
+ (defalias 'x-server-version 'server-version)
+ (defalias 'x-set-face-attribute-internal 'set-face-attribute-internal)
+ (defalias 'x-store-cut-buffer-internal 'store-cut-buffer-internal)
+ (defalias 'x-synchronize 'synchronize)
+ (defalias 'x-resolve-font-name 'resolve-font-name)
+ 
+ (provide 'ns-compat)
Index: emacs/lisp/ns-gdb.el
diff -c /dev/null emacs/lisp/ns-gdb.el:1.1
*** /dev/null	Fri Aug  2 20:40:18 1996
--- emacs/lisp/ns-gdb.el	Wed Jul 24 04:22:29 1996
***************
*** 0 ****
--- 1,83 ----
+ ; -*-Emacs-Lisp-*-
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;
+ ; File:         ns-gdb.el
+ ; RCS:          /usr/local/lib/cvs/emacs-19/lisp/ns-gdb.el,v 1.1.2.4 1994/05/25 01:32:44 cedman Exp
+ ; Description:  A mode to support interaction between Emacs and NeXT gdb
+ ; Author:       Carl Edman
+ ; Created:      Sun May 15 15:08:45 1994
+ ; Modified:     Wed May 18 20:59:01 1994 (Carl Edman) cedman@capitalist.princeton.edu
+ ; Language:     Emacs-Lisp
+ ; Package:      N/A
+ ; Status:       Experimental (Do Not Distribute)
+ ;
+ ; (C) Copyright 1994, but otherwise this file is perfect freeware.
+ ;
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ 
+ (defvar ns-gdb-mode nil
+   "Non-nil when in NS gdb mode.")
+ (make-variable-buffer-local 'ns-gdb-mode)
+ (defvar ns-gdb-mode-map nil
+   "Keymap used by NS gdb mode.")
+ 
+ (defun ns-gdb-mode (arg)
+   "Toggle NS gdb mode.\n\
+ With argument ARG, turn mode on iff ARG is positive.\n\
+ \\{ns-gdb-mode-map}"
+   (interactive "P")
+   (setq ns-gdb-mode
+         (if (null arg) (not ns-gdb-mode)
+           (> (prefix-numeric-value arg) 0)))
+   (force-mode-line-update))
+ 
+ (if ns-gdb-mode-map
+     nil
+   (setq ns-gdb-mode-map (make-sparse-keymap))
+   (define-key ns-gdb-mode-map "\C-cn" 'ns-gdb-next)
+   (define-key ns-gdb-mode-map "\C-cs" 'ns-gdb-step)
+   (define-key ns-gdb-mode-map "\C-cc" 'ns-gdb-continue)
+   (define-key ns-gdb-mode-map "\C-cf" 'ns-gdb-finish)
+   (define-key ns-gdb-mode-map "\C-cq" 'ns-gdb-quit)
+   (define-key ns-gdb-mode-map "\C-cr" 'ns-gdb-run)
+   
+   (define-key ns-gdb-mode-map "\C-cD" 'ns-gdb-down)
+   (define-key ns-gdb-mode-map "\C-cU" 'ns-gdb-up)
+   (define-key ns-gdb-mode-map "\C-cF" 'ns-gdb-frame)
+   (define-key ns-gdb-mode-map "\C-cS" 'ns-gdb-select-frame)
+   
+   (define-key ns-gdb-mode-map "\C-cb" 'ns-gdb-break-here)
+   (define-key ns-gdb-mode-map "\C-cu" 'ns-gdb-until-here)
+   (define-key ns-gdb-mode-map "\C-cp" 'ns-gdb-print-here)
+   (define-key ns-gdb-mode-map "\C-cP" 'ns-gdb-print-indirect-here)
+   (define-key ns-gdb-mode-map "\C-c\C-g" 'ns-gdb-interrupt)
+   (define-key ns-gdb-mode-map "\C-c\C-c" 'ns-gdb-mode))
+ 
+ (defun ns-gdb-break-here ()
+   "Put a break point on the current line in the current file."
+   (interactive)
+   (ns-gdb-break (file-name-nondirectory (buffer-file-name))
+                 (1+ (count-lines (point-min) (point)))))
+ 
+ (defun ns-gdb-until-here ()
+   "Run until reaching the current line in the current file."
+   (interactive)
+   (ns-gdb-until (file-name-nondirectory (buffer-file-name))
+                 (1+ (count-lines (point-min) (point)))))
+ 
+ (defun ns-gdb-print-here ()
+   "Print the value of the word around point."
+   (interactive)
+   (ns-gdb-print (current-word)))
+ 
+ (defun ns-gdb-print-indirect-here ()
+   "Print the value pointed by the word around the point."
+   (interactive)
+   (ns-gdb-print-indirect (current-word)))
+ 
+ (or (assq 'ns-gdb-mode minor-mode-alist)
+     (setq minor-mode-alist (cons '(ns-gdb-mode (" NS gdb:" ns-gdb-status))
+                                  minor-mode-alist)))
+ (or (assq 'ns-gdb-mode minor-mode-map-alist)
+     (setq minor-mode-map-alist (cons (cons 'ns-gdb-mode ns-gdb-mode-map)
+                                      minor-mode-map-alist)))
Index: emacs/lisp/ns-icon.el
diff -c /dev/null emacs/lisp/ns-icon.el:1.1
*** /dev/null	Fri Aug  2 20:40:20 1996
--- emacs/lisp/ns-icon.el	Wed Jul 24 04:22:30 1996
***************
*** 0 ****
--- 1,94 ----
+ ;; ns-icon
+ ;; Description:  Automagically updates the icon associated with each frame
+ ;;		 as the file currently being edited in that frame changes.
+ ;;		 Really only useful under Emacs 19 for NeXTSTEP.
+ ;; Author:    Joe Reiss			<jreiss@magnus.acs.ohio-state.edu>
+ ;; File:      ns-icon.el
+ ;;
+ ;; This program is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 2 of the License, or 
+ ;; (at your option) any later version.
+ 
+ ;; This program is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;; GNU General Public License for more details.
+ 
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with this program; if not, write to the Free Software
+ ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ ;; LCD Archive Entry:
+ ;; ns-icon|Joe Reiss|jreiss@magnus.acs.ohio-state.edu|
+ ;; Update frame icons based on name of file currently being edited.|
+ ;; 11-June-1994|1.00||
+ 
+ ;; INSTALLATION: 
+ ;; byte-compile it if you must, then put this file in one of your lisp
+ ;; load directories and add the following line to your .emacs file
+ ;;
+ ;; (require 'ns-icon)
+ 
+ (require 'advice)
+ (provide 'ns-icon)
+ 
+ (defvar ns-icon-type-alist 
+   '(("\\.bib$" . "bib") ("\\.c$" . "c")
+     ("\\.el$"  . "el")  ("\\.h$" . "h")
+     ("\\.l$"   . "l")   ("\\.m$" . "m")
+     ("\\.tex$" . "tex") ("\\.y$" . "y"))
+ "Alist mapping file names to icons.
+ 
+ Each element is a cons cell containing a pattern to match against the
+ current filename and the type of the icon to be used if the filename
+ matches that pattern.")
+ 
+ (defun ns-set-frame-icon ()
+ "Update the current frame's icon based on the name of the file being edited.
+ The icon type to be used is determined from the variable `ns-icon-type-alist'."
+   (interactive)
+   (let* ((frame (selected-frame))
+ 	 (filename (buffer-file-name 
+ 		    (window-buffer (frame-selected-window frame))))
+ 	 (aptr (append ns-icon-type-alist '(("*" . nil))))
+ 	 (pattern) (icon-form))
+     (if filename
+ 	(progn
+ 	  (while aptr
+ 	    (setq pattern (car (car aptr)))
+ 	    (setq icon-form (cdr (car aptr)))
+ 	    (if (string-match pattern filename)
+ 		(setq aptr nil)
+ 	      (setq aptr (cdr aptr))))))
+     (modify-frame-parameters 
+      frame (list (cons 'icon-type icon-form)))))
+ 
+ (defadvice select-window (after set-icon activate)
+   "Set the icon of the frame according to filename."
+   (ns-set-frame-icon))
+ 
+ (defadvice other-window (after set-icon activate)
+   "Set the icon of the frame according to filename."
+   (ns-set-frame-icon))
+ 
+ (defadvice delete-window (after set-icon activate)
+   "Set the icon of the frame according to filename."
+   (ns-set-frame-icon))
+ 
+ (defadvice bury-buffer (after set-icon activate)
+   "Set the icon of the frame according to filename."
+   (ns-set-frame-icon))
+ 
+ (defadvice switch-to-buffer (after set-icon activate)
+   "Set the icon of the frame according to filename."
+   (ns-set-frame-icon))
+ 
+ (defadvice switch-to-buffer-other-window (after set-icon activate)
+   "Set the icon of the frame according to filename."
+   (ns-set-frame-icon))
+ 
+ (defadvice pop-to-buffer (after set-icon activate)
+   "Set the icon of the frame according to filename."
+   (ns-set-frame-icon))
+ 
Index: emacs/lisp/ns-menu-bar.el
diff -c /dev/null emacs/lisp/ns-menu-bar.el:1.4
*** /dev/null	Fri Aug  2 20:40:25 1996
--- emacs/lisp/ns-menu-bar.el	Fri Aug  2 03:55:56 1996
***************
*** 0 ****
--- 1,609 ----
+ ;;; ns-menu-bar.el --- define a default menu bar for NS users
+ 
+ ;; Author: Carl Edman
+ ;; Keywords: internal
+ ;; Maintainer: Christian Limpach <chris@nice.ch>
+ 
+ ;; Copyright (C) 1993 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 2, or (at your option)
+ ;; any later version.
+ 
+ ;; GNU Emacs is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;; GNU General Public License for more details.
+ 
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU Emacs; see the file COPYING.  If not, write to
+ ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ ;;; Code:
+ 
+ (require 'cl)
+ (require 'ispell)
+ 
+ ;; Don't clobber an existing menu-bar keymap, to preserve any menu-bar key
+ ;; definitions made in loaddefs.el.
+ (or (lookup-key global-map [menu-bar])
+     (define-key global-map [menu-bar] (make-sparse-keymap "menu-bar")))
+ 
+ (setq menu-bar-final-items '(buffers windows services hide-app quit))
+ 
+ (define-key global-map [menu-bar quit] '("Quit" . save-buffers-kill-emacs))
+ (define-key global-map [menu-bar hide-app] '("Hide" . do-hide-emacs))
+ (define-key global-map [menu-bar services] (cons "Services" (make-sparse-keymap "Services")))
+ (define-key global-map [menu-bar windows] (make-sparse-keymap "Windows"))
+ (define-key global-map [menu-bar buffers] (make-sparse-keymap "Buffers"))
+ 
+ (defvar menu-bar-tools-menu (make-sparse-keymap "Tools"))
+ (define-key global-map [menu-bar tools] (cons "Tools" menu-bar-tools-menu))
+ 
+ (defvar menu-bar-search-menu (make-sparse-keymap "Search"))
+ (define-key global-map [menu-bar search] (cons "Search" menu-bar-search-menu))
+ 
+ (defvar menu-bar-edit-menu (make-sparse-keymap "Edit"))
+ (define-key global-map [menu-bar edit] (cons "Edit" menu-bar-edit-menu))
+ 
+ (defvar menu-bar-files-menu (make-sparse-keymap "File"))
+ (define-key global-map [menu-bar files] (cons "File" menu-bar-files-menu))
+ ;; This alias is for compatibility with 19.28 and before.
+ (defvar menu-bar-file-menu menu-bar-files-menu)
+ 
+ (defvar menu-bar-help-menu (make-sparse-keymap "Info"))
+ (define-key global-map [menu-bar help-menu] (cons "Info" menu-bar-help-menu))
+ 
+ (defvar vc-menu-map (make-sparse-keymap "Version Control"))
+ 
+ (define-key menu-bar-tools-menu [calendar] '("Display Calendar" . calendar))
+ (define-key menu-bar-tools-menu [rmail] '("Read Mail" . rmail))
+ (define-key menu-bar-tools-menu [gnus] '("Read Net News" . gnus))
+ 
+ (define-key menu-bar-tools-menu [vc-menu]
+   (cons "Version Control" vc-menu-map))
+ 
+ (define-key menu-bar-tools-menu [epatch]
+   (cons "Apply Patch" menu-bar-epatch-menu))
+ (define-key menu-bar-tools-menu [ediff-merge]
+   (cons "Merge" menu-bar-ediff-merge-menu))
+ (define-key menu-bar-tools-menu [compare]
+   (cons "Compare" menu-bar-ediff-menu))
+ 
+ (put 'print-region 'menu-enable 'mark-active)
+ (put 'ps-print-region-with-faces 'menu-enable 'mark-active)
+ 
+ (define-key menu-bar-tools-menu [ps-print-region]
+   '("Postscript Print Region" . ps-print-region-with-faces))
+ (define-key menu-bar-tools-menu [ps-print-buffer]
+   '("Postscript Print Buffer" . ps-print-buffer-with-faces))
+ (define-key menu-bar-tools-menu [print-region]
+   '("Print Region" . print-region))
+ (define-key menu-bar-tools-menu [print-buffer]
+   '("Print Buffer" . print-buffer))
+ ;(define-key menu-bar-user-menu [gomoku] '("Gomoku" . gomoku))
+ ;(define-key menu-bar-user-menu [hanoi] '("Hanoi" . hanoi))
+ ;(define-key menu-bar-user-menu [doktor] '("Doctor" . doctor))
+ 
+ (define-key menu-bar-files-menu [one-window]
+   '("One Window" . delete-other-windows))
+ (define-key menu-bar-files-menu [split-window]
+   '("Split Window" . split-window-vertically))
+ (define-key menu-bar-files-menu [kill-buffer]
+   '("Kill Current Buffer" . kill-this-buffer))
+ (define-key menu-bar-files-menu [insert-file]
+   '("Insert File..." . insert-file))
+ (define-key menu-bar-files-menu [revert-buffer]
+   '("Revert Buffer" . revert-buffer))
+ (define-key menu-bar-files-menu [write-file]
+   '("Save Buffer As..." . write-file))
+ (define-key menu-bar-files-menu [save-buffer] '("Save Buffer" . save-buffer))
+ (define-key menu-bar-files-menu [dired] '("Open Directory..." . dired))
+ (define-key menu-bar-files-menu [open-file]
+   '("Open File..." . find-file-other-frame))
+ 
+ ;; This is just one element of the ediff menu--the first.
+ (define-key menu-bar-ediff-menu [window]
+   '("This Window And Next Window" . compare-windows))
+ 
+ (defun nonincremental-search-forward (string)
+   "Read a string and search for it nonincrementally."
+   (interactive "sSearch for string: ")
+   (if (equal string "")
+       (search-forward (car search-ring))
+     (isearch-update-ring string nil)
+     (search-forward string)))
+ 
+ (defun nonincremental-search-backward (string)
+   "Read a string and search backward for it nonincrementally."
+   (interactive "sSearch for string: ")
+   (if (equal string "")
+       (search-backward (car search-ring))
+     (isearch-update-ring string nil)
+     (search-backward string)))
+ 
+ (defun nonincremental-re-search-forward (string)
+   "Read a regular expression and search for it nonincrementally."
+   (interactive "sSearch for regexp: ")
+   (if (equal string "")
+       (re-search-forward (car regexp-search-ring))
+     (isearch-update-ring string t)
+     (re-search-forward string)))
+ 
+ (defun nonincremental-re-search-backward (string)
+   "Read a regular expression and search backward for it nonincrementally."
+   (interactive "sSearch for regexp: ")
+   (if (equal string "")
+       (re-search-backward (car regexp-search-ring))
+     (isearch-update-ring string t)
+     (re-search-backward string)))
+ 
+ (defun nonincremental-repeat-search-forward ()
+   "Search forward for the previous search string."
+   (interactive)
+   (search-forward (car search-ring)))
+ 
+ (defun nonincremental-repeat-search-backward ()
+   "Search backward for the previous search string."
+   (interactive)
+   (search-backward (car search-ring)))
+ 
+ (defun nonincremental-repeat-re-search-forward ()
+   "Search forward for the previous regular expression."
+   (interactive)
+   (re-search-forward (car regexp-search-ring)))
+ 
+ (defun nonincremental-repeat-re-search-backward ()
+   "Search backward for the previous regular expression."
+   (interactive)
+   (re-search-backward (car regexp-search-ring)))
+ 
+ (define-key menu-bar-search-menu [query-replace-regexp]
+   '("Query Replace Regexp..." . query-replace-regexp))
+ (define-key menu-bar-search-menu [query-replace]
+   '("Query Replace..." . query-replace))
+ (define-key menu-bar-search-menu [find-tag]
+   '("Find Tag..." . find-tag))
+ (put 'find-tag 'menu-enable 'tags-table-list)
+ (define-key menu-bar-search-menu [bookmark]
+   (cons "Bookmarks" menu-bar-bookmark-map))
+ 
+ (define-key menu-bar-search-menu [nonincremental-repeat-re-search-back]
+   '("Repeat Regexp Backwards" . nonincremental-repeat-re-search-backward))
+ (define-key menu-bar-search-menu [nonincremental-repeat-search-back]
+   '("Repeat Backwards" . nonincremental-repeat-search-backward))
+ (define-key menu-bar-search-menu [nonincremental-repeat-re-search-fwd]
+   '("Repeat Regexp" . nonincremental-repeat-re-search-forward))
+ (define-key menu-bar-search-menu [nonincremental-repeat-search-fwd]
+   '("Repeat Search" . nonincremental-repeat-search-forward))
+ 
+ (define-key menu-bar-search-menu [re-search-back]
+   '("Regexp Search Backwards..." . nonincremental-re-search-backward))
+ (define-key menu-bar-search-menu [search-back]
+   '("Search Backwards..." . nonincremental-search-backward))
+ (define-key menu-bar-search-menu [re-search-fwd]
+   '("Regexp Search..." . nonincremental-re-search-forward))
+ (define-key menu-bar-search-menu [search-fwd]
+   '("Search..." . nonincremental-search-forward))
+ 
+ (if (fboundp 'start-process)
+     (define-key menu-bar-edit-menu [spell] '("Spell" . ispell-menu-map)))
+ (define-key menu-bar-edit-menu [fill] '("Fill" . fill-region))
+ (define-key menu-bar-edit-menu [props] (cons "Text Properties" facemenu-menu))
+ (define-key menu-bar-edit-menu [clear] '("Clear" . delete-region))
+ 
+ (defvar yank-menu (make-sparse-keymap "Select and Paste"))
+ (define-key menu-bar-edit-menu [select-paste]
+   (cons "Select and Paste" yank-menu))
+ (define-key menu-bar-edit-menu [paste] '("Paste" . yank))
+ (define-key menu-bar-edit-menu [copy] '("Copy" . menu-bar-kill-ring-save))
+ (define-key menu-bar-edit-menu [cut] '("Cut" . kill-region))
+ (define-key menu-bar-edit-menu [undo] '("Undo" . undo))
+ 
+ (defun menu-bar-kill-ring-save (beg end)
+   (interactive "r")
+   (if (mouse-region-match)
+       (message "Select a region with the mouse does `copy' automatically")
+     (kill-ring-save beg end)))
+ 
+ (put 'fill-region 'menu-enable 'mark-active)
+ (put 'kill-region 'menu-enable 'mark-active)
+ (put 'menu-bar-kill-ring-save 'menu-enable 'mark-active)
+ (put 'yank 'menu-enable '(selection-exists-p))
+ (put 'yank-menu 'menu-enable '(cdr yank-menu))
+ (put 'delete-region 'menu-enable '(and mark-active
+ 				       (not (mouse-region-match))))
+ (put 'undo 'menu-enable '(if (eq last-command 'undo)
+ 			     pending-undo-list
+ 			   (consp buffer-undo-list)))
+ (put 'query-replace 'menu-enable '(not buffer-read-only))
+ 
+ (autoload 'ispell-menu-map "ispell" nil t 'keymap)
+ 
+ (define-key menu-bar-help-menu [emacs-version]
+   '("Show Version" . emacs-version))
+ (define-key menu-bar-help-menu [ns-bug-report]
+   '("Report NeXTstep bug" . ns-submit-bug-report))
+ (define-key menu-bar-help-menu [report-emacs-bug]
+   '("Report General Emacs bug..." . report-emacs-bug))
+ (define-key menu-bar-help-menu [emacs-tutorial]
+   '("Emacs Tutorial" . help-with-tutorial))
+ (define-key menu-bar-help-menu [emacs-faq]
+   '("Emacs FAQ" . view-emacs-FAQ))
+ (define-key menu-bar-help-menu [emacs-news]
+   '("Emacs News" . view-emacs-news))
+ (define-key menu-bar-help-menu [man] '("Man..." . manual-entry))
+ (define-key menu-bar-help-menu [describe-variable]
+   '("Describe Variable..." . describe-variable))
+ (define-key menu-bar-help-menu [describe-function]
+   '("Describe Function..." . describe-function))
+ (define-key menu-bar-help-menu [describe-key]
+   '("Describe Key..." . describe-key))
+ (define-key menu-bar-help-menu [list-keybindings]
+   '("List Keybindings" . describe-bindings))
+ (define-key menu-bar-help-menu [command-apropos]
+   '("Command Apropos..." . command-apropos))
+ (define-key menu-bar-help-menu [describe-mode]
+   '("Describe Mode" . describe-mode))
+ (define-key menu-bar-help-menu [save-preferences]
+   '("Save Preferences" . ns-save-preferences))
+ (define-key menu-bar-help-menu [info-ns]
+   '("Info about Emacs for NS" . info-ns-emacs))
+ (define-key menu-bar-help-menu [info] '("Browse Manuals" . info))
+ 
+ (defun info-ns-emacs ()         ; for the menubar as well
+   "Jump to ns-emacs info item."
+   (interactive)
+   (info "ns-emacs"))
+ 
+ (defun kill-this-buffer ()	; for the menubar
+   "Kills the current buffer."
+   (interactive)
+   (kill-buffer (current-buffer)))
+ 
+ (defun kill-this-buffer-enabled-p ()
+   (let ((count 0)
+ 	(buffers (buffer-list)))
+     (while buffers
+       (or (string-match "^ " (buffer-name (car buffers)))
+ 	  (setq count (1+ count)))
+       (setq buffers (cdr buffers)))
+     (and (not (window-minibuffer-p (selected-window)))
+ 	 (> count 1))))
+ 
+ (put 'kill-this-buffer 'menu-enable '(kill-this-buffer-enabled-p))
+ 
+ (put 'save-buffer 'menu-enable
+      '(and (buffer-modified-p)
+ 	   (not (window-minibuffer-p (selected-window)))))
+ 
+ (put 'write-file 'menu-enable
+      '(not (window-minibuffer-p (selected-window))))
+ 
+ (put 'find-file 'menu-enable
+      '(not (window-minibuffer-p (selected-window))))
+ 
+ (put 'dired 'menu-enable
+      '(not (window-minibuffer-p (selected-window))))
+ 
+ (put 'insert-file 'menu-enable
+      '(not (window-minibuffer-p (selected-window))))
+ 
+ (put 'revert-buffer 'menu-enable
+      '(or revert-buffer-function revert-buffer-insert-file-contents-function
+ 	  (and (buffer-file-name)
+ 	       (or (buffer-modified-p)
+ 		   (not (verify-visited-file-modtime (current-buffer)))))))
+ 
+ ;; Permit deleting frame if it would leave a visible or iconified frame.
+ (put 'delete-frame 'menu-enable
+      '(delete-frame-enabled-p))
+ 
+ (defun delete-frame-enabled-p ()
+   "Return non-nil if `delete-frame' should be enabled in the menu bar."
+   (let ((frames (frame-list))
+ 	      (count 0))
+ 	  (while frames
+ 	    (if (frame-visible-p (car frames))
+ 		(setq count (1+ count)))
+ 	    (setq frames (cdr frames)))
+ 	  (> count 1)))
+ 
+ (put 'advertised-undo 'menu-enable
+      '(and (not (eq t buffer-undo-list))
+ 	   (if (eq last-command 'undo)
+ 	       (and (boundp 'pending-undo-list)
+ 		    pending-undo-list)
+ 	     buffer-undo-list)))
+ 
+ (defvar yank-menu-length 43
+   "*Maximum length to display in the yank-menu.")
+ 
+ (defun menu-bar-update-yank-menu (string old)
+   (let* ((front (car (cdr yank-menu)))
+ 	 ;; build menu-string
+ 	 ;; replace newlines by dots
+ 	 ;; and shorten the string to yank-menu-length
+ 	 (menu-string (let ((res string) (pos -1))
+ 			(while (setq pos (string-match "\n" res (1+ pos)))
+ 			  (setq res (replace-match "." nil t res)))
+ 			(if (string-match "\\.*$" res)
+ 			    (setq res (replace-match "" nil t res)))))
+          (menu-string (if (<= (length menu-string) yank-menu-length)
+                           menu-string
+                         (concat
+                          (substring menu-string 0 (/ yank-menu-length 2))
+                          "..."
+                          (substring menu-string (- (/ yank-menu-length 2)))))))
+     ;; If we're supposed to be extending an existing string, and that
+     ;; string really is at the front of the menu, then update it in place.
+     (if (and old (or (eq old (car front))
+ 		     (string= old (car front))))
+ 	(progn
+ 	  (setcar front string)
+ 	  (setcar (cdr front) menu-string))
+       (setcdr yank-menu
+ 	      (cons
+ 	       (cons string (cons menu-string 'menu-bar-select-yank))
+ 	       (cdr yank-menu)))))
+   (if (> (length (cdr yank-menu)) kill-ring-max)
+       (setcdr (nthcdr kill-ring-max yank-menu) nil)))
+ 
+ (defun menu-bar-select-yank ()
+   (interactive "*")
+   (push-mark (point))
+   (insert last-command-event))
+ 
+ (defvar complex-buffers-menu-p nil
+   "*Non-nil says, offer a choice of actions after you pick a buffer.
+ This applies to the Buffers menu from the menu bar.")
+ 
+ (defvar buffers-menu-max-size 10
+   "*Maximum number of entries which may appear on the Buffers menu.
+ If this is 10, then only the ten most-recently-selected buffers are shown.
+ If this is nil, then all buffers are shown.
+ A large number or nil slows down menu responsiveness.")
+ 
+ (defvar list-buffers-directory nil)
+ 
+ (defun menu-bar-select-buffer ()
+   (interactive)
+   (switch-to-buffer last-command-event))
+ 
+ (defun menu-bar-update-buffers ()
+   (let* ((buffers (buffer-list))
+          buffers-menu)
+     ;; If requested, list only the N most recently selected buffers.
+     (if (and (integerp buffers-menu-max-size)
+              (> buffers-menu-max-size 1))
+         (if (> (length buffers) buffers-menu-max-size)
+             (setcdr (nthcdr buffers-menu-max-size buffers) nil)))
+     
+     ;; Make the menu of buffers proper.
+     (setq buffers-menu
+           (cons "Select Buffer"
+                 (let ((tail buffers)
+                       (maxbuf 0)
+                       (maxlen 0)
+                       alist
+                       head)
+                   (while tail
+                     (or (eq ?\ (aref (buffer-name (car tail)) 0))
+                         (setq maxbuf
+                               (max maxbuf
+                                    (length (buffer-name (car tail))))))
+                     (setq tail (cdr tail)))
+                   (setq tail buffers)
+                   (while tail
+                     (let ((elt (car tail)))
+                       (or (eq ?\ (aref (buffer-name elt) 0))
+                           (setq alist (cons
+                                        (cons
+                                         (format
+                                          (format "%%%ds  %%s%%s  %%s"
+                                                  maxbuf)
+                                          (buffer-name elt)
+                                          (if (buffer-modified-p elt)
+                                              "*" " ")
+                                          (save-excursion
+                                            (set-buffer elt)
+                                            (if buffer-read-only "%" " "))
+                                          (abbreviate-file-name
+                                           (or (buffer-file-name elt)
+                                               (save-excursion
+                                                 (set-buffer elt)
+                                                 list-buffers-directory)
+                                               "")))
+                                         elt)
+                                        alist)))
+                       (and alist (> (length (car (car alist))) maxlen)
+                            (setq maxlen (length (car (car alist))))))
+                     (setq tail (cdr tail)))
+                   (setq alist (nreverse alist))
+                   (nconc (mapcar '(lambda (pair)
+                                     ;; This is somewhat risque, to use
+                                     ;; the buffer name itself as the event type
+                                     ;; to define, but it works.
+                                     ;; It would not work to use the buffer
+                                     ;; since a buffer as an event has its
+                                     ;; own meaning.
+                                     (nconc (list (buffer-name (cdr pair))
+                                                  (car pair)
+                                                  (cons nil nil))
+                                            'menu-bar-select-buffer))
+                                  alist)
+                          (list (cons 'list-buffers
+                                      (cons
+                                       (concat (make-string (max (- (/ maxlen
+                                                                       2)
+                                                                    8)
+                                                                 0) ?\ )
+                                               "List All Buffers")
+                                       'list-buffers)))))))
+     (if buffers-menu
+         (setq buffers-menu (cons 'keymap buffers-menu)))
+     (define-key global-map [menu-bar buffers]
+       (cons "Buffers" (or buffers-menu 'undefined)))))
+ 
+ (add-hook 'menu-bar-update-fab-hook 'menu-bar-update-buffers)
+ 
+ (defun menu-bar-select-frame ()
+   (interactive)
+   (make-frame-visible last-command-event)
+   (raise-frame last-command-event)
+   (select-frame last-command-event))
+ 
+ ;; ns-arrange functions contributed
+ ;; by Eberhard Mandler <mandler@dbag.ulm.DaimlerBenz.COM>
+ (defun ns-arrange-all-frames ()
+   "Arranges all frames according to topline"
+   (interactive)
+   (ns-arrange-frames t))
+ 
+ (defun ns-arrange-visible-frames ()
+   "Arranges all visible frames according to topline"
+   (interactive)
+   (ns-arrange-frames nil))
+ 
+ (defun ns-arrange-frames ( vis)
+   (let ((frame (next-frame))
+ 	(end-frame (selected-frame))
+ 	(inc-x 20)                      ;relative position of frames
+ 	(inc-y 22)
+ 	(x-pos 100)                     ;start position
+ 	(y-pos 40)
+ 	(done nil))
+     (while (not done)                   ;cycle through all frames
+       (if (not (or vis (eq (frame-visible-p frame) t)))
+ 	(setq x-pos x-pos); do nothing; true case
+ 	(set-frame-position frame x-pos y-pos)
+ 	(setq x-pos (+ x-pos inc-x))
+ 	(setq y-pos (+ y-pos inc-y))
+ 	(raise-frame frame))
+       (select-frame frame)
+       (setq frame (next-frame))
+       (setq done (equal frame end-frame)))
+     (set-frame-position end-frame x-pos y-pos)
+     (raise-frame frame)
+     (select-frame frame)))
+ 
+ (defun menu-bar-update-frames ()
+   (let ((frames (frame-list))
+         (frames-menu (make-sparse-keymap "Windows")))
+     (define-key frames-menu [popup-color-panel]
+       '("Colors..." . ns-popup-color-panel))
+     (define-key frames-menu [popup-font-panel]
+       '("Font Panel..." . ns-popup-font-panel))
+     (mapcar
+      '(lambda (frame)
+         (setcdr frames-menu
+                 (cons
+                  (cons frame
+                        (cons (abbreviate-file-name
+                               (cdr (assq 'name (frame-parameters frame))))
+                              'menu-bar-select-frame))
+                  (cdr frames-menu))))
+      frames)
+     (define-key frames-menu [arrange-all-frames]
+       '("Arrange All Frames" . ns-arrange-all-frames))
+     (define-key frames-menu [arrange-visible-frames]
+       '("Arrange Visible Frames" . ns-arrange-visible-frames))
+     (define-key frames-menu [delete-frame] '("Delete Frame" . delete-frame))
+     (define-key frames-menu [new-frame] '("New Frame" . new-frame))
+     (define-key global-map [menu-bar windows] (cons "Windows" frames-menu))))
+ 
+ (add-hook 'menu-bar-update-fab-hook 'menu-bar-update-frames)
+ 
+ (defun menu-bar-update-frames-and-buffers ()
+   (if (frame-or-buffer-changed-p)
+       (run-hooks 'menu-bar-update-fab-hook)))
+ 
+ (add-hook 'menu-bar-update-hook 'menu-bar-update-frames-and-buffers)
+ 
+ (defvar menu-bar-mode nil)
+ 
+ (defun menu-bar-mode (flag)
+   "Toggle display of a menu bar on each frame.
+ This command applies to all frames that exist and frames to be
+ created in the future.
+ With a numeric argument, if the argument is negative,
+ turn off menu bars; otherwise, turn on menu bars."
+   (interactive "P")
+ 
+ ; ;; Obtain the current setting by looking at default-frame-alist.
+ ; (let ((menu-bar-mode
+ ;        (let ((assq (assq 'menu-bar-lines default-frame-alist)))
+ ;          (if assq (cdr assq) nil))))
+ 
+   ;; Make menu-bar-mode and default-frame-alist consistent.
+   (let ((default (assq 'menu-bar-lines default-frame-alist)))
+     (if default
+         (setq menu-bar-mode (not (eq (cdr default) 0)))
+       (setq default-frame-alist
+             (cons (cons 'menu-bar-lines (if menu-bar-mode 1 0))
+                   default-frame-alist))))
+ 
+   ;; Toggle or set the mode, according to FLAG.
+   (setq menu-bar-mode (if (null flag) (not menu-bar-mode)
+                         (> (prefix-numeric-value flag) 0)))
+ 
+   ;; Apply it to default-frame-alist.
+   (let ((parameter (assq 'menu-bar-lines default-frame-alist)))
+     (if (consp parameter)
+         (setcdr parameter (if menu-bar-mode 1 0))
+       (setq default-frame-alist
+             (cons (cons 'menu-bar-lines (if menu-bar-mode 1 0))
+                   default-frame-alist))))
+   
+   ;; Apply it to existing frames.
+   (let ((frames (frame-list)))
+     (while frames
+       (let ((height (cdr (assq 'height (frame-parameters (car frames))))))
+         (modify-frame-parameters (car frames)
+                                  (list (cons 'menu-bar-lines
+                                              (if menu-bar-mode 1 0))))
+         (modify-frame-parameters (car frames)
+                                  (list (cons 'height height))))
+       (setq frames (cdr frames)))))
+ 
+ (defconst ns-proto-call-service
+   '((arg)
+     (interactive "p")
+     (let* ((in-string (if mark-active
+                           (buffer-substring (region-beginning) (region-end))))
+            (out-string (ns-perform-service service in-string)))
+       (cond
+        ((and out-string (or (not in-string)
+                             (not (string= in-string out-string))))
+         (if mark-active (delete-region (region-beginning) (region-end)))
+         (insert-string out-string)
+         (setq deactivate-mark nil))))))
+   
+ (defun ns-define-service (path)
+   (let ((mapping [menu-bar services])
+         (service (mapconcat 'identity path "/"))
+         (name (intern
+                (mapconcat '(lambda (s) (if (= s 32) "-" (char-to-string s)))
+                           (mapconcat 'identity (cons "ns-service" path) "-")
+                           ""))))
+     (eval (append (list 'defun name)
+                   (subst service 'service ns-proto-call-service)))
+     (cond
+      ((lookup-key global-map mapping)
+       (while (cdr path)
+         (setq mapping (vconcat mapping (list (intern (car path)))))
+         (if (not (keymapp (lookup-key global-map mapping)))
+             (define-key global-map mapping
+               (cons (car path) (make-sparse-keymap (car path)))))
+         (setq path (cdr path)))
+       (setq mapping (vconcat mapping (list (intern (car path)))))
+       (define-key global-map mapping (cons (car path) name))))
+     name))
+ 
+ (provide 'ns-menu-bar)
+ (provide 'menu-bar)
+ 
+ ;;;; ns-menu-bar.el ends here
Index: emacs/lisp/ns-scroll-bar.el
diff -c /dev/null emacs/lisp/ns-scroll-bar.el:1.1
*** /dev/null	Fri Aug  2 20:40:42 1996
--- emacs/lisp/ns-scroll-bar.el	Wed Jul 24 04:22:33 1996
***************
*** 0 ****
--- 1,125 ----
+ ;;; ns-scroll-bar.el --- NS scroll bar support.
+ 
+ ;;; Copyright (C) 1993 Free Software Foundation, Inc.
+ 
+ ;; Maintainer: FSF
+ ;; Keywords: hardware
+ 
+ ;;; This file is part of GNU Emacs.
+ 
+ ;;; GNU Emacs is free software; you can redistribute it and/or modify
+ ;;; it under the terms of the GNU General Public License as published by
+ ;;; the Free Software Foundation; either version 2, or (at your option)
+ ;;; any later version.
+ 
+ ;;; GNU Emacs is distributed in the hope that it will be useful,
+ ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;;; GNU General Public License for more details.
+ 
+ ;;; You should have received a copy of the GNU General Public License
+ ;;; along with GNU Emacs; see the file COPYING.  If not, write to
+ ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ ;;; Code:
+ 
+ ;;; Commentary:
+ 
+ ;; NS bindings of mouse clicks on the scroll bar.
+ ;;; Code:
+ 
+ (require 'mouse)
+ 
+ 
+ ;;;; Utilities.
+ 
+ (defun scroll-bar-scale (num-denom whole)
+   "Given a pair (NUM . DENOM) and WHOLE, return (/ (* NUM WHOLE) DENOM).
+ This is handy for scaling a position on a scroll bar into real units,
+ like buffer positions.  If SCROLL-BAR-POS is the (PORTION . WHOLE) pair
+ from a scroll bar event, then (scroll-bar-scale SCROLL-BAR-POS
+ \(buffer-size)) is the position in the current buffer corresponding to
+ that scroll bar position."
+   ;; We multiply before we divide to maintain precision.
+   ;; We use floating point because the product of a large buffer size
+   ;; with a large scroll bar portion can easily overflow a lisp int.
+   (truncate (/ (* (float (car num-denom)) whole) (cdr num-denom))))
+ 
+ 
+ ;;;; Helpful functions for enabling and disabling scroll bars.
+ 
+ (defun scroll-bar-mode (flag)
+   "Toggle display of vertical scroll bars on each frame.
+ This command applies to all frames that exist and frames to be
+ created in the future.
+ With a numeric argument, if the argument is negative,
+ turn off scroll bars; otherwise, turn on scroll bars."
+   (interactive "P")
+   (if flag (setq flag (prefix-numeric-value flag)))
+ 
+   ;; Obtain the current setting by looking at default-frame-alist.
+   (let ((scroll-bar-mode
+ 	 (let ((assq (assq 'vertical-scroll-bars default-frame-alist)))
+ 	   (if assq (cdr assq) t))))
+ 
+     ;; Tweedle it according to the argument.
+     (setq scroll-bar-mode (if (null flag) (not scroll-bar-mode)
+ 			    (or (not (numberp flag)) (>= flag 0))))
+ 
+     ;; Apply it to default-frame-alist.
+     (mapcar
+      (function
+       (lambda (param-name)
+ 	(let ((parameter (assq param-name default-frame-alist)))
+ 	  (if (consp parameter)
+ 	      (setcdr parameter scroll-bar-mode)
+ 	    (setq default-frame-alist
+ 		  (cons (cons param-name scroll-bar-mode)
+ 			default-frame-alist))))))
+      '(vertical-scroll-bars horizontal-scroll-bars))
+ 
+     ;; Apply it to existing frames.
+     (let ((frames (frame-list)))
+       (while frames
+ 	(modify-frame-parameters
+ 	 (car frames)
+ 	 (list (cons 'vertical-scroll-bars scroll-bar-mode)
+ 	       (cons 'horizontal-scroll-bars scroll-bar-mode)))
+ 	(setq frames (cdr frames))))))
+ 
+ ;;;; Buffer navigation using the scroll bar.
+ 
+ (defun ns-scroll-bar-move (event)
+   "Scroll the frame according to a NS scroller event."
+   (interactive "e")
+   (let* ((pos (event-end event))
+          (window (nth 0 pos))
+          (scale (nth 2 pos))
+          (old-window (selected-window)))
+ ;    (prin1 (cons window (nth 2 pos)))
+     (select-window window)
+     (set-buffer (window-buffer window))
+     (cond
+      ((eq (car scale) (cdr scale))
+       (goto-char (point-max))
+       (beginning-of-line)
+       (recenter -1))
+      ((= (car scale) 0)
+       (goto-char (point-min))
+       (beginning-of-line)
+       (recenter 0))
+      (t
+       (goto-char (+ (point-min) 1
+                     (scroll-bar-scale scale (- (point-max) (point-min)))))
+       (beginning-of-line)
+       (recenter 0)))
+     (select-window old-window)))
+ 
+ 
+ ;;;; Bindings.
+ 
+ (global-set-key [vertical-scroll-bar] 'ns-scroll-bar-move)
+ 
+ (provide 'ns-scroll-bar)
+ 
+ ;;; ns-scroll-bar.el ends here
Index: emacs/lisp/ns-syntax.el
diff -c /dev/null emacs/lisp/ns-syntax.el:1.1
*** /dev/null	Fri Aug  2 20:40:48 1996
--- emacs/lisp/ns-syntax.el	Wed Jul 24 04:22:35 1996
***************
*** 0 ****
--- 1,135 ----
+ ;;; ns-syntax.el --- set up case-conversion and syntax tables for NeXTstep encoding
+ 
+ ;; Copyright (C) 1988 Free Software Foundation, Inc.
+ 
+ ;; Author: Carl Edman
+ ;; Maintainer: FSF
+ ;; Keywords: i18n
+ 
+ ;; This file is part of GNU Emacs.
+ 
+ ;; GNU Emacs is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 2, or (at your option)
+ ;; any later version.
+ 
+ ;; GNU Emacs is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;; GNU General Public License for more details.
+ 
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU Emacs; see the file COPYING.  If not, write to
+ ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ ;;; Commentary:
+ 
+ ;; Written by Carl Edman.  See case-table.el for details.
+ 
+ ;;; Code:
+ 
+ ;(defun show-char ()
+ ;  (interactive)
+ ;  (prin1 (char-to-string (string-to-number (current-word)))))
+ 
+ (require 'case-table)
+ 
+ (let ((downcase (concat (car (standard-case-table)))))
+   (set-case-syntax 128 "w" downcase)	  ; NBSP (no-break space)
+   (set-case-syntax-pair 129 213 downcase) ; A with grave accent  
+   (set-case-syntax-pair 130 214 downcase) ; A with acute accent
+   (set-case-syntax-pair 131 215 downcase) ; A with circumflex accent
+   (set-case-syntax-pair 132 216 downcase) ; A with tilde
+   (set-case-syntax-pair 133 217 downcase) ; A with diaeresis or umlaut mark
+   (set-case-syntax-pair 134 218 downcase) ; A with ring
+   (set-case-syntax-pair 135 219 downcase) ; C with cedilla
+   (set-case-syntax-pair 136 220 downcase) ; E with grave accent
+   (set-case-syntax-pair 137 221 downcase) ; E with acute accent
+   (set-case-syntax-pair 138 222 downcase) ; E with circumflex accent
+   (set-case-syntax-pair 139 223 downcase) ; E with diaeresis or umlaut mark
+   (set-case-syntax-pair 140 224 downcase) ; I with grave accent
+   (set-case-syntax-pair 141 226 downcase) ; I with acute accent
+   (set-case-syntax-pair 142 228 downcase) ; I with circumflex accent
+   (set-case-syntax-pair 143 229 downcase) ; I with diaeresis or umlaut mark
+   (set-case-syntax-pair 144 230 downcase) ; D with stroke, Icelandic eth
+   (set-case-syntax-pair 145 231 downcase) ; N with tilde
+   (set-case-syntax-pair 146 236 downcase) ; O with grave accent
+   (set-case-syntax-pair 147 237 downcase) ; O with acute accent
+   (set-case-syntax-pair 148 238 downcase) ; O with circumflex accent
+   (set-case-syntax-pair 149 239 downcase) ; O with tilde
+   (set-case-syntax-pair 150 240 downcase) ; O with diaeresis or umlaut mark
+   (set-case-syntax-pair 151 242 downcase) ; U with grave accent
+   (set-case-syntax-pair 152 243 downcase) ; U with acute accent
+   (set-case-syntax-pair 153 244 downcase) ; U with circumflex accent
+   (set-case-syntax-pair 154 246 downcase) ; U with diaeresis or umlaut mark
+   (set-case-syntax-pair 155 247 downcase) ; Y with acute accent
+   (set-case-syntax-pair 156 252 downcase) ; thorn, Icelandic
+   (set-case-syntax 157 "_" downcase)      ; micro sign
+   (set-case-syntax 158 "_" downcase)      ; multiplication sign
+   (set-case-syntax 159 "_" downcase)      ; division sign
+   (set-case-syntax 160 "_" downcase)      ; copyright sign
+   (set-case-syntax 161 "." downcase)      ; inverted exclamation mark
+   (set-case-syntax 162 "w" downcase)      ; cent sign
+   (set-case-syntax 163 "w" downcase)      ; pound sign
+   (set-case-syntax 164 "_" downcase)      ; fraction sign
+   (set-case-syntax 165 "w" downcase)      ; yen sign
+   (set-case-syntax 166 "w" downcase)      ; florin sign
+   (set-case-syntax 167 "w" downcase)      ; section sign
+   (set-case-syntax 168 "w" downcase)      ; general currency sign
+   (set-case-syntax 169 "." downcase)      ; single quote
+   (set-case-syntax-delims 170 186 downcase) ; double quotation marks
+   (set-case-syntax-delims 171 187 downcase) ; double angle quotation marks
+   (set-case-syntax-delims 172 173 downcase) ; single angle quotation marks
+   (set-case-syntax 174 "_" downcase)      ; fi
+   (set-case-syntax 175 "_" downcase)      ; fl
+   (set-case-syntax 176 "_" downcase)      ; registered sign
+   (set-case-syntax 177 "_" downcase)      ; soft hyphen
+   (set-case-syntax 178 "_" downcase)      ; dagger
+   (set-case-syntax 179 "_" downcase)      ; double dagger
+   (set-case-syntax 180 "_" downcase)      ; middle dot
+   (set-case-syntax 181 "_" downcase)      ; broken vertical line
+   (set-case-syntax 182 "w" downcase)      ; paragraph
+   (set-case-syntax 183 "w" downcase)      ; bullet
+   (set-case-syntax 184 "." downcase)      ; base single quote
+   (set-case-syntax 185 "." downcase)      ; base double quote
+   (set-case-syntax 188 "_" downcase)      ; ellipsis
+   (set-case-syntax 189 "_" downcase)      ; permille
+   (set-case-syntax 190 "_" downcase)      ; not sign
+   (set-case-syntax 191 "." downcase)      ; inverted question mark
+   (set-case-syntax 192 "w" downcase)      ; superscript one
+   (set-case-syntax 193 "w" downcase)      ; grave accent
+   (set-case-syntax 194 "w" downcase)      ; acute accent
+   (set-case-syntax 195 "w" downcase)      ; circumflex accent
+   (set-case-syntax 196 "w" downcase)      ; tilde accent
+   (set-case-syntax 197 "w" downcase)      ; macron
+   (set-case-syntax 198 "w" downcase)      ; breve accent
+   (set-case-syntax 199 "w" downcase)      ; dot accent
+   (set-case-syntax 200 "w" downcase)      ; diaeresis
+   (set-case-syntax 201 "w" downcase)      ; superscript two
+   (set-case-syntax 202 "_" downcase)      ; degree sign
+   (set-case-syntax 203 "w" downcase)      ; cedilla
+   (set-case-syntax 204 "w" downcase)      ; superscript three
+   (set-case-syntax 205 "w" downcase)      ; hungarumlaut
+   (set-case-syntax 206 "w" downcase)      ; ogonek
+   (set-case-syntax 207 "w" downcase)      ; caron
+   (set-case-syntax 208 "_" downcase)      ; em dash
+   (set-case-syntax 209 "_" downcase)      ; plus or minus sign
+   (set-case-syntax 210 "_" downcase)      ; fraction one-quarter
+   (set-case-syntax 211 "_" downcase)      ; fraction one-half
+   (set-case-syntax 212 "_" downcase)      ; fraction three-quarters
+   (set-case-syntax-pair 225 241 downcase) ; AE diphthong
+   (set-case-syntax 227 "w" downcase)      ; ordinal indicator, feminine
+   (set-case-syntax-pair 232 248 downcase) ; L with slash
+   (set-case-syntax-pair 233 249 downcase) ; O with slash
+   (set-case-syntax-pair 234 250 downcase) ; OE diphthong
+   (set-case-syntax 235 "w" downcase)      ; ordinal indicator, masculine
+   (set-case-syntax 245 "w" downcase)      ; dotless i
+   (set-case-syntax 251 "w" downcase)      ; small sharp s, German
+   (set-case-syntax 253 "w" downcase)      ; small y with diaeresis or umlaut mark
+   (set-case-syntax 254 "_" downcase)      ; space
+   (set-case-syntax 255 "_" downcase)      ; space  
+   (set-standard-case-table (list downcase nil nil nil)))
+ 
+ (provide 'ns-syntax)
+ 
+ ;;; ns-syntax.el ends here
Index: emacs/lisp/paren.el
diff -c emacs/lisp/paren.el:1.1.1.2 emacs/lisp/paren.el:1.3
*** emacs/lisp/paren.el:1.1.1.2	Mon Jul 22 01:35:44 1996
--- emacs/lisp/paren.el	Wed Jul 31 01:35:38 1996
***************
*** 79,85 ****
  		(if mismatch
  		    (progn
  		      (and (null show-paren-mismatch-face)
! 			   (x-display-color-p)
  			   (progn
  			     (make-face 'paren-mismatch)
  			     (or (face-nontrivial-p 'paren-mismatch t)
--- 79,85 ----
  		(if mismatch
  		    (progn
  		      (and (null show-paren-mismatch-face)
! 			   (display-color-p)
  			   (progn
  			     (make-face 'paren-mismatch)
  			     (or (face-nontrivial-p 'paren-mismatch t)
***************
*** 105,111 ****
  		       (setq show-paren-overlay-1
  			     (make-overlay (- pos dir) pos)))
  		     ;; Always set the overlay face, since it varies.
! 		     (overlay-put show-paren-overlay-1 'face face))
  		 ;; Otherwise, turn off any such highlighting.
  		 (and show-paren-overlay-1
  		      (overlay-buffer show-paren-overlay-1)
--- 105,127 ----
  		       (setq show-paren-overlay-1
  			     (make-overlay (- pos dir) pos)))
  		     ;; Always set the overlay face, since it varies.
! 		     (overlay-put show-paren-overlay-1 'face face)
! 		     (if (not (pos-visible-in-window-p pos))
! 			 (progn
! 			   (save-excursion
! 			     (goto-char pos)
! 			     (message "%s %s"
! 				      (if mismatch "MISMATCH:" "Matches")
! 				  (if (save-excursion
! 					(skip-chars-backward " \t")
! 					(not (bolp)))
! 				      (concat(buffer-substring
! 					      (progn (beginning-of-line) (point)) (1+ pos)) "...")
! 				    (buffer-substring
! 				     pos (progn
! 					   (forward-char 1)
! 					   (skip-chars-forward "\n \t")
! 					   (end-of-line) (point)))))))))
  		 ;; Otherwise, turn off any such highlighting.
  		 (and show-paren-overlay-1
  		      (overlay-buffer show-paren-overlay-1)
Index: emacs/lisp/pascal.el
diff -c emacs/lisp/pascal.el:1.1.1.2 emacs/lisp/pascal.el:1.3
*** emacs/lisp/pascal.el:1.1.1.2	Mon Jul 22 01:35:48 1996
--- emacs/lisp/pascal.el	Wed Jul 31 01:35:41 1996
***************
*** 78,83 ****
--- 78,84 ----
    (define-key pascal-mode-map "\M-\t"    'pascal-complete-word)
    (define-key pascal-mode-map "\M-?"     'pascal-show-completions)
    (define-key pascal-mode-map "\177"     'backward-delete-char-untabify)
+   (define-key pascal-mode-map [delete]   'backward-delete-char-untabify)
    (define-key pascal-mode-map "\M-\C-h"  'pascal-mark-defun)
    (define-key pascal-mode-map "\C-c\C-b" 'pascal-insert-block)
    (define-key pascal-mode-map "\M-*"     'pascal-star-comment)
Index: emacs/lisp/perl-mode.el
diff -c emacs/lisp/perl-mode.el:1.1.1.2 emacs/lisp/perl-mode.el:1.3
*** emacs/lisp/perl-mode.el:1.1.1.2	Mon Jul 22 01:35:52 1996
--- emacs/lisp/perl-mode.el	Wed Jul 31 01:35:44 1996
***************
*** 116,121 ****
--- 116,122 ----
    (define-key perl-mode-map "\e\C-h" 'mark-perl-function)
    (define-key perl-mode-map "\e\C-q" 'indent-perl-exp)
    (define-key perl-mode-map "\177" 'backward-delete-char-untabify)
+   (define-key perl-mode-map [delete] 'backward-delete-char-untabify)
    (define-key perl-mode-map "\t" 'perl-indent-command))
  
  (autoload 'c-macro-expand "cmacexp"
Index: emacs/lisp/ps-print.el
diff -c emacs/lisp/ps-print.el:1.1.1.1 emacs/lisp/ps-print.el:1.2
*** emacs/lisp/ps-print.el:1.1.1.1	Mon Jul 22 01:35:59 1996
--- emacs/lisp/ps-print.el	Wed Jul 31 01:35:47 1996
***************
*** 455,464 ****
  Note: page numbers are displayed as part of headers, see variable
  `ps-print-headers'.")
  
! (defvar ps-print-color-p (and (or (fboundp 'x-color-values)   ; fsf
  				(fboundp 'pixel-components))  ; xemacs
  			      (fboundp 'float))
! ; Printing color requires both floating point and x-color-values.
    "*If non-nil, print the buffer's text in color.")
  
  (defvar ps-default-fg '(0.0 0.0 0.0)
--- 455,464 ----
  Note: page numbers are displayed as part of headers, see variable
  `ps-print-headers'.")
  
! (defvar ps-print-color-p (and (or (fboundp 'color-values)   ; fsf
  				(fboundp 'pixel-components))  ; xemacs
  			      (fboundp 'float))
! ; Printing color requires both floating point and color-values.
    "*If non-nil, print the buffer's text in color.")
  
  (defvar ps-default-fg '(0.0 0.0 0.0)
***************
*** 1548,1562 ****
          (ps-plot 'ps-basic-plot-string from to bg-color)
          (setq from to)))))
  
! (defun ps-color-value (x-color-value)
    ;; Scale 16-bit X-COLOR-VALUE to PostScript color value in [0, 1] interval.
!   (/ x-color-value ps-print-color-scale))
  
! (defun ps-color-values (x-color)
!   (cond ((fboundp 'x-color-values)
! 	 (x-color-values x-color))
  	((fboundp 'pixel-components)
! 	 (pixel-components x-color))
  	(t (error "No available function to determine X color values."))))
  
  (defun ps-face-attributes (face)
--- 1548,1562 ----
          (ps-plot 'ps-basic-plot-string from to bg-color)
          (setq from to)))))
  
! (defun ps-color-value (color-value)
    ;; Scale 16-bit X-COLOR-VALUE to PostScript color value in [0, 1] interval.
!   (/ color-value ps-print-color-scale))
  
! (defun ps-color-values (color)
!   (cond ((fboundp 'color-values)
! 	 (color-values color))
  	((fboundp 'pixel-components)
! 	 (pixel-components color))
  	(t (error "No available function to determine X color values."))))
  
  (defun ps-face-attributes (face)
Index: emacs/lisp/rmail.el
diff -c emacs/lisp/rmail.el:1.1.1.2 emacs/lisp/rmail.el:1.3
*** emacs/lisp/rmail.el:1.1.1.2	Mon Jul 22 01:36:19 1996
--- emacs/lisp/rmail.el	Wed Jul 31 01:35:49 1996
***************
*** 411,416 ****
--- 411,417 ----
    (define-key rmail-mode-map ">"      'rmail-last-message)
    (define-key rmail-mode-map " "      'scroll-up)
    (define-key rmail-mode-map "\177"   'scroll-down)
+   (define-key rmail-mode-map [delete] 'scroll-down)
    (define-key rmail-mode-map "?"      'describe-mode)
    (define-key rmail-mode-map "\C-c\C-s\C-d" 'rmail-sort-by-date)
    (define-key rmail-mode-map "\C-c\C-s\C-s" 'rmail-sort-by-subject)
Index: emacs/lisp/rmailsum.el
diff -c emacs/lisp/rmailsum.el:1.1.1.2 emacs/lisp/rmailsum.el:1.3
*** emacs/lisp/rmailsum.el:1.1.1.2	Mon Jul 22 01:36:29 1996
--- emacs/lisp/rmailsum.el	Wed Jul 31 01:35:53 1996
***************
*** 724,729 ****
--- 724,730 ----
    (define-key rmail-summary-mode-map ">"      'rmail-summary-last-message)
    (define-key rmail-summary-mode-map " "      'rmail-summary-scroll-msg-up)
    (define-key rmail-summary-mode-map "\177"   'rmail-summary-scroll-msg-down)
+   (define-key rmail-summary-mode-map [delete] 'rmail-summary-scroll-msg-down)
    (define-key rmail-summary-mode-map "?"      'describe-mode)
    (define-key rmail-summary-mode-map "\C-c\C-n" 'rmail-summary-next-same-subject)
    (define-key rmail-summary-mode-map "\C-c\C-p" 'rmail-summary-previous-same-subject)
Index: emacs/lisp/rnews.el
diff -c emacs/lisp/rnews.el:1.1.1.1 emacs/lisp/rnews.el:1.2
*** emacs/lisp/rnews.el:1.1.1.1	Fri Jul 19 01:51:02 1996
--- emacs/lisp/rnews.el	Fri Jul 19 05:03:30 1996
***************
*** 286,291 ****
--- 286,292 ----
    (suppress-keymap news-mode-map)
    (define-key news-mode-map "." 'beginning-of-buffer)
    (define-key news-mode-map " " 'scroll-up)
+   (define-key news-mode-map [delete] 'scroll-down)
    (define-key news-mode-map "\177" 'scroll-down)
    (define-key news-mode-map "n" 'news-next-message)
    (define-key news-mode-map "c" 'news-make-link-to-message)
Index: emacs/lisp/scheme.el
diff -c emacs/lisp/scheme.el:1.1.1.2 emacs/lisp/scheme.el:1.3
*** emacs/lisp/scheme.el:1.1.1.2	Mon Jul 22 01:36:38 1996
--- emacs/lisp/scheme.el	Wed Jul 31 01:35:56 1996
***************
*** 116,121 ****
--- 116,122 ----
  
  (defun scheme-mode-commands (map)
    (define-key map "\t" 'scheme-indent-line)
+   (define-key map [delete] 'backward-delete-char-untabify)
    (define-key map "\177" 'backward-delete-char-untabify)
    (define-key map "\e\C-q" 'scheme-indent-sexp))
  
Index: emacs/lisp/select.el
diff -c emacs/lisp/select.el:1.1.1.2 emacs/lisp/select.el:1.3
*** emacs/lisp/select.el:1.1.1.2	Mon Jul 22 01:36:43 1996
--- emacs/lisp/select.el	Wed Jul 31 01:35:58 1996
***************
*** 24,42 ****
  ;;; Code:
  
  ;; This is for temporary compatibility with pre-release Emacs 19.
! (defalias 'x-selection 'x-get-selection)
! (defun x-get-selection (&optional type data-type)
!   "Return the value of an X Windows selection.
  The argument TYPE (default `PRIMARY') says which selection, 
  and the argument DATA-TYPE (default `STRING') says how to convert the data."
!   (x-get-selection-internal (or type 'PRIMARY) (or data-type 'STRING)))
  
! (defun x-get-clipboard ()
    "Return text pasted to the clipboard."
!   (x-get-selection-internal 'CLIPBOARD 'STRING))
  
! (defun x-set-selection (type data)
!   "Make an X Windows selection of type TYPE and value DATA.
  The argument TYPE (default `PRIMARY') says which selection, 
  and DATA specifies the contents.  DATA may be a string,
  a symbol, an integer (or a cons of two integers or list of two integers).
--- 24,42 ----
  ;;; Code:
  
  ;; This is for temporary compatibility with pre-release Emacs 19.
! (defalias 'selection 'get-selection)
! (defun get-selection (&optional type data-type)
!   "Return the value of an selection.
  The argument TYPE (default `PRIMARY') says which selection, 
  and the argument DATA-TYPE (default `STRING') says how to convert the data."
!   (get-selection-internal (or type 'PRIMARY) (or data-type 'STRING)))
  
! (defun get-clipboard ()
    "Return text pasted to the clipboard."
!   (get-selection-internal 'CLIPBOARD 'STRING))
  
! (defun set-selection (type data)
!   "Make an selection of type TYPE and value DATA.
  The argument TYPE (default `PRIMARY') says which selection, 
  and DATA specifies the contents.  DATA may be a string,
  a symbol, an integer (or a cons of two integers or list of two integers).
***************
*** 56,78 ****
    ;; This is for temporary compatibility with pre-release Emacs 19.
    (if (stringp type)
        (setq type (intern type)))
!   (or (x-valid-simple-selection-p data)
        (and (vectorp data)
  	   (let ((valid t)
  		 (i (1- (length data))))
  	     (while (>= i 0)
! 	       (or (x-valid-simple-selection-p (aref data i))
  		   (setq valid nil))
  	       (setq i (1- i)))
  	     valid))
        (signal 'error (list "invalid selection" data)))
    (or type (setq type 'PRIMARY))
    (if data
!       (x-own-selection-internal type data)
!     (x-disown-selection-internal type))
    data)
  
! (defun x-valid-simple-selection-p (data)
    (or (stringp data)
        (symbolp data)
        (integerp data)
--- 56,78 ----
    ;; This is for temporary compatibility with pre-release Emacs 19.
    (if (stringp type)
        (setq type (intern type)))
!   (or (valid-simple-selection-p data)
        (and (vectorp data)
  	   (let ((valid t)
  		 (i (1- (length data))))
  	     (while (>= i 0)
! 	       (or (valid-simple-selection-p (aref data i))
  		   (setq valid nil))
  	       (setq i (1- i)))
  	     valid))
        (signal 'error (list "invalid selection" data)))
    (or type (setq type 'PRIMARY))
    (if data
!       (own-selection-internal type data)
!     (disown-selection-internal type))
    data)
  
! (defun valid-simple-selection-p (data)
    (or (stringp data)
        (symbolp data)
        (integerp data)
***************
*** 94,112 ****
  
  ;;; Cut Buffer support
  
! (defun x-get-cut-buffer (&optional which-one)
!   "Returns the value of one of the 8 X server cut-buffers.  Optional arg
  WHICH-ONE should be a number from 0 to 7, defaulting to 0.
  Cut buffers are considered obsolete; you should use selections instead."
!   (x-get-cut-buffer-internal
     (if which-one
         (aref [CUT_BUFFER0 CUT_BUFFER1 CUT_BUFFER2 CUT_BUFFER3
  	      CUT_BUFFER4 CUT_BUFFER5 CUT_BUFFER6 CUT_BUFFER7]
  	     which-one)
       'CUT_BUFFER0)))
  
! (defun x-set-cut-buffer (string &optional push)
!   "Store STRING into the X server's primary cut buffer.
  If PUSH is non-nil, also rotate the cut buffers:
  this means the previous value of the primary cut buffer moves the second
  cut buffer, and the second to the third, and so on (there are 8 buffers.)
--- 94,112 ----
  
  ;;; Cut Buffer support
  
! (defun get-cut-buffer (&optional which-one)
!   "Returns the value of one of the 8 server cut-buffers.  Optional arg
  WHICH-ONE should be a number from 0 to 7, defaulting to 0.
  Cut buffers are considered obsolete; you should use selections instead."
!   (get-cut-buffer-internal
     (if which-one
         (aref [CUT_BUFFER0 CUT_BUFFER1 CUT_BUFFER2 CUT_BUFFER3
  	      CUT_BUFFER4 CUT_BUFFER5 CUT_BUFFER6 CUT_BUFFER7]
  	     which-one)
       'CUT_BUFFER0)))
  
! (defun set-cut-buffer (string &optional push)
!   "Store STRING into the server's primary cut buffer.
  If PUSH is non-nil, also rotate the cut buffers:
  this means the previous value of the primary cut buffer moves the second
  cut buffer, and the second to the third, and so on (there are 8 buffers.)
***************
*** 114,128 ****
    ;; Check the data type of STRING.
    (substring string 0 0)
    (if push
!       (x-rotate-cut-buffers-internal 1))
!   (x-store-cut-buffer-internal 'CUT_BUFFER0 string))
  
  
  ;;; Functions to convert the selection into various other selection types.
  ;;; Every selection type that Emacs handles is implemented this way, except
  ;;; for TIMESTAMP, which is a special case.
  
! (defun xselect-convert-to-string (selection type value)
    (cond ((stringp value)
  	 value)
  	((overlayp value)
--- 114,128 ----
    ;; Check the data type of STRING.
    (substring string 0 0)
    (if push
!       (rotate-cut-buffers-internal 1))
!   (store-cut-buffer-internal 'CUT_BUFFER0 string))
  
  
  ;;; Functions to convert the selection into various other selection types.
  ;;; Every selection type that Emacs handles is implemented this way, except
  ;;; for TIMESTAMP, which is a special case.
  
! (defun select-convert-to-string (selection type value)
    (cond ((stringp value)
  	 value)
  	((overlayp value)
***************
*** 145,151 ****
  	   (buffer-substring (car value) (cdr value))))
  	(t nil)))
  
! (defun xselect-convert-to-length (selection type value)
    (let ((value
  	 (cond ((stringp value)
  		(length value))
--- 145,151 ----
  	   (buffer-substring (car value) (cdr value))))
  	(t nil)))
  
! (defun select-convert-to-length (selection type value)
    (let ((value
  	 (cond ((stringp value)
  		(length value))
***************
*** 164,170 ****
  	(cons (ash value -16) (logand value 65535))
        nil)))
  
! (defun xselect-convert-to-targets (selection type value)
    ;; return a vector of atoms, but remove duplicates first.
    (let* ((all (cons 'TIMESTAMP (mapcar 'car selection-converter-alist)))
  	 (rest all))
--- 164,170 ----
  	(cons (ash value -16) (logand value 65535))
        nil)))
  
! (defun select-convert-to-targets (selection type value)
    ;; return a vector of atoms, but remove duplicates first.
    (let* ((all (cons 'TIMESTAMP (mapcar 'car selection-converter-alist)))
  	 (rest all))
***************
*** 177,190 ****
  	     (setq rest (cdr rest)))))
      (apply 'vector all)))
  
! (defun xselect-convert-to-delete (selection type value)
!   (x-disown-selection-internal selection)
    ;; A return value of nil means that we do not know how to do this conversion,
    ;; and replies with an "error".  A return value of NULL means that we have
    ;; done the conversion (and any side-effects) but have no value to return.
    'NULL)
  
! (defun xselect-convert-to-filename (selection type value)
    (cond ((overlayp value)
  	 (buffer-file-name (or (overlay-buffer value)
  			       (error "selection is in a killed buffer"))))
--- 177,190 ----
  	     (setq rest (cdr rest)))))
      (apply 'vector all)))
  
! (defun select-convert-to-delete (selection type value)
!   (disown-selection-internal selection)
    ;; A return value of nil means that we do not know how to do this conversion,
    ;; and replies with an "error".  A return value of NULL means that we have
    ;; done the conversion (and any side-effects) but have no value to return.
    'NULL)
  
! (defun select-convert-to-filename (selection type value)
    (cond ((overlayp value)
  	 (buffer-file-name (or (overlay-buffer value)
  			       (error "selection is in a killed buffer"))))
***************
*** 195,201 ****
  			       (error "selection is in a killed buffer"))))
  	(t nil)))
  
! (defun xselect-convert-to-charpos (selection type value)
    (let (a b tmp)
      (cond ((cond ((overlayp value)
  		  (setq a (overlay-start value)
--- 195,201 ----
  			       (error "selection is in a killed buffer"))))
  	(t nil)))
  
! (defun select-convert-to-charpos (selection type value)
    (let (a b tmp)
      (cond ((cond ((overlayp value)
  		  (setq a (overlay-start value)
***************
*** 211,217 ****
  		 (vector (cons (ash a -16) (logand a 65535))
  			 (cons (ash b -16) (logand b 65535))))))))
  
! (defun xselect-convert-to-lineno (selection type value)
    (let (a b buf tmp)
      (cond ((cond ((and (consp value)
  		       (markerp (car value))
--- 211,217 ----
  		 (vector (cons (ash a -16) (logand a 65535))
  			 (cons (ash b -16) (logand b 65535))))))))
  
! (defun select-convert-to-lineno (selection type value)
    (let (a b buf tmp)
      (cond ((cond ((and (consp value)
  		       (markerp (car value))
***************
*** 233,239 ****
  		 (vector (cons (ash a -16) (logand a 65535))
  			 (cons (ash b -16) (logand b 65535))))))))
  
! (defun xselect-convert-to-colno (selection type value)
    (let (a b buf tmp)
      (cond ((cond ((and (consp value)
  		       (markerp (car value))
--- 233,239 ----
  		 (vector (cons (ash a -16) (logand a 65535))
  			 (cons (ash b -16) (logand b 65535))))))))
  
! (defun select-convert-to-colno (selection type value)
    (let (a b buf tmp)
      (cond ((cond ((and (consp value)
  		       (markerp (car value))
***************
*** 257,309 ****
  		 (vector (cons (ash a -16) (logand a 65535))
  			 (cons (ash b -16) (logand b 65535))))))))
  
! (defun xselect-convert-to-os (selection type size)
    (symbol-name system-type))
  
! (defun xselect-convert-to-host (selection type size)
    (system-name))
  
! (defun xselect-convert-to-user (selection type size)
    (user-full-name))
  
! (defun xselect-convert-to-class (selection type size)
    "Emacs")
  
  ;; We do not try to determine the name Emacs was invoked with,
  ;; because it is not clean for a program's behavior to depend on that.
! (defun xselect-convert-to-name (selection type size)
    "emacs")
  
! (defun xselect-convert-to-integer (selection type value)
    (and (integerp value)
         (cons (ash value -16) (logand value 65535))))
  
! (defun xselect-convert-to-atom (selection type value)
    (and (symbolp value) value))
  
! (defun xselect-convert-to-identity (selection type value) ; used internally
    (vector value))
  
  (setq selection-converter-alist
!       '((TEXT . xselect-convert-to-string)
! 	(STRING . xselect-convert-to-string)
! 	(TARGETS . xselect-convert-to-targets)
! 	(LENGTH . xselect-convert-to-length)
! 	(DELETE . xselect-convert-to-delete)
! 	(FILE_NAME . xselect-convert-to-filename)
! 	(CHARACTER_POSITION . xselect-convert-to-charpos)
! 	(LINE_NUMBER . xselect-convert-to-lineno)
! 	(COLUMN_NUMBER . xselect-convert-to-colno)
! 	(OWNER_OS . xselect-convert-to-os)
! 	(HOST_NAME . xselect-convert-to-host)
! 	(USER . xselect-convert-to-user)
! 	(CLASS . xselect-convert-to-class)
! 	(NAME . xselect-convert-to-name)
! 	(ATOM . xselect-convert-to-atom)
! 	(INTEGER . xselect-convert-to-integer)
! 	(_EMACS_INTERNAL . xselect-convert-to-identity)
  	))
  
! (provide 'select)
  
  ;;; select.el ends here.
--- 257,370 ----
  		 (vector (cons (ash a -16) (logand a 65535))
  			 (cons (ash b -16) (logand b 65535))))))))
  
! (defun select-convert-to-os (selection type size)
    (symbol-name system-type))
  
! (defun select-convert-to-host (selection type size)
    (system-name))
  
! (defun select-convert-to-user (selection type size)
    (user-full-name))
  
! (defun select-convert-to-class (selection type size)
    "Emacs")
  
  ;; We do not try to determine the name Emacs was invoked with,
  ;; because it is not clean for a program's behavior to depend on that.
! (defun select-convert-to-name (selection type size)
    "emacs")
  
! (defun select-convert-to-integer (selection type value)
    (and (integerp value)
         (cons (ash value -16) (logand value 65535))))
  
! (defun select-convert-to-atom (selection type value)
    (and (symbolp value) value))
  
! (defun select-convert-to-identity (selection type value) ; used internally
    (vector value))
  
  (setq selection-converter-alist
!       '((TEXT . select-convert-to-string)
! 	(STRING . select-convert-to-string)
! 	(TARGETS . select-convert-to-targets)
! 	(LENGTH . select-convert-to-length)
! 	(DELETE . select-convert-to-delete)
! 	(FILE_NAME . select-convert-to-filename)
! 	(CHARACTER_POSITION . select-convert-to-charpos)
! 	(LINE_NUMBER . select-convert-to-lineno)
! 	(COLUMN_NUMBER . select-convert-to-colno)
! 	(OWNER_OS . select-convert-to-os)
! 	(HOST_NAME . select-convert-to-host)
! 	(USER . select-convert-to-user)
! 	(CLASS . select-convert-to-class)
! 	(NAME . select-convert-to-name)
! 	(ATOM . select-convert-to-atom)
! 	(INTEGER . select-convert-to-integer)
! 	(_EMACS_INTERNAL . select-convert-to-identity)
  	))
  
! ;;;; Selections and cut buffers
! 
! ;;; We keep track of the last text selected here, so we can check the
! ;;; current selection against it, and avoid passing back our own text
! ;;; from cut-buffer-or-selection-value.
! (defvar last-selected-text nil)
! 
! ;;; It is said that overlarge strings are slow to put into the cut buffer.
! ;;; Note this value is overridden below.
! (defvar cut-buffer-max nil
!   "Max number of characters to put in the cut buffer.")
! 
! (defvar select-enable-clipboard nil
!   "Non-nil means cutting and pasting uses the clipboard.
! This is in addition to the primary selection.")
! 
! ;;; Make TEXT, a string, the primary selection.
! ;;; Also, set the value of cut buffer 0, for backward compatibility
! ;;; with older applications.
! ;;; gildea@lcs.mit.edu says it's not desirable to put kills
! ;;; in the clipboard.
! (defun select-text (text &optional push)
!   ;; Don't send the cut buffer too much text.
!   ;; It becomes slow, and if really big it causes errors.
!   (if (or (not cut-buffer-max) (< (length text) cut-buffer-max))
!       (set-cut-buffer text push)
!     (set-cut-buffer "" push))
!   (set-selection 'PRIMARY text)
!   (if select-enable-clipboard
!       (set-selection 'CLIPBOARD text))
!   (setq last-selected-text text))
! 
! ;;; Return the value of the current selection.
! ;;; Consult the selection, then the cut buffer.  Treat empty strings
! ;;; as if they were unset.
! (defun cut-buffer-or-selection-value ()
!   (let (text)
! 
!     ;; Don't die if get-selection signals an error.
!     (condition-case c
! 	(setq text (get-selection 'PRIMARY))
!       (error (message "%s" c)))
!     (if (string= text "") (setq text nil))
! 
!     (if select-enable-clipboard
! 	(condition-case c
! 	    (setq text (get-selection 'CLIPBOARD))
! 	  (error (message "%s" c))))
!     (if (string= text "") (setq text nil))
!     (or text (setq text (get-cut-buffer 0)))
!     (if (string= text "") (setq text nil))
! 
!     (cond
!      ((not text) nil)
!      ((eq text last-selected-text) nil)
!      ((string= text last-selected-text)
!       ;; Record the newer string, so subsequent calls can use the `eq' test.
!       (setq last-selected-text text)
!       nil)
!      (t
!       (setq last-selected-text text)))))
  
+ (provide 'select)
  ;;; select.el ends here.
Index: emacs/lisp/simple.el
diff -c emacs/lisp/simple.el:1.1.1.2 emacs/lisp/simple.el:1.3
*** emacs/lisp/simple.el:1.1.1.2	Mon Jul 22 01:36:55 1996
--- emacs/lisp/simple.el	Wed Jul 31 01:36:00 1996
***************
*** 3028,3033 ****
--- 3028,3034 ----
     (let ((keypad (nth 0 keypad-normal))
  	 (normal (nth 1 keypad-normal)))
       (put keypad 'ascii-character normal)
+      ;(define-key isearch-mode-map (vector keypad) 'isearch-printing-char)
       (define-key function-key-map (vector keypad) (vector normal))))
   '((kp-0 ?0) (kp-1 ?1) (kp-2 ?2) (kp-3 ?3) (kp-4 ?4)
     (kp-5 ?5) (kp-6 ?6) (kp-7 ?7) (kp-8 ?8) (kp-9 ?9)
***************
*** 3040,3045 ****
     (kp-subtract ?-)
     (kp-decimal ?.)
     (kp-divide ?/)
!    (kp-equal ?=)))
  
  ;;; simple.el ends here
--- 3041,3054 ----
     (kp-subtract ?-)
     (kp-decimal ?.)
     (kp-divide ?/)
!    (kp-equal ?=)
!    (kp-backslash ?\\)
!    (kp-backtick ?`)
!    (kp-bar ?|)
!    (kp-less ?<)
!    (kp-more ?>)
!    (kp-hash ?#)
!    (kp-at ?@)
!    (kp-tilde ?~)))
  
  ;;; simple.el ends here
Index: emacs/lisp/simula.el
diff -c emacs/lisp/simula.el:1.1.1.2 emacs/lisp/simula.el:1.3
*** emacs/lisp/simula.el:1.1.1.2	Mon Jul 22 01:36:58 1996
--- emacs/lisp/simula.el	Wed Jul 31 01:36:03 1996
***************
*** 120,125 ****
--- 120,126 ----
    (define-key simula-mode-map "\C-c\C-n"   'simula-next-statement)
    ;(define-key simula-mode-map "\C-c\C-g"   'simula-goto-definition)
    ;(define-key simula-mode-map "\C-c\C-h"   'simula-standard-help)
+   (define-key simula-mode-map [delete]     'backward-delete-char-untabify)
    (define-key simula-mode-map "\177"       'backward-delete-char-untabify)
    (define-key simula-mode-map ":"          'simula-electric-label)
    (define-key simula-mode-map "\t"         'simula-indent-command))
Index: emacs/lisp/startup.el
diff -c emacs/lisp/startup.el:1.1.1.2 emacs/lisp/startup.el:1.3
*** emacs/lisp/startup.el:1.1.1.2	Mon Jul 22 01:37:00 1996
--- emacs/lisp/startup.el	Wed Jul 31 01:36:05 1996
***************
*** 287,301 ****
  	     (run-hooks 'term-setup-hook))
  	;; Modify the initial frame based on what .emacs puts into
  	;; ...-frame-alist.
  	(if (fboundp 'frame-notice-user-settings)
  	    (frame-notice-user-settings))
  	;; Now we know the user's default font, so add it to the menu.
  	(if (fboundp 'font-menu-add-default)
  	    (font-menu-add-default))
  	(and window-setup-hook
  	     (run-hooks 'window-setup-hook))
  	(or menubar-bindings-done
! 	    (if (eq window-system 'x)
  		(precompute-menubar-bindings)))))))
  
  ;; Precompute the keyboard equivalents in the menu bar items.
--- 287,304 ----
  	     (run-hooks 'term-setup-hook))
  	;; Modify the initial frame based on what .emacs puts into
  	;; ...-frame-alist.
+         ;; FIXME/cl check was window-system
  	(if (fboundp 'frame-notice-user-settings)
  	    (frame-notice-user-settings))
  	;; Now we know the user's default font, so add it to the menu.
+         ;; FIXME/cl check was window-system
  	(if (fboundp 'font-menu-add-default)
  	    (font-menu-add-default))
  	(and window-setup-hook
  	     (run-hooks 'window-setup-hook))
  	(or menubar-bindings-done
! 	    (if (or (eq window-system 'x)
!                     (eq window-system 'ns))
  		(precompute-menubar-bindings)))))))
  
  ;; Precompute the keyboard equivalents in the menu bar items.
***************
*** 307,313 ****
  	   (stringp (car-safe (cdr (car submap))))
  	   (keymapp (cdr (cdr (car submap))))
  	   (progn
! 	     (x-popup-menu nil (cdr (cdr (car submap))))
  	     (if purify-flag
  		 (garbage-collect))))
        (setq submap (cdr submap))))
--- 310,316 ----
  	   (stringp (car-safe (cdr (car submap))))
  	   (keymapp (cdr (cdr (car submap))))
  	   (progn
! 	     (popup-menu nil (cdr (cdr (car submap))))
  	     (if purify-flag
  		 (garbage-collect))))
        (setq submap (cdr submap))))
***************
*** 444,456 ****
      ;; Re-attach the program name to the front of the arg list.
      (and command-line-args (setcdr command-line-args args)))
  
!   ;; Under X Windows, this creates the X frame and deletes the terminal frame.
    (if (fboundp 'face-initialize)
        (face-initialize))
    (if (fboundp 'frame-initialize)
        (frame-initialize))
    ;; If frame was created with a menu bar, set menu-bar-mode on.
!   (if (and (eq window-system 'x)
  	   (> (cdr (assq 'menu-bar-lines (frame-parameters))) 0))
        (menu-bar-mode t))
  
--- 447,460 ----
      ;; Re-attach the program name to the front of the arg list.
      (and command-line-args (setcdr command-line-args args)))
  
!   ;; Under a window system, this creates the frame and deletes the terminal frame.
!   ;; FIXME/cl check
    (if (fboundp 'face-initialize)
        (face-initialize))
    (if (fboundp 'frame-initialize)
        (frame-initialize))
    ;; If frame was created with a menu bar, set menu-bar-mode on.
!   (if (and window-system 
  	   (> (cdr (assq 'menu-bar-lines (frame-parameters))) 0))
        (menu-bar-mode t))
  
***************
*** 586,591 ****
--- 590,596 ----
  	     ;; display the startup message; otherwise, the settings
  	     ;; won't take effect until the user gives the first
  	     ;; keystroke, and that's distracting.
+              ;; FIXME/cl check
  	     (if (fboundp 'frame-notice-user-settings)
  		 (frame-notice-user-settings))
  
***************
*** 594,600 ****
  	     (setq window-setup-hook nil)
  	     ;; Do this now to avoid an annoying delay if the user
  	     ;; clicks the menu bar during the sit-for.
! 	     (if (eq window-system 'x)
  		 (precompute-menubar-bindings))
  	     (setq menubar-bindings-done t)
  	     (unwind-protect
--- 599,606 ----
  	     (setq window-setup-hook nil)
  	     ;; Do this now to avoid an annoying delay if the user
  	     ;; clicks the menu bar during the sit-for.
! 	     (if (or (eq window-system 'x)
!                      (eq window-system 'ns))
  		 (precompute-menubar-bindings))
  	     (setq menubar-bindings-done t)
  	     (unwind-protect
Index: emacs/lisp/sun-curs.el
diff -c emacs/lisp/sun-curs.el:1.1.1.1 emacs/lisp/sun-curs.el:removed
*** emacs/lisp/sun-curs.el:1.1.1.1	Fri Jul 19 01:51:15 1996
--- emacs/lisp/sun-curs.el	Fri Aug  2 20:42:17 1996
***************
*** 1,216 ****
- ;;; sun-curs.el --- cursor definitions for Sun windows
- 
- ;; Copyright (C) 1987 Free Software Foundation, Inc.
- 
- ;; Author: Jeff Peck <peck@sun.com>
- ;; Keywords: hardware
- 
- ;; This file is part of GNU Emacs.
- 
- ;; GNU Emacs is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 2, or (at your option)
- ;; any later version.
- 
- ;; GNU Emacs is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- ;; GNU General Public License for more details.
- 
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs; see the file COPYING.  If not, write to
- ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- 
- ;;; Code:
- 
- ;;;
- ;;; Added some more cursors and moved the hot spots
- ;;; Cursor defined by 16 pairs of 16-bit numbers
- ;;;
- ;;; 9-dec-86 Jeff Peck, Sun Microsystems Inc. <peck@sun.com>
- 
- (require 'cl)
- 
- (defvar sc::cursors nil "List of known cursors")
- 
- (defmacro defcursor (name x y string)
-   (if (not (memq name sc::cursors)) 
-       (setq sc::cursors (cons name sc::cursors)))
-   (list 'defconst name (list 'vector x y string)))
- 
- ;;; push should be defined in common lisp, but if not use this:
- ;(defmacro push (v l)
- ;  "The ITEM is evaluated and consed onto LIST, a list-valued atom"
- ;  (list 'setq l (list 'cons v l)))
- 
- ;;;
- ;;; The standard default cursor
- ;;;
- (defcursor sc:right-arrow 15 0
-   (concat '(0 1 0 3 0 7 0 15 0 31 0 63 0 127 0 15
- 	      0 27 0 25 0 48 0 48 0 96 0 96 0 192 0 192)))
- 
- ;;(sc:set-cursor sc:right-arrow)
- 
- (defcursor sc:fat-left-arrow 0 8
-   (concat '(1 0 3 0 7 0 15 0 31 0 63 255 127 255 255 255
- 	      255 255 127 255 63 255 31 0 15 0 7 0 3 0 1 0)))
- 
- (defcursor sc:box 8 8
-   (concat '(15 252 8 4 8 4 8 4 8 4 8 4 8 4 8 4
- 	       8 132 8 4 8 4 8 4 8 4 8 4 8 4 15 252)))
- 
- (defcursor sc:hourglass 8 8
-   (concat "\177\376\100\002\040\014\032\070"
- 	  "\017\360\007\340\003\300\001\200"
- 	  "\001\200\002\100\005\040\010\020"
- 	  "\021\210\043\304\107\342\177\376"))
- 
- (defun sc:set-cursor (icon)
-   "Change the Sun mouse cursor to ICON.
- If ICON is nil, switch to the system default cursor,
- Otherwise, ICON should be a vector or the name of a vector of [x y 32-chars]"
-   (interactive "XIcon Name: ")
-   (if (symbolp icon) (setq icon (symbol-value icon)))
-   (sun-change-cursor-icon icon))
- 
- (make-local-variable '*edit-icon*)
- (make-variable-buffer-local 'icon-edit)
- (setq-default icon-edit nil)
- (or (assq 'icon-edit minor-mode-alist)
-     (push '(icon-edit " IconEdit") minor-mode-alist))
- 
- (defun sc:edit-cursor (icon)
-   "convert icon to rectangle, edit, and repack"
-   (interactive "XIcon Name: ")
-   (if (not icon) (setq icon (sc::menu-choose-cursor (selected-window) 1 1)))
-   (if (symbolp icon) (setq icon (symbol-value icon)))
-   (if (get-buffer "icon-edit") (kill-buffer "icon-edit"))
-   (switch-to-buffer "icon-edit")
-   (local-set-mouse '(text right) 'sc::menu-function)
-   (local-set-mouse '(text left) '(sc::pic-ins-at-mouse 32))
-   (local-set-mouse '(text middle) '(sc::pic-ins-at-mouse 64))
-   (local-set-mouse '(text left middle) 'sc::hotspot)
-   (sc::display-icon icon)
-   (picture-mode)
-   (setq icon-edit t)	; for mode line display
- )
- 
- (defun sc::pic-ins-at-mouse (char)
-   "Picture insert char at mouse location"
-   (mouse-move-point *mouse-window* (min 15 *mouse-x*) (min 15 *mouse-y*))
-   (move-to-column (1+ (min 15 (current-column))) t)
-   (delete-char -1)
-   (insert char)
-   (sc::goto-hotspot))
-     
- (defun sc::menu-function (window x y)
-   (sun-menu-evaluate window (1+ x) y sc::menu))
- 
- (defmenu sc::menu
-   ("Cursor Menu")
-   ("Pack & Use" sc::pack-buffer-to-cursor)
-   ("Pack to Icon" sc::pack-buffer-to-icon 
- 		  (sc::menu-choose-cursor *menu-window* *menu-x* *menu-y*))
-   ("New Icon" call-interactively 'sc::make-cursor)
-   ("Edit Icon" sc:edit-cursor 
- 	       (sc::menu-choose-cursor *menu-window* *menu-x* *menu-y*))
-   ("Set Cursor" sc:set-cursor
- 		(sc::menu-choose-cursor *menu-window* *menu-x* *menu-y*)) 
-   ("Reset Cursor" sc:set-cursor nil)
-   ("Help". sc::edit-icon-help-menu)
-   ("Quit" sc::quit-edit)
-   )
- 
- (defun sc::quit-edit ()
-   (interactive)
-   (bury-buffer (current-buffer))
-   (switch-to-buffer (other-buffer) 'no-record))
- 
- (defun sc::make-cursor (symbol)
-   (interactive "SIcon Name: ")
-   (eval (list 'defcursor symbol 0 0 ""))
-   (sc::pack-buffer-to-icon (symbol-value symbol)))
- 
- (defmenu sc::edit-icon-help-menu
-   ("Simple Icon Editor")
-   ("Left     => CLEAR")
-   ("Middle   => SET")
-   ("L & M    => HOTSPOT")
-   ("Right    => MENU"))
- 
- (defun sc::edit-icon-help ()
-   (message "Left=> CLEAR  Middle=> SET  Left+Middle=> HOTSPOT  Right=> MENU"))
- 
- (defun sc::pack-buffer-to-cursor ()
-     (sc::pack-buffer-to-icon *edit-icon*)
-     (sc:set-cursor *edit-icon*))
- 
- (defun sc::menu-choose-cursor (window x y)
-   "Presents a menu of cursor names, and returns one or nil"
-   (let ((curs sc::cursors) 
- 	(items))
-     (while curs
-       (push (sc::menu-item-for-cursor (car curs)) items)
-       (setq curs (cdr curs)))
-     (push (list "Choose Cursor") items)
-     (setq menu (menu-create items))
-     (sun-menu-evaluate window x y menu)))
- 
- (defun sc::menu-item-for-cursor (cursor)
-   "apply function to selected cursor"
-   (list (symbol-name cursor) 'quote cursor))
- 
- (defun sc::hotspot (window x y)
-   (aset *edit-icon* 0 x)
-   (aset *edit-icon* 1 y)
-   (sc::goto-hotspot))
- 
- (defun sc::goto-hotspot ()
-   (goto-line (1+ (aref *edit-icon* 1)))
-   (move-to-column (aref *edit-icon* 0)))
- 
- (defun sc::display-icon (icon)
-   (setq *edit-icon* (copy-sequence icon))
-   (let ((string (aref *edit-icon* 2))
- 	(index 0))
-     (while (< index 32)
-       (let ((char (aref string index))
- 	    (bit 128))
- 	(while (> bit 0)
- 	  (insert (sc::char-at-bit char bit))
- 	  (setq bit (lsh bit -1))))
-       (if (eq 1 (% index 2)) (newline))
-       (setq index (1+ index))))
-   (sc::goto-hotspot))
- 
- (defun sc::char-at-bit (char bit)
-   (if (> (logand char bit) 0) "@" " "))
- 
- (defun sc::pack-buffer-to-icon (icon)
-   "Pack 16 x 16 field into icon string"
-   (goto-char (point-min))
-   (aset icon 0 (aref *edit-icon* 0))
-   (aset icon 1 (aref *edit-icon* 1))
-   (aset icon 2 (mapconcat 'sc::pack-one-line "1234567890123456" ""))
-   (sc::goto-hotspot)
-   )
-   
- (defun sc::pack-one-line (dummy)
-   (let* (char chr1 chr2)
-     (setq char 0 chr1 (mapconcat 'sc::pack-one-char "12345678" "") chr1 char)
-     (setq char 0 chr2 (mapconcat 'sc::pack-one-char "12345678" "") chr2 char)
-     (forward-line 1)
-     (concat (char-to-string chr1) (char-to-string chr2))
-     ))
- 
- (defun sc::pack-one-char (dummy)
-   "pack following char into char, unless eolp"
-   (if (or (eolp) (char-equal (following-char) 32))
-       (setq char (lsh char 1)) 
-     (setq char (1+ (lsh char 1))))
-   (if (not (eolp))(forward-char)))
- 
- (provide 'sm-cursors)
- 
- ;;; sun-curs.el ends here
--- 0 ----
Index: emacs/lisp/sun-fns.el
diff -c emacs/lisp/sun-fns.el:1.1.1.1 emacs/lisp/sun-fns.el:removed
*** emacs/lisp/sun-fns.el:1.1.1.1	Fri Jul 19 01:51:15 1996
--- emacs/lisp/sun-fns.el	Fri Aug  2 20:42:25 1996
***************
*** 1,641 ****
- ;;; sun-fns.el --- subroutines of Mouse handling for Sun windows
- 
- ;; Copyright (C) 1987 Free Software Foundation, Inc.
- 
- ;; Author: Jeff Peck <peck@sun.com>
- ;; Keywords: hardware
- 
- ;; This file is part of GNU Emacs.
- 
- ;; GNU Emacs is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 2, or (at your option)
- ;; any later version.
- 
- ;; GNU Emacs is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- ;; GNU General Public License for more details.
- 
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs; see the file COPYING.  If not, write to
- ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- 
- ;;; Commentary:
- 
- ;;; Submitted Mar. 1987, Jeff Peck
- ;;;		 	 Sun Microsystems Inc. <peck@sun.com>
- ;;; Conceived Nov. 1986, Stan Jefferson,
- ;;;                      Computer Science Lab, SRI International.
- ;;; GoodIdeas Feb. 1987, Steve Greenbaum
- ;;; & UpClicks           Reasoning Systems, Inc.
- ;;;
- ;;;
- ;;; Functions for manipulating via the mouse and mouse-map definitions
- ;;; for accessing them.  Also definitions of mouse menus.
- ;;; This file you should freely modify to reflect you personal tastes.
- ;;;
- ;;; First half of file defines functions to implement mouse commands,
- ;;; Don't delete any of those, just add what ever else you need.
- ;;; Second half of file defines mouse bindings, do whatever you want there.
- 
- ;;;
- ;;;         Mouse Functions.
- ;;;
- ;;; These functions follow the sun-mouse-handler convention of being called
- ;;; with three arguments: (window x-pos y-pos)
- ;;; This makes it easy for a mouse executed command to know where the mouse is.
- ;;; Use the macro "eval-in-window" to execute a function 
- ;;; in a temporarily selected window.
- ;;;
- ;;; If you have a function that must be called with other arguments
- ;;; bind the mouse button to an s-exp that contains the necessary parameters.
- ;;; See "minibuffer" bindings for examples.
- ;;;
- 
- ;;; Code:
- 
- (require 'sun-mouse)
- 
- (defconst cursor-pause-milliseconds 300
-   "*Number of milliseconds to display alternate cursor (usually the mark)")
- 
- (defun indicate-region (&optional pause)
-   "Bounce cursor to mark for cursor-pause-milliseconds and back again"
-   (or pause (setq pause cursor-pause-milliseconds))
-   (let ((point (point)))
-     (goto-char (mark))
-     (sit-for-millisecs pause)
-     ;(update-display)
-     ;(sleep-for-millisecs pause)
-     (goto-char point)))
- 
- 
- ;;;
- ;;; Text buffer operations
- ;;;
- (defun mouse-move-point (window x y)
-   "Move point to mouse cursor."
-   (select-window window)
-   (move-to-loc x y)
-   (if (memq last-command	; support the mouse-copy/delete/yank
- 	    '(mouse-copy mouse-delete mouse-yank-move))
-       (setq this-command 'mouse-yank-move))
-   )
- 
- (defun mouse-set-mark (window x y)
-   "Set mark at mouse cursor."
-   (eval-in-window window	;; use this to get the unwind protect
-     (let ((point (point)))
-       (move-to-loc x y)
-       (set-mark (point))
-       (goto-char point)
-       (indicate-region)))
-   )
- 
- (defun mouse-set-mark-and-select (window x y)
-   "Set mark at mouse cursor, and select that window."
-   (select-window window)
-   (mouse-set-mark window x y)
-   )
- 
- (defun mouse-set-mark-and-stuff (w x y)
-   "Set mark at mouse cursor, and put region in stuff buffer."
-   (mouse-set-mark-and-select w x y)
-   (sun-select-region (region-beginning) (region-end)))
- 
- ;;;
- ;;; Simple mouse dragging stuff: marking with button up
- ;;;
- 
- (defvar *mouse-drag-window* nil)
- (defvar *mouse-drag-x* -1)
- (defvar *mouse-drag-y* -1)
- 
- (defun mouse-drag-move-point (window x y)
-   "Move point to mouse cursor, and allow dragging."
-   (mouse-move-point window x y)
-   (setq *mouse-drag-window* window
- 	*mouse-drag-x* x
- 	*mouse-drag-y* y))
- 
- (defun mouse-drag-set-mark-stuff (window x y)
-   "The up click handler that goes with mouse-drag-move-point.
- If mouse is in same WINDOW but at different X or Y than when
- mouse-drag-move-point was last executed, set the mark at mouse
- and put the region in the stuff buffer."
-   (if (and (eq *mouse-drag-window* window)
- 	   (not (and (equal *mouse-drag-x* x)
- 		     (equal *mouse-drag-y* y))))
-       (mouse-set-mark-and-stuff window x y)
-     (setq this-command last-command))	; this was just an upclick no-op.
-   )
- 
- (defun mouse-select-or-drag-move-point (window x y)
-   "Select window if not selected, otherwise do mouse-drag-move-point."
-   (if (eq (selected-window) window)
-       (mouse-drag-move-point window x y)
-     (mouse-select-window window x y)))
- 
- ;;;
- ;;; esoterica:
- ;;;
- (defun mouse-exch-pt-and-mark (window x y)
-   "Exchange point and mark."
-   (select-window window)
-   (exchange-point-and-mark)
-   )
- 
- (defun mouse-call-kbd-macro (window x y)
-   "Invokes last keyboard macro at mouse cursor."
-   (mouse-move-point window x y)
-   (call-last-kbd-macro)
-   )
- 
- (defun mouse-mark-thing (window x y)
-   "Set point and mark to text object using syntax table.
- The resulting region is put in the sun-window stuff buffer.
- Left or right Paren syntax marks an s-expression.  
- Clicking at the end of a line marks the line including a trailing newline.  
- If it doesn't recognize one of these it marks the character at point."
-   (mouse-move-point window x y)
-   (if (eobp) (open-line 1))
-   (let* ((char (char-after (point)))
-          (syntax (char-syntax char)))
-     (cond
-      ((eq syntax ?w)			; word.
-       (forward-word 1)
-       (set-mark (point))
-       (forward-word -1))
-      ;; try to include a single following whitespace (is this a good idea?)
-      ;; No, not a good idea since inconsistent.
-      ;;(if (eq (char-syntax (char-after (mark))) ?\ )
-      ;;    (set-mark (1+ (mark))))
-      ((eq syntax ?\( )			; open paren.
-       (mark-sexp 1))
-      ((eq syntax ?\) )			; close paren.
-       (forward-char 1)
-       (mark-sexp -1)
-       (exchange-point-and-mark))
-      ((eolp)				; mark line if at end.
-       (set-mark (1+ (point)))
-       (beginning-of-line 1))
-      (t					; mark character
-       (set-mark (1+ (point)))))
-     (indicate-region))			; display region boundary.
-   (sun-select-region (region-beginning) (region-end))
-   )
- 
- (defun mouse-kill-thing (window x y)
-   "Kill thing at mouse, and put point there."
-   (mouse-mark-thing window x y)
-   (kill-region-and-unmark (region-beginning) (region-end))
-   )
- 
- (defun mouse-kill-thing-there (window x y)
-   "Kill thing at mouse, leave point where it was.
- See mouse-mark-thing for a description of the objects recognized."
-   (eval-in-window window 
-     (save-excursion
-       (mouse-mark-thing window x y)
-       (kill-region (region-beginning) (region-end))))
-   )
- 
- (defun mouse-save-thing (window x y &optional quiet)
-   "Put thing at mouse in kill ring.
- See mouse-mark-thing for a description of the objects recognized."
-   (mouse-mark-thing window x y)
-   (copy-region-as-kill (region-beginning) (region-end))
-   (if (not quiet) (message "Thing saved"))
-   )
- 
- (defun mouse-save-thing-there (window x y &optional quiet)
-   "Put thing at mouse in kill ring, leave point as is.
- See mouse-mark-thing for a description of the objects recognized."
-   (eval-in-window window
-     (save-excursion
-       (mouse-save-thing window x y quiet))))
- 
- ;;;
- ;;; Mouse yanking...
- ;;;
- (defun mouse-copy-thing (window x y)
-   "Put thing at mouse in kill ring, yank to point.
- See mouse-mark-thing for a description of the objects recognized."
-   (setq last-command 'not-kill)	 ;Avoids appending to previous kills.
-   (mouse-save-thing-there window x y t)
-   (yank)
-   (setq this-command 'yank))
- 
- (defun mouse-move-thing (window x y)
-   "Kill thing at mouse, yank it to point.
- See mouse-mark-thing for a description of the objects recognized."
-   (setq last-command 'not-kill)	 ;Avoids appending to previous kills.
-   (mouse-kill-thing-there window x y)
-   (yank)
-   (setq this-command 'yank))
- 
- (defun mouse-yank-at-point (&optional window x y)
-   "Yank from kill-ring at point; then cycle thru kill ring."
-   (if (eq last-command 'yank)
-       (let ((before (< (point) (mark))))
- 	(delete-region (point) (mark))
- 	(insert (current-kill 1))
- 	(if before (exchange-point-and-mark)))
-     (yank))
-   (setq this-command 'yank))
- 
- (defun mouse-yank-at-mouse (window x y)
-   "Yank from kill-ring at mouse; then cycle thru kill ring."
-   (mouse-move-point window x y)
-   (mouse-yank-at-point window x y))
- 
- (defun mouse-save/delete/yank (&optional window x y)
-   "Context sensitive save/delete/yank.
- Consecutive clicks perform as follows:
-     * first click saves region to kill ring,
-     * second click kills region,
-     * third click yanks from kill ring,
-     * subsequent clicks cycle thru kill ring.
- If mouse-move-point is performed after the first or second click,
- the next click will do a yank, etc.  Except for a possible mouse-move-point,
- this command is insensitive to mouse location."
-   (cond
-    ((memq last-command '(mouse-delete yank mouse-yank-move))	; third+ click
-     (mouse-yank-at-point))
-    ((eq last-command 'mouse-copy)	; second click
-     (kill-region (region-beginning) (region-end))
-     (setq this-command 'mouse-delete))
-    (t					; first click
-     (copy-region-as-kill (region-beginning) (region-end))
-     (message "Region saved")
-     (setq this-command 'mouse-copy))
-    ))
- 
- 
- (defun mouse-split-horizontally (window x y)
-   "Splits the window horizontally at mouse cursor."
-   (eval-in-window window (split-window-horizontally (1+ x))))
- 
- (defun mouse-split-vertically (window x y)
-   "Split the window vertically at the mouse cursor."
-   (eval-in-window window (split-window-vertically (1+ y))))
- 
- (defun mouse-select-window (window x y)
-   "Selects the window, restoring point."
-   (select-window window))
- 
- (defun mouse-delete-other-windows (window x y)
-   "Deletes all windows except the one mouse is in."
-   (delete-other-windows window))
- 
- (defun mouse-delete-window (window x y)
-   "Deletes the window mouse is in."
-   (delete-window window))
- 
- (defun mouse-undo (window x y)
-   "Invokes undo in the window mouse is in."
-   (eval-in-window window (undo)))
- 
- ;;;
- ;;; Scroll operations
- ;;;
- 
- ;;; The move-to-window-line is used below because otherwise
- ;;; scrolling a non-selected process window with the mouse, after
- ;;; the process has written text past the bottom of the window,
- ;;; gives an "End of buffer" error, and then scrolls.  The
- ;;; move-to-window-line seems to force recomputing where things are.
- (defun mouse-scroll-up (window x y)
-   "Scrolls the window upward."
-   (eval-in-window window (move-to-window-line 1) (scroll-up nil)))
- 
- (defun mouse-scroll-down (window x y)
-   "Scrolls the window downward."
-   (eval-in-window window (scroll-down nil)))
- 
- (defun mouse-scroll-proportional (window x y)
-   "Scrolls the window proportionally corresponding to window
- relative X divided by window width."
-   (eval-in-window window 
-     (if (>= x (1- (window-width)))
- 	;; When x is maximun (equal to or 1 less than window width),
- 	;; goto end of buffer.  We check for this special case
- 	;; because the calculated goto-char often goes short of the
- 	;; end due to roundoff error, and we often really want to go
- 	;; to the end.
- 	(goto-char (point-max))
-       (progn
- 	(goto-char (+ (point-min)	; For narrowed regions.
- 		      (* x (/ (- (point-max) (point-min))
- 			      (1- (window-width))))))
- 	(beginning-of-line))
-       )
-     (what-cursor-position)		; Report position.
-     ))
- 
- (defun mouse-line-to-top (window x y)
-   "Scrolls the line at the mouse cursor up to the top."
-   (eval-in-window window (scroll-up y)))
- 
- (defun mouse-top-to-line (window x y)
-   "Scrolls the top line down to the mouse cursor."
-   (eval-in-window window (scroll-down y)))
- 
- (defun mouse-line-to-bottom (window x y)
-   "Scrolls the line at the mouse cursor to the bottom."
-   (eval-in-window window (scroll-up (+ y (- 2 (window-height))))))
- 
- (defun mouse-bottom-to-line (window x y)
-   "Scrolls the bottom line up to the mouse cursor."
-   (eval-in-window window (scroll-down (+ y (- 2 (window-height))))))
- 
- (defun mouse-line-to-middle (window x y)
-   "Scrolls the line at the mouse cursor to the middle."
-   (eval-in-window window (scroll-up (- y -1 (/ (window-height) 2)))))
- 
- (defun mouse-middle-to-line (window x y)
-   "Scrolls the line at the middle to the mouse cursor."
-   (eval-in-window window (scroll-up (- (/ (window-height) 2) y 1))))
- 
- 
- ;;;
- ;;; main emacs menu.
- ;;;
- (defmenu expand-menu
-   ("Vertically" mouse-expand-vertically *menu-window*)
-   ("Horizontally" mouse-expand-horizontally *menu-window*))
- 
- (defmenu delete-window-menu
-   ("This One" delete-window *menu-window*)
-   ("All Others" delete-other-windows *menu-window*))
- 
- (defmenu mouse-help-menu
-   ("Text Region"
-    mouse-help-region *menu-window* *menu-x* *menu-y* 'text)
-   ("Scrollbar"
-    mouse-help-region *menu-window* *menu-x* *menu-y* 'scrollbar)
-   ("Modeline"
-    mouse-help-region *menu-window* *menu-x* *menu-y* 'modeline)
-   ("Minibuffer"
-    mouse-help-region *menu-window* *menu-x* *menu-y* 'minibuffer)
-   )
-   
- (defmenu emacs-quit-menu
-   ("Suspend" suspend-emacstool)
-   ("Quit" save-buffers-kill-emacs))
- 
- (defmenu emacs-menu
-   ("Emacs Menu")
-   ("Stuff Selection" sun-yank-selection)
-   ("Expand" . expand-menu)
-   ("Delete Window" . delete-window-menu)
-   ("Previous Buffer" mouse-select-previous-buffer *menu-window*)
-   ("Save Buffers" save-some-buffers)
-   ("List Directory" list-directory nil)
-   ("Dired" dired nil)
-   ("Mouse Help" . mouse-help-menu)
-   ("Quit" . emacs-quit-menu))
- 
- (defun emacs-menu-eval (window x y)
-   "Pop-up menu of editor commands."
-   (sun-menu-evaluate window (1+ x) (1- y) 'emacs-menu))
- 
- (defun mouse-expand-horizontally (window)
-   (eval-in-window window
-     (enlarge-window 4 t)
-     (update-display)		; Try to redisplay, since can get confused.
-     ))
- 
- (defun mouse-expand-vertically (window)
-   (eval-in-window window (enlarge-window 4)))
- 
- (defun mouse-select-previous-buffer (window)
-   "Switch buffer in mouse window to most recently selected buffer."
-   (eval-in-window window (switch-to-buffer (other-buffer))))
- 
- ;;;
- ;;; minibuffer menu
- ;;;
- (defmenu minibuffer-menu 
-   ("Minibuffer" message "Just some miscellaneous minibuffer commands")
-   ("Stuff" sun-yank-selection)
-   ("Do-It" exit-minibuffer)
-   ("Abort" abort-recursive-edit)
-   ("Suspend" suspend-emacs))
- 
- (defun minibuffer-menu-eval (window x y)
-   "Pop-up menu of commands."
-   (sun-menu-evaluate window x (1- y) 'minibuffer-menu))
- 
- (defun mini-move-point (window x y)
-   ;; -6 is good for most common cases
-   (mouse-move-point window (- x 6) 0))
- 
- (defun mini-set-mark-and-stuff (window x y)
-   ;; -6 is good for most common cases
-   (mouse-set-mark-and-stuff window (- x 6) 0))
- 
- 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- ;;; Buffer-mode Mouse commands
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- 
- (defun Buffer-at-mouse (w x y)
-   "Calls Buffer-menu-buffer from mouse click."
-   (save-window-excursion 
-     (mouse-move-point w x y)
-     (beginning-of-line)
-     (Buffer-menu-buffer t)))
- 
- (defun mouse-buffer-bury (w x y)
-   "Bury the indicated buffer."
-   (bury-buffer (Buffer-at-mouse w x y))
-   )
- 
- (defun mouse-buffer-select (w x y)
-   "Put the indicated buffer in selected window."
-   (switch-to-buffer (Buffer-at-mouse w x y))
-   (list-buffers)
-   )
- 
- (defun mouse-buffer-delete (w x y)
-   "mark indicated buffer for delete"
-   (save-window-excursion
-     (mouse-move-point w x y)
-     (Buffer-menu-delete)
-     ))
- 
- (defun mouse-buffer-execute (w x y)
-   "execute buffer-menu selections"
-   (save-window-excursion
-     (mouse-move-point w x y)
-     (Buffer-menu-execute)
-     ))
-   
- (defun enable-mouse-in-buffer-list ()
-   "Call this to enable mouse selections in *Buffer List*
-     LEFT puts the indicated buffer in the selected window.
-     MIDDLE buries the indicated buffer.
-     RIGHT marks the indicated buffer for deletion.
-     MIDDLE-RIGHT deletes the marked buffers.
- To unmark a buffer marked for deletion, select it with LEFT."
-   (save-window-excursion
-     (list-buffers)			; Initialize *Buffer List*
-     (set-buffer "*Buffer List*")
-     (local-set-mouse '(text middle) 'mouse-buffer-bury)
-     (local-set-mouse '(text left) 'mouse-buffer-select)	    
-     (local-set-mouse '(text right) 'mouse-buffer-delete)
-     (local-set-mouse '(text middle right) 'mouse-buffer-execute)
-     )
-   )
- 
- 
- ;;;*******************************************************************
- ;;;
- ;;;           Global Mouse Bindings.
- ;;;
- ;;; There is some sense to this mouse binding madness:
- ;;; LEFT and RIGHT scrolls are inverses.
- ;;; SHIFT makes an opposite meaning in the scroll bar.
- ;;; SHIFT is an alternative to DOUBLE (but double chords do not exist).
- ;;; META makes the scrollbar functions work in the text region.
- ;;; MIDDLE operates the mark
- ;;; LEFT operates at point
- 
- ;;; META commands are generally non-destructive,
- ;;; SHIFT is a little more dangerous.
- ;;; CONTROL is for the really complicated ones.
- 
- ;;; CONTROL-META-SHIFT-RIGHT gives help on that region.
- 
- ;;;
- ;;; Text Region mousemap
- ;;;
- ;; The basics: Point, Mark, Menu, Sun-Select:
- (global-set-mouse '(text        left)	'mouse-drag-move-point)
- (global-set-mouse '(text     up left)	'mouse-drag-set-mark-stuff)
- (global-set-mouse '(text shift  left)	'mouse-exch-pt-and-mark)
- (global-set-mouse '(text double left)	'mouse-exch-pt-and-mark)
- 
- (global-set-mouse '(text	middle)	'mouse-set-mark-and-stuff)
- 
- (global-set-mouse '(text	right)	'emacs-menu-eval)
- (global-set-mouse '(text shift	right)	'(sun-yank-selection))
- (global-set-mouse '(text double	right)	'(sun-yank-selection))
- 
- ;; The Slymoblics multi-command for Save, Kill, Copy, Move:
- (global-set-mouse '(text shift	middle)	'mouse-save/delete/yank)
- (global-set-mouse '(text double	middle)	'mouse-save/delete/yank)
- 
- ;; Save, Kill, Copy, Move Things:
- ;; control-left composes with control middle/right to produce copy/move
- (global-set-mouse '(text control middle	    )	'mouse-save-thing-there)
- (global-set-mouse '(text control right      )	'mouse-kill-thing-there)
- (global-set-mouse '(text control 	left)	'mouse-yank-at-point)
- (global-set-mouse '(text control middle	left)	'mouse-copy-thing)
- (global-set-mouse '(text control right	left)	'mouse-move-thing)
- (global-set-mouse '(text control right middle)	'mouse-mark-thing)
- 
- ;; The Universal mouse help command (press all buttons):
- (global-set-mouse '(text shift  control meta right)	'mouse-help-region)
- (global-set-mouse '(text double control meta right)	'mouse-help-region)
- 
- ;;; Meta in Text Region is like meta version in scrollbar:
- (global-set-mouse '(text meta        left)	'mouse-line-to-top)
- (global-set-mouse '(text meta shift  left)	'mouse-line-to-bottom)
- (global-set-mouse '(text meta double left)	'mouse-line-to-bottom)
- (global-set-mouse '(text meta         middle)	'mouse-line-to-middle)
- (global-set-mouse '(text meta shift   middle)	'mouse-middle-to-line)
- (global-set-mouse '(text meta double  middle)	'mouse-middle-to-line)
- (global-set-mouse '(text meta control middle)	'mouse-split-vertically)
- (global-set-mouse '(text meta        right)	'mouse-top-to-line)
- (global-set-mouse '(text meta shift  right)	'mouse-bottom-to-line)
- (global-set-mouse '(text meta double right)	'mouse-bottom-to-line)
- 
- ;; Miscellaneous:
- (global-set-mouse '(text meta control left)	'mouse-call-kbd-macro)
- (global-set-mouse '(text meta control right)	'mouse-undo)
- 
- ;;;
- ;;; Scrollbar mousemap.
- ;;; Are available in the Scrollbar Region, or with Meta Text (or Meta Scrollbar)
- ;;;
- (global-set-mouse '(scrollbar        left)	'mouse-line-to-top)
- (global-set-mouse '(scrollbar shift  left)	'mouse-line-to-bottom)
- (global-set-mouse '(scrollbar double left)	'mouse-line-to-bottom)
- 
- (global-set-mouse '(scrollbar         middle)	'mouse-line-to-middle)
- (global-set-mouse '(scrollbar shift   middle)	'mouse-middle-to-line)
- (global-set-mouse '(scrollbar double  middle)	'mouse-middle-to-line)
- (global-set-mouse '(scrollbar control middle)	'mouse-split-vertically)
- 
- (global-set-mouse '(scrollbar        right)	'mouse-top-to-line)
- (global-set-mouse '(scrollbar shift  right)	'mouse-bottom-to-line)
- (global-set-mouse '(scrollbar double right)	'mouse-bottom-to-line)
- 
- (global-set-mouse '(scrollbar meta        left)		'mouse-line-to-top)
- (global-set-mouse '(scrollbar meta shift  left)		'mouse-line-to-bottom)
- (global-set-mouse '(scrollbar meta double left)		'mouse-line-to-bottom)
- (global-set-mouse '(scrollbar meta         middle)	'mouse-line-to-middle)
- (global-set-mouse '(scrollbar meta shift   middle)	'mouse-middle-to-line)
- (global-set-mouse '(scrollbar meta double  middle)	'mouse-middle-to-line)
- (global-set-mouse '(scrollbar meta control middle)	'mouse-split-vertically)
- (global-set-mouse '(scrollbar meta        right)	'mouse-top-to-line)
- (global-set-mouse '(scrollbar meta shift  right)	'mouse-bottom-to-line)
- (global-set-mouse '(scrollbar meta double right)	'mouse-bottom-to-line)
- 
- ;; And the help menu:
- (global-set-mouse '(scrollbar shift  control meta right) 'mouse-help-region)
- (global-set-mouse '(scrollbar double control meta right) 'mouse-help-region)
- 
- ;;;
- ;;; Modeline mousemap.
- ;;;
- ;;; Note: meta of any single button selects window.
- 
- (global-set-mouse '(modeline      left)	'mouse-scroll-up)
- (global-set-mouse '(modeline meta left)	'mouse-select-window)
- 
- (global-set-mouse '(modeline         middle)	'mouse-scroll-proportional)
- (global-set-mouse '(modeline meta    middle)	'mouse-select-window)
- (global-set-mouse '(modeline control middle)	'mouse-split-horizontally)
- 
- (global-set-mouse '(modeline      right)	'mouse-scroll-down)
- (global-set-mouse '(modeline meta right)	'mouse-select-window)
- 
- ;;; control-left selects this window, control-right deletes it.
- (global-set-mouse '(modeline control left)	'mouse-delete-other-windows)
- (global-set-mouse '(modeline control right)	'mouse-delete-window)
- 
- ;; in case of confusion, just select it:
- (global-set-mouse '(modeline control left right)'mouse-select-window)
- 
- ;; even without confusion (and without the keyboard) select it:
- (global-set-mouse '(modeline left right)	'mouse-select-window)
- 
- ;; And the help menu:
- (global-set-mouse '(modeline shift  control meta right)	'mouse-help-region)
- (global-set-mouse '(modeline double control meta right)	'mouse-help-region)
- 
- ;;;
- ;;; Minibuffer Mousemap
- ;;; Demonstrating some variety:
- ;;;
- (global-set-mouse '(minibuffer left)		'mini-move-point)
- 
- (global-set-mouse '(minibuffer         middle)	'mini-set-mark-and-stuff)
- 
- (global-set-mouse '(minibuffer shift   middle) '(select-previous-complex-command))
- (global-set-mouse '(minibuffer double  middle) '(select-previous-complex-command))
- (global-set-mouse '(minibuffer control middle) '(next-complex-command 1))
- (global-set-mouse '(minibuffer meta    middle) '(previous-complex-command 1))
- 
- (global-set-mouse '(minibuffer right)	'minibuffer-menu-eval)
- 
- (global-set-mouse '(minibuffer shift  control meta right)  'mouse-help-region)
- (global-set-mouse '(minibuffer double control meta right)  'mouse-help-region)
- 
- (provide 'sun-fns)
- 
- ;;; sun-fns.el ends here
--- 0 ----
Index: emacs/lisp/tar-mode.el
diff -c emacs/lisp/tar-mode.el:1.1.1.2 emacs/lisp/tar-mode.el:1.3
*** emacs/lisp/tar-mode.el:1.1.1.2	Mon Jul 22 01:37:17 1996
--- emacs/lisp/tar-mode.el	Wed Jul 31 01:36:07 1996
***************
*** 495,500 ****
--- 495,501 ----
    (define-key tar-mode-map "u" 'tar-unflag)
    (define-key tar-mode-map "v" 'tar-view)
    (define-key tar-mode-map "x" 'tar-expunge)
+   (define-key tar-mode-map [delete] 'tar-unflag-backwards)
    (define-key tar-mode-map "\177" 'tar-unflag-backwards)
    (define-key tar-mode-map "E" 'tar-extract-other-window)
    (define-key tar-mode-map "M" 'tar-chmod-entry)
Index: emacs/lisp/terminal.el
diff -c emacs/lisp/terminal.el:1.1.1.2 emacs/lisp/terminal.el:1.3
*** emacs/lisp/terminal.el:1.1.1.2	Mon Jul 22 01:37:25 1996
--- emacs/lisp/terminal.el	Wed Jul 31 01:36:09 1996
***************
*** 139,144 ****
--- 139,145 ----
      (define-key map "\C-o" 'te-more-break-flush-pending-output)
      ;;>>> this isn't right
      ;(define-key map "\^?" 'te-more-break-flush-pending-output) ;DEL
+     ;(define-key map [delete] 'te-more-break-flush-pending-output) ;DEL
      (define-key map "\r" 'te-more-break-advance-one-line)
  
      (setq terminal-more-break-map map)))
Index: emacs/lisp/tex-mode.el
diff -c emacs/lisp/tex-mode.el:1.1.1.2 emacs/lisp/tex-mode.el:1.3
*** emacs/lisp/tex-mode.el:1.1.1.2	Mon Jul 22 01:37:27 1996
--- emacs/lisp/tex-mode.el	Wed Jul 31 01:36:12 1996
***************
*** 117,123 ****
  window system being used.  For example,
  
      (setq tex-dvi-view-command
!           (if (eq window-system 'x) \"xdvi\" \"dvi2tty * | cat -s\"))
  
  would tell \\[tex-view] to use xdvi under X windows and to use dvi2tty
  otherwise.")
--- 117,126 ----
  window system being used.  For example,
  
      (setq tex-dvi-view-command
!           (cond
!            ((eq window-system 'x)  \"xdvi\")
!            ((eq window-system 'ns) \"open *\")
!            (t                      \"dvi2tty * | cat -s\")))
  
  would tell \\[tex-view] to use xdvi under X windows and to use dvi2tty
  otherwise.")
Index: emacs/lisp/tpu-edt.el
diff -c emacs/lisp/tpu-edt.el:1.1.1.2 emacs/lisp/tpu-edt.el:1.3
*** emacs/lisp/tpu-edt.el:1.1.1.2	Mon Jul 22 01:37:45 1996
--- emacs/lisp/tpu-edt.el	Wed Jul 31 01:36:16 1996
***************
*** 55,61 ****
  ;;;
  ;;;     o tpu-mark              o tpu-set-mark
  ;;;     o tpu-string-prompt     o tpu-regexp-prompt
! ;;;     o tpu-edt-on            o tpu-load-xkeys
  ;;;     o tpu-update-mode-line  o mode line section
  ;;;
  (defconst tpu-emacs19-p (not (string-lessp emacs-version "19"))
--- 55,61 ----
  ;;;
  ;;;     o tpu-mark              o tpu-set-mark
  ;;;     o tpu-string-prompt     o tpu-regexp-prompt
! ;;;     o tpu-edt-on            o tpu-load-winkeys
  ;;;     o tpu-update-mode-line  o mode line section
  ;;;
  (defconst tpu-emacs19-p (not (string-lessp emacs-version "19"))
***************
*** 128,135 ****
    "True when TPU-edt is operating in the backward direction.")
  (defvar tpu-control-keys t
    "If non-nil, control keys are set to perform TPU functions.")
! (defvar tpu-xkeys-file nil
!   "File containing TPU-edt X key map.")
  
  (defvar tpu-rectangle-string nil
    "Mode line string to identify rectangular mode.")
--- 128,135 ----
    "True when TPU-edt is operating in the backward direction.")
  (defvar tpu-control-keys t
    "If non-nil, control keys are set to perform TPU functions.")
! (defvar tpu-winkeys-file nil
!   "File containing TPU-edt window system key map.")
  
  (defvar tpu-rectangle-string nil
    "Mode line string to identify rectangular mode.")
***************
*** 1906,1911 ****
--- 1906,1912 ----
  (define-key GOLD-map "}" 'nil)                                ; }
  (define-key GOLD-map "~" 'exchange-point-and-mark)            ; ~
  (define-key GOLD-map "\177" 'delete-window)                   ; <X]
+ (define-key GOLD-map [delete] 'delete-window)                   ; <X]
  
  
  ;;;
***************
*** 2095,2109 ****
  
  
  ;;;
! ;;;  Emacs version 19 X-windows key definition support
  ;;;
! (defun tpu-load-xkeys (file)
!   "Load the TPU-edt X-windows key definitions FILE.
  If FILE is nil, try to load a default file.  The default file names are
  `~/.tpu-lucid-keys' for Lucid emacs, and `~/.tpu-keys' for Emacs."
    (interactive "fX key definition file: ")
    (cond (file
  	 (setq file (expand-file-name file)))
  	(tpu-xkeys-file
  	 (setq file (expand-file-name tpu-xkeys-file)))
  	(tpu-lucid-emacs19-p
--- 2096,2112 ----
  
  
  ;;;
! ;;;  Emacs version 19 window system key definition support
  ;;;
! (defun tpu-load-winkeys (file)
!   "Load the TPU-edt window system key definitions FILE.
  If FILE is nil, try to load a default file.  The default file names are
  `~/.tpu-lucid-keys' for Lucid emacs, and `~/.tpu-keys' for Emacs."
    (interactive "fX key definition file: ")
    (cond (file
  	 (setq file (expand-file-name file)))
+ 	(tpu-winkeys-file
+ 	 (setq file (expand-file-name tpu-winkeys-file)))
  	(tpu-xkeys-file
  	 (setq file (expand-file-name tpu-xkeys-file)))
  	(tpu-lucid-emacs19-p
***************
*** 2120,2127 ****
  	 (erase-buffer)
  	 (insert "
  
!      Ack!!  You're running TPU-edt under X-windows without loading an
!      X  key definition file.   To create a  TPU-edt X  key definition
       file, run the tpu-mapper.el program.  It  came with TPU-edt.  It
       even includes directions on how to  use it!  Perhaps it's laying
       around here someplace.  ")
--- 2123,2130 ----
  	 (erase-buffer)
  	 (insert "
  
!      Ack!!  You're running TPU-edt under a window system without loading an
!      key definition file.   To create a  TPU-edt  key definition
       file, run the tpu-mapper.el program.  It  came with TPU-edt.  It
       even includes directions on how to  use it!  Perhaps it's laying
       around here someplace.  ")
***************
*** 2187,2193 ****
      (require 'picture)
      (tpu-reset-control-keys t)
      (cond (tpu-emacs19-p
! 	   (and window-system (tpu-load-xkeys nil))
  	   (tpu-arrow-history))
  	  (t
  	   ;; define ispell functions
--- 2190,2196 ----
      (require 'picture)
      (tpu-reset-control-keys t)
      (cond (tpu-emacs19-p
! 	   (and window-system (tpu-load-winkeys nil))
  	   (tpu-arrow-history))
  	  (t
  	   ;; define ispell functions
Index: emacs/lisp/tpu-mapper.el
diff -c emacs/lisp/tpu-mapper.el:1.1.1.2 emacs/lisp/tpu-mapper.el:1.3
*** emacs/lisp/tpu-mapper.el:1.1.1.2	Mon Jul 22 01:37:49 1996
--- emacs/lisp/tpu-mapper.el	Wed Jul 31 01:36:20 1996
***************
*** 1,4 ****
! ;;; tpu-mapper.el  ---  Create a TPU-edt keymap file for x-windows emacs.
  
  ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
--- 1,4 ----
! ;;; tpu-mapper.el  ---  Create a TPU-edt keymap file for windows emacs.
  
  ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
***************
*** 25,37 ****
  ;;; Commentary:
  
  ;;  This emacs lisp program can be used to create an emacs lisp file that
! ;;  defines the TPU-edt keypad for emacs running on x-windows.  Please read
  ;;  the "Usage" AND "Known Problems" sections before attempting to run this
  ;;  program.
  
  ;;; Usage:
  
! ;;  Simply load this file into the X-windows version of emacs (version 19)
  ;;  using the following command.
  
  ;;    emacs -q -l tpu-mapper.el
--- 25,37 ----
  ;;; Commentary:
  
  ;;  This emacs lisp program can be used to create an emacs lisp file that
! ;;  defines the TPU-edt keypad for emacs running under a GUI.  Please read
  ;;  the "Usage" AND "Known Problems" sections before attempting to run this
  ;;  program.
  
  ;;; Usage:
  
! ;;  Simply load this file into the GUI version of emacs (version 19)
  ;;  using the following command.
  
  ;;    emacs -q -l tpu-mapper.el
***************
*** 49,58 ****
  ;;  Finally, you will be prompted for the name of the file to store the key
  ;;  definitions.  If you chose the default, TPU-edt will find it and load it
  ;;  automatically.  If you specify a different file name, you will need to
! ;;  set the variable "tpu-xkeys-file" before loading TPU-edt.  Here's how
  ;;  you might go about doing that in your .emacs file.
  
! ;;    (setq tpu-xkeys-file (expand-file-name "~/.my-emacs-x-keys"))
  ;;    (load "tpu-edt")
  
  ;;; Known Problems:
--- 49,58 ----
  ;;  Finally, you will be prompted for the name of the file to store the key
  ;;  definitions.  If you chose the default, TPU-edt will find it and load it
  ;;  automatically.  If you specify a different file name, you will need to
! ;;  set the variable "tpu-winkeys-file" before loading TPU-edt.  Here's how
  ;;  you might go about doing that in your .emacs file.
  
! ;;    (setq tpu-winkeys-file (expand-file-name "~/.my-emacs-win-keys"))
  ;;    (load "tpu-edt")
  
  ;;; Known Problems:
***************
*** 67,77 ****
  ;;; Code:
  
  ;;;
! ;;;  Make sure we're running X-windows and Emacs version 19
  ;;;
  (cond
   ((not (and window-system (not (string-lessp emacs-version "19"))))
!   (error "tpu-mapper requires running in Emacs 19, with an X display")))
  
  
  ;;;
--- 67,77 ----
  ;;; Code:
  
  ;;;
! ;;;  Make sure we're running a window system and Emacs version 19
  ;;;
  (cond
   ((not (and window-system (not (string-lessp emacs-version "19"))))
!   (error "tpu-mapper requires running in Emacs 19, under a GUI.")))
  
  
  ;;;
***************
*** 125,131 ****
  (switch-to-buffer "Directions")
  (insert "
      This program prompts you to press keys to create a custom keymap file
!     for use with the x-windows version of Emacs and TPU-edt.
  
      Start by pressing the RETURN key, and continue by pressing the keys
      specified in the mini-buffer.  You can re-arrange the TPU-edt keypad
--- 125,131 ----
  (switch-to-buffer "Directions")
  (insert "
      This program prompts you to press keys to create a custom keymap file
!     for use with a GUI version of emacs and TPU-edt.
  
      Start by pressing the RETURN key, and continue by pressing the keys
      specified in the mini-buffer.  You can re-arrange the TPU-edt keypad
Index: emacs/lisp/two-column.el
diff -c emacs/lisp/two-column.el:1.1.1.1 emacs/lisp/two-column.el:1.2
*** emacs/lisp/two-column.el:1.1.1.1	Fri Jul 19 01:51:30 1996
--- emacs/lisp/two-column.el	Fri Jul 19 05:04:10 1996
***************
*** 216,221 ****
--- 216,222 ----
    (define-key tc-mode-map "}" 'enlarge-window-horizontally)
    (define-key tc-mode-map " " 'tc-scroll-up)
    (define-key tc-mode-map "\^?" 'tc-scroll-down)
+   (define-key tc-mode-map [delete] 'tc-scroll-down)
    (define-key tc-mode-map "\C-m" 'tc-scroll-line))
  
  ;;;###autoload
Index: emacs/lisp/vi.el
diff -c emacs/lisp/vi.el:1.1.1.2 emacs/lisp/vi.el:1.3
*** emacs/lisp/vi.el:1.1.1.2	Mon Jul 22 01:38:10 1996
--- emacs/lisp/vi.el	Wed Jul 31 01:36:22 1996
***************
*** 250,255 ****
--- 250,256 ----
    (define-key vi-com-map "|"  'vi-goto-column)
    (define-key vi-com-map "}"  'forward-paragraph)
    (define-key vi-com-map "~"  'vi-change-case)
+   (define-key vi-com-map [delete] 'delete-backward-char)
    (define-key vi-com-map "\177" 'delete-backward-char))
  
  (put 'backward-char 'point-moving-unit 'char)
Index: emacs/lisp/view.el
diff -c emacs/lisp/view.el:1.1.1.2 emacs/lisp/view.el:1.3
*** emacs/lisp/view.el:1.1.1.2	Mon Jul 22 01:38:12 1996
--- emacs/lisp/view.el	Wed Jul 31 01:36:25 1996
***************
*** 65,70 ****
--- 65,71 ----
    (define-key view-mode-map "\ev" 'View-scroll-lines-backward)
    (define-key view-mode-map "\C-v" 'View-scroll-lines-forward)
    (define-key view-mode-map " " 'View-scroll-lines-forward)
+   (define-key view-mode-map [delete] 'View-scroll-lines-backward)
    (define-key view-mode-map "\177" 'View-scroll-lines-backward)
    (define-key view-mode-map "\n" 'View-scroll-one-more-line)
    (define-key view-mode-map "\r" 'View-scroll-one-more-line)
Index: emacs/lisp/vip.el
diff -c emacs/lisp/vip.el:1.1.1.2 emacs/lisp/vip.el:1.3
*** emacs/lisp/vip.el:1.1.1.2	Mon Jul 22 01:38:14 1996
--- emacs/lisp/vip.el	Wed Jul 31 01:36:27 1996
***************
*** 1965,1970 ****
--- 1965,1971 ----
  (define-key vip-mode-map "|" 'vip-goto-col)
  (define-key vip-mode-map "}" 'vip-forward-paragraph)
  (define-key vip-mode-map "~" 'vip-nil)
+ (define-key vip-mode-map [delete] 'vip-delete-backward-char)
  (define-key vip-mode-map "\177" 'vip-delete-backward-char)
  
  (define-key ctl-x-map "3" 'vip-buffer-in-two-windows)
Index: emacs/lisp/ws-mode.el
diff -c emacs/lisp/ws-mode.el:1.1.1.1 emacs/lisp/ws-mode.el:1.2
*** emacs/lisp/ws-mode.el:1.1.1.1	Fri Jul 19 01:51:36 1996
--- emacs/lisp/ws-mode.el	Fri Jul 19 05:04:21 1996
***************
*** 178,183 ****
--- 178,184 ----
    (define-key wordstar-C-q-map "\C-w" 'ws-last-error)
    (define-key wordstar-C-q-map "y" 'ws-kill-eol)
    (define-key wordstar-C-q-map "\C-y" 'ws-kill-eol)
+   (define-key wordstar-C-q-map [delete] 'ws-kill-bol)
    (define-key wordstar-C-q-map "\177" 'ws-kill-bol))
  
  ;;;###autoload
Index: emacs/lisp/term/ns-win.el
diff -c /dev/null emacs/lisp/term/ns-win.el:1.3
*** /dev/null	Fri Aug  2 20:43:55 1996
--- emacs/lisp/term/ns-win.el	Thu Aug  1 02:12:29 1996
***************
*** 0 ****
--- 1,1306 ----
+ ;;; ns-win.el --- parse switches controlling interface with NS window system
+ ;; Copyright (C) 1993 Free Software Foundation, Inc.
+ 
+ ;; Author: FSF
+ ;; Keywords: terminals
+ 
+ ;;; This file is part of GNU Emacs.
+ ;;;
+ ;;; GNU Emacs is free software; you can redistribute it and/or modify
+ ;;; it under the terms of the GNU General Public License as published by
+ ;;; the Free Software Foundation; either version 2, or (at your option)
+ ;;; any later version.
+ ;;;
+ ;;; GNU Emacs is distributed in the hope that it will be useful,
+ ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ ;;; GNU General Public License for more details.
+ ;;;
+ ;;; You should have received a copy of the GNU General Public License
+ ;;; along with GNU Emacs; see the file COPYING.  If not, write to
+ ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ ;;; Commentary:
+ 
+ ;; ns-win.el:  this file is loaded from ../lisp/startup.el when it recognizes
+ ;; that NS windows are to be used.  Command line switches are parsed and those
+ ;; pertaining to NS are processed and removed from the command line.  The
+ ;; NS display is opened and hooks are set for popping up the initial window.
+ 
+ ;; startup.el will then examine startup files, and eventually call the hooks
+ ;; which create the first window (s).
+ 
+ ;;; Code:
+ 
+ ;; An alist of NS options and the function which handles them.  See
+ ;; ../startup.el.
+ 
+ (if (not (eq window-system 'ns))
+     (error "%s: Loading ns-win.el but not compiled for NS" (invocation-name)))
+ 
+ (require 'frame)
+ (require 'mouse)
+ (require 'ns-scroll-bar)
+ (require 'ns-menu-bar)
+ (require 'faces)
+ (require 'delsel)
+ (require 'mldrag)
+ 
+ (autoload 'ns-gdb-mode "ns-gdb" "NS gdb is a minor mode which interacts with gdb" t)
+ (autoload 'reporter-submit-bug-report "reporter" "Submit a bug report via mail." t)
+ 
+ (defvar ns-invocation-args)
+ 
+ (defvar ns-command-line-resources nil)
+ 
+ (setq command-switch-alist
+       (append '(("-NXAutoLaunch" .      ns-ignore-1-arg)
+                 ("-ns" .                ns-ignore-0-arg)
+                 ("-NXHost" .            ns-ignore-1-arg)
+                 ("-MachLaunch" .        ns-ignore-2-arg)
+                 ("-NXOpen" .            ns-handle-nxopen)
+                 ("-NXOpenTemp" .        ns-handle-nxopentemp)
+                 ("-name" .              ns-handle-name-switch)
+                 ("-T" .                 ns-handle-switch)
+                 ("-r" .                 ns-handle-switch)
+                 ("-rv" .                ns-handle-switch)
+                 ("-reverse" .           ns-handle-switch)
+                 ("-fn" .                ns-handle-switch)
+                 ("-font" .              ns-handle-switch)
+                 ("-ib" .                ns-handle-numeric-switch)
+                 ("-fg" .                ns-handle-switch)
+                 ("-foreground".         ns-handle-switch)
+                 ("-bg" .                ns-handle-switch)
+                 ("-background".         ns-handle-switch)
+                 ("-ms" .                ns-handle-switch)
+                 ("-itype" .             ns-handle-switch)
+                 ("-i"   .               ns-handle-switch)
+                 ("-iconic" .            ns-handle-iconic)
+                 ("-cr" .                ns-handle-switch)
+                 ("-vb" .                ns-handle-switch)
+                 ("-hb" .                ns-handle-switch)
+                 ("-bd" .                ns-handle-switch))
+               command-switch-alist))
+ 
+ (defconst ns-switch-definitions
+   '(("-name" name)
+     ("-T" name)
+     ("-r" reverse t)
+     ("-rv" reverse t)
+     ("-reverse" reverse t)
+     ("-fn" font)
+     ("-font" font)
+     ("-ib" internal-border-width)
+     ("-fg" foreground-color)
+     ("-foreground" foreground-color)
+     ("-bg" background-color)
+     ("-background" background-color)
+     ("-ms" mouse-color)
+     ("-cr" cursor-color)
+     ("-itype" icon-type t)
+     ("-i" icon-type t)
+     ("-vb" vertical-scroll-bars t)
+     ("-hb" horizontal-scroll-bars t)
+     ("-bd" border-color)))
+ 
+ ;;; Font conversion
+ (defvar ns-convert-font-trait-alist
+   '(("Ohlfs" "Courier-Bold" "Courier-Oblique"
+      "Courier-BoldOblique"))
+   "Alist (FACE BOLD ITALIC BOLDITALIC) of faces where BOLD, ITALIC,
+ BOLDITALIC are the faces to use when making FACE bold, italic or
+ bold-italic. This can be used to either define bold, italic,
+ bolditalic traits for faces which don't have such traits or to
+ override the trait chosen by the FontManager.")
+ 
+ ;; Handler for switches of the form "-switch value" or "-switch".
+ (defun ns-handle-switch (switch)
+   (let ((aelt (assoc switch ns-switch-definitions)))
+     (if aelt
+         (if (nth 2 aelt)
+             (setq default-frame-alist
+                   (cons (cons (nth 1 aelt) (nth 2 aelt))
+                         default-frame-alist))
+           (setq default-frame-alist
+                 (cons (cons (nth 1 aelt)
+                             (car ns-invocation-args))
+                       default-frame-alist)
+                 ns-invocation-args (cdr ns-invocation-args))))))
+ 
+ ;; Make -iconic apply only to the initial frame!
+ (defun ns-handle-iconic (switch)
+   (setq initial-frame-alist
+         (cons '(visibility . icon) initial-frame-alist)))
+ 
+ ;; Handler for switches of the form "-switch n"
+ (defun ns-handle-numeric-switch (switch)
+   (let ((aelt (assoc switch ns-switch-definitions)))
+     (if aelt
+         (setq default-frame-alist
+               (cons (cons (nth 1 aelt)
+                           (string-to-int (car ns-invocation-args)))
+                     default-frame-alist)
+               ns-invocation-args
+               (cdr ns-invocation-args)))))
+ 
+ ;; Handle the -name option, set the name of
+ ;; the initial frame.
+ (defun ns-handle-name-switch (switch)
+   (or (consp ns-invocation-args)
+       (error "%s: missing argument to `%s' option" (invocation-name) switch))
+   (setq initial-frame-alist (cons (cons 'name (car ns-invocation-args))
+                                   initial-frame-alist)
+         ns-invocation-args (cdr ns-invocation-args)))
+ 
+ (defun ns-handle-nxopen (switch)
+   (setq unread-command-events (append unread-command-events '(ns-open-file))
+         ns-input-file (append ns-input-file (list (car ns-invocation-args)))
+         ns-invocation-args (cdr ns-invocation-args)))
+ 
+ (defun ns-handle-nxopentemp (switch)
+   (setq unread-command-events (append unread-command-events '(ns-open-temp-file))
+         ns-input-file (append ns-input-file (list (car ns-invocation-args)))
+         ns-invocation-args (cdr ns-invocation-args)))
+ 
+ (defun ns-ignore-0-arg (switch)
+   )
+ (defun ns-ignore-1-arg (switch)
+   (setq ns-invocation-args (cdr ns-invocation-args)))
+ (defun ns-ignore-2-arg (switch)
+   (setq ns-invocation-args (cddr ns-invocation-args)))
+ 
+ (defvar ns-invocation-args nil)
+ 
+ (defvar ns-pop-up-frames 'fresh
+   "* Should file opened upon request from the Workspace be opened in a new frame ?
+ If t, always.  If nil, never.  Otherwise a new frame is opened
+ unless the current buffer is a scratch buffer.")
+ 
+ (defun ns-handle-args (args)
+   "Here the Ns-related command line options in ARGS are processed,
+ before the user's startup file is loaded.  They are copied to
+ ns-invocation args from which the NS related things are extracted, first
+ the switch (e.g., \"-fg\") in the following code, and possible values
+ (e.g., \"black\") in the option handler code (e.g., ns-handle-switch).
+ This returns ARGS with the arguments that have been processed removed."
+   (setq ns-invocation-args args
+         args nil)
+   (while ns-invocation-args
+     (let* ((this-switch (car ns-invocation-args))
+            (aelt (assoc this-switch command-switch-alist)))
+       (setq ns-invocation-args (cdr ns-invocation-args))
+       (if aelt
+           (funcall (cdr aelt) this-switch)
+         (setq args (cons this-switch args)))))
+   (setq args (nreverse args))
+   args)
+ 
+ (defun get-lisp-resource (arg1 arg2)
+   (let ((res (get-resource arg1 arg2)))
+     (cond
+      ((not res) 'unbound)
+      ((string-equal (upcase res) "YES")
+       t)
+      ((string-equal (upcase res) "NO")
+       nil)
+      (t
+       (read res)))))
+ 
+ (defun do-hide-emacs ()
+   (interactive)
+   (hide-emacs t))
+ 
+ ;;
+ ;; Available colors
+ ;;
+ 
+ (defvar ns-colors '("AliceBlue"
+                     "AntiqueWhite"
+                     "AntiqueWhite1"
+                     "AntiqueWhite2"
+                     "AntiqueWhite3"
+                     "AntiqueWhite4"
+                     "aquamarine"
+                     "aquamarine1"
+                     "aquamarine2"
+                     "aquamarine3"
+                     "aquamarine4"
+                     "azure"
+                     "azure1"
+                     "azure2"
+                     "azure3"
+                     "azure4"
+                     "beige"
+                     "bisque"
+                     "bisque1"
+                     "bisque2"
+                     "bisque3"
+                     "bisque4"
+                     "black"
+                     "BlanchedAlmond"
+                     "blue"
+                     "blue1"
+                     "blue2"
+                     "blue3"
+                     "blue4"
+                     "BlueViolet"
+                     "brown"
+                     "brown1"
+                     "brown2"
+                     "brown3"
+                     "brown4"
+                     "burlywood"
+                     "burlywood1"
+                     "burlywood2"
+                     "burlywood3"
+                     "burlywood4"
+                     "CadetBlue"
+                     "CadetBlue1"
+                     "CadetBlue2"
+                     "CadetBlue3"
+                     "CadetBlue4"
+                     "chartreuse"
+                     "chartreuse1"
+                     "chartreuse2"
+                     "chartreuse3"
+                     "chartreuse4"
+                     "chocolate"
+                     "chocolate1"
+                     "chocolate2"
+                     "chocolate3"
+                     "chocolate4"
+                     "coral"
+                     "coral1"
+                     "coral2"
+                     "coral3"
+                     "coral4"
+                     "CornflowerBlue"
+                     "cornsilk"
+                     "cornsilk1"
+                     "cornsilk2"
+                     "cornsilk3"
+                     "cornsilk4"
+                     "cyan"
+                     "cyan1"
+                     "cyan2"
+                     "cyan3"
+                     "cyan4"
+                     "DarkGoldenrod"
+                     "DarkGoldenrod1"
+                     "DarkGoldenrod2"
+                     "DarkGoldenrod3"
+                     "DarkGoldenrod4"
+                     "DarkGreen"
+                     "DarkKhaki"
+                     "DarkOliveGreen"
+                     "DarkOliveGreen1"
+                     "DarkOliveGreen2"
+                     "DarkOliveGreen3"
+                     "DarkOliveGreen4"
+                     "DarkOrange"
+                     "DarkOrange1"
+                     "DarkOrange2"
+                     "DarkOrange3"
+                     "DarkOrange4"
+                     "DarkOrchid"
+                     "DarkOrchid1"
+                     "DarkOrchid2"
+                     "DarkOrchid3"
+                     "DarkOrchid4"
+                     "DarkSalmon"
+                     "DarkSeaGreen"
+                     "DarkSeaGreen1"
+                     "DarkSeaGreen2"
+                     "DarkSeaGreen3"
+                     "DarkSeaGreen4"
+                     "DarkSlateBlue"
+                     "DarkSlateGray"
+                     "DarkSlateGray1"
+                     "DarkSlateGray2"
+                     "DarkSlateGray3"
+                     "DarkSlateGray4"
+                     "DarkSlateGrey"
+                     "DarkTurquoise"
+                     "DarkViolet"
+                     "DeepPink"
+                     "DeepPink1"
+                     "DeepPink2"
+                     "DeepPink3"
+                     "DeepPink4"
+                     "DeepSkyBlue"
+                     "DeepSkyBlue1"
+                     "DeepSkyBlue2"
+                     "DeepSkyBlue3"
+                     "DeepSkyBlue4"
+                     "DimGray"
+                     "DimGrey"
+                     "DodgerBlue"
+                     "DodgerBlue1"
+                     "DodgerBlue2"
+                     "DodgerBlue3"
+                     "DodgerBlue4"
+                     "firebrick"
+                     "firebrick1"
+                     "firebrick2"
+                     "firebrick3"
+                     "firebrick4"
+                     "FloralWhite"
+                     "ForestGreen"
+                     "gainsboro"
+                     "GhostWhite"
+                     "gold"
+                     "gold1"
+                     "gold2"
+                     "gold3"
+                     "gold4"
+                     "Goldenrod"
+                     "goldenrod"
+                     "goldenrod1"
+                     "goldenrod2"
+                     "goldenrod3"
+                     "goldenrod4"
+                     "gray"
+                     "green"
+                     "green1"
+                     "green2"
+                     "green3"
+                     "green4"
+                     "GreenYellow"
+                     "grey"
+                     "honeydew"
+                     "honeydew1"
+                     "honeydew2"
+                     "honeydew3"
+                     "honeydew4"
+                     "HotPink"
+                     "HotPink1"
+                     "HotPink2"
+                     "HotPink3"
+                     "HotPink4"
+                     "IndianRed"
+                     "IndianRed1"
+                     "IndianRed2"
+                     "IndianRed3"
+                     "IndianRed4"
+                     "ivory"
+                     "ivory1"
+                     "ivory2"
+                     "ivory3"
+                     "ivory4"
+                     "khaki"
+                     "khaki1"
+                     "khaki2"
+                     "khaki3"
+                     "khaki4"
+                     "lavender"
+                     "LavenderBlush"
+                     "LavenderBlush1"
+                     "LavenderBlush2"
+                     "LavenderBlush3"
+                     "LavenderBlush4"
+                     "LawnGreen"
+                     "LemonChiffon"
+                     "LemonChiffon1"
+                     "LemonChiffon2"
+                     "LemonChiffon3"
+                     "LemonChiffon4"
+                     "LightBlue"
+                     "LightBlue1"
+                     "LightBlue2"
+                     "LightBlue3"
+                     "LightBlue4"
+                     "LightCoral"
+                     "LightCyan"
+                     "LightCyan1"
+                     "LightCyan2"
+                     "LightCyan3"
+                     "LightCyan4"
+                     "LightGoldenrod"
+                     "LightGoldenrod1"
+                     "LightGoldenrod2"
+                     "LightGoldenrod3"
+                     "LightGoldenrod4"
+                     "LightGoldenrodYellow"
+                     "LightGray"
+                     "LightGrey"
+                     "LightPink"
+                     "LightPink1"
+                     "LightPink2"
+                     "LightPink3"
+                     "LightPink4"
+                     "LightSalmon"
+                     "LightSalmon1"
+                     "LightSalmon2"
+                     "LightSalmon3"
+                     "LightSalmon4"
+                     "LightSeaGreen"
+                     "LightSkyBlue"
+                     "LightSkyBlue1"
+                     "LightSkyBlue2"
+                     "LightSkyBlue3"
+                     "LightSkyBlue4"
+                     "LightSlateBlue"
+                     "LightSlateGray"
+                     "LightSlateGrey"
+                     "LightSteelBlue"
+                     "LightSteelBlue1"
+                     "LightSteelBlue2"
+                     "LightSteelBlue3"
+                     "LightSteelBlue4"
+                     "LightYellow"
+                     "LightYellow1"
+                     "LightYellow2"
+                     "LightYellow3"
+                     "LightYellow4"
+                     "LimeGreen"
+                     "linen"
+                     "magenta"
+                     "magenta1"
+                     "magenta2"
+                     "magenta3"
+                     "magenta4"
+                     "maroon"
+                     "maroon1"
+                     "maroon2"
+                     "maroon3"
+                     "maroon4"
+                     "MediumAquamarine"
+                     "MediumBlue"
+                     "MediumOrchid"
+                     "MediumOrchid1"
+                     "MediumOrchid2"
+                     "MediumOrchid3"
+                     "MediumOrchid4"
+                     "MediumPurple"
+                     "MediumPurple1"
+                     "MediumPurple2"
+                     "MediumPurple3"
+                     "MediumPurple4"
+                     "MediumSeaGreen"
+                     "MediumSlateBlue"
+                     "MediumSpringGreen"
+                     "MediumTurquoise"
+                     "MediumVioletRed"
+                     "MidnightBlue"
+                     "MintCream"
+                     "MistyRose"
+                     "MistyRose1"
+                     "MistyRose2"
+                     "MistyRose3"
+                     "MistyRose4"
+                     "moccasin"
+                     "NavajoWhite"
+                     "NavajoWhite1"
+                     "NavajoWhite2"
+                     "NavajoWhite3"
+                     "NavajoWhite4"
+                     "navy"
+                     "NavyBlue"
+                     "OldLace"
+                     "OliveDrab"
+                     "OliveDrab1"
+                     "OliveDrab2"
+                     "OliveDrab3"
+                     "OliveDrab4"
+                     "orange"
+                     "orange1"
+                     "orange2"
+                     "orange3"
+                     "orange4"
+                     "OrangeRed"
+                     "OrangeRed1"
+                     "OrangeRed2"
+                     "OrangeRed3"
+                     "OrangeRed4"
+                     "orchid"
+                     "orchid1"
+                     "orchid2"
+                     "orchid3"
+                     "orchid4"
+                     "PaleGoldenrod"
+                     "PaleGreen"
+                     "PaleGreen1"
+                     "PaleGreen2"
+                     "PaleGreen3"
+                     "PaleGreen4"
+                     "PaleTurquoise"
+                     "PaleTurquoise1"
+                     "PaleTurquoise2"
+                     "PaleTurquoise3"
+                     "PaleTurquoise4"
+                     "PaleVioletRed"
+                     "PaleVioletRed1"
+                     "PaleVioletRed2"
+                     "PaleVioletRed3"
+                     "PaleVioletRed4"
+                     "PapayaWhip"
+                     "PeachPuff"
+                     "PeachPuff1"
+                     "PeachPuff2"
+                     "PeachPuff3"
+                     "PeachPuff4"
+                     "peru"
+                     "pink"
+                     "pink1"
+                     "pink2"
+                     "pink3"
+                     "pink4"
+                     "plum"
+                     "plum1"
+                     "plum2"
+                     "plum3"
+                     "plum4"
+                     "PowderBlue"
+                     "purple"
+                     "purple1"
+                     "purple2"
+                     "purple3"
+                     "purple4"
+                     "red"
+                     "red1"
+                     "red2"
+                     "red3"
+                     "red4"
+                     "RosyBrown"
+                     "RosyBrown1"
+                     "RosyBrown2"
+                     "RosyBrown3"
+                     "RosyBrown4"
+                     "RoyalBlue"
+                     "RoyalBlue1"
+                     "RoyalBlue2"
+                     "RoyalBlue3"
+                     "RoyalBlue4"
+                     "SaddleBrown"
+                     "salmon"
+                     "salmon1"
+                     "salmon2"
+                     "salmon3"
+                     "salmon4"
+                     "SandyBrown"
+                     "SeaGreen"
+                     "SeaGreen1"
+                     "SeaGreen2"
+                     "SeaGreen3"
+                     "SeaGreen4"
+                     "seashell"
+                     "seashell1"
+                     "seashell2"
+                     "seashell3"
+                     "seashell4"
+                     "sienna"
+                     "sienna1"
+                     "sienna2"
+                     "sienna3"
+                     "sienna4"
+                     "SkyBlue"
+                     "skyblue"
+                     "SkyBlue1"
+                     "SkyBlue2"
+                     "SkyBlue3"
+                     "SkyBlue4"
+                     "SlateBlue"
+                     "SlateBlue1"
+                     "SlateBlue2"
+                     "SlateBlue3"
+                     "SlateBlue4"
+                     "SlateGray"
+                     "SlateGray1"
+                     "SlateGray2"
+                     "SlateGray3"
+                     "SlateGray4"
+                     "SlateGrey"
+                     "snow"
+                     "snow1"
+                     "snow2"
+                     "snow3"
+                     "snow4"
+                     "SpringGreen"
+                     "SpringGreen1"
+                     "SpringGreen2"
+                     "SpringGreen3"
+                     "SpringGreen4"
+                     "SteelBlue"
+                     "SteelBlue1"
+                     "SteelBlue2"
+                     "SteelBlue3"
+                     "SteelBlue4"
+                     "tan"
+                     "tan1"
+                     "tan2"
+                     "tan3"
+                     "tan4"
+                     "thistle"
+                     "thistle1"
+                     "thistle2"
+                     "thistle3"
+                     "thistle4"
+                     "tomato"
+                     "tomato1"
+                     "tomato2"
+                     "tomato3"
+                     "tomato4"
+                     "turquoise"
+                     "turquoise1"
+                     "turquoise2"
+                     "turquoise3"
+                     "turquoise4"
+                     "violet"
+                     "VioletRed"
+                     "VioletRed1"
+                     "VioletRed2"
+                     "VioletRed3"
+                     "VioletRed4"
+                     "wheat"
+                     "wheat1"
+                     "wheat2"
+                     "wheat3"
+                     "wheat4"
+                     "white"
+                     "WhiteSmoke"
+                     "yellow"
+                     "yellow1"
+                     "yellow2"
+                     "yellow3"
+                     "yellow4"
+                     "YellowGreen")
+   "The full list of X colors from the `Emacs.clr' file.")
+ (defvar colors ns-colors "The full list of colors.")
+ 
+ (defun defined-colors (&optional frame)
+   "Return a list of colors supported for a particular frame.
+ The argument FRAME specifies which frame to try.
+ The value may be different for frames on different NS displays."
+   (or frame (setq frame (selected-frame)))
+   (let ((all-colors ns-colors)
+ 	(this-color nil)
+ 	(defined-colors nil))
+     (while all-colors
+       (setq this-color (car all-colors)
+ 	    all-colors (cdr all-colors))
+       (and (face-color-supported-p frame this-color t)
+ 	   (setq defined-colors (cons this-color defined-colors))))
+     defined-colors))
+ (defalias 'ns-defined-colors 'defined-colors)
+ 
+ (substitute-key-definition 'suspend-emacs 'iconify-frame global-map)
+ 
+ ;; These tell read-char how to convert
+ ;; these special chars to ASCII.
+ (put 'backspace 'ascii-character 127)
+ (put 'delete 'ascii-character 127)
+ (put 'tab 'ascii-character ?\t)
+ (put 'S-tab 'ascii-character (logior 16 ?\t))
+ (put 'linefeed 'ascii-character ?\n)
+ (put 'clear 'ascii-character 12)
+ (put 'return 'ascii-character 13)
+ (put 'escape 'ascii-character ?\e)
+ 
+ ;; Map certain keypad keys into ASCII characters
+ ;; that people usually expect.
+ (define-key function-key-map [backspace] [127])
+ (define-key function-key-map [delete] [127])
+ (define-key function-key-map [tab] [?\t])
+ (define-key function-key-map [S-tab] [25])
+ (define-key function-key-map [linefeed] [?\n])
+ (define-key function-key-map [clear] [11])
+ (define-key function-key-map [return] [13])
+ (define-key function-key-map [escape] [?\e])
+ (define-key function-key-map [M-backspace] [?\M-\d])
+ (define-key function-key-map [M-delete] [?\M-\d])
+ (define-key function-key-map [M-tab] [?\M-\t])
+ (define-key function-key-map [M-linefeed] [?\M-\n])
+ (define-key function-key-map [M-clear] [?\M-\013])
+ (define-key function-key-map [M-return] [?\M-\015])
+ (define-key function-key-map [M-escape] [?\M-\e])
+ 
+ ;; Nice setting for the cursor key + modifiers
+ (global-set-key [C-up] 'beginning-of-buffer)
+ (global-set-key [C-down] 'end-of-buffer)
+ (global-set-key [C-left] 'beginning-of-line)
+ (global-set-key [C-right] 'end-of-line)
+ (global-set-key [S-up] 'scroll-down)
+ (global-set-key [S-down] 'scroll-up)
+ (global-set-key [S-left] 'backward-word)
+ (global-set-key [S-right] 'forward-word)
+ 
+ ;; Mouse bindings for ml-drag
+ (global-set-key [mode-line down-mouse-1] 'mldrag-drag-mode-line)
+ (global-set-key [vertical-line down-mouse-1] 'mldrag-drag-vertical-line)
+ 
+ ;; Here are some NeXTSTEP like binding for command key sequences.
+ (define-key global-map [?\s-'] 'next-multiframe-window)
+ (define-key global-map [?\s--] 'center-line)
+ (define-key global-map [?\s-:] 'ispell)
+ (define-key global-map [?\s-;] 'ispell-next)
+ (define-key global-map [?\s-?] 'info)
+ (define-key global-map [?\s-^] 'kill-some-buffers)
+ (define-key global-map [?\s-&] 'kill-this-buffer)
+ (define-key global-map [?\s-C] 'ns-popup-color-panel)
+ (define-key global-map [?\s-D] 'dired)
+ (define-key global-map [?\s-E] 'edit-abbrevs)
+ (define-key global-map [?\s-L] 'shell-command)
+ (define-key global-map [?\s-M] 'manual-entry)
+ (define-key global-map [?\s-S] 'write-file)
+ (define-key global-map [?\s-a] 'mark-whole-buffer)
+ (define-key global-map [?\s-c] 'kill-ring-save)
+ (define-key global-map [?\s-d] 'isearch-repeat-backward)
+ (define-key global-map [?\s-e] 'isearch-yank-kill)
+ (define-key global-map [?\s-f] 'isearch-forward)
+ (define-key global-map [?\s-g] 'isearch-repeat-forward)
+ (define-key global-map [?\s-h] 'do-hide-emacs)
+ (define-key global-map [?\s-j] 'exchange-point-and-mark)
+ (define-key global-map [?\s-k] 'kill-this-buffer)
+ (define-key global-map [?\s-l] 'goto-line)
+ (define-key global-map [?\s-m] 'iconify-frame)
+ (define-key global-map [?\s-n] 'new-frame)
+ (define-key global-map [?\s-o] 'find-file-other-frame)
+ (define-key global-map [?\s-p] 'print-buffer)
+ (define-key global-map [?\s-q] 'save-buffers-kill-emacs)
+ (define-key global-map [?\s-s] 'save-buffer)
+ (define-key global-map [?\s-t] 'ns-popup-font-panel)
+ (define-key global-map [?\s-u] 'revert-buffer)
+ (define-key global-map [?\s-v] 'yank)
+ (define-key global-map [?\s-w] 'delete-frame)
+ (define-key global-map [?\s-x] 'kill-region)
+ (define-key global-map [?\s-z] 'undo)
+ (define-key global-map [?\s-|] 'shell-command-on-region)
+ (define-key global-map [s-kp-bar] 'shell-command-on-region)
+ 
+ (define-key global-map [kp-home] 'beginning-of-buffer)
+ (define-key global-map [kp-end] 'end-of-buffer)
+ (define-key global-map [kp-prior] 'scroll-down)
+ (define-key global-map [kp-next] 'scroll-up)
+ 
+ ;;; Allow shift-clicks to work just like under NS
+ (defun mouse-extend-region (event)
+   "Move point or mark so as to extend region.
+ This should be bound to a mouse click event type."
+   (interactive "e")
+   (mouse-minibuffer-check event)
+   (let ((posn (event-end event)))
+     (if (not (windowp (posn-window posn)))
+         (error "Cursor not in text area of window"))
+     (select-window (posn-window posn))
+     (cond
+      ((not (numberp (posn-point posn))))
+      ((or (not mark-active) (> (abs (- (posn-point posn) (point)))
+                                (abs (- (posn-point posn) (mark)))))
+       (let ((point-save (point)))
+         (unwind-protect
+             (progn
+               (goto-char (posn-point posn))
+               (push-mark nil t t)
+               (or transient-mark-mode
+                   (sit-for 1)))
+           (goto-char point-save))))
+      (t
+       (goto-char (posn-point posn))))))
+ 
+ (define-key global-map [S-mouse-1] 'mouse-extend-region)
+ 
+ (defun ns-insert-ascii ()
+   "Insert contents of ns-input-ascii."
+   (interactive)
+   (insert ns-input-ascii)
+   (setq ns-input-ascii nil))
+  
+ (defun ns-insert-file ()
+   "Insert contents of file ns-input-file like insert-file but with less prompting.
+ If file is a directory perform a find-file on it."
+   (interactive)
+   (let ((f))
+     (setq f (car ns-input-file))
+     (setq ns-input-file (cdr ns-input-file))
+     (if (file-directory-p f)
+         (find-file f)
+       (push-mark (+ (point) (car (cdr (insert-file-contents f))))))))
+ 
+ (defun ns-respond-to-change-font ()
+   "Respond to changeFont: event, expecting ns-input-font and\n\
+ ns-input-fontsize of new font."
+   (interactive)
+   (modify-frame-parameters (selected-frame)
+                            (list (cons 'font ns-input-font)
+                                  (cons 'fontsize ns-input-fontsize))))
+ 
+ (defun ns-face-at-pos (pos)
+   (let* ((frame (car pos))
+          (frame-pos (cdr pos))
+          (window (window-at (car frame-pos) (cdr frame-pos) frame))
+          (window-pos (coordinates-in-window-p frame-pos window))
+          (buffer (window-buffer window))
+          (edges (window-edges window)))
+     (cond
+      ((not window-pos)
+       nil)
+      ((eq window-pos 'mode-line)
+       'modeline)
+      ((eq window-pos 'vertical-line)
+       'default)
+      ((consp window-pos)
+       (save-excursion
+         (set-buffer buffer)
+         (let ((p (car (compute-motion (window-start window)
+                                       (cons (nth 0 edges) (nth 1 edges))
+                                       (window-end window)
+                                       frame-pos
+                                       (- (window-width window) 1)
+                                       nil
+                                       window))))
+           (cond
+            ((eq p (window-point window))
+             'cursor)
+            ((and mark-active (< (region-beginning) p) (< p (region-end)))
+             'region)
+            (t
+             (get-char-property p 'face window))))))
+      (t
+       nil))))
+ 
+ (defun ns-set-foreground-at-mouse ()
+   "Set the foreground color at the mouse location to ns-input-color."
+   (interactive)
+   (let* ((pos (mouse-position))
+          (frame (car pos))
+          (face (ns-face-at-pos pos)))
+     (cond
+      ((eq face 'cursor)
+       (modify-frame-parameters frame (list (cons 'cursor-color 
+                                                  ns-input-color))))
+      ((not face)
+       (modify-frame-parameters frame (list (cons 'foreground-color
+                                                  ns-input-color))))
+      (t
+       (set-face-foreground face ns-input-color frame)))))
+       
+ (defun ns-set-background-at-mouse ()
+   "Set the background color at the mouse location to ns-input-color."
+   (interactive)
+   (let* ((pos (mouse-position))
+          (frame (car pos))
+          (face (ns-face-at-pos pos)))
+     (cond
+      ((eq face 'cursor)
+       (modify-frame-parameters frame (list (cons 'cursor-color
+                                                  ns-input-color))))
+      ((not face)
+       (modify-frame-parameters frame (list (cons 'background-color
+                                                  ns-input-color))))
+      (t
+       (set-face-background face ns-input-color frame)))))
+ 
+ (defun ns-save-preferences ()
+   "Set all the defaults."
+   (interactive)
+   (set-resource nil "ShrinkSpace" (number-to-string ns-shrink-space))
+   (set-resource nil "CursorBlinkRate"
+                 (if ns-cursor-blink-rate
+                     (number-to-string ns-cursor-blink-rate)
+                   "NO"))
+   (set-resource nil "AlternateIsMeta" (cond
+                                        ((eq t ns-alternate-is-meta) "YES")
+                                        ((eq nil ns-alternate-is-meta) "NO")
+                                        ((eq 'left ns-alternate-is-meta) "LEFT")
+                                        ((eq 'right ns-alternate-is-meta) "RIGHT")
+                                        (t nil)))
+   (set-resource nil "ISOLatin" (if ns-iso-latin "YES" "NO"))
+   (set-resource nil "UseOpenPanel" (if ns-use-open-panel "YES" "NO"))
+   (let ((p (frame-parameters)))
+     (let ((f (assq 'font p)))
+       (if f (set-resource nil "Font" (cdr f))))
+     (let ((fs (assq 'fontsize p)))
+       (if fs (set-resource nil "FontSize" (number-to-string (cdr fs)))))
+     (let ((fgc (assq 'foreground-color p)))
+       (if fgc (set-resource nil "Foreground" (cdr fgc))))
+     (let ((bgc (assq 'background-color p)))
+       (if bgc (set-resource nil "Background" (cdr bgc))))
+     (let ((under (assq 'underline p)))
+       (if under (set-resource nil "Underline" (if (cdr under) "YES" "NO"))))
+     (let ((ibw (assq 'internal-border-width p)))
+       (if ibw (set-resource nil "InternalBorderWidth"
+                             (number-to-string (cdr ibw)))))
+     (let ((vsb (assq 'vertical-scroll-bars p)))
+       (if vsb (set-resource nil "VerticalScrollBars"
+                             (if (cdr vsb) "YES" "NO"))))
+     (let ((buf (assq 'buffered p)))
+       (if buf (set-resource nil "Buffered"
+                             (if (cdr buf) "YES" "NO"))))
+     (let ((ar (assq 'auto-raise p)))
+       (if ar (set-resource nil "AutoRaise"
+                             (if (cdr ar) "YES" "NO"))))
+     (let ((mbl (assq 'menu-bar-lines p)))
+       (if mbl (set-resource nil "Menus"
+                             (if (cdr mbl) "YES" "NO"))))
+     (let ((al (assq 'auto-lower p)))
+       (if al (set-resource nil "AutoLower"
+                             (if (cdr al) "YES" "NO"))))
+     (let ((height (assq 'height p)))
+       (if height (set-resource nil "Height"
+                                (number-to-string (cdr height)))))
+     (let ((width (assq 'width p)))
+       (if width (set-resource nil "Width"
+                               (number-to-string (cdr width)))))
+     (let ((top (assq 'top p)))
+       (if top (set-resource nil "Top"
+                             (number-to-string (cdr top)))))
+     (let ((left (assq 'left p)))
+       (if left (set-resource nil "Left"
+                              (number-to-string (cdr left)))))
+     (let ((it (assq 'icon-type p)))
+       (if it (set-resource nil "IconType"
+                   (if (symbolp (cdr it)) (symbol-name (cdr it)) (cdr it)))))
+     (let ((ct (assq 'cursor-type p)))
+       (if ct (set-resource nil "CursorType"
+                   (if (symbolp (cdr ct)) (symbol-name (cdr ct)) (cdr ct)))))    
+     (let ((cc (assq 'cursor-color p)))
+       (if cc (set-resource nil "CursorColor" (cdr cc)))))
+   (let ((fl (face-list)))
+     (while (consp fl)
+       (let* ((name (capitalize (symbol-name (car fl))))
+              (font (face-font (car fl)))
+              (fontsize (face-fontsize (car fl)))
+              (foreground (face-foreground (car fl)))
+              (background (face-background (car fl)))
+              (underline (face-underline-p (car fl))))
+         (set-resource nil (concat name "Font")
+                       (if font font nil))
+         (set-resource nil (concat name "FontSize")
+                       (if fontsize (number-to-string fontsize) nil))
+         (set-resource nil (concat name "Foreground")
+                       (if foreground foreground nil))
+         (set-resource nil (concat name "Background")
+                       (if background background nil))
+         (set-resource nil (concat name "Underline")
+                       (if underline "YES" nil)))
+       (setq fl (cdr fl)))))
+   
+ (defun ns-find-file ()
+   "Do a find-file with the ns-input-file as argument."
+   (interactive)
+   (let ((f) (file) (bufwin1) (bufwin2))
+     (setq f (file-truename (car ns-input-file)))
+     (setq ns-input-file (cdr ns-input-file))
+     (setq file (find-file-noselect f))
+     (setq bufwin1 (get-buffer-window file 'visible))
+     (setq bufwin2 (get-buffer-window "*scratch*" 'visibile))
+     (cond
+      (bufwin1
+       (select-frame (window-frame bufwin1))
+       (raise-frame (window-frame bufwin1))
+       (select-window bufwin1))
+      ((and (eq ns-pop-up-frames 'fresh) bufwin2)
+       (ns-hide-emacs 'activate)
+       (select-frame (window-frame bufwin2))
+       (raise-frame (window-frame bufwin2))
+       (select-window bufwin2)
+       (find-file f))
+      (ns-pop-up-frames
+       (ns-hide-emacs 'activate)
+       (let ((pop-up-frames t)) (pop-to-buffer file nil)))
+      (t
+       (ns-hide-emacs 'activate)
+       (find-file f)))))
+ 
+ 
+ (defvar ns-select-overlay nil
+   "Overlay used to highlight areas in files requested by NS apps.")
+ (make-variable-buffer-local 'ns-select-overlay)
+ 
+ (defun ns-open-file-select-line ()
+   "Brings up a buffer containing file ns-input-file,\n\
+ and highlights lines indicated by ns-input-line."
+   (interactive)
+   (ns-find-file)
+   (cond
+    ((and ns-input-line (buffer-modified-p))
+     (if ns-select-overlay
+         (setq ns-select-overlay (delete-overlay ns-select-overlay)))
+     (deactivate-mark)
+     (goto-line (if (consp ns-input-line)
+                    (min (car ns-input-line) (cdr ns-input-line))
+                  ns-input-line)))
+    (ns-input-line
+     (if (not ns-select-overlay)
+         (overlay-put (setq ns-select-overlay (make-overlay (point-min) (point-min)))
+                      'face 'highlight))
+     (let ((beg (save-excursion
+                  (goto-line (if (consp ns-input-line)
+                                 (min (car ns-input-line) (cdr ns-input-line))
+                               ns-input-line))
+                  (point)))
+           (end (save-excursion
+                  (goto-line (+ 1 (if (consp ns-input-line)
+                                      (max (car ns-input-line) (cdr ns-input-line))
+                                    ns-input-line)))
+                  (point))))
+       (move-overlay ns-select-overlay beg end)
+       (deactivate-mark)
+       (goto-char beg)))
+    (t
+     (if ns-select-overlay
+         (setq ns-select-overlay (delete-overlay ns-select-overlay))))))
+ 
+ (defun ns-unselect-line ()
+   "Removes any NS highlight a buffer may contain."
+   (if ns-select-overlay
+       (setq ns-select-overlay (delete-overlay ns-select-overlay))))
+ 
+ (add-hook 'first-change-hook 'ns-unselect-line)
+ 
+ 
+ 
+ ;; Special NeXTSTEP generated events are converted to function keys.  Here
+ ;; are the bindings for them.
+ (define-key global-map [ns-power-off]
+   '(lambda () (interactive) (save-buffers-kill-emacs t)))
+ (define-key global-map [ns-open-file] 'ns-find-file)
+ (define-key global-map [ns-open-temp-file] [ns-open-file])
+ (define-key global-map [ns-drag-file] 'ns-insert-file)
+ (define-key global-map [ns-drag-color] 'ns-set-foreground-at-mouse)
+ (define-key global-map [ns-drag-ascii] 'ns-insert-ascii)
+ (define-key global-map [S-ns-drag-color] 'ns-set-background-at-mouse)
+ (define-key global-map [ns-change-font] 'ns-respond-to-change-font)
+ (define-key global-map [ns-open-file-line] 'ns-open-file-select-line)
+ 
+ (setq system-key-alist
+       (list
+        (cons (logior (lsh 0 16)   1) 'ns-power-off)
+        (cons (logior (lsh 0 16)   2) 'ns-open-file)
+        (cons (logior (lsh 0 16)   3) 'ns-open-temp-file)
+        (cons (logior (lsh 0 16)   4) 'ns-drag-file)
+        (cons (logior (lsh 0 16)   5) 'ns-drag-color)
+        (cons (logior (lsh 0 16)   6) 'ns-drag-ascii)
+        (cons (logior (lsh 0 16)   7) 'ns-change-font)
+        (cons (logior (lsh 0 16)   8) 'ns-open-file-line)
+        (cons (logior (lsh 0 16)   9) 'ns-change-gdb)
+        (cons (logior (lsh 1 16)  32) 'f1)
+        (cons (logior (lsh 1 16)  33) 'f2)
+        (cons (logior (lsh 1 16)  34) 'f3)
+        (cons (logior (lsh 1 16)  35) 'f4)
+        (cons (logior (lsh 1 16)  36) 'f5)
+        (cons (logior (lsh 1 16)  37) 'f6)
+        (cons (logior (lsh 1 16)  38) 'f7)
+        (cons (logior (lsh 1 16)  39) 'f8)
+        (cons (logior (lsh 1 16)  40) 'f9)
+        (cons (logior (lsh 1 16)  41) 'f10)
+        (cons (logior (lsh 1 16)  42) 'f11)
+        (cons (logior (lsh 1 16)  43) 'f12)
+        (cons (logior (lsh 1 16)  44) 'kp-insert)
+        (cons (logior (lsh 1 16)  45) 'kp-delete)
+        (cons (logior (lsh 1 16)  46) 'kp-home)
+        (cons (logior (lsh 1 16)  47) 'kp-end)
+        (cons (logior (lsh 1 16)  48) 'kp-prior)
+        (cons (logior (lsh 1 16)  49) 'kp-next)
+        (cons (logior (lsh 1 16)  50) 'print-screen)
+        (cons (logior (lsh 1 16)  51) 'scroll-lock)
+        (cons (logior (lsh 1 16)  52) 'pause)
+        (cons (logior (lsh 1 16)  53) 'system)
+        (cons (logior (lsh 1 16)  54) 'break)
+        (cons (logior (lsh 1 16)  56) 'please-tell-carl-what-this-key-is-called-56)
+        (cons (logior (lsh 1 16)  61) 'please-tell-carl-what-this-key-is-called-61)
+        (cons (logior (lsh 1 16)  62) 'please-tell-carl-what-this-key-is-called-62)
+        (cons (logior (lsh 1 16)  63) 'please-tell-carl-what-this-key-is-called-63)
+        (cons (logior (lsh 1 16)  64) 'please-tell-carl-what-this-key-is-called-64)
+        (cons (logior (lsh 1 16)  69) 'please-tell-carl-what-this-key-is-called-69)
+        (cons (logior (lsh 1 16)  70) 'please-tell-carl-what-this-key-is-called-70)
+        (cons (logior (lsh 1 16)  71) 'please-tell-carl-what-this-key-is-called-71)
+        (cons (logior (lsh 1 16)  72) 'please-tell-carl-what-this-key-is-called-72)
+        (cons (logior (lsh 1 16)  73) 'please-tell-carl-what-this-key-is-called-73)
+        (cons (logior (lsh 2 16)   3) 'kp-enter)
+        (cons (logior (lsh 2 16)   9) 'kp-tab)
+        (cons (logior (lsh 2 16)  28) 'kp-quit)
+        (cons (logior (lsh 2 16)  35) 'kp-hash)
+        (cons (logior (lsh 2 16)  42) 'kp-multiply)
+        (cons (logior (lsh 2 16)  43) 'kp-add)
+        (cons (logior (lsh 2 16)  44) 'kp-separator)
+        (cons (logior (lsh 2 16)  45) 'kp-subtract)
+        (cons (logior (lsh 2 16)  46) 'kp-decimal)
+        (cons (logior (lsh 2 16)  47) 'kp-divide)
+        (cons (logior (lsh 2 16)  48) 'kp-0)
+        (cons (logior (lsh 2 16)  49) 'kp-1)
+        (cons (logior (lsh 2 16)  50) 'kp-2)
+        (cons (logior (lsh 2 16)  51) 'kp-3)
+        (cons (logior (lsh 2 16)  52) 'kp-4)
+        (cons (logior (lsh 2 16)  53) 'kp-5)
+        (cons (logior (lsh 2 16)  54) 'kp-6)
+        (cons (logior (lsh 2 16)  55) 'kp-7)
+        (cons (logior (lsh 2 16)  56) 'kp-8)
+        (cons (logior (lsh 2 16)  57) 'kp-9)
+        (cons (logior (lsh 2 16)  60) 'kp-less)
+        (cons (logior (lsh 2 16)  61) 'kp-equal)
+        (cons (logior (lsh 2 16)  62) 'kp-more)
+        (cons (logior (lsh 2 16)  64) 'kp-at)
+        (cons (logior (lsh 2 16)  92) 'kp-backslash)
+        (cons (logior (lsh 2 16)  96) 'kp-backtick)
+        (cons (logior (lsh 2 16) 124) 'kp-bar)
+        (cons (logior (lsh 2 16) 126) 'kp-tilde)
+        (cons (logior (lsh 2 16) 157) 'kp-mu)
+        (cons (logior (lsh 2 16) 165) 'kp-yen)
+        (cons (logior (lsh 2 16) 167) 'kp-paragraph)
+        (cons (logior (lsh 2 16) 172) 'left)
+        (cons (logior (lsh 2 16) 173) 'up)
+        (cons (logior (lsh 2 16) 174) 'right)
+        (cons (logior (lsh 2 16) 175) 'down)
+        (cons (logior (lsh 2 16) 176) 'kp-ring)
+        (cons (logior (lsh 2 16) 201) 'kp-square)
+        (cons (logior (lsh 2 16) 204) 'kp-cube)
+        (cons (logior (lsh 3 16)   8) 'backspace)
+        (cons (logior (lsh 3 16)   9) 'tab)
+        (cons (logior (lsh 3 16)  10) 'linefeed)
+        (cons (logior (lsh 3 16)  11) 'clear)
+        (cons (logior (lsh 3 16)  13) 'return)
+        (cons (logior (lsh 3 16)  18) 'pause)
+        (cons (logior (lsh 3 16)  25) 'S-tab)
+        (cons (logior (lsh 3 16)  27) 'escape)
+        (cons (logior (lsh 3 16) 127) 'delete)
+        ))
+ 
+ 
+ (defun undefine-key (keymap key)
+   (if (lookup-key keymap key t)
+       (define-key keymap key 'undefined)))
+ 
+ ;;; Do the actual NS Windows setup here; the above code just defines
+ ;;; functions and variables that we use now.
+ 
+ (setq command-line-args (ns-handle-args command-line-args))
+ 
+ (ns-open-connection nil)
+ 
+ (if (string-match "NeXT Mach \\([4-9]\\.[0-9]\\|3\\.[2-9]\\)" (ns-server-version))
+     (let ((services (ns-list-services)))
+       (while services
+         (if (eq (caar services) 'undefined)
+             (ns-define-service (cdar services))
+           (define-key global-map (vector (caar services))
+             (ns-define-service (cdar services))))
+         (setq services (cdr services)))))
+ 
+ (let ((keys (ns-list-command-keys)))
+   (while keys
+     (define-key global-map (vector (caar keys))
+       (lookup-key global-map (vconcat '[menu-bar] (cdar keys))))
+     (setq keys (cdr keys))))
+ 
+ (ns-reset-menu)
+ 
+ (if (and (eq (get-lisp-resource nil "NXAutoLaunch") t)
+          (eq (get-lisp-resource nil "HideOnAutoLaunch") t))
+      (add-hook 'after-init-hook 'do-hide-emacs))
+ 
+ (setq frame-creation-function 'create-frame-with-faces)
+ 
+ (if (eq (get-lisp-resource nil "Reverse") t)
+     (setq default-frame-alist (cons '(reverse . t) default-frame-alist)))
+ 
+ (menu-bar-mode (if (get-lisp-resource nil "Menus") 1 -1))
+ 
+ 
+ (defconst ns-version "4.2beta1")
+ ;; remember to change version number in man/ns-emacs.texi
+ (defun ns-submit-bug-report ()
+    "Submit via mail a bug report on emacs 19 for NS."
+    (interactive)
+    (let ((frame-parameters (frame-parameters))
+          (server-vendor (ns-server-vendor))
+          (server-version (ns-server-version)))
+      (reporter-submit-bug-report
+       "Christian Limpach <chris@nice.ch>"
+       ;;"Carl Edman <cedman@princeton.edu>"
+       (concat "Emacs for NS " ns-version)
+       '(ns-use-open-panel ns-iso-latin ns-shrink-space
+         ns-cursor-blink-rate ns-alternate-is-meta data-directory
+         frame-parameters window-system window-system-version server-vendor
+         server-version system-configuration-options))))
+ 
+ (add-hook 'before-make-frame-hook
+           '(lambda ()
+              (let ((left (cdr (assq 'left (frame-parameters))))
+                    (top (cdr (assq 'top (frame-parameters)))))
+                (cond
+                 ((or (assq 'top parameters) (assq 'left parameters)))
+                 ((or (not left) (not top)))
+                 (t
+                  (setq parameters (cons (cons 'left (+ left 25))
+                                         (cons (cons 'top (+ top 25))
+                                               parameters))))))))
+ 
+ 
+ (cond
+  (ns-iso-latin
+   (require 'iso-syntax)
+   (standard-display-8bit 160 255))
+  (t
+   (require 'ns-syntax)
+   (let ((l 128))
+     (while (< l 160)
+       (define-key global-map (vector l) 'self-insert-command)
+       (setq l (+ l 1))))
+   (standard-display-8bit 128 255)))
+ 
+ 
+ (defun ns-win-suspend-error ()
+   (error "Suspending an emacs running under NS makes no sense"))
+ (add-hook 'suspend-hook 'ns-win-suspend-error)
+ 
+ ;(require 'select)
+ ;(setq interprogram-cut-function 'select-text
+ ;      interprogram-paste-function 'cut-buffer-or-selection-value)
+ 
+ ;;;; Pasteboard support
+ (defun ns-get-pasteboard ()
+   "Returns the value of the pasteboard."
+   (ns-get-cut-buffer-internal 'PRIMARY))
+ 
+ (defun ns-set-pasteboard (string)
+   "Store STRING into the NS server's pasteboard."
+   ;; Check the data type of STRING.
+   (substring string 0 0)
+   (ns-store-cut-buffer-internal 'PRIMARY string))
+ 
+ ;;; We keep track of the last text selected here, so we can check the
+ ;;; current selection against it, and avoid passing back our own text
+ ;;; from ns-pasteboard-value.
+ (defvar ns-last-selected-text nil)
+ 
+ ;;; Put TEXT, a string, on the pasteboard.
+ (defun ns-select-text (text &optional push)
+   ;; Don't send the pasteboard too much text.
+   ;; It becomes slow, and if really big it causes errors.
+   (ns-set-pasteboard text)
+   (setq ns-last-selected-text text))
+ 
+ ;;; Return the value of the current NS selection.  For compatibility
+ ;;; with older NS applications, this checks cut buffer 0 before
+ ;;; retrieving the value of the primary selection.
+ (defun ns-pasteboard-value ()
+   (let (text)
+     
+     ;; Consult the selection, then the cut buffer.  Treat empty strings
+     ;; as if they were unset.
+     (or text (setq text (ns-get-pasteboard)))
+     (if (string= text "") (setq text nil))
+     
+     (cond
+      ((not text) nil)
+      ((eq text ns-last-selected-text) nil)
+      ((string= text ns-last-selected-text)
+       ;; Record the newer string, so subsequent calls can use the `eq' test.
+       (setq ns-last-selected-text text)
+       nil)
+      (t
+       (setq ns-last-selected-text text)))))
+ 
+ (setq interprogram-cut-function 'ns-select-text
+       interprogram-paste-function 'ns-pasteboard-value)
+ 
+ (setq transient-mark-mode t
+       highlight-nonselected-windows nil
+       delete-selection-mode t
+       search-highlight t
+       split-window-keep-point t
+       mouse-copy-selection nil
+       query-replace-highlight t)
+ ;;; ns-win.el ends here
+ 
Index: emacs/lisp/term/sun-curs.el
diff -c emacs/lisp/term/sun-curs.el:1.1.1.1 emacs/lisp/term/sun-curs.el:1.2
*** emacs/lisp/term/sun-curs.el:1.1.1.1	Fri Jul 19 01:51:56 1996
--- emacs/lisp/term/sun-curs.el	Fri Jul 19 05:04:24 1996
***************
*** 30,40 ****
  ;;; 9-dec-86 Jeff Peck, Sun Microsystems Inc. <peck@sun.com>
  
  (require 'cl)
  
  (defvar sc::cursors nil "List of known cursors")
  
  (defmacro defcursor (name x y string)
!   (if (not (memq name sc::cursors)) 
        (setq sc::cursors (cons name sc::cursors)))
    (list 'defconst name (list 'vector x y string)))
  
--- 30,41 ----
  ;;; 9-dec-86 Jeff Peck, Sun Microsystems Inc. <peck@sun.com>
  
  (require 'cl)
+ (require 'sun-mouse "term/sun-mouse")
  
  (defvar sc::cursors nil "List of known cursors")
  
  (defmacro defcursor (name x y string)
!   (if (and (boundp 'sc::cursors) (not (memq name sc::cursors)))
        (setq sc::cursors (cons name sc::cursors)))
    (list 'defconst name (list 'vector x y string)))
  
Index: emacs/lisp/term/sun-fns.el
diff -c emacs/lisp/term/sun-fns.el:1.1.1.1 emacs/lisp/term/sun-fns.el:1.2
*** emacs/lisp/term/sun-fns.el:1.1.1.1	Fri Jul 19 01:51:56 1996
--- emacs/lisp/term/sun-fns.el	Fri Jul 19 05:04:26 1996
***************
*** 55,61 ****
  
  ;;; Code:
  
! (require 'sun-mouse)
  
  (defconst cursor-pause-milliseconds 300
    "*Number of milliseconds to display alternate cursor (usually the mark)")
--- 55,61 ----
  
  ;;; Code:
  
! (require 'sun-mouse "term/sun-mouse")
  
  (defconst cursor-pause-milliseconds 300
    "*Number of milliseconds to display alternate cursor (usually the mark)")
Index: emacs/lisp/term/x-win.el
diff -c emacs/lisp/term/x-win.el:1.1.1.2 emacs/lisp/term/x-win.el:1.3
*** emacs/lisp/term/x-win.el:1.1.1.2	Mon Jul 22 01:39:34 1996
--- emacs/lisp/term/x-win.el	Wed Jul 31 01:36:33 1996
***************
*** 487,494 ****
  		   "green yellow"
  		   "GreenYellow")
    "The full list of X colors from the `rgb.text' file.")
  
! (defun x-defined-colors (&optional frame)
    "Return a list of colors supported for a particular frame.
  The argument FRAME specifies which frame to try.
  The value may be different for frames on different X displays."
--- 487,495 ----
  		   "green yellow"
  		   "GreenYellow")
    "The full list of X colors from the `rgb.text' file.")
+ (defvar colors x-colors "The full list of colors.")
  
! (defun defined-colors (&optional frame)
    "Return a list of colors supported for a particular frame.
  The argument FRAME specifies which frame to try.
  The value may be different for frames on different X displays."
***************
*** 502,507 ****
--- 503,509 ----
        (and (face-color-supported-p frame this-color t)
  	   (setq defined-colors (cons this-color defined-colors))))
      defined-colors))
+ (defalias 'x-defined-colors 'defined-colors)
  
  ;;;; Function keys
  
***************
*** 606,674 ****
  	 '((65280 . remove)))))
  
  
- ;;;; Selections and cut buffers
- 
- ;;; We keep track of the last text selected here, so we can check the
- ;;; current selection against it, and avoid passing back our own text
- ;;; from x-cut-buffer-or-selection-value.
- (defvar x-last-selected-text nil)
- 
- ;;; It is said that overlarge strings are slow to put into the cut buffer.
- ;;; Note this value is overridden below.
- (defvar x-cut-buffer-max 20000
-   "Max number of characters to put in the cut buffer.")
- 
- (defvar x-select-enable-clipboard nil
-   "Non-nil means cutting and pasting uses the clipboard.
- This is in addition to the primary selection.")
- 
- ;;; Make TEXT, a string, the primary X selection.
- ;;; Also, set the value of X cut buffer 0, for backward compatibility
- ;;; with older X applications.
- ;;; gildea@lcs.mit.edu says it's not desirable to put kills
- ;;; in the clipboard.
- (defun x-select-text (text &optional push)
-   ;; Don't send the cut buffer too much text.
-   ;; It becomes slow, and if really big it causes errors.
-   (if (< (length text) x-cut-buffer-max)
-       (x-set-cut-buffer text push)
-     (x-set-cut-buffer "" push))
-   (x-set-selection 'PRIMARY text)
-   (if x-select-enable-clipboard
-       (x-set-selection 'CLIPBOARD text))
-   (setq x-last-selected-text text))
- 
- ;;; Return the value of the current X selection.
- ;;; Consult the selection, then the cut buffer.  Treat empty strings
- ;;; as if they were unset.
- (defun x-cut-buffer-or-selection-value ()
-   (let (text)
- 
-     ;; Don't die if x-get-selection signals an error.
-     (condition-case c
- 	(setq text (x-get-selection 'PRIMARY))
-       (error (message "%s" c)))
-     (if (string= text "") (setq text nil))
- 
-     (if x-select-enable-clipboard
- 	(condition-case c
- 	    (setq text (x-get-selection 'CLIPBOARD))
- 	  (error (message "%s" c))))
-     (if (string= text "") (setq text nil))
-     (or text (setq text (x-get-cut-buffer 0)))
-     (if (string= text "") (setq text nil))
- 
-     (cond
-      ((not text) nil)
-      ((eq text x-last-selected-text) nil)
-      ((string= text x-last-selected-text)
-       ;; Record the newer string, so subsequent calls can use the `eq' test.
-       (setq x-last-selected-text text)
-       nil)
-      (t
-       (setq x-last-selected-text text)))))
- 
- 
  ;;; Do the actual X Windows setup here; the above code just defines
  ;;; functions and variables that we use now.
  
--- 608,613 ----
***************
*** 697,706 ****
  			 (setq x-display-name (getenv "DISPLAY")))
  		     x-command-line-resources))
  
! (setq frame-creation-function 'x-create-frame-with-faces)
! 
! (setq x-cut-buffer-max (min (- (/ (x-server-max-request-size) 2) 100)
! 			    x-cut-buffer-max))
  
  ;; Sun expects the menu bar cut and paste commands to use the clipboard.
  ;; This has ,? to match both on Sunos and on Solaris.
--- 636,642 ----
  			 (setq x-display-name (getenv "DISPLAY")))
  		     x-command-line-resources))
  
! (setq frame-creation-function 'create-frame-with-faces)
  
  ;; Sun expects the menu bar cut and paste commands to use the clipboard.
  ;; This has ,? to match both on Sunos and on Solaris.
***************
*** 753,760 ****
  (add-hook 'suspend-hook 'x-win-suspend-error)
  
  ;;; Arrange for the kill and yank functions to set and check the clipboard.
! (setq interprogram-cut-function 'x-select-text)
! (setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
  
  ;;; Turn off window-splitting optimization; X is usually fast enough
  ;;; that this is only annoying.
--- 689,698 ----
  (add-hook 'suspend-hook 'x-win-suspend-error)
  
  ;;; Arrange for the kill and yank functions to set and check the clipboard.
! (let ((m (server-max-request-size)))
!   (if m (setq cut-buffer-max (min (- (/ m 2) 100)))))
! (setq interprogram-cut-function 'select-text)
! (setq interprogram-paste-function 'cut-buffer-or-selection-value)
  
  ;;; Turn off window-splitting optimization; X is usually fast enough
  ;;; that this is only annoying.
Index: emacs/man/Makefile.in
diff -c emacs/man/Makefile.in:1.1.1.1 emacs/man/Makefile.in:1.4
*** emacs/man/Makefile.in:1.1.1.1	Mon Jul 22 01:54:55 1996
--- emacs/man/Makefile.in	Thu Aug  1 02:29:53 1996
***************
*** 9,30 ****
  # Tell make where to find source files; this is needed for the makefiles.
  VPATH=@srcdir@
  
  
  # The makeinfo program is part of the Texinfo distribution.
! MAKEINFO = makeinfo
! INFO_TARGETS = ../info/emacs ../info/cl ../info/dired-x ../info/forms \
! 	       ../info/gnus ../info/info \
! 	       ../info/mh-e ../info/sc ../info/vip ../info/viper
! DVI_TARGETS = emacs.dvi cl.dvi dired-x.dvi forms.dvi gnus.dvi \
! 		 mh-e.dvi sc.dvi vip.dvi viper.dvi
  INFOSOURCES = info.texi info-stnd.texi
  
  # The following rule does not work with all versions of `make'.
  .SUFFIXES: .texi .dvi
  .texi.dvi:
! 	texi2dvi $<
! 
! TEXI2DVI = texi2dvi
  
  EMACSSOURCES= \
  	${srcdir}/emacs.texi \
--- 9,41 ----
  # Tell make where to find source files; this is needed for the makefiles.
  VPATH=@srcdir@
  
+ # Redefine `TEX' if `tex' does not invoke plain TeX. For example:
+ # TEX=platex
+ TEX=tex
+ 
+ # Uncomment this line for permuted index.
+ permuted_index = 1 
  
  # The makeinfo program is part of the Texinfo distribution.
! # The makeinfo program is also included in Emacs for NeXTstep
! MAKEINFO = ../lib-src/makeinfo
! TEXINDEX = ../lib-src/texindex
! PERMUTEINDEX = ../lib-src/permute-index
! TEXI2DVI = ../lib-src/texi2dvi
! INFO_TARGETS = ../info/emacs.info ../info/cl.info ../info/dired-x.info \
! 	       ../info/forms.info ../info/gnus.info ../info/info.info \
! 	       ../info/mh-e.info ../info/sc.info ../info/vip.info \
! 	       ../info/viper.info ../info/ediff.info ../info/elisp.info \
! 	       ../info/ns-emacs.info ../info/makeinfo.info
! DVI_TARGETS = emacs.dvi cl.dvi dired-x.dvi forms.dvi gnus.dvi mh-e.dvi \
! 	      sc.dvi vip.dvi viper.dvi ediff.dvi elisp.dvi ns-emacs.dvi \
! 	      makeinfo.dvi
  INFOSOURCES = info.texi info-stnd.texi
  
  # The following rule does not work with all versions of `make'.
  .SUFFIXES: .texi .dvi
  .texi.dvi:
! 	$(TEXI2DVI) $<
  
  EMACSSOURCES= \
  	${srcdir}/emacs.texi \
***************
*** 65,129 ****
  	${srcdir}/gnu1.texi \
  	${srcdir}/glossary.texi
  
  info: $(INFO_TARGETS)
  
  dvi: $(DVI_TARGETS)
  
! ../info/info: ${INFOSOURCES}
! 	$(MAKEINFO) --no-split info.texi
  
  info.dvi: ${INFOSOURCES}
  	$(TEXI2DVI) ${srcdir}/info.texi
  
! ../info/emacs: ${EMACSSOURCES}
! 	$(MAKEINFO) emacs.texi
  
  emacs.dvi: ${EMACSSOURCES}
  	$(TEXI2DVI) ${srcdir}/emacs.texi
  
! ../info/cl: cl.texi
! 	$(MAKEINFO) cl.texi
  cl.dvi: cl.texi
  	$(TEXI2DVI) ${srcdir}/cl.texi
  
! ../info/dired-x: dired-x.texi
! 	$(MAKEINFO) dired-x.texi
  dired-x.dvi: dired-x.texi
  	$(TEXI2DVI) ${srcdir}/dired-x.texi
  
! ../info/forms: forms.texi
! 	$(MAKEINFO) forms.texi
  forms.dvi: forms.texi
  	$(TEXI2DVI) ${srcdir}/forms.texi
  
! ../info/mh-e: mh-e.texi
! 	$(MAKEINFO) mh-e.texi
  mh-e.dvi: mh-e.texi
  	$(TEXI2DVI) ${srcdir}/mh-e.texi
  
! ../info/sc: sc.texi
! 	$(MAKEINFO) sc.texi
  sc.dvi: sc.texi
  	$(TEXI2DVI) ${srcdir}/sc.texi
  
! ../info/vip: vip.texi
! 	$(MAKEINFO) vip.texi
  vip.dvi: vip.texi
  	$(TEXI2DVI) ${srcdir}/vip.texi
  
! ../info/gnus: gnus.texi
! 	$(MAKEINFO) gnus.texi
  gnus.dvi: gnus.texi
  	$(TEXI2DVI) ${srcdir}/gnus.texi
  
  ../etc/GNU: gnu1.texi gnu.texi
! 	makeinfo --no-headers -o ../etc/GNU gnu1.texi
  
! ../info/viper: viper.texi viper-cmd.texi
! 	$(MAKEINFO) viper.texi
  viper.dvi: viper.texi viper-cmd.texi
  	$(TEXI2DVI) ${srcdir}/viper.texi
  
  mostlyclean:
  	rm -f *.log *.cp *.fn *.ky *.pg *.vr core
  
--- 76,219 ----
  	${srcdir}/gnu1.texi \
  	${srcdir}/glossary.texi
  
+ ELISPSOURCES= \
+ 	${srcdir}/elisp.texi \
+ 	${srcdir}/elisp-back.texi \
+ 	${srcdir}/elisp-abbrevs.texi \
+ 	${srcdir}/elisp-anti.texi \
+ 	${srcdir}/elisp-backups.texi \
+ 	${srcdir}/elisp-locals.texi \
+ 	${srcdir}/elisp-buffers.texi \
+ 	${srcdir}/elisp-calendar.texi \
+ 	${srcdir}/elisp-commands.texi \
+ 	${srcdir}/elisp-compile.texi \
+ 	${srcdir}/elisp-control.texi \
+ 	${srcdir}/elisp-debugging.texi \
+ 	${srcdir}/elisp-display.texi \
+ 	${srcdir}/elisp-errors.texi \
+ 	${srcdir}/elisp-eval.texi \
+ 	${srcdir}/elisp-files.texi \
+ 	${srcdir}/elisp-frames.texi \
+ 	${srcdir}/elisp-functions.texi \
+ 	${srcdir}/elisp-help.texi \
+ 	${srcdir}/elisp-hooks.texi \
+ 	${srcdir}/elisp-internals.texi \
+ 	${srcdir}/elisp-intro.texi \
+ 	${srcdir}/elisp-keymaps.texi \
+ 	${srcdir}/elisp-lists.texi \
+ 	${srcdir}/elisp-loading.texi \
+ 	${srcdir}/elisp-macros.texi \
+ 	${srcdir}/elisp-maps.texi \
+ 	${srcdir}/elisp-markers.texi \
+ 	${srcdir}/elisp-minibuf.texi \
+ 	${srcdir}/elisp-modes.texi \
+ 	${srcdir}/elisp-numbers.texi \
+ 	${srcdir}/elisp-objects.texi \
+ 	${srcdir}/elisp-os.texi \
+ 	${srcdir}/elisp-positions.texi \
+ 	${srcdir}/elisp-processes.texi \
+ 	${srcdir}/elisp-searching.texi \
+ 	${srcdir}/elisp-sequences.texi \
+ 	${srcdir}/elisp-streams.texi \
+ 	${srcdir}/elisp-strings.texi \
+ 	${srcdir}/elisp-symbols.texi \
+ 	${srcdir}/elisp-syntax.texi \
+ 	${srcdir}/elisp-text.texi \
+ 	${srcdir}/elisp-tips.texi \
+ 	${srcdir}/elisp-variables.texi \
+ 	${srcdir}/elisp-windows.texi \
+ 	${srcdir}/elisp-edebug.texi \
+ 	${srcdir}/elisp-index.texi
+ 
  info: $(INFO_TARGETS)
  
  dvi: $(DVI_TARGETS)
  
! gnu: ../etc/GNU
! 
! ../info/info.info: ${INFOSOURCES}
! 	$(MAKEINFO) --no-split -o ../info/info.info info.texi
  
  info.dvi: ${INFOSOURCES}
  	$(TEXI2DVI) ${srcdir}/info.texi
  
! ../info/emacs.info: ${EMACSSOURCES}
! 	$(MAKEINFO) -o ../info/emacs.info emacs.texi
  
  emacs.dvi: ${EMACSSOURCES}
  	$(TEXI2DVI) ${srcdir}/emacs.texi
  
! ../info/cl.info: cl.texi
! 	$(MAKEINFO) -o ../info/cl.info cl.texi
  cl.dvi: cl.texi
  	$(TEXI2DVI) ${srcdir}/cl.texi
  
! ../info/dired-x.info: dired-x.texi
! 	$(MAKEINFO) -o ../info/dired-x.info dired-x.texi
  dired-x.dvi: dired-x.texi
  	$(TEXI2DVI) ${srcdir}/dired-x.texi
  
! ../info/forms.info: forms.texi
! 	$(MAKEINFO) -o ../info/forms.info forms.texi
  forms.dvi: forms.texi
  	$(TEXI2DVI) ${srcdir}/forms.texi
  
! ../info/mh-e.info: mh-e.texi
! 	$(MAKEINFO) -o ../info/mh-e.info mh-e.texi
  mh-e.dvi: mh-e.texi
  	$(TEXI2DVI) ${srcdir}/mh-e.texi
  
! ../info/sc.info: sc.texi
! 	$(MAKEINFO) -o ../info/sc.info sc.texi
  sc.dvi: sc.texi
  	$(TEXI2DVI) ${srcdir}/sc.texi
  
! ../info/vip.info: vip.texi
! 	$(MAKEINFO) -o ../info/vip.info vip.texi
  vip.dvi: vip.texi
  	$(TEXI2DVI) ${srcdir}/vip.texi
  
! ../info/gnus.info: gnus.texi
! 	$(MAKEINFO) -o ../info/gnus.info gnus.texi
  gnus.dvi: gnus.texi
  	$(TEXI2DVI) ${srcdir}/gnus.texi
  
  ../etc/GNU: gnu1.texi gnu.texi
! 	$(MAKEINFO) --no-headers -o ../etc/GNU ${srcdir}/gnu1.texi
  
! ../info/viper.info: viper.texi viper-cmd.texi
! 	$(MAKEINFO) -o ../info/viper.info viper.texi
  viper.dvi: viper.texi viper-cmd.texi
  	$(TEXI2DVI) ${srcdir}/viper.texi
  
+ ../info/ediff.info: ediff.texi
+ 	$(MAKEINFO) -o ../info/ediff.info ediff.texi
+ ediff.dvi: ediff.texi
+ 	$(TEXI2DVI) ${srcdir}/ediff.texi
+ 
+ ../info/elisp.info: ${ELISPSOURCES}
+ 	$(MAKEINFO) -o ../info/elisp.info elisp.texi
+ elisp.dvi: ${ELISPSOURCES}
+ 	$(TEX) elisp.texi
+ 	if [ a${permuted_index} != a ]; \
+ 	then \
+ 	  $(PERMUTEINDEX); \
+ 	  mv permuted.fns elisp.fns; \
+ 	else \
+ 	  $(TEXINDEX) elisp.??; \
+ 	fi
+ 	$(TEX) elisp.texi
+ 
+ ../info/ns-emacs.info: ns-emacs.texi
+ 	$(MAKEINFO) -o ../info/ns-emacs.info ns-emacs.texi
+ ns-emacs.dvi: ns-emacs.texi
+ 	$(TEXI2DVI) ${srcdir}/ns-emacs.texi
+ 
+ ../info/makeinfo.info: makeinfo.texi macro.texi
+ 	$(MAKEINFO) -o ../info/makeinfo.info makeinfo.texi
+ makeinfo.dvi: makeinfo.texi macro.texi
+ 	$(TEXI2DVI) ${srcdir}/makeinfo.texi
+ 
  mostlyclean:
  	rm -f *.log *.cp *.fn *.ky *.pg *.vr core
  
***************
*** 133,145 ****
  distclean: clean
  
  maintainer-clean: distclean
! 	rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs
! # Don't delete these, because they are outside the current directory.
! #	for file in $(INFO_TARGETS); do rm -f $${file}*; done
! 
  
- # Formerly this directory had texindex.c and getopt.c in it
- # and this makefile built them to make texindex.
- # That caused trouble because this is run entirely in the source directory.
- # Since we expect to get texi2dvi from elsewhere,
- # it is ok to expect texindex from elsewhere also.
--- 223,228 ----
  distclean: clean
  
  maintainer-clean: distclean
! 	rm -f *.aux *.toc *.tp *.cps *.fns *.kys *.pgs *.vrs ../etc/GNU
! 	for file in $(INFO_TARGETS); do rm -f $${file}*; done
  
Index: emacs/man/cl.texi
diff -c emacs/man/cl.texi:1.1.1.1 emacs/man/cl.texi:1.2
*** emacs/man/cl.texi:1.1.1.1	Fri Jul 19 01:55:33 1996
--- emacs/man/cl.texi	Fri Jul 19 05:04:41 1996
***************
*** 1,5 ****
  \input texinfo    @c -*-texinfo-*-
! @setfilename ../info/cl
  @settitle Common Lisp Extensions
  
  @iftex
--- 1,5 ----
  \input texinfo    @c -*-texinfo-*-
! @setfilename ../info/cl.info
  @settitle Common Lisp Extensions
  
  @iftex
Index: emacs/man/dired-x.texi
diff -c emacs/man/dired-x.texi:1.1.1.2 emacs/man/dired-x.texi:1.3
*** emacs/man/dired-x.texi:1.1.1.2	Mon Jul 22 01:53:33 1996
--- emacs/man/dired-x.texi	Wed Jul 31 01:36:38 1996
***************
*** 15,21 ****
  
  @comment %**start of header (This is for running Texinfo on a region.)
  @c FOR GNU EMACS USE ../info/dired-x BELOW
! @setfilename ../info/dired-x
  @c dired-x.el REVISION NUMBER
  @settitle Dired Extra Version 2 User's Manual
  @iftex
--- 15,21 ----
  
  @comment %**start of header (This is for running Texinfo on a region.)
  @c FOR GNU EMACS USE ../info/dired-x BELOW
! @setfilename ../info/dired-x.info
  @c dired-x.el REVISION NUMBER
  @settitle Dired Extra Version 2 User's Manual
  @iftex
Index: emacs/man/elisp-abbrevs.texi
diff -c /dev/null emacs/man/elisp-abbrevs.texi:1.2
*** /dev/null	Fri Aug  2 20:46:01 1996
--- emacs/man/elisp-abbrevs.texi	Thu Aug  1 00:22:19 1996
***************
*** 0 ****
--- 1,344 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/abbrevs
+ @node Abbrevs, Processes, Syntax Tables, Top
+ @chapter Abbrevs And Abbrev Expansion
+ @cindex abbrev
+ @cindex abbrev table
+ 
+   An abbreviation or @dfn{abbrev} is a string of characters that may be
+ expanded to a longer string.  The user can insert the abbrev string and
+ find it replaced automatically with the expansion of the abbrev.  This
+ saves typing.
+ 
+   The set of abbrevs currently in effect is recorded in an @dfn{abbrev
+ table}.  Each buffer has a local abbrev table, but normally all buffers
+ in the same major mode share one abbrev table.  There is also a global
+ abbrev table.  Normally both are used.
+ 
+   An abbrev table is represented as an obarray containing a symbol for
+ each abbreviation.  The symbol's name is the abbreviation; its value is
+ the expansion; its function definition is the hook function to do the
+ expansion (@pxref{Defining Abbrevs}); its property list cell contains
+ the use count, the number of times the abbreviation has been expanded.
+ Because these symbols are not interned in the usual obarray, they will
+ never appear as the result of reading a Lisp expression; in fact,
+ normally they are never used except by the code that handles abbrevs.
+ Therefore, it is safe to use them in an extremely nonstandard way.
+ @xref{Creating Symbols}.
+ 
+   For the user-level commands for abbrevs, see @ref{Abbrevs,, Abbrev
+ Mode, emacs, The GNU Emacs Manual}.
+ 
+ @menu
+ * Abbrev Mode::                 Setting up Emacs for abbreviation.
+ * Tables: Abbrev Tables.        Creating and working with abbrev tables.
+ * Defining Abbrevs::            Specifying abbreviations and their expansions.
+ * Files: Abbrev Files.          Saving abbrevs in files.
+ * Expansion: Abbrev Expansion.  Controlling expansion; expansion subroutines.
+ * Standard Abbrev Tables::      Abbrev tables used by various major modes.
+ @end menu
+ 
+ @node Abbrev Mode, Abbrev Tables, Abbrevs, Abbrevs
+ @comment  node-name,  next,  previous,  up
+ @section Setting Up Abbrev Mode    
+ 
+   Abbrev mode is a minor mode controlled by the value of the variable
+ @code{abbrev-mode}.
+ 
+ @defvar abbrev-mode
+ A non-@code{nil} value of this variable turns on the automatic expansion
+ of abbrevs when their abbreviations are inserted into a buffer.
+ If the value is @code{nil}, abbrevs may be defined, but they are not
+ expanded automatically.
+ 
+ This variable automatically becomes local when set in any fashion.
+ @end defvar
+ 
+ @defvar default-abbrev-mode
+ This is the value of @code{abbrev-mode} for buffers that do not override it.
+ This is the same as @code{(default-value 'abbrev-mode)}.
+ @end defvar
+ 
+ @node Abbrev Tables, Defining Abbrevs, Abbrev Mode, Abbrevs
+ @section Abbrev Tables
+ 
+   This section describes how to create and manipulate abbrev tables.
+ 
+ @defun make-abbrev-table
+ This function creates and returns a new, empty abbrev table---an obarray
+ containing no symbols.  It is a vector filled with zeros.
+ @end defun
+ 
+ @defun clear-abbrev-table table
+ This function undefines all the abbrevs in abbrev table @var{table},
+ leaving it empty.  The function returns @code{nil}.
+ @end defun
+ 
+ @defun define-abbrev-table tabname definitions
+ This function defines @var{tabname} (a symbol) as an abbrev table name,
+ i.e., as a variable whose value is an abbrev table.  It defines abbrevs
+ in the table according to @var{definitions}, a list of elements of the
+ form @code{(@var{abbrevname} @var{expansion} @var{hook}
+ @var{usecount})}.  The value is always @code{nil}.
+ @end defun
+ 
+ @defvar abbrev-table-name-list
+ This is a list of symbols whose values are abbrev tables.
+ @code{define-abbrev-table} adds the new abbrev table name to this list.
+ @end defvar
+ 
+ @defun insert-abbrev-table-description name &optional human
+ This function inserts before point a description of the abbrev table
+ named @var{name}.  The argument @var{name} is a symbol whose value is an
+ abbrev table.  The value is always @code{nil}.
+ 
+ If @var{human} is non-@code{nil}, the description is human-oriented.
+ Otherwise the description is a Lisp expression---a call to
+ @code{define-abbrev-table} that would define @var{name} exactly as it
+ is currently defined.
+ @end defun
+ 
+ @node Defining Abbrevs, Abbrev Files, Abbrev Tables, Abbrevs
+ @comment  node-name,  next,  previous,  up
+ @section Defining Abbrevs
+ 
+   These functions define an abbrev in a specified abbrev table.
+ @code{define-abbrev} is the low-level basic function, while
+ @code{add-abbrev} is used by commands that ask for information from the
+ user.
+ 
+ @defun add-abbrev table type arg
+ This function adds an abbreviation to abbrev table @var{table} based on
+ information from the user.  The argument @var{type} is a string
+ describing in English the kind of abbrev this will be (typically,
+ @code{"global"} or @code{"mode-specific"}); this is used in prompting
+ the user.  The argument @var{arg} is the number of words in the
+ expansion.
+ 
+ The return value is the symbol that internally represents the new
+ abbrev, or @code{nil} if the user declines to confirm redefining an
+ existing abbrev.
+ @end defun
+ 
+ @defun define-abbrev table name expansion hook
+ This function defines an abbrev in @var{table} named @var{name}, to
+ expand to @var{expansion}, and call @var{hook}.  The return value is an
+ uninterned symbol that represents the abbrev inside Emacs; its name is
+ @var{name}.
+ 
+ The argument @var{name} should be a string.  The argument
+ @var{expansion} should be a string, or @code{nil} to undefine the
+ abbrev.
+ 
+ The argument @var{hook} is a function or @code{nil}.  If @var{hook} is
+ non-@code{nil}, then it is called with no arguments after the abbrev is
+ replaced with @var{expansion}; point is located at the end of
+ @var{expansion} when @var{hook} is called.
+ 
+ The use count of the abbrev is initialized to zero.
+ @end defun
+ 
+ @defopt only-global-abbrevs
+ If this variable is non-@code{nil}, it means that the user plans to use
+ global abbrevs only.  This tells the commands that define mode-specific
+ abbrevs to define global ones instead.  This variable does not alter the
+ behavior of the functions in this section; it is examined by their
+ callers.
+ @end defopt
+ 
+ @node Abbrev Files, Abbrev Expansion, Defining Abbrevs, Abbrevs
+ @section Saving Abbrevs in Files
+ 
+   A file of saved abbrev definitions is actually a file of Lisp code.
+ The abbrevs are saved in the form of a Lisp program to define the same
+ abbrev tables with the same contents.  Therefore, you can load the file
+ with @code{load} (@pxref{How Programs Do Loading}).  However, the
+ function @code{quietly-read-abbrev-file} is provided as a more
+ convenient interface.
+ 
+   User-level facilities such as @code{save-some-buffers} can save
+ abbrevs in a file automatically, under the control of variables
+ described here.
+ 
+ @defopt abbrev-file-name
+ This is the default file name for reading and saving abbrevs.
+ @end defopt
+ 
+ @defun quietly-read-abbrev-file filename
+ This function reads abbrev definitions from a file named @var{filename},
+ previously written with @code{write-abbrev-file}.  If @var{filename} is
+ @code{nil}, the file specified in @code{abbrev-file-name} is used.
+ @code{save-abbrevs} is set to @code{t} so that changes will be saved.
+ 
+ This function does not display any messages.  It returns @code{nil}.
+ @end defun
+ 
+ @defopt save-abbrevs
+ A non-@code{nil} value for @code{save-abbrev} means that Emacs should
+ save abbrevs when files are saved.  @code{abbrev-file-name} specifies
+ the file to save the abbrevs in.
+ @end defopt
+ 
+ @defvar abbrevs-changed
+ This variable is set non-@code{nil} by defining or altering any 
+ abbrevs.  This serves as a flag for various Emacs commands to offer to
+ save your abbrevs.
+ @end defvar
+ 
+ @deffn Command write-abbrev-file filename
+ Save all abbrev definitions, in all abbrev tables, in the file
+ @var{filename}, in the form of a Lisp program that when loaded will
+ define the same abbrevs.  This function returns @code{nil}.
+ @end deffn
+ 
+ @node Abbrev Expansion, Standard Abbrev Tables, Abbrev Files, Abbrevs
+ @comment  node-name,  next,  previous,  up
+ @section Looking Up and Expanding Abbreviations
+ 
+   Abbrevs are usually expanded by commands for interactive use,
+ including @code{self-insert-command}.  This section describes the
+ subroutines used in writing such functions, as well as the variables
+ they use for communication.
+ 
+ @defun abbrev-symbol abbrev &optional table
+ This function returns the symbol representing the abbrev named
+ @var{abbrev}.  The value returned is @code{nil} if that abbrev is not
+ defined.  The optional second argument @var{table} is the abbrev table
+ to look it up in.  If @var{table} is @code{nil}, this function tries
+ first the current buffer's local abbrev table, and second the global
+ abbrev table.
+ @end defun
+ 
+ @defun abbrev-expansion abbrev &optional table
+ This function returns the string that @var{abbrev} would expand into (as
+ defined by the abbrev tables used for the current buffer).  The optional
+ argument @var{table} specifies the abbrev table to use, as in
+ @code{abbrev-symbol}.
+ @end defun
+ 
+ @deffn Command expand-abbrev
+ This command expands the abbrev before point, if any.
+ If point does not follow an abbrev, this command does nothing.
+ The command returns @code{t} if it did expansion, @code{nil} otherwise.
+ @end deffn
+ 
+ @deffn Command abbrev-prefix-mark &optional arg
+ Mark current point as the beginning of an abbrev.  The next call to
+ @code{expand-abbrev} will use the text from here to point (where it is
+ then) as the abbrev to expand, rather than using the previous word as
+ usual.
+ @end deffn
+ 
+ @defopt abbrev-all-caps
+ When this is set non-@code{nil}, an abbrev entered entirely in upper
+ case is expanded using all upper case.  Otherwise, an abbrev entered
+ entirely in upper case is expanded by capitalizing each word of the
+ expansion.
+ @end defopt
+ 
+ @defvar abbrev-start-location
+ This is the buffer position for @code{expand-abbrev} to use as the start
+ of the next abbrev to be expanded.  (@code{nil} means use the word
+ before point instead.)  @code{abbrev-start-location} is set to
+ @code{nil} each time @code{expand-abbrev} is called.  This variable is
+ also set by @code{abbrev-prefix-mark}.
+ @end defvar
+ 
+ @defvar abbrev-start-location-buffer
+ The value of this variable is the buffer for which
+ @code{abbrev-start-location} has been set.  Trying to expand an abbrev
+ in any other buffer clears @code{abbrev-start-location}.  This variable
+ is set by @code{abbrev-prefix-mark}.
+ @end defvar
+ 
+ @defvar last-abbrev
+ This is the @code{abbrev-symbol} of the last abbrev expanded.  This
+ information is left by @code{expand-abbrev} for the sake of the
+ @code{unexpand-abbrev} command.
+ @end defvar
+ 
+ @defvar last-abbrev-location
+ This is the location of the last abbrev expanded.  This contains
+ information left by @code{expand-abbrev} for the sake of the
+ @code{unexpand-abbrev} command.
+ @end defvar
+ 
+ @defvar last-abbrev-text
+ This is the exact expansion text of the last abbrev expanded, after case
+ conversion (if any).  Its value is @code{nil} if the abbrev has already
+ been unexpanded.  This contains information left by @code{expand-abbrev}
+ for the sake of the @code{unexpand-abbrev} command.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @defvar pre-abbrev-expand-hook
+ This is a normal hook whose functions are executed, in sequence, just
+ before any expansion of an abbrev.  @xref{Hooks}.  Since it is a normal
+ hook, the hook functions receive no arguments.  However, they can find
+ the abbrev to be expanded by looking in the buffer before point.
+ @end defvar
+ 
+   The following sample code shows a simple use of
+ @code{pre-abbrev-expand-hook}.  If the user terminates an abbrev with a
+ punctuation character, the hook function asks for confirmation.  Thus,
+ this hook allows the user to decide whether to expand the abbrev, and
+ aborts expansion if it is not confirmed.
+ 
+ @smallexample
+ (add-hook 'pre-abbrev-expand-hook 'query-if-not-space)
+ 
+ ;; @r{This is the function invoked by @code{pre-abbrev-expand-hook}.}
+ 
+ ;; @r{If the user terminated the abbrev with a space, the function does}
+ ;; @r{nothing (that is, it returns so that the abbrev can expand).  If the}
+ ;; @r{user entered some other character, this function asks whether}
+ ;; @r{expansion should continue.}
+ 
+ ;; @r{If the user answers the prompt with @kbd{y}, the function returns}
+ ;; @r{@code{nil} (because of the @code{not} function), but that is}
+ ;; @r{acceptable; the return value has no effect on expansion.}
+ 
+ (defun query-if-not-space ()
+   (if (/= ?\  (preceding-char))
+       (if (not (y-or-n-p "Do you want to expand this abbrev? "))
+           (error "Not expanding this abbrev"))))
+ @end smallexample
+ 
+ @node Standard Abbrev Tables,  , Abbrev Expansion, Abbrevs
+ @comment  node-name,  next,  previous,  up
+ @section Standard Abbrev Tables
+ 
+   Here we list the variables that hold the abbrev tables for the
+ preloaded major modes of Emacs.
+ 
+ @defvar global-abbrev-table
+ This is the abbrev table for mode-independent abbrevs.  The abbrevs
+ defined in it apply to all buffers.  Each buffer may also have a local
+ abbrev table, whose abbrev definitions take precedence over those in the
+ global table.
+ @end defvar
+ 
+ @defvar local-abbrev-table
+ The value of this buffer-local variable is the (mode-specific)
+ abbreviation table of the current buffer.
+ @end defvar
+ 
+ @defvar fundamental-mode-abbrev-table
+ This is the local abbrev table used in Fundamental mode; in other words,
+ it is the local abbrev table in all buffers in Fundamental mode.
+ @end defvar
+ 
+ @defvar text-mode-abbrev-table
+ This is the local abbrev table used in Text mode.
+ @end defvar
+ 
+ @defvar c-mode-abbrev-table
+ This is the local abbrev table used in C mode.
+ @end defvar
+ 
+ @defvar lisp-mode-abbrev-table
+ This is the local abbrev table used in Lisp mode and Emacs Lisp mode.
+ @end defvar
Index: emacs/man/elisp-anti.texi
diff -c /dev/null emacs/man/elisp-anti.texi:1.2
*** /dev/null	Fri Aug  2 20:46:09 1996
--- emacs/man/elisp-anti.texi	Thu Aug  1 00:22:21 1996
***************
*** 0 ****
--- 1,619 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @node Antinews, Index, Standard Hooks, Top
+ @appendix Emacs 18 Antinews
+ 
+ For those users who live backwards in time, here is information about
+ downgrading to Emacs version 18.  We hope you will enjoy the greater
+ simplicity that results from the absence of many Emacs 19 features.
+ 
+ @section Old Features in the Lisp Language
+ 
+ The following functions are missing or different in Emacs version 18.
+ 
+ @itemize @bullet
+ @item
+ The functions @code{delete}, @code{member}, @code{indirect-function},
+ @code{map-y-or-n-p}, and @code{invocation-name} have been removed.
+ 
+ @item
+ The function @code{read} now skips a terminator character that
+ terminates a symbol when reading from a buffer.  Thus, if you use
+ @code{read} on a buffer containing @samp{foo(bar)} following point, it
+ returns @code{foo} and leaves point after the open-parenthesis.  This
+ means there's no way you can properly read the list @samp{(bar)}, but
+ that's the way the cookie crumbles.
+ 
+ Because of this simplification, it's no longer necessary for an input
+ stream function to accept an optional argument.  In Emacs 18, an input
+ stream is always called with no arguments, and should always return
+ the next character of input.
+ 
+ @item
+ The function @code{documentation} takes just one argument;
+ @code{documentation-property} takes just two.
+ 
+ @item
+ @code{random} no longer has the optional argument @var{n}.
+ 
+ @item 
+ You can no longer arrange to run a hook if a particular Lisp library is
+ loaded.  The variable @code{after-load-alist} and the function
+ @code{eval-after-load} have been removed.
+ 
+ @item
+ The function @code{autoload} no longer supports autoloading a keymap.
+ 
+ @item
+ ``Magic'' comments of the form @samp{;;;###autoload} are now just
+ comments.  They don't do anything in particular except look pretty.
+ If you want a function to be autoloaded by default, edit @file{loaddefs.h}
+ by hand.  What do you think editors are for? 
+ 
+ @item
+ We took out the @samp{%S} from the @code{format} function, and the
+ optional argument @var{noescap} from @code{prin1-to-string}.  We removed
+ the @code{print-level} variable.
+ @end itemize
+ 
+ @section Compilation Features
+ 
+ @itemize @bullet
+ @item
+ Inline functions are nonexistent in Emacs 18.  We find they make the
+ calling function unnecessarily large.  (Small size is one of the 
+ features of Emacs 18.)
+ 
+ @item
+ We eliminated the two special forms, @code{eval-when-compile} and
+ @code{eval-and-compile}, as well as the @code{compile-defun} command.
+ 
+ @item
+ When you load a Lisp file or library, you will no longer receive a
+ warning if the directory contains both a @samp{.elc} file and a new
+ @samp{.el} file that is newer.  So be on your toes.
+ 
+ @item
+ We removed the special data type for byte-code functions.  Compiled
+ functions now work by means of an interpreted function which calls
+ the function @code{bytecode}.  That function runs the byte code
+ interpreter.
+ @end itemize
+ 
+ @section Floating Point Numbers
+ 
+ Emacs 18 doesn't have or need floating point arithmetic built in.
+ It has a handy Lisp program that allows you to emulate floating point.
+ You'll have to write programs specially to use it, though.
+ 
+ As a result, certain macros, functions, and predicates no longer handle
+ specifications for floating point numbers.
+ 
+ @itemize @bullet
+ @item
+ The function @code{string-to-number}, the predicate @code{floatp}, and
+ the variable @code{float-output-format} have all been eliminated.
+ 
+ @item
+ The functions @code{float}, @code{truncate}, @code{floor}, @code{ceil},
+ @code{round}, and @code{logb} do not exist; neither do the functions
+ @code{abs}, @code{cos}, @code{sin}, @code{tan}, @code{acos},
+ @code{asin}, @code{atan}, @code{exp}, @code{expt}, @code{log10},
+ @code{log}, or @code{sqrt}.
+ 
+ @item
+ The @code{format} function no longer handles the specifications
+ @samp{%e}, @samp{%f} and @samp{%g} for printing floating point numbers;
+ likewise for @code{message}.
+ @end itemize
+ 
+ @section Changes in Basic Editing Functions
+ 
+ @itemize @bullet
+ @item
+ @code{kill-new} and @code{kill-append}, the primitives for putting text
+ in the kill ring, have been eliminated.
+ @c @code{kill-append} seems to exist as a non-documented (no doc string)
+ @c primitive in emacs 18.  but news.texi said it was new for 19.
+ 
+ @item
+ The variables @code{interprogram-paste-function} and
+ @code{interprogram-cut-function} have been removed in Emacs 18.
+ 
+ In addition, there's no need for @code{mark-active} and
+ @code{deactivate-mark} because there is no Transient Mark mode.  We also
+ removed the hooks @code{activate-mark-hook} and
+ @code{deactivate-mark-hook}.
+ 
+ @item
+ The @code{kill-region} function can no longer be used in read-only
+ buffers.  The @code{compare-buffer-substrings} and @code{current-kill}
+ functions have been removed.
+ 
+ @item
+ The variable @code{overwrite-mode-binary} has been removed.
+ 
+ @item
+ The function @code{move-to-column} allows just one argument,
+ @var{column}. 
+ 
+ @item 
+ The search functions now just return @code{t} when successful.  This
+ affects the functions @code{search-forward}, @code{search-backward},
+ @code{word-search-forward}, @code{word-search-backward},
+ @code{re-search-forward}, and @code{re-search-backward}.
+ 
+ @item
+ When you do regular expression searching or matching, there is a fixed
+ limit of ten @samp{\(@dots{}\)} pairs that you can get information about
+ with @code{match-beginning} and @code{match-end}.  Moreover,
+ @code{save-match-data} does not exist; you must use an explicit
+ @code{unwind-protect} to save the match data.
+ 
+ @item
+ @code{translate-region} is gone.
+ 
+ @item
+ The variables @code{before-change-function},
+ @code{after-change-function}, and @code{first-change-hook} have been
+ eliminated.
+ 
+ @item
+ The second argument to @code{insert-abbrev-table-description} is no
+ longer optional.
+ @end itemize
+ 
+ @section Text Properties
+ 
+ We eliminated text properties.
+ 
+ @section Features for Files
+  
+ Many file-related functions have been eliminated or simplified.  Here is
+ a basic listing of these functions.
+ 
+ @itemize @bullet
+ @item
+ The functions @code{file-accessible-directory-p}, @code{file-truename},
+ @code{make-directory}, @code{delete-directory},
+ @code{set-visited-file-modtime}, @code{directory-abbrev-alist},
+ @code{abbreviate-file-name}, @code{write-region},
+ @code{write-contents-hooks}, @code{after-save-hook},
+ @code{set-default-file-modes}, @code{default-file-modes}, and
+ @code{unix-sync} have been eliminated.
+ 
+ @item
+ We got rid of the ``initial file name'' argument to
+ @code{read-file-name}.
+ 
+ @item
+ Additionally, we removed the 12th element from the list returned by
+ @code{file-attributes}.
+ 
+ @item
+ @code{directory-files} always sorts the list of files.  It's not user
+ friendly to process the files in any haphazard order.
+ 
+ @item
+ We eliminated the variables @code{write-contents-hooks} and
+ @code{local-write-file-hooks}.
+ @end itemize
+ 
+ @section Making Certain File Names ``Magic''
+ 
+ There are no more magic filenames.  Sorry, but all the mana has been
+ used up.
+ 
+ @section Frames
+ 
+ There is only one frame in Emacs 18, so all of the frame functions have
+ been eliminated.
+ 
+ @section X Window System Features
+ 
+ We have simplified the way Emacs and X interact by removing a great deal
+ of creeping featurism.
+ 
+ @itemize @bullet
+ @item
+ The functions @code{mouse-position} and @code{set-mouse-position}, and
+ the special form @code{track-mouse}, have been eliminated.
+ 
+ @item
+ Likewise, the functions @code{x-set-selection}, @code{x-set-cut-buffer},
+ @code{x-close-current-connection}, and @code{x-open-connection} have all
+ been removed from Emacs Lisp 18.
+ 
+ @item
+ We removed a series of functions that gave information about the X
+ server and the screen you were using; after all, the whole point of X is
+ that all servers are equivalent.  The names of the removed functions
+ are: @code{x-display-screens}, @code{x-server-version},
+ @code{x-server-vendor}, @code{x-display-pixel-height},
+ @code{x-display-mm-height}, @code{x-display-pixel-width},
+ @code{x-display-mm-width}, @code{x-display-backing-store},
+ @code{x-display-save-under}, @code{x-display-planes},
+ @code{x-display-visual-class}, @code{x-display-color-p}, and
+ @code{x-display-color-cells}.
+ 
+ @item
+ Additionally, we removed the variable @code{x-no-window-manager} and the
+ functions @code{x-synchronize} and @code{x-get-resource}.
+ 
+ @item
+ We didn't abolish @code{x-display-color-p}, but we renamed it to
+ @code{x-color-display-p}.  We did abolish @code{x-color-defined-p}.
+ 
+ @item
+ @code{x-popup-menu} no longer accepts a keymap for its first argument.
+ 
+ @item
+ We removed both the function @code{x-rebind-key} and the related
+ function @code{x-rebind-keys}.
+ 
+ @item 
+ We abolished @code{x-parse-geometry}.
+ @end itemize
+ 
+ @section Window Actions that Were No Longer Useful
+ 
+ Various behaviors of windows in Emacs 19 were obsolete by the time Emacs
+ 18 was due to come out.  We have removed them.  These changes are listed
+ below. 
+ 
+ @itemize @bullet
+ @item
+ We removed the functions @code{window-at}, @code{window-minibuffer-p},
+ @code{set-window-dedicated-p}, @code{coordinates-in-window-p},
+ @code{walk-windows}, @code{window-dedicated-p}, and @code{window-end}.
+ 
+ @item
+ We removed the variables @code{pop-up-frames},
+ @code{pop-up-frame-function}, @code{display-buffer-function}, and
+ @code{other-window-scroll-buffer}.
+ 
+ @item
+ The function @code{minibuffer-window} no longer accepts a frame as
+ argument, since frames as objects do not exist in Emacs version 18.  It
+ returns the window used for minibuffers.
+ 
+ @item
+ The functions @code{next-window} and @code{previous-window} no longer
+ accept the @var{all-frames} argument since there is just one frame.
+ 
+ @item
+ The functions @code{get-lru-window}, @code{get-largest-window},
+ @code{get-buffer-window}, and @code{get-buffer-window} also no longer
+ take the optional argument @var{all-frames} because there is just one
+ frame to search.
+ @end itemize
+ 
+ @section Display Features
+ 
+ @itemize @bullet
+ @item
+ There are no overlays, and no faces.
+ 
+ @item
+ We eliminated the mode line spec @samp{%l} that in later versions used
+ to display the current line number.  We removed the variables
+ @code{line-number-mode} and @code{line-number-display-limit}.
+ 
+ @item
+ @code{baud-rate} is now a function rather than a variable.
+ 
+ @item
+ You can no longer call @code{message} with @code{nil} as the only
+ argument; therefore, you can not reliably make the contents of the
+ minibuffer visible.
+ 
+ @item
+ The variable @code{temp-buffer-show-function} has been renamed
+ @code{temp-buffer-show-hook}.
+ 
+ @item
+ We removed the function @code{force-mode-line-update}.  Use
+ the following idiom instead:
+ 
+ @example
+ (set-buffer-modified-p (buffer-modified-p))
+ @end example
+ 
+ @item
+ Display tables no longer exist.  We know what the @sc{ASCII} characters
+ should look like, and we made them look that way.
+ @end itemize
+ 
+ @section Working with Input Events
+ 
+ The big news about input events is that we got rid of function key
+ and mouse events.  Now the only input events are characters.
+ What's more, these characters now have to be in the range of 0 to 127,
+ optionally with a meta bit.  This makes for big simplifications.
+ 
+ @itemize @bullet
+ @item
+ Functions like @code{define-key}, @code{global-set-key},
+ @code{read-key-sequence}, and @code{local-set-key} used to accept
+ strings or vectors in Emacs 19; now they only accept strings.
+ 
+ @item
+ The documentation functions (@code{single-key-description},
+ @code{key-description}, etc.) also no longer accept vectors, but they do
+ accept strings.
+ 
+ @item
+ We removed the @code{read-event}, @code{event-start},
+ @code{posn-window}, @code{posn-point}, @code{posn-col-row},
+ @code{posn-timestamp}, @code{scroll-bar-scale}, and @code{event-end}
+ functions, since they were useful only for non-character events.
+ 
+ @item
+ We removed the @code{unread-command-events} and @code{last-event-frame}
+ variables.
+ 
+ @item
+ The functions @code{this-command-keys} and @code{recent-keys} now always
+ return a string.  Likewise, a keyboard macro's definition can only be a
+ string, not a vector.
+ 
+ @item
+ We eliminated @samp{e} as an interactive specification since it
+ was useful only with non-character events.
+ 
+ @item
+ In Emacs 18, we represent Meta characters as character objects with the
+ same encoding used in strings: 128 plus the corresponding non-Meta
+ @sc{ASCII} character.
+ @end itemize
+ 
+ @section Menus
+ 
+ @itemize @bullet
+ @item
+ You can no longer define menus as keymaps; good system design requires
+ crafting a special-purpose interface for each facility, so it can
+ precisely fit the requirements of that facility.  We decided that
+ unifying keymaps and menus was simply too much of a strain.
+ 
+ @item
+ In Emacs 18, you can activate menus only with the mouse.  Using them
+ with a keyboard was too confusing for too many users.
+ 
+ @item
+ Emacs 18 has no menu bars.  All functions and variables related to the
+ menu bar have been eliminated.
+ @end itemize
+ 
+ @section Changes in Minibuffer Features
+ 
+ @itemize @bullet
+ @item
+ The minibuffer history feature has been eliminated.  Thus, we removed
+ the optional argument @var{hist} from the minibuffer input functions
+ @code{read-from-minibuffer} and @code{completing-read}.
+ 
+ @item
+ The @var{initial} argument to @code{read-from-minibuffer} and other
+ minibuffer input functions can no longer be a cons cell
+ @code{(@var{string} . @var{position})}.
+ 
+ @item
+ In the function @code{read-no-blanks-input}, the @var{initial} argument
+ is no longer optional.
+ @end itemize
+ 
+ @section New Features for Defining Commands
+ 
+ @itemize @bullet
+ @item
+ The special meaning of @samp{@@} in an interactive specification has
+ been eliminated.
+ 
+ @item
+ Emacs 18 does not support use of format-style @samp{%}-sequences in the
+ prompt strings in interactive specifications.
+ 
+ @item
+ The property @code{enable-recursive-minibuffers} no longer has any
+ special meaning.
+ @end itemize
+ 
+ @section Removed Features for Reading Input
+ 
+ @itemize @bullet
+ @item
+ We removed the third argument (@var{meta}) from the function
+ @code{set-input-mode}.  Consequently, we added the variable
+ @code{meta-flag}; set it to @code{t} to enable use of a Meta key, and
+ to @code{nil} to disable it.  (Those are the only two alternatives.)
+ 
+ @item
+ We also removed the variable @code{extra-keyboard-modifiers}.
+ 
+ @item
+ We removed the function @code{keyboard-translate} and the variables
+ @code{num-input-keys} and @code{function-key-map}.
+ @end itemize
+ 
+ @section Removed Syntax Table Features
+ 
+ @itemize @bullet
+ @item
+ We eliminated the functions @code{skip-syntax-forward},
+ @code{skip-syntax-backward}, @code{forward-comment}.
+ 
+ @item
+ We removed the syntax flag for ``prefix syntax'' and the flag for the
+ alternate comment style.  Emacs 18 supports only one style of comment
+ in any given syntax table.
+ 
+ @item
+ We abolished the variable @code{words-include-escapes}.
+ @end itemize
+ 
+ @section The Case Table
+ 
+ @itemize @bullet
+ @item
+ Case tables do not exist in Emacs 18.  Due to this change, we have
+ removed the associated functions @code{set-standard-case-table},
+ @code{standard-case-table}, @code{current-case-table},
+ @code{set-case-table}, and @code{set-case-syntax-pair}.
+ @end itemize
+ 
+ @section Features for Dealing with Buffers
+ 
+ @itemize @bullet
+ @item
+ We eliminated several functions for dealing with buffers:
+ @code{buffer-modified-tick} and @code{generate-new-buffer-name}.
+ 
+ @item
+ We renamed @code{buffer-disable-undo} to @code{buffer-flush-undo}---a
+ more picturesque name, you will agree.
+ 
+ @item
+ The function @code{other-buffer} takes just one argument in Emacs 18.
+ 
+ @item
+ The function @code{rename-buffer} now requires you to specify precisely
+ the new name you want.
+ 
+ @item
+ We removed the local variable @code{list-buffers-directory}.
+ 
+ @item
+ We got rid of the hook @code{kill-buffer-hook}.
+ @end itemize
+ 
+ @section Local Variables Features
+ 
+ @itemize @bullet
+ @item
+ The function @code{kill-all-local-variables} always eliminates all
+ buffer-local variables of the current buffer.  No more exceptions.
+ 
+ @item
+ Making a variable buffer-local when it is void now sets it to
+ @code{nil}.
+ 
+ @item
+ We eliminated the functions @code{default-boundp}, because it is no
+ longer possible for the default binding of a variable to be void.
+ 
+ @item
+ The special forms @code{defconst} and @code{defvar} now set the
+ variable's local value rather than its default value when the variable
+ is local in the current buffer.
+ @end itemize
+ 
+ @section Features for Subprocesses
+ 
+ @itemize @bullet
+ @item
+ @code{call-process} and @code{call-process-region} no longer indicate
+ the termination status of the subprocess.  We call on users to have faith
+ that the subprocess executed properly.
+ 
+ @item
+ The standard asynchronous subprocess features do not work on VMS;
+ instead, special VMS asynchronous subprocess functions have been added.
+ Since they are only for VMS, we can't be bothered documenting them;
+ sorry.  Use the source, Luke!
+ 
+ @item
+ The function @code{signal-process} has been removed.
+ 
+ @item
+ We eliminated the transaction queue feature, and the associated
+ functions @code{tq-create}, @code{tq-enqueue}, and @code{tq-close}.
+ @end itemize
+ 
+ @section Dealing with Times And Time Delays
+ 
+ @itemize @bullet
+ @item
+ We removed the functions @code{current-time}, @code{current-time-zone},
+ @code{run-at-time}, and @code{cancel-timer}. 
+ 
+ @item
+ The function @code{current-time-string} no longer accepts any optional
+ arguments.
+ 
+ @item
+ The functions @code{sit-for} and @code{sleep-for} no longer allow an
+ optional argument to let you specify the time period in milliseconds;
+ just in seconds.  Additionally, we took out the optional third argument
+ @var{nodisp} from @code{sit-for}.
+ 
+ @item
+ We removed the optional second and third arguments from the
+ @code{accept-process-output} function.  It accepts just one argument,
+ the process.
+ @end itemize
+ 
+ @need 3000
+ 
+ @section Features not Available for Lisp Debuggers
+ 
+ @itemize @bullet
+ @item
+ In Emacs 18, you can no longer specify to invoke the Lisp debugger only
+ upon encountering certain types of errors.  Any non-@code{nil} value for
+ the variable @code{debug-on-error} says to invoke the debugger for any
+ error whatever.
+ 
+ @item
+ We removed the variable @code{command-debug-status} and the function
+ @code{backtrace-frame}. 
+ @end itemize
+ 
+ @section Memory Allocation Changes
+ 
+ @itemize @bullet
+ @item
+ We removed the function @code{memory-limit}.
+ 
+ @item
+ The list returned by @code{garbage-collect} no longer contains an
+ element to describe floating point numbers, since there aren't any
+ floating point numbers in Emacs 18.
+ @end itemize
+ 
+ @section Hook Changes
+ 
+ @itemize @bullet
+ @item
+ We removed the hooks @code{pre-abbrev-expand-hook},
+ @code{pre-command-hook}, @code{post-command-hook}, and
+ @code{auto-save-hook}.
+ 
+ @item
+ We removed the variable
+ @code{revert-buffer-insert-file-contents-function}.
+ 
+ @item
+ We also removed the new function @code{add-hook}; you will have to set
+ your hooks by hand.  If you want to get really into the swing of things,
+ set your hook variables the archaic way: store just one function rather
+ than a list of functions.  But that is optional.
+ 
+ @item
+ The variable @code{lisp-indent-hook} has been renamed to
+ @code{lisp-indent-function}.
+ 
+ @item
+ The variable @code{auto-fill-function} has been renamed to
+ @code{auto-fill-hook}.
+ 
+ @item
+ The @code{blink-paren-function} has been renamed to
+ @code{blink-paren-hook}.
+ 
+ @item
+ The variable @code{temp-buffer-show-function} has been renamed to
+ @code{temp-buffer-show-hook}.
+ @end itemize
Index: emacs/man/elisp-back.texi
diff -c /dev/null emacs/man/elisp-back.texi:1.1
*** /dev/null	Fri Aug  2 20:46:26 1996
--- emacs/man/elisp-back.texi	Fri Jul 19 05:04:51 1996
***************
*** 0 ****
--- 1,33 ----
+ \input /home/gd/gnu/doc/texinfo.tex  @c -*-texinfo-*-
+ @c %**start of header
+ @setfilename back-cover
+ @settitle GNU Emacs Lisp Reference Manual
+ @c %**end of header
+ .
+ @sp 7
+ @center @titlefont {GNU Emacs Lisp}
+ @sp 1
+ 
+ @quotation
+   Most of the GNU Emacs text editor is written in the programming
+ language called Emacs Lisp.  You can write new code in Emacs Lisp and
+ install it as an extension to the editor.  However, Emacs Lisp is more
+ than a mere ``extension language''; it is a full computer programming
+ language in its own right.  You can use it as you would any other
+ programming language.
+ 
+   Because Emacs Lisp is designed for use in an editor, it has special
+ features for scanning and parsing text as well as features for handling
+ files, buffers, displays, subprocesses, and so on.  Emacs Lisp is
+ closely integrated with the editing facilities; thus, editing commands
+ are functions that can also conveniently be called from Lisp programs,
+ and parameters for customization are ordinary Lisp variables.
+ 
+   This manual describes Emacs Lisp.  Generally speaking, the earlier
+ chapters describe features of Emacs Lisp that have counterparts in
+ many programming languages, and later chapters describe features that
+ are peculiar to Emacs Lisp or relate specifically to editing.
+ @end quotation
+ 
+ @hfil
+ @bye
Index: emacs/man/elisp-backups.texi
diff -c /dev/null emacs/man/elisp-backups.texi:1.2
*** /dev/null	Fri Aug  2 20:46:29 1996
--- emacs/man/elisp-backups.texi	Thu Aug  1 00:22:22 1996
***************
*** 0 ****
--- 1,648 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/backups
+ @node Backups and Auto-Saving, Buffers, Files, Top
+ @chapter Backups and Auto-Saving
+ 
+   Backup files and auto-save files are two methods by which Emacs tries
+ to protect the user from the consequences of crashes or of the user's
+ own errors.  Auto-saving preserves the text from earlier in the current
+ editing session; backup files preserve file contents prior to the
+ current session.
+ 
+ @menu
+ * Backup Files::   How backup files are made; how their names are chosen.
+ * Auto-Saving::    How auto-save files are made; how their names are chosen.
+ * Reverting::      @code{revert-buffer}, and how to customize what it does.
+ @end menu
+ 
+ @node Backup Files
+ @section Backup Files
+ @cindex backup file
+ 
+   A @dfn{backup file} is a copy of the old contents of a file you are
+ editing.  Emacs makes a backup file the first time you save a buffer
+ into its visited file.  Normally, this means that the backup file
+ contains the contents of the file as it was before the current editing
+ session.  The contents of the backup file normally remain unchanged once
+ it exists.
+ 
+   Backups are usually made by renaming the visited file to a new name.
+ Optionally, you can specify that backup files should be made by copying
+ the visited file.  This choice makes a difference for files with
+ multiple names; it also can affect whether the edited file remains owned
+ by the original owner or becomes owned by the user editing it.
+ 
+   By default, Emacs makes a single backup file for each file edited.
+ You can alternatively request numbered backups; then each new backup
+ file gets a new name.  You can delete old numbered backups when you
+ don't want them any more, or Emacs can delete them automatically.
+ 
+ @menu
+ * Making Backups::     How Emacs makes backup files, and when.
+ * Rename or Copy::     Two alternatives: renaming the old file or copying it.
+ * Numbered Backups::   Keeping multiple backups for each source file.
+ * Backup Names::       How backup file names are computed; customization.
+ @end menu
+ 
+ @node Making Backups
+ @subsection Making Backup Files
+ 
+ @defun backup-buffer
+   This function makes a backup of the file visited by the current
+ buffer, if appropriate.  It is called by @code{save-buffer} before
+ saving the buffer the first time.
+ @end defun
+ 
+ @defvar buffer-backed-up
+   This buffer-local variable indicates whether this buffer's file has
+ been backed up on account of this buffer.  If it is non-@code{nil}, then
+ the backup file has been written.  Otherwise, the file should be backed
+ up when it is next saved (if backups are enabled).  This is a
+ permanent local; @code{kill-local-variables} does not alter it.
+ @end defvar
+ 
+ @defopt make-backup-files
+ This variable determines whether or not to make backup files.  If it
+ is non-@code{nil}, then Emacs creates a backup of each file when it is
+ saved for the first time---provided that @code{backup-inhibited}
+ is @code{nil} (see below).
+ 
+ The following example shows how to change the @code{make-backup-files}
+ variable only in the @file{RMAIL} buffer and not elsewhere.  Setting it
+ @code{nil} stops Emacs from making backups of the @file{RMAIL} file,
+ which may save disk space.  (You would put this code in your
+ @file{.emacs} file.)
+ 
+ @smallexample
+ @group
+ (add-hook 'rmail-mode-hook 
+           (function (lambda ()
+                       (make-local-variable 
+                        'make-backup-files)
+                       (setq make-backup-files nil))))
+ @end group
+ @end smallexample
+ @end defopt
+ 
+ @defvar backup-enable-predicate
+ This variable's value is a function to be called on certain occasions to
+ decide whether a file should have backup files.  The function receives
+ one argument, a file name to consider.  If the function returns
+ @code{nil}, backups are disabled for that file.  Otherwise, the other
+ variables in this section say whether and how to make backups.
+ 
+ The default value is this:
+ 
+ @example
+ (lambda (name)
+   (or (< (length name) 5)
+       (not (string-equal "/tmp/"
+                          (substring name 0 5)))))
+ @end example
+ @end defvar
+ 
+ @defvar backup-inhibited
+ If this variable is non-@code{nil}, backups are inhibited.  It records
+ the result of testing @code{backup-enable-predicate} on the visited file
+ name.  It can also coherently be used by other mechanisms that inhibit
+ backups based on which file is visited.  For example, VC sets this
+ variable non-@code{nil} to prevent making backups for files managed
+ with a version control system.
+ 
+ This is a permanent local, so that changing the major mode does not lose
+ its value.  Major modes should not set this variable---they should set
+ @code{make-backup-files} instead.
+ @end defvar
+ 
+ @node Rename or Copy
+ @subsection Backup by Renaming or by Copying?
+ @cindex backup files, how to make them
+ 
+   There are two ways that Emacs can make a backup file: 
+ 
+ @itemize @bullet
+ @item
+ Emacs can rename the original file so that it becomes a backup file, and
+ then write the buffer being saved into a new file.  After this
+ procedure, any other names (i.e., hard links) of the original file now
+ refer to the backup file.  The new file is owned by the user doing the
+ editing, and its group is the default for new files written by the user
+ in that directory.
+ 
+ @item
+ Emacs can copy the original file into a backup file, and then overwrite
+ the original file with new contents.  After this procedure, any other
+ names (i.e., hard links) of the original file still refer to the current
+ version of the file.  The file's owner and group will be unchanged.
+ @end itemize
+ 
+   The first method, renaming, is the default.
+ 
+   The variable @code{backup-by-copying}, if non-@code{nil}, says to use
+ the second method, which is to copy the original file and overwrite it
+ with the new buffer contents.  The variable @code{file-precious-flag},
+ if non-@code{nil}, also has this effect (as a sideline of its main
+ significance).  @xref{Saving Buffers}.
+ 
+ @defvar backup-by-copying
+ If this variable is non-@code{nil}, Emacs always makes backup files by
+ copying.
+ @end defvar
+ 
+   The following two variables, when non-@code{nil}, cause the second
+ method to be used in certain special cases.  They have no effect on the
+ treatment of files that don't fall into the special cases.
+ 
+ @defvar backup-by-copying-when-linked
+ If this variable is non-@code{nil}, Emacs makes backups by copying for
+ files with multiple names (hard links).
+ 
+ This variable is significant only if @code{backup-by-copying} is
+ @code{nil}, since copying is always used when that variable is
+ non-@code{nil}.
+ @end defvar
+ 
+ @defvar backup-by-copying-when-mismatch
+ If this variable is non-@code{nil}, Emacs makes backups by copying in cases
+ where renaming would change either the owner or the group of the file.
+ 
+ The value has no effect when renaming would not alter the owner or
+ group of the file; that is, for files which are owned by the user and
+ whose group matches the default for a new file created there by the
+ user.
+ 
+ This variable is significant only if @code{backup-by-copying} is
+ @code{nil}, since copying is always used when that variable is
+ non-@code{nil}.
+ @end defvar
+ 
+ @node Numbered Backups
+ @subsection Making and Deleting Numbered Backup Files
+ 
+   If a file's name is @file{foo}, the names of its numbered backup
+ versions are @file{foo.~@var{v}~}, for various integers @var{v}, like
+ this: @file{foo.~1~}, @file{foo.~2~}, @file{foo.~3~}, @dots{},
+ @file{foo.~259~}, and so on.
+ 
+ @defopt version-control
+ This variable controls whether to make a single non-numbered backup
+ file or multiple numbered backups.
+ 
+ @table @asis
+ @item @code{nil}
+ Make numbered backups if the visited file already has numbered backups;
+ otherwise, do not.
+ 
+ @item @code{never}
+ Do not make numbered backups.
+ 
+ @item @var{anything else}
+ Make numbered backups.
+ @end table
+ @end defopt
+ 
+   The use of numbered backups ultimately leads to a large number of
+ backup versions, which must then be deleted.  Emacs can do this
+ automatically or it can ask the user whether to delete them.
+ 
+ @defopt kept-new-versions
+ The value of this variable is the number of newest versions to keep
+ when a new numbered backup is made.  The newly made backup is included
+ in the count.  The default value is 2.
+ @end defopt
+ 
+ @defopt kept-old-versions
+ The value of this variable is the number of oldest versions to keep
+ when a new numbered backup is made.  The default value is 2.
+ @end defopt
+ 
+   If there are backups numbered 1, 2, 3, 5, and 7, and both of these
+ variables have the value 2, then the backups numbered 1 and 2 are kept
+ as old versions and those numbered 5 and 7 are kept as new versions;
+ backup version 3 is excess.  The function @code{find-backup-file-name}
+ (@pxref{Backup Names}) is responsible for determining which backup
+ versions to delete, but does not delete them itself.
+ 
+ @defopt trim-versions-without-asking
+ If this variable is non-@code{nil}, then saving a file deletes excess
+ backup versions silently.  Otherwise, it asks the user whether to delete
+ them.
+ @end defopt
+ 
+ @defopt dired-kept-versions
+ This variable specifies how many of the newest backup versions to keep
+ in the Dired command @kbd{.} (@code{dired-clean-directory}).  That's the
+ same thing @code{kept-new-versions} specifies when you make a new backup
+ file.  The default value is 2.
+ @end defopt
+ 
+ @node Backup Names
+ @subsection Naming Backup Files
+ 
+   The functions in this section are documented mainly because you can
+ customize the naming conventions for backup files by redefining them.
+ If you change one, you probably need to change the rest.
+ 
+ @defun backup-file-name-p filename
+ This function returns a non-@code{nil} value if @var{filename} is a
+ possible name for a backup file.  A file with the name @var{filename}
+ need not exist; the function just checks the name.
+ 
+ @smallexample
+ @group
+ (backup-file-name-p "foo")
+      @result{} nil
+ @end group
+ @group
+ (backup-file-name-p "foo~")
+      @result{} 3
+ @end group
+ @end smallexample
+ 
+ The standard definition of this function is as follows:
+ 
+ @smallexample
+ @group
+ (defun backup-file-name-p (file)
+   "Return non-nil if FILE is a backup file \
+ name (numeric or not)..."
+   (string-match "~$" file))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ Thus, the function returns a non-@code{nil} value if the file name ends
+ with a @samp{~}.  (We use a backslash to split the documentation
+ string's first line into two lines in the text, but produce just one
+ line in the string itself.)
+ 
+ This simple expression is placed in a separate function to make it easy
+ to redefine for customization.
+ @end defun
+ 
+ @defun make-backup-file-name filename
+ This function returns a string that is the name to use for a
+ non-numbered backup file for file @var{filename}.  On Unix, this is just
+ @var{filename} with a tilde appended.
+ 
+ The standard definition of this function is as follows:
+ 
+ @smallexample
+ @group
+ (defun make-backup-file-name (file)
+   "Create the non-numeric backup file name for FILE.
+ @dots{}"
+   (concat file "~"))
+ @end group
+ @end smallexample
+ 
+ You can change the backup-file naming convention by redefining this
+ function.  The following example redefines @code{make-backup-file-name}
+ to prepend a @samp{.} in addition to appending a tilde:
+ 
+ @smallexample
+ @group
+ (defun make-backup-file-name (filename)
+   (concat "." filename "~"))
+ @end group
+ 
+ @group
+ (make-backup-file-name "backups.texi")
+      @result{} ".backups.texi~"
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun find-backup-file-name filename
+ This function computes the file name for a new backup file for
+ @var{filename}.  It may also propose certain existing backup files for
+ deletion.  @code{find-backup-file-name} returns a list whose @sc{car} is
+ the name for the new backup file and whose @sc{cdr} is a list of backup
+ files whose deletion is proposed.
+ 
+ Two variables, @code{kept-old-versions} and @code{kept-new-versions},
+ determine which backup versions should be kept.  This function keeps
+ those versions by excluding them from the @sc{cdr} of the value.
+ @xref{Numbered Backups}.
+ 
+ In this example, the value says that @file{~rms/foo.~5~} is the name
+ to use for the new backup file, and @file{~rms/foo.~3~} is an ``excess''
+ version that the caller should consider deleting now.
+ 
+ @smallexample
+ @group
+ (find-backup-file-name "~rms/foo")
+      @result{} ("~rms/foo.~5~" "~rms/foo.~3~")
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun file-newest-backup filename
+ This function returns the name of the most recent backup file for
+ @var{filename}, or @code{nil} if that file has no backup files.
+ 
+ Some file comparison commands use this function so that they can
+ automatically compare a file with its most recent backup.
+ @end defun 
+ 
+ @node Auto-Saving
+ @section Auto-Saving
+ @cindex auto-saving
+ 
+   Emacs periodically saves all files that you are visiting; this is
+ called @dfn{auto-saving}.  Auto-saving prevents you from losing more
+ than a limited amount of work if the system crashes.  By default,
+ auto-saves happen every 300 keystrokes, or after around 30 seconds of
+ idle time.  @xref{Auto-Save, Auto-Save, Auto-Saving: Protection Against
+ Disasters, emacs, The GNU Emacs Manual}, for information on auto-save
+ for users.  Here we describe the functions used to implement auto-saving
+ and the variables that control them.
+ 
+ @defvar buffer-auto-save-file-name
+ This buffer-local variable is the name of the file used for
+ auto-saving the current buffer.  It is @code{nil} if the buffer
+ should not be auto-saved.
+ 
+ @example
+ @group
+ buffer-auto-save-file-name
+ => "/xcssun/users/rms/lewis/#files.texi#"
+ @end group
+ @end example
+ @end defvar
+ 
+ @deffn Command auto-save-mode arg
+ When used interactively without an argument, this command is a toggle
+ switch: it turns on auto-saving of the current buffer if it is off, and
+ vice-versa.  With an argument @var{arg}, the command turns auto-saving
+ on if the value of @var{arg} is @code{t}, a nonempty list, or a positive
+ integer.  Otherwise, it turns auto-saving off.
+ @end deffn
+ 
+ @defun auto-save-file-name-p filename
+ This function returns a non-@code{nil} value if @var{filename} is a
+ string that could be the name of an auto-save file.  It works based on
+ knowledge of the naming convention for auto-save files: a name that
+ begins and ends with hash marks (@samp{#}) is a possible auto-save file
+ name.  The argument @var{filename} should not contain a directory part.
+ 
+ @example
+ @group
+ (make-auto-save-file-name)
+      @result{} "/xcssun/users/rms/lewis/#files.texi#"
+ @end group
+ @group
+ (auto-save-file-name-p "#files.texi#")
+      @result{} 0
+ @end group
+ @group
+ (auto-save-file-name-p "files.texi")
+      @result{} nil
+ @end group
+ @end example
+ 
+ The standard definition of this function is as follows:
+ 
+ @example
+ @group
+ (defun auto-save-file-name-p (filename)
+   "Return non-nil if FILENAME can be yielded by..."
+   (string-match "^#.*#$" filename))
+ @end group
+ @end example
+ 
+ This function exists so that you can customize it if you wish to
+ change the naming convention for auto-save files.  If you redefine it,
+ be sure to redefine the function @code{make-auto-save-file-name}
+ correspondingly.
+ @end defun
+ 
+ @defun make-auto-save-file-name
+ This function returns the file name to use for auto-saving the current
+ buffer.  This is just the file name with hash marks (@samp{#}) appended
+ and prepended to it.  This function does not look at the variable
+ @code{auto-save-visited-file-name} (described below); you should check
+ that before calling this function.
+ 
+ @example
+ @group
+ (make-auto-save-file-name)
+      @result{} "/xcssun/users/rms/lewis/#backup.texi#"
+ @end group
+ @end example
+ 
+ The standard definition of this function is as follows:
+ 
+ @example
+ @group
+ (defun make-auto-save-file-name ()
+   "Return file name to use for auto-saves \
+ of current buffer.
+ @dots{}"
+   (if buffer-file-name
+ @end group
+ @group
+       (concat
+        (file-name-directory buffer-file-name)
+        "#"
+        (file-name-nondirectory buffer-file-name)
+        "#")
+     (expand-file-name
+      (concat "#%" (buffer-name) "#"))))
+ @end group
+ @end example
+ 
+ This exists as a separate function so that you can redefine it to
+ customize the naming convention for auto-save files.  Be sure to
+ change @code{auto-save-file-name-p} in a corresponding way.
+ @end defun
+ 
+ @defvar auto-save-visited-file-name
+ If this variable is non-@code{nil}, Emacs auto-saves buffers in
+ the files they are visiting.  That is, the auto-save is done in the same
+ file that you are editing.  Normally, this variable is @code{nil}, so
+ auto-save files have distinct names that are created by
+ @code{make-auto-save-file-name}.
+ 
+ When you change the value of this variable, the value does not take
+ effect until the next time auto-save mode is reenabled in any given
+ buffer.  If auto-save mode is already enabled, auto-saves continue to go
+ in the same file name until @code{auto-save-mode} is called again.
+ @end defvar
+ 
+ @defun recent-auto-save-p
+ This function returns @code{t} if the current buffer has been
+ auto-saved since the last time it was read in or saved.
+ @end defun
+ 
+ @defun set-buffer-auto-saved
+ This function marks the current buffer as auto-saved.  The buffer will
+ not be auto-saved again until the buffer text is changed again.  The
+ function returns @code{nil}.
+ @end defun
+ 
+ @defopt auto-save-interval
+ The value of this variable is the number of characters that Emacs
+ reads from the keyboard between auto-saves.  Each time this many more
+ characters are read, auto-saving is done for all buffers in which it is
+ enabled.
+ @end defopt
+ 
+ @defopt auto-save-timeout
+ The value of this variable is the number of seconds of idle time that
+ should cause auto-saving.  Each time the user pauses for this long,
+ Emacs auto-saves any buffers that need it.  (Actually, the specified
+ timeout is multiplied by a factor depending on the size of the current
+ buffer.)
+ @end defopt
+ 
+ @defvar auto-save-hook
+ This normal hook is run whenever an auto-save is about to happen.
+ @end defvar
+ 
+ @defopt auto-save-default
+ If this variable is non-@code{nil}, buffers that are visiting files
+ have auto-saving enabled by default.  Otherwise, they do not.
+ @end defopt
+ 
+ @deffn Command do-auto-save &optional no-message current-only
+ This function auto-saves all buffers that need to be auto-saved.  It
+ saves all buffers for which auto-saving is enabled and that have been
+ changed since the previous auto-save.
+ 
+ Normally, if any buffers are auto-saved, a message that says
+ @samp{Auto-saving...} is displayed in the echo area while auto-saving is
+ going on.  However, if @var{no-message} is non-@code{nil}, the message
+ is inhibited.
+ 
+ If @var{current-only} is non-@code{nil}, only the current buffer
+ is auto-saved.
+ @end deffn
+ 
+ @defun delete-auto-save-file-if-necessary
+ This function deletes the current buffer's auto-save file if
+ @code{delete-auto-save-files} is non-@code{nil}.  It is called every
+ time a buffer is saved.
+ @end defun
+ 
+ @defvar delete-auto-save-files
+ This variable is used by the function
+ @code{delete-auto-save-file-if-necessary}.  If it is non-@code{nil},
+ Emacs deletes auto-save files when a true save is done (in the visited
+ file).  This saves disk space and unclutters your directory.
+ @end defvar
+ 
+ @defun rename-auto-save-file
+ This function adjusts the current buffer's auto-save file name if the
+ visited file name has changed.  It also renames an existing auto-save
+ file.  If the visited file name has not changed, this function does
+ nothing.
+ @end defun
+ 
+ @defvar buffer-saved-size
+ The value of this buffer-local variable is the length of the current
+ buffer as of the last time it was read in, saved, or auto-saved.  This is
+ used to detect a substantial decrease in size, and turn off auto-saving
+ in response.
+ 
+ If it is -1, that means auto-saving is temporarily shut off in this
+ buffer due to a substantial deletion.  Explicitly saving the buffer
+ stores a positive value in this variable, thus reenabling auto-saving.
+ Turning auto-save mode off or on also alters this variable.
+ @end defvar
+ 
+ @defvar auto-save-list-file-name
+ This variable (if non-@code{nil}) specifies a file for recording the
+ names of all the auto-save files.  Each time Emacs does auto-saving, it
+ writes two lines into this file for each buffer that has auto-saving
+ enabled.  The first line gives the name of the visited file (it's empty
+ if the buffer has none), and the second gives the name of the auto-save
+ file.
+ 
+ If Emacs exits normally, it deletes this file.  If Emacs crashes, you
+ can look in the file to find all the auto-save files that might contain
+ work that was otherwise lost.  The @code{recover-session} command uses
+ these files.
+ 
+ The default name for this file is in your home directory and starts with
+ @samp{.saves-}.  It also contains the Emacs process @sc{id} and the host
+ name.
+ @end defvar
+ 
+ @node Reverting
+ @section Reverting
+ 
+   If you have made extensive changes to a file and then change your mind
+ about them, you can get rid of them by reading in the previous version
+ of the file with the @code{revert-buffer} command.  @xref{Reverting, ,
+ Reverting a Buffer, emacs, The GNU Emacs Manual}.
+ 
+ @deffn Command revert-buffer &optional check-auto-save noconfirm
+ This command replaces the buffer text with the text of the visited
+ file on disk.  This action undoes all changes since the file was visited
+ or saved.
+ 
+ If the argument @var{check-auto-save} is non-@code{nil}, and the
+ latest auto-save file is more recent than the visited file,
+ @code{revert-buffer} asks the user whether to use that instead.
+ Otherwise, it always uses the text of the visited file itself.
+ Interactively, @var{check-auto-save} is set if there is a numeric prefix
+ argument.
+ 
+ Normally, @code{revert-buffer} asks for confirmation before it changes
+ the buffer; but if the argument @var{noconfirm} is non-@code{nil},
+ @code{revert-buffer} does not ask for confirmation.
+ 
+ Reverting tries to preserve marker positions in the buffer by using the
+ replacement feature of @code{insert-file-contents}.  If the buffer
+ contents and the file contents are identical before the revert
+ operation, reverting preserves all the markers.  If they are not
+ identical, reverting does change the buffer; then it preserves the
+ markers in the unchanged text (if any) at the beginning and end of the
+ buffer.  Preserving any additional markers would be problematical.
+ @end deffn
+ 
+ You can customize how @code{revert-buffer} does its work by setting
+ these variables---typically, as buffer-local variables.
+ 
+ @defvar revert-buffer-function
+ The value of this variable is the function to use to revert this buffer.
+ If non-@code{nil}, it is called as a function with no arguments to do
+ the work of reverting.  If the value is @code{nil}, reverting works the
+ usual way.
+ 
+ Modes such as Dired mode, in which the text being edited does not
+ consist of a file's contents but can be regenerated in some other
+ fashion, give this variable a buffer-local value that is a function to
+ regenerate the contents.
+ @end defvar
+ 
+ @defvar revert-buffer-insert-file-contents-function
+ The value of this variable, if non-@code{nil}, is the function to use to
+ insert the updated contents when reverting this buffer.  The function
+ receives two arguments: first the file name to use; second, @code{t} if
+ the user has asked to read the auto-save file.
+ @end defvar
+ 
+ @defvar before-revert-hook
+ This normal hook is run by @code{revert-buffer} before actually
+ inserting the modified contents---but only if
+ @code{revert-buffer-function} is @code{nil}.
+ 
+ Font Lock mode uses this hook to record that the buffer contents are no
+ longer fontified.
+ @end defvar
+ 
+ @defvar after-revert-hook
+ This normal hook is run by @code{revert-buffer} after actually inserting
+ the modified contents---but only if @code{revert-buffer-function} is
+ @code{nil}.
+ 
+ Font Lock mode uses this hook to recompute the fonts for the updated
+ buffer contents.
+ @end defvar
+ 
Index: emacs/man/elisp-buffers.texi
diff -c /dev/null emacs/man/elisp-buffers.texi:1.2
*** /dev/null	Fri Aug  2 20:46:47 1996
--- emacs/man/elisp-buffers.texi	Thu Aug  1 00:22:24 1996
***************
*** 0 ****
--- 1,896 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/buffers
+ @node Buffers, Windows, Backups and Auto-Saving, Top
+ @chapter Buffers
+ @cindex buffer
+ 
+   A @dfn{buffer} is a Lisp object containing text to be edited.  Buffers
+ are used to hold the contents of files that are being visited; there may
+ also be buffers that are not visiting files.  While several buffers may
+ exist at one time, exactly one buffer is designated the @dfn{current
+ buffer} at any time.  Most editing commands act on the contents of the
+ current buffer.  Each buffer, including the current buffer, may or may
+ not be displayed in any windows.
+ 
+ @menu
+ * Buffer Basics::       What is a buffer?
+ * Current Buffer::      Designating a buffer as current
+                           so primitives will access its contents.
+ * Buffer Names::        Accessing and changing buffer names.
+ * Buffer File Name::    The buffer file name indicates which file is visited.
+ * Buffer Modification:: A buffer is @dfn{modified} if it needs to be saved.
+ * Modification Time::   Determining whether the visited file was changed
+                          ``behind Emacs's back''.
+ * Read Only Buffers::   Modifying text is not allowed in a read-only buffer.
+ * The Buffer List::     How to look at all the existing buffers.
+ * Creating Buffers::    Functions that create buffers.
+ * Killing Buffers::     Buffers exist until explicitly killed.
+ * Indirect Buffers::    An indirect buffer shares text with some other buffer.
+ @end menu
+ 
+ @node Buffer Basics
+ @comment  node-name,  next,  previous,  up
+ @section Buffer Basics
+ 
+ @ifinfo
+   A @dfn{buffer} is a Lisp object containing text to be edited.  Buffers
+ are used to hold the contents of files that are being visited; there may
+ also be buffers that are not visiting files.  While several buffers may
+ exist at one time, exactly one buffer is designated the @dfn{current
+ buffer} at any time.  Most editing commands act on the contents of the
+ current buffer.  Each buffer, including the current buffer, may or may
+ not be displayed in any windows.
+ @end ifinfo
+ 
+   Buffers in Emacs editing are objects that have distinct names and hold
+ text that can be edited.  Buffers appear to Lisp programs as a special
+ data type.  You can think of the contents of a buffer as an extendable
+ string; insertions and deletions may occur in any part of the buffer.
+ @xref{Text}.
+ 
+   A Lisp buffer object contains numerous pieces of information.  Some of
+ this information is directly accessible to the programmer through
+ variables, while other information is accessible only through
+ special-purpose functions.  For example, the visited file name is
+ directly accessible through a variable, while the value of point is
+ accessible only through a primitive function.
+ 
+   Buffer-specific information that is directly accessible is stored in
+ @dfn{buffer-local} variable bindings, which are variable values that are
+ effective only in a particular buffer.  This feature allows each buffer
+ to override the values of certain variables.  Most major modes override
+ variables such as @code{fill-column} or @code{comment-column} in this
+ way.  For more information about buffer-local variables and functions
+ related to them, see @ref{Buffer-Local Variables}.
+ 
+   For functions and variables related to visiting files in buffers, see
+ @ref{Visiting Files} and @ref{Saving Buffers}.  For functions and
+ variables related to the display of buffers in windows, see
+ @ref{Buffers and Windows}.
+ 
+ @defun bufferp object
+ This function returns @code{t} if @var{object} is a buffer,
+ @code{nil} otherwise.
+ @end defun
+ 
+ @node Current Buffer
+ @section The Current Buffer
+ @cindex selecting a buffer
+ @cindex changing to another buffer
+ @cindex current buffer
+ 
+   There are, in general, many buffers in an Emacs session.  At any time,
+ one of them is designated as the @dfn{current buffer}.  This is the
+ buffer in which most editing takes place, because most of the primitives
+ for examining or changing text in a buffer operate implicitly on the
+ current buffer (@pxref{Text}).  Normally the buffer that is displayed on
+ the screen in the selected window is the current buffer, but this is not
+ always so: a Lisp program can designate any buffer as current
+ temporarily in order to operate on its contents, without changing what
+ is displayed on the screen.
+ 
+   The way to designate a current buffer in a Lisp program is by calling
+ @code{set-buffer}.  The specified buffer remains current until a new one
+ is designated.
+ 
+   When an editing command returns to the editor command loop, the
+ command loop designates the buffer displayed in the selected window as
+ current, to prevent confusion: the buffer that the cursor is in when
+ Emacs reads a command is the buffer that the command will apply to.
+ (@xref{Command Loop}.)  Therefore, @code{set-buffer} is not the way to
+ switch visibly to a different buffer so that the user can edit it.  For
+ this, you must use the functions described in @ref{Displaying Buffers}.
+ 
+   However, Lisp functions that change to a different current buffer
+ should not depend on the command loop to set it back afterwards.
+ Editing commands written in Emacs Lisp can be called from other programs
+ as well as from the command loop.  It is convenient for the caller if
+ the subroutine does not change which buffer is current (unless, of
+ course, that is the subroutine's purpose).  Therefore, you should
+ normally use @code{set-buffer} within a @code{save-excursion} that will
+ restore the current buffer when your function is done
+ (@pxref{Excursions}).  Here is an example, the code for the command
+ @code{append-to-buffer} (with the documentation string abridged):
+ 
+ @example
+ @group
+ (defun append-to-buffer (buffer start end)
+   "Append to specified buffer the text of the region.
+ @dots{}"
+   (interactive "BAppend to buffer: \nr")
+   (let ((oldbuf (current-buffer)))
+     (save-excursion
+       (set-buffer (get-buffer-create buffer))
+       (insert-buffer-substring oldbuf start end))))
+ @end group
+ @end example
+ 
+ @noindent
+ This function binds a local variable to the current buffer, and then
+ @code{save-excursion} records the values of point, the mark, and the
+ original buffer.  Next, @code{set-buffer} makes another buffer current.
+ Finally, @code{insert-buffer-substring} copies the string from the
+ original current buffer to the new current buffer.
+ 
+   If the buffer appended to happens to be displayed in some window, 
+ the next redisplay will show how its text has changed.  Otherwise, you
+ will not see the change immediately on the screen.  The buffer becomes
+ current temporarily during the execution of the command, but this does
+ not cause it to be displayed.
+ 
+   If you make local bindings (with @code{let} or function arguments) for
+ a variable that may also have buffer-local bindings, make sure that the
+ same buffer is current at the beginning and at the end of the local
+ binding's scope.  Otherwise you might bind it in one buffer and unbind
+ it in another!  There are two ways to do this.  In simple cases, you may
+ see that nothing ever changes the current buffer within the scope of the
+ binding.  Otherwise, use @code{save-excursion} to make sure that the
+ buffer current at the beginning is current again whenever the variable
+ is unbound.
+ 
+   It is not reliable to change the current buffer back with
+ @code{set-buffer}, because that won't do the job if a quit happens while
+ the wrong buffer is current.  Here is what @emph{not} to do:
+ 
+ @example
+ @group
+ (let (buffer-read-only
+       (obuf (current-buffer)))
+   (set-buffer @dots{})
+   @dots{}
+   (set-buffer obuf))
+ @end group
+ @end example
+ 
+ @noindent
+ Using @code{save-excursion}, as shown below, handles quitting, errors,
+ and @code{throw}, as well as ordinary evaluation.
+ 
+ @example
+ @group
+ (let (buffer-read-only)
+   (save-excursion
+     (set-buffer @dots{})
+     @dots{}))
+ @end group
+ @end example
+ 
+ @defun current-buffer
+ This function returns the current buffer.
+ 
+ @example
+ @group
+ (current-buffer)
+      @result{} #<buffer buffers.texi>
+ @end group
+ @end example
+ @end defun
+ 
+ @defun set-buffer buffer-or-name
+ This function makes @var{buffer-or-name} the current buffer.  It does
+ not display the buffer in the currently selected window or in any other
+ window, so the user cannot necessarily see the buffer.  But Lisp
+ programs can in any case work on it.
+ 
+ This function returns the buffer identified by @var{buffer-or-name}.
+ An error is signaled if @var{buffer-or-name} does not identify an
+ existing buffer.
+ @end defun
+ 
+ @node Buffer Names
+ @section Buffer Names
+ @cindex buffer names
+ 
+   Each buffer has a unique name, which is a string.  Many of the
+ functions that work on buffers accept either a buffer or a buffer name
+ as an argument.  Any argument called @var{buffer-or-name} is of this
+ sort, and an error is signaled if it is neither a string nor a buffer.
+ Any argument called @var{buffer} must be an actual buffer
+ object, not a name.
+ 
+   Buffers that are ephemeral and generally uninteresting to the user
+ have names starting with a space, so that the @code{list-buffers} and
+ @code{buffer-menu} commands don't mention them.  A name starting with
+ space also initially disables recording undo information; see
+ @ref{Undo}.
+ 
+ @defun buffer-name &optional buffer
+ This function returns the name of @var{buffer} as a string.  If
+ @var{buffer} is not supplied, it defaults to the current buffer.
+ 
+ If @code{buffer-name} returns @code{nil}, it means that @var{buffer}
+ has been killed.  @xref{Killing Buffers}.
+ 
+ @example
+ @group
+ (buffer-name)
+      @result{} "buffers.texi"
+ @end group
+ 
+ @group
+ (setq foo (get-buffer "temp"))
+      @result{} #<buffer temp>
+ @end group
+ @group
+ (kill-buffer foo)
+      @result{} nil
+ @end group
+ @group
+ (buffer-name foo)
+      @result{} nil
+ @end group
+ @group
+ foo
+      @result{} #<killed buffer>
+ @end group
+ @end example
+ @end defun
+ 
+ @deffn Command rename-buffer newname &optional unique
+ This function renames the current buffer to @var{newname}.  An error
+ is signaled if @var{newname} is not a string, or if there is already a
+ buffer with that name.  The function returns @code{nil}.
+ 
+ @c Emacs 19 feature
+ Ordinarily, @code{rename-buffer} signals an error if @var{newname} is
+ already in use.  However, if @var{unique} is non-@code{nil}, it modifies
+ @var{newname} to make a name that is not in use.  Interactively, you can
+ make @var{unique} non-@code{nil} with a numeric prefix argument.
+ 
+ One application of this command is to rename the @samp{*shell*} buffer
+ to some other name, thus making it possible to create a second shell
+ buffer under the name @samp{*shell*}.
+ @end deffn
+ 
+ @defun get-buffer buffer-or-name
+ This function returns the buffer specified by @var{buffer-or-name}.
+ If @var{buffer-or-name} is a string and there is no buffer with that
+ name, the value is @code{nil}.  If @var{buffer-or-name} is a buffer, it
+ is returned as given.  (That is not very useful, so the argument is usually 
+ a name.)  For example:
+ 
+ @example
+ @group
+ (setq b (get-buffer "lewis"))
+      @result{} #<buffer lewis>
+ @end group
+ @group
+ (get-buffer b)
+      @result{} #<buffer lewis>
+ @end group
+ @group
+ (get-buffer "Frazzle-nots")
+      @result{} nil
+ @end group
+ @end example
+ 
+ See also the function @code{get-buffer-create} in @ref{Creating Buffers}.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun generate-new-buffer-name starting-name
+ This function returns a name that would be unique for a new buffer---but
+ does not create the buffer.  It starts with @var{starting-name}, and
+ produces a name not currently in use for any buffer by appending a
+ number inside of @samp{<@dots{}>}.
+ 
+ See the related function @code{generate-new-buffer} in @ref{Creating
+ Buffers}.
+ @end defun
+ 
+ @node Buffer File Name
+ @section Buffer File Name
+ @cindex visited file
+ @cindex buffer file name
+ @cindex file name of buffer
+ 
+   The @dfn{buffer file name} is the name of the file that is visited in
+ that buffer.  When a buffer is not visiting a file, its buffer file name
+ is @code{nil}.  Most of the time, the buffer name is the same as the
+ nondirectory part of the buffer file name, but the buffer file name and
+ the buffer name are distinct and can be set independently.
+ @xref{Visiting Files}.
+ 
+ @defun buffer-file-name &optional buffer
+ This function returns the absolute file name of the file that
+ @var{buffer} is visiting.  If @var{buffer} is not visiting any file,
+ @code{buffer-file-name} returns @code{nil}.  If @var{buffer} is not
+ supplied, it defaults to the current buffer.
+ 
+ @example
+ @group
+ (buffer-file-name (other-buffer))
+      @result{} "/usr/user/lewis/manual/files.texi"
+ @end group
+ @end example
+ @end defun
+ 
+ @defvar buffer-file-name
+ This buffer-local variable contains the name of the file being visited
+ in the current buffer, or @code{nil} if it is not visiting a file.  It
+ is a permanent local, unaffected by @code{kill-local-variables}.
+ 
+ @example
+ @group
+ buffer-file-name
+      @result{} "/usr/user/lewis/manual/buffers.texi"
+ @end group
+ @end example
+ 
+ It is risky to change this variable's value without doing various other
+ things.  See the definition of @code{set-visited-file-name} in
+ @file{files.el}; some of the things done there, such as changing the
+ buffer name, are not strictly necessary, but others are essential to
+ avoid confusing Emacs.
+ @end defvar
+ 
+ @defvar buffer-file-truename
+ This buffer-local variable holds the truename of the file visited in the
+ current buffer, or @code{nil} if no file is visited.  It is a permanent
+ local, unaffected by @code{kill-local-variables}.  @xref{Truenames}.
+ @end defvar
+ 
+ @defvar buffer-file-number
+ This buffer-local variable holds the file number and directory device
+ number of the file visited in the current buffer, or @code{nil} if no
+ file or a nonexistent file is visited.  It is a permanent local,
+ unaffected by @code{kill-local-variables}.  @xref{Truenames}.
+ 
+ The value is normally a list of the form @code{(@var{filenum}
+ @var{devnum})}.  This pair of numbers uniquely identifies the file among
+ all files accessible on the system.  See the function
+ @code{file-attributes}, in @ref{File Attributes}, for more information
+ about them.
+ @end defvar
+ 
+ @defun get-file-buffer filename
+ This function returns the buffer visiting file @var{filename}.  If
+ there is no such buffer, it returns @code{nil}.  The argument
+ @var{filename}, which must be a string, is expanded (@pxref{File Name
+ Expansion}), then compared against the visited file names of all live
+ buffers.
+ 
+ @example
+ @group
+ (get-file-buffer "buffers.texi")
+     @result{} #<buffer buffers.texi>
+ @end group
+ @end example
+ 
+ In unusual circumstances, there can be more than one buffer visiting
+ the same file name.  In such cases, this function returns the first
+ such buffer in the buffer list.
+ @end defun
+ 
+ @deffn Command set-visited-file-name filename
+ If @var{filename} is a non-empty string, this function changes the
+ name of the file visited in current buffer to @var{filename}.  (If the
+ buffer had no visited file, this gives it one.)  The @emph{next time}
+ the buffer is saved it will go in the newly-specified file.  This
+ command marks the buffer as modified, since it does not (as far as Emacs
+ knows) match the contents of @var{filename}, even if it matched the
+ former visited file.
+ 
+ If @var{filename} is @code{nil} or the empty string, that stands for
+ ``no visited file''.  In this case, @code{set-visited-file-name} marks
+ the buffer as having no visited file.
+ 
+ @c Wordy to avoid overfull hbox.  --rjc 16mar92
+ When the function @code{set-visited-file-name} is called interactively, it
+ prompts for @var{filename} in the minibuffer.
+ 
+ See also @code{clear-visited-file-modtime} and
+ @code{verify-visited-file-modtime} in @ref{Buffer Modification}.
+ @end deffn
+ 
+ @defvar list-buffers-directory
+ This buffer-local variable records a string to display in a buffer
+ listing in place of the visited file name, for buffers that don't have a
+ visited file name.  Dired buffers use this variable.
+ @end defvar
+ 
+ @node Buffer Modification
+ @section Buffer Modification
+ @cindex buffer modification
+ @cindex modification flag (of buffer)
+ 
+   Emacs keeps a flag called the @dfn{modified flag} for each buffer, to
+ record whether you have changed the text of the buffer.  This flag is
+ set to @code{t} whenever you alter the contents of the buffer, and
+ cleared to @code{nil} when you save it.  Thus, the flag shows whether
+ there are unsaved changes.  The flag value is normally shown in the mode
+ line (@pxref{Mode Line Variables}), and controls saving (@pxref{Saving
+ Buffers}) and auto-saving (@pxref{Auto-Saving}).
+ 
+   Some Lisp programs set the flag explicitly.  For example, the function
+ @code{set-visited-file-name} sets the flag to @code{t}, because the text
+ does not match the newly-visited file, even if it is unchanged from the
+ file formerly visited.
+ 
+   The functions that modify the contents of buffers are described in
+ @ref{Text}.
+ 
+ @defun buffer-modified-p &optional buffer
+ This function returns @code{t} if the buffer @var{buffer} has been modified
+ since it was last read in from a file or saved, or @code{nil}
+ otherwise.  If @var{buffer} is not supplied, the current buffer
+ is tested.
+ @end defun
+ 
+ @defun set-buffer-modified-p flag
+ This function marks the current buffer as modified if @var{flag} is
+ non-@code{nil}, or as unmodified if the flag is @code{nil}.
+ 
+ Another effect of calling this function is to cause unconditional
+ redisplay of the mode line for the current buffer.  In fact, the
+ function @code{force-mode-line-update} works by doing this:
+ 
+ @example
+ @group
+ (set-buffer-modified-p (buffer-modified-p))
+ @end group
+ @end example
+ @end defun
+ 
+ @deffn Command not-modified
+ This command marks the current buffer as unmodified, and not needing
+ to be saved.  Don't use this function in programs, since it prints a
+ message in the echo area; use @code{set-buffer-modified-p} (above) instead.
+ @end deffn
+ 
+ @c Emacs 19 feature
+ @defun buffer-modified-tick &optional buffer
+ This function returns @var{buffer}`s modification-count.  This is a
+ counter that increments every time the buffer is modified.  If
+ @var{buffer} is @code{nil} (or omitted), the current buffer is used.
+ @end defun
+ 
+ @node Modification Time
+ @comment  node-name,  next,  previous,  up
+ @section Comparison of Modification Time
+ @cindex comparison of modification time
+ @cindex modification time, comparison of 
+ 
+   Suppose that you visit a file and make changes in its buffer, and
+ meanwhile the file itself is changed on disk.  At this point, saving the
+ buffer would overwrite the changes in the file.  Occasionally this may
+ be what you want, but usually it would lose valuable information.  Emacs
+ therefore checks the file's modification time using the functions
+ described below before saving the file.
+ 
+ @defun verify-visited-file-modtime buffer
+ This function compares what @var{buffer} has recorded for the
+ modification time of its visited file against the actual modification
+ time of the file as recorded by the operating system.  The two should be
+ the same unless some other process has written the file since Emacs
+ visited or saved it.
+ 
+ The function returns @code{t} if the last actual modification time and
+ Emacs's recorded modification time are the same, @code{nil} otherwise.
+ @end defun
+ 
+ @defun clear-visited-file-modtime
+ This function clears out the record of the last modification time of
+ the file being visited by the current buffer.  As a result, the next
+ attempt to save this buffer will not complain of a discrepancy in
+ file modification times.
+ 
+ This function is called in @code{set-visited-file-name} and other
+ exceptional places where the usual test to avoid overwriting a changed
+ file should not be done.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun visited-file-modtime
+ This function returns the buffer's recorded last file modification time,
+ as a list of the form @code{(@var{high} . @var{low})}.  (This is the
+ same format that @code{file-attributes} uses to return time values; see
+ @ref{File Attributes}.)
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun set-visited-file-modtime &optional time
+ This function updates the buffer's record of the last modification time
+ of the visited file, to the value specified by @var{time} if @var{time}
+ is not @code{nil}, and otherwise to the last modification time of the
+ visited file.
+ 
+ If @var{time} is not @code{nil}, it should have the form
+ @code{(@var{high} . @var{low})} or @code{(@var{high} @var{low})}, in
+ either case containing two integers, each of which holds 16 bits of the
+ time.
+ 
+ This function is useful if the buffer was not read from the file
+ normally, or if the file itself has been changed for some known benign
+ reason.
+ @end defun
+ 
+ @defun ask-user-about-supersession-threat filename
+ @cindex obsolete buffer
+ This function is used to ask a user how to proceed after an attempt to
+ modify an obsolete buffer visiting file @var{filename}.  An
+ @dfn{obsolete buffer} is an unmodified buffer for which the associated
+ file on disk is newer than the last save-time of the buffer.  This means
+ some other program has probably altered the file.
+ 
+ @kindex file-supersession
+ Depending on the user's answer, the function may return normally, in
+ which case the modification of the buffer proceeds, or it may signal a
+ @code{file-supersession} error with data @code{(@var{filename})}, in which
+ case the proposed buffer modification is not allowed.  
+ 
+ This function is called automatically by Emacs on the proper
+ occasions.  It exists so you can customize Emacs by redefining it.
+ See the file @file{userlock.el} for the standard definition.
+ 
+ See also the file locking mechanism in @ref{File Locks}.
+ @end defun
+ 
+ @node Read Only Buffers
+ @section Read-Only Buffers
+ @cindex read-only buffer
+ @cindex buffer, read-only
+ 
+   If a buffer is @dfn{read-only}, then you cannot change its contents,
+ although you may change your view of the contents by scrolling and 
+ narrowing.
+ 
+   Read-only buffers are used in two kinds of situations:
+ 
+ @itemize @bullet
+ @item
+ A buffer visiting a write-protected file is normally read-only.
+ 
+ Here, the purpose is to show the user that editing the buffer with the
+ aim of saving it in the file may be futile or undesirable.  The user who
+ wants to change the buffer text despite this can do so after clearing
+ the read-only flag with @kbd{C-x C-q}.
+ 
+ @item
+ Modes such as Dired and Rmail make buffers read-only when altering the
+ contents with the usual editing commands is probably a mistake.
+ 
+ The special commands of these modes bind @code{buffer-read-only} to
+ @code{nil} (with @code{let}) or bind @code{inhibit-read-only} to
+ @code{t} around the places where they change the text.
+ @end itemize
+ 
+ @defvar buffer-read-only
+ This buffer-local variable specifies whether the buffer is read-only.
+ The buffer is read-only if this variable is non-@code{nil}.
+ @end defvar
+ 
+ @defvar inhibit-read-only
+ If this variable is non-@code{nil}, then read-only buffers and read-only
+ characters may be modified.  Read-only characters in a buffer are those
+ that have non-@code{nil} @code{read-only} properties (either text
+ properties or overlay properties).  @xref{Special Properties}, for more
+ information about text properties.  @xref{Overlays}, for more
+ information about overlays and their properties.
+ 
+ If @code{inhibit-read-only} is @code{t}, all @code{read-only} character
+ properties have no effect.  If @code{inhibit-read-only} is a list, then
+ @code{read-only} character properties have no effect if they are members
+ of the list (comparison is done with @code{eq}).
+ @end defvar
+ 
+ @deffn Command toggle-read-only
+ This command changes whether the current buffer is read-only.  It is
+ intended for interactive use; don't use it in programs.  At any given
+ point in a program, you should know whether you want the read-only flag
+ on or off; so you can set @code{buffer-read-only} explicitly to the
+ proper value, @code{t} or @code{nil}.
+ @end deffn
+ 
+ @defun barf-if-buffer-read-only
+ This function signals a @code{buffer-read-only} error if the current
+ buffer is read-only.  @xref{Interactive Call}, for another way to
+ signal an error if the current buffer is read-only.
+ @end defun
+ 
+ @node The Buffer List
+ @section The Buffer List
+ @cindex buffer list
+ 
+   The @dfn{buffer list} is a list of all live buffers.  Creating a
+ buffer adds it to this list, and killing a buffer deletes it.  The order
+ of the buffers in the list is based primarily on how recently each
+ buffer has been displayed in the selected window.  Buffers move to the
+ front of the list when they are selected and to the end when they are
+ buried.  Several functions, notably @code{other-buffer}, use this
+ ordering.  A buffer list displayed for the user also follows this order.
+ 
+ @defun buffer-list
+ This function returns a list of all buffers, including those whose names
+ begin with a space.  The elements are actual buffers, not their names.
+ 
+ @example
+ @group
+ (buffer-list)
+      @result{} (#<buffer buffers.texi>
+          #<buffer  *Minibuf-1*> #<buffer buffer.c>
+          #<buffer *Help*> #<buffer TAGS>)
+ @end group
+ 
+ @group
+ ;; @r{Note that the name of the minibuffer}
+ ;;   @r{begins with a space!}
+ (mapcar (function buffer-name) (buffer-list))
+     @result{} ("buffers.texi" " *Minibuf-1*" 
+         "buffer.c" "*Help*" "TAGS")
+ @end group
+ @end example
+ 
+ This list is a copy of a list used inside Emacs; modifying it has no
+ effect on the ordering of buffers.
+ @end defun
+ 
+ @defun other-buffer &optional buffer-or-name visible-ok
+ This function returns the first buffer in the buffer list other than
+ @var{buffer-or-name}.  Usually this is the buffer most recently shown in
+ the selected window, aside from @var{buffer-or-name}.  Buffers whose
+ names start with a space are not considered.
+ 
+ If @var{buffer-or-name} is not supplied (or if it is not a buffer),
+ then @code{other-buffer} returns the first buffer on the buffer list
+ that is not visible in any window in a visible frame.
+ 
+ If the selected frame has a non-@code{nil} @code{buffer-predicate}
+ parameter, then @code{other-buffer} uses that predicate to decide which
+ buffers to consider.  It calls the predicate once for each buffer, and
+ if the value is @code{nil}, that buffer is ignored.  @xref{X Frame
+ Parameters}.
+ 
+ @c Emacs 19 feature
+ If @var{visible-ok} is @code{nil}, @code{other-buffer} avoids returning
+ a buffer visible in any window on any visible frame, except as a last
+ resort.   If @var{visible-ok} is non-@code{nil}, then it does not matter
+ whether a buffer is displayed somewhere or not.
+ 
+ If no suitable buffer exists, the buffer @samp{*scratch*} is returned
+ (and created, if necessary).
+ @end defun
+ 
+ @deffn Command bury-buffer &optional buffer-or-name
+ This function puts @var{buffer-or-name} at the end of the buffer list
+ without changing the order of any of the other buffers on the list.
+ This buffer therefore becomes the least desirable candidate for
+ @code{other-buffer} to return.
+ 
+ If @var{buffer-or-name} is @code{nil} or omitted, this means to bury the
+ current buffer.  In addition, if the buffer is displayed in the selected
+ window, this switches to some other buffer (obtained using
+ @code{other-buffer}) in the selected window.  But if the buffer is
+ displayed in some other window, it remains displayed there.
+ 
+ If you wish to replace a buffer in all the windows that display it, use
+ @code{replace-buffer-in-windows}.  @xref{Buffers and Windows}.
+ @end deffn
+ 
+ @node Creating Buffers
+ @section Creating Buffers
+ @cindex creating buffers
+ @cindex buffers, creating
+ 
+   This section describes the two primitives for creating buffers.
+ @code{get-buffer-create} creates a buffer if it finds no existing buffer
+ with the specified name; @code{generate-new-buffer} always creates a new
+ buffer and gives it a unique name.
+ 
+   Other functions you can use to create buffers include
+ @code{with-output-to-temp-buffer} (@pxref{Temporary Displays}) and
+ @code{create-file-buffer} (@pxref{Visiting Files}).  Starting a
+ subprocess can also create a buffer (@pxref{Processes}).
+ 
+ @defun get-buffer-create name
+ This function returns a buffer named @var{name}.  It returns an existing
+ buffer with that name, if one exists; otherwise, it creates a new
+ buffer.  The buffer does not become the current buffer---this function
+ does not change which buffer is current.
+ 
+ An error is signaled if @var{name} is not a string.
+ 
+ @example
+ @group
+ (get-buffer-create "foo")
+      @result{} #<buffer foo>
+ @end group
+ @end example
+ 
+ The major mode for the new buffer is set to Fundamental mode.  The
+ variable @code{default-major-mode} is handled at a higher level.
+ @xref{Auto Major Mode}.
+ @end defun
+ 
+ @defun generate-new-buffer name
+ This function returns a newly created, empty buffer, but does not make
+ it current.  If there is no buffer named @var{name}, then that is the
+ name of the new buffer.  If that name is in use, this function adds
+ suffixes of the form @samp{<@var{n}>} to @var{name}, where @var{n} is an
+ integer.  It tries successive integers starting with 2 until it finds an
+ available name.
+ 
+ An error is signaled if @var{name} is not a string.
+ 
+ @example
+ @group
+ (generate-new-buffer "bar")
+      @result{} #<buffer bar>
+ @end group
+ @group
+ (generate-new-buffer "bar")
+      @result{} #<buffer bar<2>>
+ @end group
+ @group
+ (generate-new-buffer "bar")
+      @result{} #<buffer bar<3>>
+ @end group
+ @end example
+ 
+ The major mode for the new buffer is set to Fundamental mode.  The
+ variable @code{default-major-mode} is handled at a higher level.
+ @xref{Auto Major Mode}.
+ 
+ See the related function @code{generate-new-buffer-name} in @ref{Buffer
+ Names}.
+ @end defun
+ 
+ @node Killing Buffers
+ @section Killing Buffers
+ @cindex killing buffers
+ @cindex buffers, killing
+ 
+   @dfn{Killing a buffer} makes its name unknown to Emacs and makes its
+ text space available for other use.
+ 
+   The buffer object for the buffer that has been killed remains in
+ existence as long as anything refers to it, but it is specially marked
+ so that you cannot make it current or display it.  Killed buffers retain
+ their identity, however; two distinct buffers, when killed, remain
+ distinct according to @code{eq}.
+ 
+   If you kill a buffer that is current or displayed in a window, Emacs
+ automatically selects or displays some other buffer instead.  This means
+ that killing a buffer can in general change the current buffer.
+ Therefore, when you kill a buffer, you should also take the precautions
+ associated with changing the current buffer (unless you happen to know
+ that the buffer being killed isn't current).  @xref{Current Buffer}.
+ 
+   If you kill a buffer that is the base buffer of one or more indirect
+ buffers, the indirect buffers are automatically killed as well.
+ 
+   The @code{buffer-name} of a killed buffer is @code{nil}.  You can use
+ this feature to test whether a buffer has been killed:
+ 
+ @example
+ @group
+ (defun buffer-killed-p (buffer)
+   "Return t if BUFFER is killed."
+   (not (buffer-name buffer)))
+ @end group
+ @end example
+ 
+ @deffn Command kill-buffer buffer-or-name
+ This function kills the buffer @var{buffer-or-name}, freeing all its
+ memory for use as space for other buffers.  (Emacs version 18 and older
+ was unable to return the memory to the operating system.)  It returns
+ @code{nil}.
+ 
+ Any processes that have this buffer as the @code{process-buffer} are
+ sent the @code{SIGHUP} signal, which normally causes them to terminate.
+ (The basic meaning of @code{SIGHUP} is that a dialup line has been
+ disconnected.)  @xref{Deleting Processes}.
+ 
+ If the buffer is visiting a file and contains unsaved changes,
+ @code{kill-buffer} asks the user to confirm before the buffer is killed.
+ It does this even if not called interactively.  To prevent the request
+ for confirmation, clear the modified flag before calling
+ @code{kill-buffer}.  @xref{Buffer Modification}.
+ 
+ Killing a buffer that is already dead has no effect.
+ 
+ @smallexample
+ (kill-buffer "foo.unchanged")
+      @result{} nil
+ (kill-buffer "foo.changed")
+ 
+ ---------- Buffer: Minibuffer ----------
+ Buffer foo.changed modified; kill anyway? (yes or no) @kbd{yes}
+ ---------- Buffer: Minibuffer ----------
+ 
+      @result{} nil
+ @end smallexample
+ @end deffn
+ 
+ @defvar kill-buffer-query-functions
+ After confirming unsaved changes, @code{kill-buffer} calls the functions
+ in the list @code{kill-buffer-query-functions}, in order of appearance,
+ with no arguments.  The buffer being killed is the current buffer when
+ they are called.  The idea is that these functions ask for confirmation
+ from the user for various nonstandard reasons.  If any of them returns
+ @code{nil}, @code{kill-buffer} spares the buffer's life.
+ @end defvar
+ 
+ @defvar kill-buffer-hook
+ This is a normal hook run by @code{kill-buffer} after asking all the
+ questions it is going to ask, just before actually killing the buffer.
+ The buffer to be killed is current when the hook functions run.
+ @xref{Hooks}.
+ @end defvar
+ 
+ @defvar buffer-offer-save
+ This variable, if non-@code{nil} in a particular buffer, tells
+ @code{save-buffers-kill-emacs} and @code{save-some-buffers} to offer to
+ save that buffer, just as they offer to save file-visiting buffers.  The
+ variable @code{buffer-offer-save} automatically becomes buffer-local
+ when set for any reason.  @xref{Buffer-Local Variables}.
+ @end defvar
+ 
+ @node Indirect Buffers
+ @section Indirect Buffers
+ @cindex indirect buffers
+ @cindex base buffer
+ 
+   An @dfn{indirect buffer} shares the text of some other buffer, which
+ is called the @dfn{base buffer} of the indirect buffer.  In some ways it
+ is the analogue, for buffers, of a symbolic link among files.  The base
+ buffer may not itself be an indirect buffer.
+ 
+   The text of the indirect buffer is always identical to the text of its
+ base buffer; changes made by editing either one are visible immediately
+ in the other.  This includes the text properties as well as the characters
+ themselves.
+ 
+   But in all other respects, the indirect buffer and its base buffer are
+ completely separate.  They have different names, different values of
+ point, different narrowing, different markers and overlays (though
+ inserting or deleting text in either buffer relocates the markers and
+ overlays for both), different major modes, and different local
+ variables.
+ 
+   An indirect buffer cannot visit a file, but its base buffer can.  If
+ you try to save the indirect buffer, that actually works by saving the
+ base buffer.
+ 
+   Killing an indirect buffer has no effect on its base buffer.  Killing
+ the base buffer effectively kills the indirect buffer in that it cannot
+ ever again be the current buffer.
+ 
+ @deffn Command make-indirect-buffer base-buffer name
+ This creates an indirect buffer named @var{name} whose base buffer
+ is @var{base-buffer}.  The argument @var{base-buffer} may be a buffer
+ or a string.
+  
+ If @var{base-buffer} is an indirect buffer, its base buffer is used as
+ the base for the new buffer.
+ @end deffn
+ 
+ @defun buffer-base-buffer buffer
+ This function returns the base buffer of @var{buffer}.  If @var{buffer}
+ is not indirect, the value is @code{nil}.  Otherwise, the value is
+ another buffer, which is never an indirect buffer.
+ @end defun
+ 
Index: emacs/man/elisp-calendar.texi
diff -c /dev/null emacs/man/elisp-calendar.texi:1.2
*** /dev/null	Fri Aug  2 20:47:19 1996
--- emacs/man/elisp-calendar.texi	Thu Aug  1 00:22:26 1996
***************
*** 0 ****
--- 1,908 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @node Calendar, Tips, Display, Top
+ @chapter Customizing the Calendar and Diary
+ 
+   There are many customizations that you can use to make the calendar and
+ diary suit your personal tastes.
+ 
+ @menu
+ * Calendar Customizing::   Defaults you can set.
+ * Holiday Customizing::    Defining your own holidays.
+ * Date Display Format::    Changing the format.
+ * Time Display Format::    Changing the format.
+ * Daylight Savings::       Changing the default.
+ * Diary Customizing::      Defaults you can set.
+ * Hebrew/Islamic Entries:: How to obtain them.
+ * Fancy Diary Display::    Enhancing the diary display, sorting entries, 
+                              using included diary files.
+ * Sexp Diary Entries::     Fancy things you can do.
+ * Appt Customizing::	   Customizing appointment reminders.
+ @end menu
+ 
+ @node Calendar Customizing
+ @section Customizing the Calendar
+ @vindex view-diary-entries-initially
+ 
+   If you set the variable @code{view-diary-entries-initially} to
+ @code{t}, calling up the calendar automatically displays the diary
+ entries for the current date as well.  The diary dates appear only if
+ the current date is visible.  If you add both of the following lines to
+ your @file{.emacs} file:@refill
+ 
+ @example
+ (setq view-diary-entries-initially t)
+ (calendar)
+ @end example
+ 
+ @noindent
+ this displays both the calendar and diary windows whenever you start Emacs.
+ 
+ @vindex view-calendar-holidays-initially
+   Similarly, if you set the variable
+ @code{view-calendar-holidays-initially} to @code{t}, entering the
+ calendar automatically displays a list of holidays for the current
+ three-month period.  The holiday list appears in a separate
+ window.
+ 
+ @vindex mark-diary-entries-in-calendar
+   You can set the variable @code{mark-diary-entries-in-calendar} to
+ @code{t} in order to mark any dates with diary entries.  This takes
+ effect whenever the calendar window contents are recomputed.  There are
+ two ways of marking these dates: by changing the face (@pxref{Faces}),
+ if the display supports that, or by placing a plus sign (@samp{+})
+ beside the date otherwise.
+ 
+ @vindex mark-holidays-in-calendar
+   Similarly, setting the variable @code{mark-holidays-in-calendar} to
+ @code{t} marks holiday dates, either with a change of face or with an
+ asterisk (@samp{*}).
+ 
+ @vindex calendar-holiday-marker
+ @vindex diary-entry-marker
+   The variable @code{calendar-holiday-marker} specifies how to mark a
+ date as being a holiday.  Its value may be a character to insert next to
+ the date, or a face name to use for displaying the date.  Likewise, the
+ variable @code{diary-entry-marker} specifies how to mark a date that has
+ diary entries.  The calendar creates faces named @code{holiday-face} and
+ @code{diary-face} for these purposes; those symbols are the default
+ values of these variables, when Emacs supports multiple faces on your
+ terminal.
+ 
+ @vindex calendar-load-hook
+   The variable @code{calendar-load-hook} is a normal hook run when the
+ calendar package is first loaded (before actually starting to display
+ the calendar).
+ 
+ @vindex initial-calendar-window-hook
+   Starting the calendar runs the normal hook
+ @code{initial-calendar-window-hook}.  Recomputation of the calendar
+ display does not run this hook.  But if you leave the calendar with the
+ @kbd{q} command and reenter it, the hook runs again.@refill
+ 
+ @vindex today-visible-calendar-hook
+   The variable @code{today-visible-calendar-hook} is a normal hook run
+ after the calendar buffer has been prepared with the calendar when the
+ current date is visible in the window.  One use of this hook is to
+ replace today's date with asterisks; to do that, use the hook function
+ @code{calendar-star-date}.
+ 
+ @findex calendar-star-date
+ @example
+ (add-hook 'today-visible-calendar-hook 'calendar-star-date)
+ @end example
+ 
+ @noindent
+ Another standard hook function marks the current date, either by
+ changing its face or by adding an asterisk.  Here's how to use it:
+ 
+ @findex calendar-mark-today
+ @example
+ (add-hook 'today-visible-calendar-hook 'calendar-mark-today)
+ @end example
+ 
+ @noindent
+ @vindex calendar-today-marker
+ The variable @code{calendar-today-marker} specifies how to mark today's
+ date.  Its value should be a character to insert next to the date or a
+ face name to use for displaying the date.  A face named
+ @code{calendar-today-face} is provided for this purpose; that symbol is
+ the default for this variable when Emacs supports multiple faces on your
+ terminal.
+ 
+ @vindex today-invisible-calendar-hook
+ @noindent
+   A similar normal hook, @code{today-invisible-calendar-hook} is run if
+ the current date is @emph{not} visible in the window.
+ 
+ @node Holiday Customizing
+ @section Customizing the Holidays
+ 
+ @vindex calendar-holidays
+ @vindex christian-holidays
+ @vindex hebrew-holidays
+ @vindex islamic-holidays
+   Emacs knows about holidays defined by entries on one of several lists.
+ You can customize these lists of holidays to your own needs, adding or
+ deleting holidays.  The lists of holidays that Emacs uses are for
+ general holidays (@code{general-holidays}), local holidays
+ (@code{local-holidays}), Christian holidays (@code{christian-holidays}),
+ Hebrew (Jewish) holidays (@code{hebrew-holidays}), Islamic (Moslem)
+ holidays (@code{islamic-holidays}), and other holidays
+ (@code{other-holidays}).
+ 
+ @vindex general-holidays
+   The general holidays are, by default, holidays common throughout the
+ United States.  To eliminate these holidays, set @code{general-holidays}
+ to @code{nil}.
+ 
+ @vindex local-holidays
+   There are no default local holidays (but sites may supply some).  You
+ can set the variable @code{local-holidays} to any list of holidays, as
+ described below.
+ 
+ @vindex all-christian-calendar-holidays
+ @vindex all-hebrew-calendar-holidays
+ @vindex all-islamic-calendar-holidays
+   By default, Emacs does not include all the holidays of the religions
+ that it knows, only those commonly found in secular calendars.  For a
+ more extensive collection of religious holidays, you can set any (or
+ all) of the variables @code{all-christian-calendar-holidays},
+ @code{all-hebrew-calendar-holidays}, or
+ @code{all-islamic-calendar-holidays} to @code{t}.  If you want to
+ eliminate the religious holidays, set any or all of the corresponding
+ variables @code{christian-holidays}, @code{hebrew-holidays}, and
+ @code{islamic-holidays} to @code{nil}.@refill
+ 
+ @vindex other-holidays
+   You can set the variable @code{other-holidays} to any list of
+ holidays.  This list, normally empty, is intended for individual use.
+ 
+ @cindex holiday forms
+   Each of the lists (@code{general-holidays}, @code{local-holidays},
+ @code{christian-holidays}, @code{hebrew-holidays},
+ @code{islamic-holidays}, and @code{other-holidays}) is a list of
+ @dfn{holiday forms}, each holiday form describing a holiday (or
+ sometimes a list of holidays).
+ 
+   Here is a table of the possible kinds of holiday form.  Day numbers
+ and month numbers count starting from 1, but ``dayname'' numbers
+ count Sunday as 0.  The element @var{string} is always the
+ name of the holiday, as a string.
+ 
+ @table @code
+ @item (holiday-fixed @var{month} @var{day} @var{string})
+ A fixed date on the Gregorian calendar.
+ 
+ @item (holiday-float @var{month} @var{dayname} @var{k} @var{string})
+ The @var{k}th @var{dayname} in @var{month} on the Gregorian calendar
+ (@var{dayname}=0 for Sunday, and so on); negative @var{k} means count back
+ from the end of the month.
+ 
+ @item (holiday-hebrew @var{month} @var{day} @var{string})
+ A fixed date on the Hebrew calendar.
+ 
+ @item (holiday-islamic @var{month} @var{day} @var{string})
+ A fixed date on the Islamic calendar.
+ 
+ @item (holiday-julian @var{month} @var{day} @var{string})
+ A fixed date on the Julian calendar.
+ 
+ @item (holiday-sexp @var{sexp} @var{string})
+ A date calculated by the Lisp expression @var{sexp}.  The expression
+ should use the variable @code{year} to compute and return the date of a
+ holiday, or @code{nil} if the holiday doesn't happen this year.  The
+ value of @var{sexp} must represent the date as a list of the form
+ @code{(@var{month} @var{day} @var{year})}.
+ 
+ @item (if @var{condition} @var{holiday-form})
+ A holiday that happens only if @var{condition} is true.
+ 
+ @item (@var{function} @r{[}@var{args}@r{]})
+ A list of dates calculated by the function @var{function}, called with
+ arguments @var{args}.
+ @end table
+ 
+   For example, suppose you want to add Bastille Day, celebrated in
+ France on July 14.  You can do this as follows:
+ 
+ @smallexample
+ (setq other-holidays '((holiday-fixed 7 14 "Bastille Day")))
+ @end smallexample
+ 
+ @noindent
+ The holiday form @code{(holiday-fixed 7 14 "Bastille Day")} specifies the
+ fourteenth day of the seventh month (July).
+ 
+   Many holidays occur on a specific day of the week, at a specific time
+ of month.  Here is a holiday form describing Hurricane Supplication Day,
+ celebrated in the Virgin Islands on the fourth Monday in August:
+ 
+ @smallexample
+ (holiday-float 8 1 4 "Hurricane Supplication Day")
+ @end smallexample
+ 
+ @noindent
+ Here the 8 specifies August, the 1 specifies Monday (Sunday is 0,
+ Tuesday is 2, and so on), and the 4 specifies the fourth occurrence in
+ the month (1 specifies the first occurrence, 2 the second occurrence,
+ @minus{}1 the last occurrence, @minus{}2 the second-to-last occurrence, and
+ so on).
+ 
+   You can specify holidays that occur on fixed days of the Hebrew,
+ Islamic, and Julian calendars too.  For example,
+ 
+ @smallexample
+ (setq other-holidays
+       '((holiday-hebrew 10 2 "Last day of Hanukkah")
+         (holiday-islamic 3 12 "Mohammed's Birthday")
+         (holiday-julian 4 2 "Jefferson's Birthday")))
+ @end smallexample
+ 
+ @noindent
+ adds the last day of Hanukkah (since the Hebrew months are numbered with
+ 1 starting from Nisan), the Islamic feast celebrating Mohammed's
+ birthday (since the Islamic months are numbered from 1 starting with
+ Muharram), and Thomas Jefferson's birthday, which is 2 April 1743 on the
+ Julian calendar.
+ 
+   To include a holiday conditionally, use either Emacs Lisp's @code{if} or the
+ @code{holiday-sexp} form.  For example, American presidential elections
+ occur on the first Tuesday after the first Monday in November of years
+ divisible by 4:
+ 
+ @smallexample
+ (holiday-sexp (if (= 0 (% year 4))
+                    (calendar-gregorian-from-absolute
+                     (1+ (calendar-dayname-on-or-before
+                           1 (+ 6 (calendar-absolute-from-gregorian
+                                   (list 11 1 year))))))
+               "US Presidential Election"))
+ @end smallexample
+ 
+ @noindent
+ or
+ 
+ @smallexample
+ (if (= 0 (% displayed-year 4))
+     (fixed 11
+            (extract-calendar-day
+              (calendar-gregorian-from-absolute
+                (1+ (calendar-dayname-on-or-before
+                      1 (+ 6 (calendar-absolute-from-gregorian
+                               (list 11 1 displayed-year)))))))
+            "US Presidential Election"))
+ @end smallexample
+ 
+   Some holidays just don't fit into any of these forms because special
+ calculations are involved in their determination.  In such cases you
+ must write a Lisp function to do the calculation.  To include eclipses,
+ for example, add @code{(eclipses)} to @code{other-holidays}
+ and write an Emacs Lisp function @code{eclipses} that returns a
+ (possibly empty) list of the relevant Gregorian dates among the range
+ visible in the calendar window, with descriptive strings, like this:
+ 
+ @smallexample
+ (((6 27 1991) "Lunar Eclipse") ((7 11 1991) "Solar Eclipse") ... )
+ @end smallexample
+ 
+ @node Date Display Format
+ @section Date Display Format
+ @vindex calendar-date-display-form
+ 
+   You can customize the manner of displaying dates in the diary, in mode
+ lines, and in messages by setting @code{calendar-date-display-form}.
+ This variable holds a list of expressions that can involve the variables
+ @code{month}, @code{day}, and @code{year}, which are all numbers in
+ string form, and @code{monthname} and @code{dayname}, which are both
+ alphabetic strings.  In the American style, the default value of this
+ list is as follows:
+ 
+ @smallexample
+ ((if dayname (concat dayname ", ")) monthname " " day ", " year)
+ @end smallexample
+ 
+ @noindent
+ while in the European style this value is the default:
+ 
+ @smallexample
+ ((if dayname (concat dayname ", ")) day " " monthname " " year)
+ @end smallexample
+ 
+ @noindent
+ The ISO standard date representation is this:
+ 
+ @smallexample
+ (year "-" month "-" day)
+ @end smallexample
+ 
+ @noindent
+ This specifies a typical American format:
+ 
+ @smallexample
+ (month "/" day "/" (substring year -2))
+ @end smallexample
+ 
+ @node Time Display Format
+ @section Time Display Format
+ @vindex calendar-time-display-form
+ 
+   The calendar and diary by default display times of day in the
+ conventional American style with the hours from 1 through 12, minutes,
+ and either @samp{am} or @samp{pm}.  If you prefer the European style,
+ also known in the US as military, in which the hours go from 00 to 23,
+ you can alter the variable @code{calendar-time-display-form}.  This
+ variable is a list of expressions that can involve the variables
+ @code{12-hours}, @code{24-hours}, and @code{minutes}, which are all
+ numbers in string form, and @code{am-pm} and @code{time-zone}, which are
+ both alphabetic strings.  The default value of
+ @code{calendar-time-display-form} is as follows:
+ 
+ @smallexample
+ (12-hours ":" minutes am-pm
+           (if time-zone " (") time-zone (if time-zone ")"))
+ @end smallexample
+ 
+ @noindent
+ Here is a value that provides European style times:
+ 
+ @smallexample
+ (24-hours ":" minutes
+           (if time-zone " (") time-zone (if time-zone ")"))
+ @end smallexample
+ 
+ @node Daylight Savings
+ @section Daylight Savings Time
+ @cindex daylight savings time
+ 
+   Emacs understands the difference between standard time and daylight
+ savings time---the times given for sunrise, sunset, solstices,
+ equinoxes, and the phases of the moon take that into account.  The rules
+ for daylight savings time vary from place to place and have also varied
+ historically from year to year.  To do the job properly, Emacs needs to
+ know which rules to use.
+ 
+   Some operating systems keep track of the rules that apply to the place
+ where you are; on these systems, Emacs gets the information it needs
+ from the system automatically.  If some or all of this information is
+ missing, Emacs fills in the gaps with the rules currently used in
+ Cambridge, Massachusetts, which is the center of GNU's world.
+ 
+ 
+ @vindex calendar-daylight-savings-starts
+ @vindex calendar-daylight-savings-ends
+   If the default choice of rules is not appropriate for your location,
+ you can tell Emacs the rules to use by setting the variables
+ @code{calendar-daylight-savings-starts} and
+ @code{calendar-daylight-savings-ends}.  Their values should be Lisp
+ expressions that refer to the variable @code{year}, and evaluate to the
+ Gregorian date on which daylight savings time starts or (respectively)
+ ends, in the form of a list @code{(@var{month} @var{day} @var{year})}.
+ The values should be @code{nil} if your area does not use daylight
+ savings time.
+ 
+   Emacs uses these expressions to determine the start and end dates of
+ daylight savings time as holidays and for correcting times of day in the
+ solar and lunar calculations.
+ 
+   The values for Cambridge, Massachusetts are as follows:
+ 
+ @example
+ @group
+ (calendar-nth-named-day 1 0 4 year)
+ (calendar-nth-named-day -1 0 10 year)
+ @end group
+ @end example
+ 
+ @noindent
+ i.e., the first 0th day (Sunday) of the fourth month (April) in
+ the year specified by @code{year}, and the last Sunday of the tenth month
+ (October) of that year.  If daylight savings time were
+ changed to start on October 1, you would set
+ @code{calendar-daylight-savings-starts} to this:
+ 
+ @example
+ (list 10 1 year)
+ @end example
+ 
+   For a more complex example, suppose daylight savings time begins on
+ the first of Nisan on the Hebrew calendar.  You should set
+ @code{calendar-daylight-savings-starts} to this value:
+ 
+ @example
+ (calendar-gregorian-from-absolute
+   (calendar-absolute-from-hebrew
+     (list 1 1 (+ year 3760))))
+ @end example
+ 
+ @noindent
+ because Nisan is the first month in the Hebrew calendar and the Hebrew
+ year differs from the Gregorian year by 3760 at Nisan.
+ 
+   If there is no daylight savings time at your location, or if you want
+ all times in standard time, set @code{calendar-daylight-savings-starts}
+ and @code{calendar-daylight-savings-ends} to @code{nil}.
+ 
+ @vindex calendar-daylight-time-offset
+   The variable @code{calendar-daylight-time-offset} specifies the
+ difference between daylight savings time and standard time, measured in
+ minutes.  The value for Cambridge is 60.
+ 
+ @vindex calendar-daylight-savings-starts-time
+ @vindex calendar-daylight-savings-ends-time
+   The variable @code{calendar-daylight-savings-starts-time} and the
+ variable @code{calendar-daylight-savings-ends-time} specify the number
+ of minutes after midnight local time when the transition to and from
+ daylight savings time should occur.  For Cambridge, both variables'
+ values are 120.
+ 
+ @node Diary Customizing
+ @section Customizing the Diary
+ 
+ @vindex holidays-in-diary-buffer
+   Ordinarily, the mode line of the diary buffer window indicates any
+ holidays that fall on the date of the diary entries.  The process of
+ checking for holidays can take several seconds, so including holiday
+ information delays the display of the diary buffer noticeably.  If you'd
+ prefer to have a faster display of the diary buffer but without the
+ holiday information, set the variable @code{holidays-in-diary-buffer} to
+ @code{nil}.@refill
+ 
+ @vindex number-of-diary-entries
+   The variable @code{number-of-diary-entries} controls the number of
+ days of diary entries to be displayed at one time.  It affects the
+ initial display when @code{view-diary-entries-initially} is @code{t}, as
+ well as the command @kbd{M-x diary}.  For example, the default value is
+ 1, which says to display only the current day's diary entries.  If the
+ value is 2, both the current day's and the next day's entries are
+ displayed.  The value can also be a vector of seven elements: for
+ example, if the value is @code{[0 2 2 2 2 4 1]} then no diary entries
+ appear on Sunday, the current date's and the next day's diary entries
+ appear Monday through Thursday, Friday through Monday's entries appear
+ on Friday, while on Saturday only that day's entries appear.
+ 
+ @vindex print-diary-entries-hook
+ @findex print-diary-entries
+   The variable @code{print-diary-entries-hook} is a normal hook run
+ after preparation of a temporary buffer containing just the diary
+ entries currently visible in the diary buffer.  (The other, irrelevant
+ diary entries are really absent from the temporary buffer; in the diary
+ buffer, they are merely hidden.)  The default value of this hook does
+ the printing with the command @code{lpr-buffer}.  If you want to use a
+ different command to do the printing, just change the value of this
+ hook.  Other uses might include, for example, rearranging the lines into
+ order by day and time.
+ 
+ @vindex diary-date-forms
+   You can customize the form of dates in your diary file, if neither the
+ standard American nor European styles suits your needs, by setting the
+ variable @code{diary-date-forms}.  This variable is a list of patterns
+ for recognizing a date.  Each date pattern is a list whose elements may
+ be regular expressions (@pxref{Regular Expressions}) or the symbols
+ @code{month}, @code{day}, @code{year}, @code{monthname}, and
+ @code{dayname}.  All these elements serve as patterns that match certain
+ kinds of text in the diary file.  In order for the date pattern, as a
+ whole, to match, all of its elements must match consecutively.
+ 
+   A regular expression in a date pattern matches in its usual fashion,
+ using the standard syntax table altered so that @samp{*} is a word
+ constituent.
+ 
+   The symbols @code{month}, @code{day}, @code{year}, @code{monthname},
+ and @code{dayname} match the month number, day number, year number,
+ month name, and day name of the date being considered.  The symbols that
+ match numbers allow leading zeros; those that match names allow
+ three-letter abbreviations and capitalization.  All the symbols can
+ match @samp{*}; since @samp{*} in a diary entry means ``any day'', ``any
+ month'', and so on, it should match regardless of the date being
+ considered.
+ 
+   The default value of @code{diary-date-forms} in the American style is
+ this:
+ 
+ @example
+ ((month "/" day "[^/0-9]")
+  (month "/" day "/" year "[^0-9]")
+  (monthname " *" day "[^,0-9]")
+  (monthname " *" day ", *" year "[^0-9]")
+  (dayname "\\W"))
+ @end example
+ 
+   The date patterns in the list must be @emph{mutually exclusive} and
+ must not match any portion of the diary entry itself, just the date and
+ one character of whitespace.  If, to be mutually exclusive, the pattern
+ must match a portion of the diary entry text---beyond the whitespace
+ that ends the date---then the first element of the date pattern
+ @emph{must} be @code{backup}.  This causes the date recognizer to back
+ up to the beginning of the current word of the diary entry, after
+ finishing the match.  Even if you use @code{backup}, the date pattern
+ must absolutely not match more than a portion of the first word of the
+ diary entry.  The default value of @code{diary-date-forms} in the
+ European style is this list:
+ 
+ @example
+ ((day "/" month "[^/0-9]")
+  (day "/" month "/" year "[^0-9]")
+  (backup day " *" monthname "\\W+\\<[^*0-9]")
+  (day " *" monthname " *" year "[^0-9]")
+  (dayname "\\W"))
+ @end example
+ 
+ @noindent
+ Notice the use of @code{backup} in the third pattern, because it needs
+ to match part of a word beyond the date itself to distinguish it from
+ the fourth pattern.
+ 
+ @node Hebrew/Islamic Entries
+ @section Hebrew- and Islamic-Date Diary Entries
+ 
+   Your diary file can have entries based on Hebrew or Islamic dates, as
+ well as entries based on the world-standard Gregorian calendar.
+ However, because recognition of such entries is time-consuming and most
+ people don't use them, you must explicitly enable their use.  If you
+ want the diary to recognize Hebrew-date diary entries, for example, 
+ you must do this:
+ 
+ @vindex nongregorian-diary-listing-hook
+ @vindex nongregorian-diary-marking-hook
+ @findex list-hebrew-diary-entries
+ @findex mark-hebrew-diary-entries
+ @smallexample
+ (add-hook 'nongregorian-diary-listing-hook 'list-hebrew-diary-entries)
+ (add-hook 'nongregorian-diary-marking-hook 'mark-hebrew-diary-entries)
+ @end smallexample
+ 
+ @noindent
+ If you want Islamic-date entries, do this:
+ 
+ @findex list-islamic-diary-entries
+ @findex mark-islamic-diary-entries
+ @smallexample
+ (add-hook 'nongregorian-diary-listing-hook 'list-islamic-diary-entries)
+ (add-hook 'nongregorian-diary-marking-hook 'mark-islamic-diary-entries)
+ @end smallexample
+ 
+   Hebrew- and Islamic-date diary entries have the same formats as
+ Gregorian-date diary entries, except that @samp{H} precedes a Hebrew
+ date and @samp{I} precedes an Islamic date.  Moreover, because the
+ Hebrew and Islamic month names are not uniquely specified by the first
+ three letters, you may not abbreviate them.  For example, a diary entry
+ for the Hebrew date Heshvan 25 could look like this:
+ 
+ @smallexample
+ HHeshvan 25 Happy Hebrew birthday!
+ @end smallexample
+ 
+ @noindent
+ and would appear in the diary for any date that corresponds to Heshvan 25
+ on the Hebrew calendar.  And here is  Islamic-date diary entry  that matches
+ Dhu al-Qada 25:
+ 
+ @smallexample
+ IDhu al-Qada 25 Happy Islamic birthday!
+ @end smallexample
+ 
+   As with Gregorian-date diary entries, Hebrew- and Islamic-date entries
+ are nonmarking if they are preceded with an ampersand (@samp{&}).
+ 
+   Here is a table of commands used in the calendar to create diary entries
+ that match the selected date and other dates that are similar in the Hebrew
+ or Islamic calendar:
+ 
+ @table @kbd
+ @item i h d
+ Add a diary entry for the Hebrew date corresponding to the selected date
+ (@code{insert-hebrew-diary-entry}).
+ @item i h m
+ Add a diary entry for the day of the Hebrew month corresponding to the
+ selected date (@code{insert-monthly-hebrew-diary-entry}).  This diary
+ entry matches any date that has the same Hebrew day-within-month as the
+ selected date.
+ @item i h y
+ Add a diary entry for the day of the Hebrew year corresponding to the
+ selected date (@code{insert-yearly-hebrew-diary-entry}).  This diary 
+ entry matches any date which has the same Hebrew month and day-within-month
+ as the selected date.
+ @item i i d
+ Add a diary entry for the Islamic date corresponding to the selected date
+ (@code{insert-islamic-diary-entry}).
+ @item i i m
+ Add a diary entry for the day of the Islamic month corresponding to the
+ selected date (@code{insert-monthly-islamic-diary-entry}).
+ @item i i y
+ Add a diary entry for the day of the Islamic year corresponding to the
+ selected date (@code{insert-yearly-islamic-diary-entry}).
+ @end table
+ 
+ @findex insert-hebrew-diary-entry
+ @findex insert-monthly-hebrew-diary-entry
+ @findex insert-yearly-hebrew-diary-entry
+ @findex insert-islamic-diary-entry
+ @findex insert-monthly-islamic-diary-entry
+ @findex insert-yearly-islamic-diary-entry
+   These commands work much like the corresponding commands for ordinary
+ diary entries: they apply to the date that point is on in the calendar
+ window, and what they do is insert just the date portion of a diary entry
+ at the end of your diary file.  You must then insert the rest of the 
+ diary entry.
+ 
+ @node Fancy Diary Display
+ @section Fancy Diary Display
+ @vindex diary-display-hook
+ @findex simple-diary-display
+ 
+   Diary display works by preparing the diary buffer and then running the
+ hook @code{diary-display-hook}.  The default value of this hook
+ (@code{simple-diary-display}) hides the irrelevant diary entries and
+ then displays the buffer.  However, if you specify the hook as follows,
+ 
+ @cindex diary buffer
+ @findex fancy-diary-display
+ @example
+ (add-hook 'diary-display-hook 'fancy-diary-display)
+ @end example
+ 
+ @noindent
+ this enables fancy diary display.  It displays diary entries and
+ holidays by copying them into a special buffer that exists only for the
+ sake of display.  Copying to a separate buffer provides an opportunity
+ to change the displayed text to make it prettier---for example, to sort
+ the entries by the dates they apply to.
+ 
+   As with simple diary display, you can print a hard copy of the buffer
+ with @code{print-diary-entries}.  To print a hard copy of a day-by-day
+ diary for a week by positioning point on Sunday of that week, type
+ @kbd{7 d} and then do @kbd{M-x print-diary-entries}.  As usual, the
+ inclusion of the holidays slows down the display slightly; you can speed
+ things up by setting the variable @code{holidays-in-diary-buffer} to
+ @code{nil}.
+ 
+ @vindex diary-list-include-blanks
+   Ordinarily, the fancy diary buffer does not show days for which there are
+ no diary entries, even if that day is a holiday.  If you want such days to be
+ shown in the fancy diary buffer, set the variable
+ @code{diary-list-include-blanks} to @code{t}.@refill
+ 
+ @cindex sorting diary entries
+   If you use the fancy diary display, you can use the normal hook
+ @code{list-diary-entries-hook} to sort each day's diary entries by their
+ time of day.  Here's how
+ 
+ @findex sort-diary-entries
+ @example
+ (add-hook 'list-diary-entries-hook 'sort-diary-entries t)
+ @end example
+ 
+ @noindent
+ For each day, this sorts diary entries that begin with a recognizable
+ time of day according to their times.  Diary entries without times come
+ first within each day.
+ 
+   Fancy diary display also has the ability to process included diary
+ files.  This permits a group of people to share a diary file for events
+ that apply to all of them.  Lines in the diary file of this form:
+ 
+ @smallexample
+ #include "@var{filename}"
+ @end smallexample
+ 
+ @noindent
+ includes the diary entries from the file @var{filename} in the fancy
+ diary buffer.  The include mechanism is recursive, so that included files
+ can include other files, and so on; you must be careful not to have a
+ cycle of inclusions, of course.  Here is how to enable the include
+ facility:
+ 
+ @vindex list-diary-entries-hook
+ @vindex mark-diary-entries-hook
+ @findex include-other-diary-files
+ @findex mark-included-diary-files
+ @smallexample
+ (add-hook 'list-diary-entries-hook 'include-other-diary-files)
+ (add-hook 'mark-diary-entries-hook 'mark-included-diary-files)
+ @end smallexample
+ 
+ The include mechanism works only with the fancy diary display, because
+ ordinary diary display shows the entries directly from your diary file.
+ 
+ @node Sexp Diary Entries
+ @section Sexp Entries and the Fancy Diary Display
+ @cindex sexp diary entries
+ 
+   Sexp diary entries allow you to do more than just have complicated
+ conditions under which a diary entry applies.  If you use the fancy
+ diary display, sexp entries can generate the text of the entry depending
+ on the date itself.  For example, an anniversary diary entry can insert
+ the number of years since the anniversary date into the text of the
+ diary entry.  Thus the @samp{%d} in this dairy entry:
+ 
+ @findex diary-anniversary
+ @smallexample
+ %%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
+ @end smallexample
+ 
+ @noindent
+ gets replaced by the age, so on October 31, 1990 the entry appears in
+ the fancy diary buffer like this:
+ 
+ @smallexample
+ Arthur's birthday (42 years old)
+ @end smallexample
+ 
+ @noindent
+ If the diary file instead contains this entry:
+ 
+ @smallexample
+ %%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
+ @end smallexample
+ 
+ @noindent
+ the entry in the fancy diary buffer for October 31, 1990 appears like this:
+ 
+ @smallexample
+ Arthur's 42nd birthday
+ @end smallexample
+ 
+   Similarly, cyclic diary entries can interpolate the number of repetitions
+ that have occurred:
+ 
+ @findex diary-cyclic
+ @smallexample
+ %%(diary-cyclic 50 1 1 1990) Renew medication (%d%s time)
+ @end smallexample
+ 
+ @noindent
+ looks like this:
+ 
+ @smallexample
+ Renew medication (5th time)
+ @end smallexample
+ 
+ @noindent
+ in the fancy diary display on September 8, 1990.
+ 
+   The generality of sexp diary entries lets you specify any diary entry
+ that you can describe algorithmically.  A sexp diary entry contains an
+ expression that computes whether the entry applies to any given date.
+ If its value is non-@code{nil}, the entry applies to that date;
+ otherwise, it does not.  The expression can use the variable  @code{date}
+ to find the date being considered; its value is a list (@var{month}
+ @var{day} @var{year}) that refers to the Gregorian calendar.
+ 
+   Suppose you get paid on the 21st of the month if it is a weekday, and
+ on the Friday before if the 21st is on a weekend.  Here is how to write
+ a sexp diary entry that matches those dates:
+ 
+ @smallexample
+ &%%(let ((dayname (calendar-day-of-week date))
+          (day (car (cdr date))))
+       (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
+           (and (memq day '(19 20)) (= dayname 5)))
+          ) Pay check deposited
+ @end smallexample
+ 
+   The following sexp diary entries take advantage of the ability (in the fancy
+ diary display) to concoct diary entries whose text varies based on the date:
+ 
+ @findex diary-sunrise-sunset
+ @findex diary-phases-of-moon
+ @findex diary-day-of-year
+ @findex diary-iso-date
+ @findex diary-julian-date
+ @findex diary-astro-day-number
+ @findex diary-hebrew-date
+ @findex diary-islamic-date
+ @findex diary-french-date
+ @findex diary-mayan-date
+ @table @code
+ @item %%(diary-sunrise-sunset)
+ Make a diary entry for the local times of today's sunrise and sunset.
+ @item %%(diary-phases-of-moon)
+ Make a diary entry for the phases (quarters) of the moon.
+ @item %%(diary-day-of-year)
+ Make a diary entry with today's day number in the current year and the number
+ of days remaining in the current year.
+ @item %%(diary-iso-date)
+ Make a diary entry with today's equivalent ISO commercial date.
+ @item %%(diary-julian-date)
+ Make a diary entry with today's equivalent date on the Julian calendar.
+ @item %%(diary-astro-day-number)
+ Make a diary entry with today's equivalent astronomical (Julian) day number.
+ @item %%(diary-hebrew-date)
+ Make a diary entry with today's equivalent date on the Hebrew calendar.
+ @item %%(diary-islamic-date)
+ Make a diary entry with today's equivalent date on the Islamic calendar.
+ @item %%(diary-french-date)
+ Make a diary entry with today's equivalent date on the French Revolutionary
+ calendar.
+ @item %%(diary-mayan-date)
+ Make a diary entry with today's equivalent date on the Mayan calendar.
+ @end table
+ 
+ @noindent
+ Thus including the diary entry
+ 
+ @example
+ &%%(diary-hebrew-date)
+ @end example
+ 
+ @noindent
+ causes every day's diary display to contain the equivalent date on the
+ Hebrew calendar, if you are using the fancy diary display.  (With simple
+ diary display, the line @samp{&%%(diary-hebrew-date)} appears in the
+ diary for any date, but does nothing particularly useful.)
+ 
+   These functions can be used to construct sexp diary entries based on
+ the Hebrew calendar in certain standard ways:
+ 
+ @cindex rosh hodesh
+ @findex diary-rosh-hodesh
+ @cindex parasha, weekly
+ @findex diary-parasha
+ @cindex candle lighting times
+ @findex diary-sabbath-candles
+ @cindex omer count
+ @findex diary-omer
+ @cindex yahrzeits
+ @findex diary-yahrzeit
+ @table @code
+ @item %%(diary-rosh-hodesh)
+ Make a diary entry that tells the occurrence and ritual announcement of each
+ new Hebrew month.
+ @item %%(diary-parasha)
+ Make a Saturday diary entry that tells the weekly synagogue scripture reading.
+ @item %%(diary-sabbath-candles)
+ Make a Friday diary entry that tells the @emph{local time} of Sabbath
+ candle lighting.
+ @item %%(diary-omer)
+ Make a diary entry that gives the omer count, when appropriate.
+ @item %%(diary-yahrzeit @var{month} @var{day} @var{year}) @var{name}
+ Make a diary entry marking the anniversary of a date of death.  The date
+ is the @emph{Gregorian} (civil) date of death.  The diary entry appears
+ on the proper Hebrew calendar anniversary and on the day before.  (In
+ the European style, the order of the parameters is changed to @var{day},
+ @var{month}, @var{year}.)
+ @end table
+ 
+ @node Appt Customizing
+ @section Customizing Appointment Reminders
+ 
+   You can specify exactly how Emacs reminds you of an appointment, and
+ how far in advance it begins doing so, by setting these variables:
+ 
+ @vindex appt-message-warning-time
+ @vindex appt-audible
+ @vindex appt-visible
+ @vindex appt-display-mode-line
+ @vindex appt-msg-window
+ @vindex appt-display-duration
+ @vindex appt-disp-window-function
+ @vindex appt-delete-window-function
+ @table @code
+ @item appt-message-warning-time
+ The time in minutes before an appointment that the reminder begins.  The
+ default is 10 minutes.
+ @item appt-audible
+ If this is non-@code{nil}, Emacs rings the
+ terminal bell for appointment reminders.  The default is @code{t}.
+ @item appt-visible
+ If this is non-@code{nil}, Emacs displays the appointment
+ message in the echo area.  The default is @code{t}.
+ @item appt-display-mode-line
+ If this is non-@code{nil}, Emacs displays the number of minutes
+ to the appointment on the mode line.  The default is @code{t}.
+ @item appt-msg-window
+ If this is non-@code{nil}, Emacs displays the appointment
+ message in another window.  The default is @code{t}.
+ @item appt-disp-window-function
+ This variable holds a function to use to create the other window
+ for the appointment message.
+ @item appt-delete-window-function
+ This variable holds a function to use to get rid of the appointment
+ message window, when its time is up.
+ @item appt-display-duration
+ The number of seconds to display an appointment message.  The default
+ is 5 seconds.
+ @end table
Index: emacs/man/elisp-commands.texi
diff -c /dev/null emacs/man/elisp-commands.texi:1.2
*** /dev/null	Fri Aug  2 20:47:44 1996
--- emacs/man/elisp-commands.texi	Thu Aug  1 00:22:28 1996
***************
*** 0 ****
--- 1,2491 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/commands
+ @node Command Loop, Keymaps, Minibuffers, Top
+ @chapter Command Loop
+ @cindex editor command loop
+ @cindex command loop
+ 
+   When you run Emacs, it enters the @dfn{editor command loop} almost
+ immediately.  This loop reads key sequences, executes their definitions,
+ and displays the results.  In this chapter, we describe how these things
+ are done, and the subroutines that allow Lisp programs to do them.  
+ 
+ @menu
+ * Command Overview::    How the command loop reads commands.
+ * Defining Commands::   Specifying how a function should read arguments.
+ * Interactive Call::    Calling a command, so that it will read arguments.
+ * Command Loop Info::   Variables set by the command loop for you to examine.
+ * Input Events::	What input looks like when you read it.
+ * Reading Input::       How to read input events from the keyboard or mouse.
+ * Waiting::             Waiting for user input or elapsed time.
+ * Quitting::            How @kbd{C-g} works.  How to catch or defer quitting.
+ * Prefix Command Arguments::    How the commands to set prefix args work.
+ * Recursive Editing::   Entering a recursive edit,
+                           and why you usually shouldn't.
+ * Disabling Commands::  How the command loop handles disabled commands.
+ * Command History::     How the command history is set up, and how accessed.
+ * Keyboard Macros::     How keyboard macros are implemented.
+ @end menu
+ 
+ @node Command Overview
+ @section Command Loop Overview
+ 
+   The first thing the command loop must do is read a key sequence, which
+ is a sequence of events that translates into a command.  It does this by
+ calling the function @code{read-key-sequence}.  Your Lisp code can also
+ call this function (@pxref{Key Sequence Input}).  Lisp programs can also
+ do input at a lower level with @code{read-event} (@pxref{Reading One
+ Event}) or discard pending input with @code{discard-input}
+ (@pxref{Event Input Misc}).
+ 
+   The key sequence is translated into a command through the currently
+ active keymaps.  @xref{Key Lookup}, for information on how this is done.
+ The result should be a keyboard macro or an interactively callable
+ function.  If the key is @kbd{M-x}, then it reads the name of another
+ command, which it then calls.  This is done by the command
+ @code{execute-extended-command} (@pxref{Interactive Call}).
+ 
+   To execute a command requires first reading the arguments for it.
+ This is done by calling @code{command-execute} (@pxref{Interactive
+ Call}).  For commands written in Lisp, the @code{interactive}
+ specification says how to read the arguments.  This may use the prefix
+ argument (@pxref{Prefix Command Arguments}) or may read with prompting
+ in the minibuffer (@pxref{Minibuffers}).  For example, the command
+ @code{find-file} has an @code{interactive} specification which says to
+ read a file name using the minibuffer.  The command's function body does
+ not use the minibuffer; if you call this command from Lisp code as a
+ function, you must supply the file name string as an ordinary Lisp
+ function argument.
+ 
+   If the command is a string or vector (i.e., a keyboard macro) then
+ @code{execute-kbd-macro} is used to execute it.  You can call this
+ function yourself (@pxref{Keyboard Macros}).
+ 
+   To terminate the execution of a running command, type @kbd{C-g}.  This
+ character causes @dfn{quitting} (@pxref{Quitting}).
+ 
+ @defvar pre-command-hook
+ The editor command loop runs this normal hook before each command.  At
+ that time, @code{this-command} contains the command that is about to
+ run, and @code{last-command} describes the previous command.
+ @xref{Hooks}.
+ @end defvar
+ 
+ @defvar post-command-hook
+ The editor command loop runs this normal hook after each command
+ (including commands terminated prematurely by quitting or by errors),
+ and also when the command loop is first entered.  At that time,
+ @code{this-command} describes the command that just ran, and
+ @code{last-command} describes the command before that.  @xref{Hooks}.
+ @end defvar
+ 
+   Quitting is suppressed while running @code{pre-command-hook} and
+ @code{post-command-hook}.  If an error happens while executing one of
+ these hooks, it terminates execution of the hook, but that is all it
+ does.
+ 
+ @node Defining Commands
+ @section Defining Commands
+ @cindex defining commands
+ @cindex commands, defining
+ @cindex functions, making them interactive
+ @cindex interactive function
+ 
+   A Lisp function becomes a command when its body contains, at top
+ level, a form that calls the special form @code{interactive}.  This
+ form does nothing when actually executed, but its presence serves as a
+ flag to indicate that interactive calling is permitted.  Its argument
+ controls the reading of arguments for an interactive call.
+ 
+ @menu
+ * Using Interactive::     General rules for @code{interactive}.
+ * Interactive Codes::     The standard letter-codes for reading arguments
+                              in various ways.
+ * Interactive Examples::  Examples of how to read interactive arguments.
+ @end menu
+ 
+ @node Using Interactive
+ @subsection Using @code{interactive}
+ 
+   This section describes how to write the @code{interactive} form that
+ makes a Lisp function an interactively-callable command.
+ 
+ @defspec interactive arg-descriptor
+ @cindex argument descriptors
+ This special form declares that the function in which it appears is a
+ command, and that it may therefore be called interactively (via
+ @kbd{M-x} or by entering a key sequence bound to it).  The argument
+ @var{arg-descriptor} declares how to compute the arguments to the
+ command when the command is called interactively.
+ 
+ A command may be called from Lisp programs like any other function, but
+ then the caller supplies the arguments and @var{arg-descriptor} has no
+ effect.
+ 
+ The @code{interactive} form has its effect because the command loop
+ (actually, its subroutine @code{call-interactively}) scans through the
+ function definition looking for it, before calling the function.  Once
+ the function is called, all its body forms including the
+ @code{interactive} form are executed, but at this time
+ @code{interactive} simply returns @code{nil} without even evaluating its
+ argument.
+ @end defspec
+ 
+ There are three possibilities for the argument @var{arg-descriptor}:
+ 
+ @itemize @bullet
+ @item
+ It may be omitted or @code{nil}; then the command is called with no
+ arguments.  This leads quickly to an error if the command requires one
+ or more arguments.
+ 
+ @item
+ It may be a Lisp expression that is not a string; then it should be a
+ form that is evaluated to get a list of arguments to pass to the
+ command.
+ @cindex argument evaluation form
+ 
+ If this expression reads keyboard input (this includes using the
+ minibuffer), keep in mind that the integer value of point or the mark
+ before reading input may be incorrect after reading input.  This is
+ because the current buffer may be receiving subprocess output;
+ if subprocess output arrives while the command is waiting for input,
+ it could relocate point and the mark.
+ 
+ Here's an example of what @emph{not} to do:
+ 
+ @smallexample
+ (interactive
+  (list (region-beginning) (region-end)
+        (read-string "Foo: " nil 'my-history)))
+ @end smallexample
+ 
+ @noindent
+ Here's how to avoid the problem, by examining point and the mark only
+ after reading the keyboard input:
+ 
+ @smallexample
+ (interactive
+  (let ((string (read-string "Foo: " nil 'my-history)))
+    (list (region-beginning) (region-end) string)))
+ @end smallexample
+ 
+ @item
+ @cindex argument prompt
+ It may be a string; then its contents should consist of a code character
+ followed by a prompt (which some code characters use and some ignore).
+ The prompt ends either with the end of the string or with a newline.
+ Here is a simple example:
+ 
+ @smallexample
+ (interactive "bFrobnicate buffer: ")
+ @end smallexample
+ 
+ @noindent
+ The code letter @samp{b} says to read the name of an existing buffer,
+ with completion.  The buffer name is the sole argument passed to the
+ command.  The rest of the string is a prompt.
+ 
+ If there is a newline character in the string, it terminates the prompt.
+ If the string does not end there, then the rest of the string should
+ contain another code character and prompt, specifying another argument.
+ You can specify any number of arguments in this way.
+ 
+ @c Emacs 19 feature
+ The prompt string can use @samp{%} to include previous argument values
+ (starting with the first argument) in the prompt.  This is done using
+ @code{format} (@pxref{Formatting Strings}).  For example, here is how
+ you could read the name of an existing buffer followed by a new name to
+ give to that buffer:
+ 
+ @smallexample
+ @group
+ (interactive "bBuffer to rename: \nsRename buffer %s to: ")
+ @end group
+ @end smallexample
+ 
+ @cindex @samp{*} in interactive
+ @cindex read-only buffers in interactive
+ If the first character in the string is @samp{*}, then an error is
+ signaled if the buffer is read-only.
+ 
+ @cindex @samp{@@} in interactive
+ @c Emacs 19 feature
+ If the first character in the string is @samp{@@}, and if the key
+ sequence used to invoke the command includes any mouse events, then
+ the window associated with the first of those events is selected
+ before the command is run.
+ 
+ You can use @samp{*} and @samp{@@} together; the order does not matter.
+ Actual reading of arguments is controlled by the rest of the prompt
+ string (starting with the first character that is not @samp{*} or
+ @samp{@@}).
+ @end itemize
+ 
+ @node Interactive Codes
+ @comment  node-name,  next,  previous,  up
+ @subsection Code Characters for @code{interactive}
+ @cindex interactive code description
+ @cindex description for interactive codes
+ @cindex codes, interactive, description of
+ @cindex characters for interactive codes
+ 
+   The code character descriptions below contain a number of key words,
+ defined here as follows:
+ 
+ @table @b
+ @item Completion
+ @cindex interactive completion
+ Provide completion.  @key{TAB}, @key{SPC}, and @key{RET} perform name
+ completion because the argument is read using @code{completing-read}
+ (@pxref{Completion}).  @kbd{?} displays a list of possible completions.
+ 
+ @item Existing
+ Require the name of an existing object.  An invalid name is not
+ accepted; the commands to exit the minibuffer do not exit if the current
+ input is not valid.
+ 
+ @item Default
+ @cindex default argument string
+ A default value of some sort is used if the user enters no text in the
+ minibuffer.  The default depends on the code character.
+ 
+ @item No I/O
+ This code letter computes an argument without reading any input.
+ Therefore, it does not use a prompt string, and any prompt string you
+ supply is ignored.
+ 
+ Even though the code letter doesn't use a prompt string, you must follow
+ it with a newline if it is not the last code character in the string.
+ 
+ @item Prompt
+ A prompt immediately follows the code character.  The prompt ends either
+ with the end of the string or with a newline.
+ 
+ @item Special
+ This code character is meaningful only at the beginning of the
+ interactive string, and it does not look for a prompt or a newline.
+ It is a single, isolated character.
+ @end table
+ 
+ @cindex reading interactive arguments
+   Here are the code character descriptions for use with @code{interactive}:
+ 
+ @table @samp
+ @item *
+ Signal an error if the current buffer is read-only.  Special.
+ 
+ @item @@
+ Select the window mentioned in the first mouse event in the key
+ sequence that invoked this command.  Special.
+ 
+ @item a
+ A function name (i.e., a symbol satisfying @code{fboundp}).  Existing,
+ Completion, Prompt.
+ 
+ @item b
+ The name of an existing buffer.  By default, uses the name of the
+ current buffer (@pxref{Buffers}).  Existing, Completion, Default,
+ Prompt.
+ 
+ @item B
+ A buffer name.  The buffer need not exist.  By default, uses the name of
+ a recently used buffer other than the current buffer.  Completion,
+ Default, Prompt.
+ 
+ @item c
+ A character.  The cursor does not move into the echo area.  Prompt.
+ 
+ @item C
+ A command name (i.e., a symbol satisfying @code{commandp}).  Existing,
+ Completion, Prompt.
+ 
+ @item d
+ @cindex position argument
+ The position of point, as an integer (@pxref{Point}).  No I/O.
+ 
+ @item D
+ A directory name.  The default is the current default directory of the
+ current buffer, @code{default-directory} (@pxref{System Environment}).
+ Existing, Completion, Default, Prompt.
+ 
+ @item e
+ The first or next mouse event in the key sequence that invoked the command.
+ More precisely, @samp{e} gets events that are lists, so you can look at
+ the data in the lists.  @xref{Input Events}.  No I/O.
+ 
+ You can use @samp{e} more than once in a single command's interactive
+ specification.  If the key sequence that invoked the command has
+ @var{n} events that are lists, the @var{n}th @samp{e} provides the
+ @var{n}th such event.  Events that are not lists, such as function keys
+ and @sc{ASCII} characters, do not count where @samp{e} is concerned.
+ 
+ @item f
+ A file name of an existing file (@pxref{File Names}).  The default
+ directory is @code{default-directory}.  Existing, Completion, Default,
+ Prompt.
+ 
+ @item F
+ A file name.  The file need not exist.  Completion, Default, Prompt.
+ 
+ @item k
+ A key sequence (@pxref{Keymap Terminology}).  This keeps reading events
+ until a command (or undefined command) is found in the current key
+ maps.  The key sequence argument is represented as a string or vector.
+ The cursor does not move into the echo area.  Prompt.
+ 
+ This kind of input is used by commands such as @code{describe-key} and
+ @code{global-set-key}.
+ 
+ @item K
+ A key sequence, whose definition you intend to change.  This works like
+ @samp{k}, except that it suppresses, for the last input event in the key
+ sequence, the conversions that are normally used (when necessary) to
+ convert an undefined key into a defined one.
+ 
+ @item m
+ @cindex marker argument
+ The position of the mark, as an integer.  No I/O.
+ 
+ @item n
+ A number read with the minibuffer.  If the input is not a number, the
+ user is asked to try again.  The prefix argument, if any, is not used.
+ Prompt.
+ 
+ @item N
+ @cindex raw prefix argument usage
+ The raw prefix argument.  If the prefix argument is @code{nil}, then
+ read a number as with @kbd{n}.  Requires a number.  @xref{Prefix Command
+ Arguments}.  Prompt.
+ 
+ @item p
+ @cindex numeric prefix argument usage
+ The numeric prefix argument.  (Note that this @samp{p} is lower case.)
+ No I/O.
+ 
+ @item P
+ The raw prefix argument.  (Note that this @samp{P} is upper case.)  No
+ I/O.
+ 
+ @item r
+ @cindex region argument
+ Point and the mark, as two numeric arguments, smallest first.  This is
+ the only code letter that specifies two successive arguments rather than
+ one.  No I/O.
+ 
+ @item s
+ Arbitrary text, read in the minibuffer and returned as a string
+ (@pxref{Text from Minibuffer}).  Terminate the input with either
+ @key{LFD} or @key{RET}.  (@kbd{C-q} may be used to include either of
+ these characters in the input.)  Prompt.
+ 
+ @item S
+ An interned symbol whose name is read in the minibuffer.  Any whitespace
+ character terminates the input.  (Use @kbd{C-q} to include whitespace in
+ the string.)  Other characters that normally terminate a symbol (e.g.,
+ parentheses and brackets) do not do so here.  Prompt.
+ 
+ @item v
+ A variable declared to be a user option (i.e., satisfying the predicate
+ @code{user-variable-p}).  @xref{High-Level Completion}.  Existing,
+ Completion, Prompt.
+ 
+ @item x
+ A Lisp object, specified with its read syntax, terminated with a
+ @key{LFD} or @key{RET}.  The object is not evaluated.  @xref{Object from
+ Minibuffer}.  Prompt.
+ 
+ @item X
+ @cindex evaluated expression argument
+ A Lisp form is read as with @kbd{x}, but then evaluated so that its
+ value becomes the argument for the command.  Prompt.
+ @end table
+ 
+ @node Interactive Examples
+ @comment  node-name,  next,  previous,  up
+ @subsection Examples of Using @code{interactive}
+ @cindex examples of using @code{interactive}
+ @cindex @code{interactive}, examples of using 
+ 
+   Here are some examples of @code{interactive}:
+ 
+ @example
+ @group
+ (defun foo1 ()              ; @r{@code{foo1} takes no arguments,}
+     (interactive)           ;   @r{just moves forward two words.}
+     (forward-word 2))
+      @result{} foo1
+ @end group
+ 
+ @group
+ (defun foo2 (n)             ; @r{@code{foo2} takes one argument,}
+     (interactive "p")       ;   @r{which is the numeric prefix.}
+     (forward-word (* 2 n)))
+      @result{} foo2
+ @end group
+ 
+ @group
+ (defun foo3 (n)             ; @r{@code{foo3} takes one argument,}
+     (interactive "nCount:") ;   @r{which is read with the Minibuffer.}
+     (forward-word (* 2 n)))
+      @result{} foo3
+ @end group
+ 
+ @group
+ (defun three-b (b1 b2 b3)
+   "Select three existing buffers.
+ Put them into three windows, selecting the last one."
+ @end group
+     (interactive "bBuffer1:\nbBuffer2:\nbBuffer3:")
+     (delete-other-windows)
+     (split-window (selected-window) 8)
+     (switch-to-buffer b1)
+     (other-window 1)
+     (split-window (selected-window) 8)
+     (switch-to-buffer b2)
+     (other-window 1)
+     (switch-to-buffer b3))
+      @result{} three-b
+ @group
+ (three-b "*scratch*" "declarations.texi" "*mail*")
+      @result{} nil
+ @end group
+ @end example
+ 
+ @node Interactive Call
+ @section Interactive Call
+ @cindex interactive call
+ 
+   After the command loop has translated a key sequence into a
+ definition, it invokes that definition using the function
+ @code{command-execute}.  If the definition is a function that is a
+ command, @code{command-execute} calls @code{call-interactively}, which
+ reads the arguments and calls the command.  You can also call these
+ functions yourself.
+ 
+ @defun commandp object
+ Returns @code{t} if @var{object} is suitable for calling interactively;
+ that is, if @var{object} is a command.  Otherwise, returns @code{nil}.  
+ 
+ The interactively callable objects include strings and vectors (treated
+ as keyboard macros), lambda expressions that contain a top-level call to
+ @code{interactive}, byte-code function objects made from such lambda
+ expressions, autoload objects that are declared as interactive
+ (non-@code{nil} fourth argument to @code{autoload}), and some of the
+ primitive functions.
+ 
+ A symbol is @code{commandp} if its function definition is
+ @code{commandp}.
+ 
+ Keys and keymaps are not commands.  Rather, they are used to look up
+ commands (@pxref{Keymaps}).
+ 
+ See @code{documentation} in @ref{Accessing Documentation}, for a
+ realistic example of using @code{commandp}.
+ @end defun
+ 
+ @defun call-interactively command &optional record-flag
+ This function calls the interactively callable function @var{command},
+ reading arguments according to its interactive calling specifications.
+ An error is signaled if @var{command} is not a function or if it cannot
+ be called interactively (i.e., is not a command).  Note that keyboard
+ macros (strings and vectors) are not accepted, even though they are
+ considered commands, because they are not functions.
+ 
+ @cindex record command history
+ If @var{record-flag} is non-@code{nil}, then this command and its
+ arguments are unconditionally added to the list @code{command-history}.
+ Otherwise, the command is added only if it uses the minibuffer to read
+ an argument.  @xref{Command History}.
+ @end defun
+ 
+ @defun command-execute command &optional record-flag
+ @cindex keyboard macro execution
+ This function executes @var{command} as an editing command.  The
+ argument @var{command} must satisfy the @code{commandp} predicate; i.e.,
+ it must be an interactively callable function or a keyboard macro.
+ 
+ A string or vector as @var{command} is executed with
+ @code{execute-kbd-macro}.  A function is passed to
+ @code{call-interactively}, along with the optional @var{record-flag}.
+ 
+ A symbol is handled by using its function definition in its place.  A
+ symbol with an @code{autoload} definition counts as a command if it was
+ declared to stand for an interactively callable function.  Such a
+ definition is handled by loading the specified library and then
+ rechecking the definition of the symbol.
+ @end defun
+ 
+ @deffn Command execute-extended-command prefix-argument
+ @cindex read command name
+ This function reads a command name from the minibuffer using
+ @code{completing-read} (@pxref{Completion}).  Then it uses
+ @code{command-execute} to call the specified command.  Whatever that
+ command returns becomes the value of @code{execute-extended-command}.
+ 
+ @cindex execute with prefix argument
+ If the command asks for a prefix argument, it receives the value
+ @var{prefix-argument}.  If @code{execute-extended-command} is called
+ interactively, the current raw prefix argument is used for
+ @var{prefix-argument}, and thus passed on to whatever command is run.
+ 
+ @c !!! Should this be @kindex?
+ @cindex @kbd{M-x}
+ @code{execute-extended-command} is the normal definition of @kbd{M-x},
+ so it uses the string @w{@samp{M-x }} as a prompt.  (It would be better
+ to take the prompt from the events used to invoke
+ @code{execute-extended-command}, but that is painful to implement.)  A
+ description of the value of the prefix argument, if any, also becomes
+ part of the prompt.
+ 
+ @example
+ @group
+ (execute-extended-command 1)
+ ---------- Buffer: Minibuffer ----------
+ 1 M-x forward-word RET
+ ---------- Buffer: Minibuffer ----------
+      @result{} t
+ @end group
+ @end example
+ @end deffn
+ 
+ @defun interactive-p
+ This function returns @code{t} if the containing function (the one that
+ called @code{interactive-p}) was called interactively, with the function
+ @code{call-interactively}.  (It makes no difference whether
+ @code{call-interactively} was called from Lisp or directly from the
+ editor command loop.)  If the containing function was called by Lisp
+ evaluation (or with @code{apply} or @code{funcall}), then it was not
+ called interactively.
+ 
+ The most common use of @code{interactive-p} is for deciding whether to
+ print an informative message.  As a special exception,
+ @code{interactive-p} returns @code{nil} whenever a keyboard macro is
+ being run.  This is to suppress the informative messages and speed
+ execution of the macro.
+ 
+ For example:
+ 
+ @example
+ @group
+ (defun foo ()
+   (interactive)
+   (and (interactive-p)
+        (message "foo")))
+      @result{} foo
+ @end group
+ 
+ @group
+ (defun bar ()
+   (interactive)
+   (setq foobar (list (foo) (interactive-p))))
+      @result{} bar
+ @end group
+ 
+ @group
+ ;; @r{Type @kbd{M-x foo}.}
+      @print{} foo
+ @end group
+ 
+ @group
+ ;; @r{Type @kbd{M-x bar}.}
+ ;; @r{This does not print anything.}
+ @end group
+ 
+ @group
+ foobar
+      @result{} (nil t)
+ @end group
+ @end example
+ @end defun
+ 
+ @node Command Loop Info
+ @comment  node-name,  next,  previous,  up
+ @section Information from the Command Loop
+ 
+ The editor command loop sets several Lisp variables to keep status
+ records for itself and for commands that are run.  
+ 
+ @defvar last-command
+ This variable records the name of the previous command executed by the
+ command loop (the one before the current command).  Normally the value
+ is a symbol with a function definition, but this is not guaranteed.
+ 
+ The value is copied from @code{this-command} when a command returns to
+ the command loop, except when the command specifies a prefix argument
+ for the following command.
+ 
+ This variable is always local to the current terminal and cannot be
+ buffer-local.  @xref{Multiple Displays}.
+ @end defvar
+ 
+ @defvar this-command
+ @cindex current command
+ This variable records the name of the command now being executed by
+ the editor command loop.  Like @code{last-command}, it is normally a symbol
+ with a function definition.
+ 
+ The command loop sets this variable just before running a command, and
+ copies its value into @code{last-command} when the command finishes
+ (unless the command specifies a prefix argument for the following
+ command).
+ 
+ @cindex kill command repetition
+ Some commands set this variable during their execution, as a flag for
+ whatever command runs next.  In particular, the functions for killing text
+ set @code{this-command} to @code{kill-region} so that any kill commands
+ immediately following will know to append the killed text to the
+ previous kill.
+ @end defvar
+ 
+ If you do not want a particular command to be recognized as the previous
+ command in the case where it got an error, you must code that command to
+ prevent this.  One way is to set @code{this-command} to @code{t} at the
+ beginning of the command, and set @code{this-command} back to its proper
+ value at the end, like this:
+ 
+ @example
+ (defun foo (args@dots{})
+   (interactive @dots{})
+   (let ((old-this-command this-command))
+     (setq this-command t)
+     @r{@dots{}do the work@dots{}}
+     (setq this-command old-this-command)))
+ @end example
+ 
+ @defun this-command-keys
+ This function returns a string or vector containing the key sequence
+ that invoked the present command, plus any previous commands that
+ generated the prefix argument for this command.  The value is a string
+ if all those events were characters.  @xref{Input Events}.
+ 
+ @example
+ @group
+ (this-command-keys)
+ ;; @r{Now use @kbd{C-u C-x C-e} to evaluate that.}
+      @result{} "^U^X^E"
+ @end group
+ @end example
+ @end defun
+ 
+ @defvar last-nonmenu-event
+ This variable holds the last input event read as part of a key
+ sequence, not counting events resulting from mouse menus.
+ 
+ One use of this variable is to figure out a good default location to
+ pop up another menu.
+ @end defvar
+ 
+ @defvar last-command-event
+ @defvarx last-command-char
+ This variable is set to the last input event that was read by the
+ command loop as part of a command.  The principal use of this variable
+ is in @code{self-insert-command}, which uses it to decide which
+ character to insert.
+ 
+ @example
+ @group
+ last-command-event
+ ;; @r{Now use @kbd{C-u C-x C-e} to evaluate that.}
+      @result{} 5
+ @end group
+ @end example
+ 
+ @noindent
+ The value is 5 because that is the @sc{ASCII} code for @kbd{C-e}.
+ 
+ The alias @code{last-command-char} exists for compatibility with
+ Emacs version 18.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @defvar last-event-frame
+ This variable records which frame the last input event was directed to.
+ Usually this is the frame that was selected when the event was
+ generated, but if that frame has redirected input focus to another
+ frame, the value is the frame to which the event was redirected.
+ @xref{Input Focus}.
+ @end defvar
+ 
+ @node Input Events
+ @section Input Events
+ @cindex events
+ @cindex input events
+ 
+ The Emacs command loop reads a sequence of @dfn{input events} that
+ represent keyboard or mouse activity.  The events for keyboard activity
+ are characters or symbols; mouse events are always lists.  This section
+ describes the representation and meaning of input events in detail.
+ 
+ @defun eventp object
+ This function returns non-@code{nil} if @var{event} is an input event.
+ @end defun
+ 
+ @menu
+ * Keyboard Events::		Ordinary characters--keys with symbols on them.
+ * Function Keys::		Function keys--keys with names, not symbols.
+ * Mouse Events::                Overview of mouse events.
+ * Click Events::		Pushing and releasing a mouse button.
+ * Drag Events::			Moving the mouse before releasing the button.
+ * Button-Down Events::		A button was pushed and not yet released.
+ * Repeat Events::               Double and triple click (or drag, or down).
+ * Motion Events::		Just moving the mouse, not pushing a button.
+ * Focus Events::		Moving the mouse between frames.
+ * Misc Events::                 Other events window systems can generate.
+ * Event Examples::		Examples of the lists for mouse events.
+ * Classifying Events::		Finding the modifier keys in an event symbol.
+ 				Event types.
+ * Accessing Events::		Functions to extract info from events.
+ * Strings of Events::           Special considerations for putting
+ 				  keyboard character events in a string.
+ @end menu
+ 
+ @node Keyboard Events
+ @subsection Keyboard Events
+ 
+ There are two kinds of input you can get from the keyboard: ordinary
+ keys, and function keys.  Ordinary keys correspond to characters; the
+ events they generate are represented in Lisp as characters.  In Emacs
+ versions 18 and earlier, characters were the only events.  The event
+ type of a character event is the character itself (an integer); 
+ see @ref{Classifying Events}.
+ 
+ @cindex modifier bits (of input character)
+ @cindex basic code (of input character)
+ An input character event consists of a @dfn{basic code} between 0 and
+ 255, plus any or all of these @dfn{modifier bits}:
+ 
+ @table @asis
+ @item meta
+ The
+ @iftex
+ $2^{27}$
+ @end iftex
+ @ifinfo
+ 2**27
+ @end ifinfo
+ bit in the character code indicates a character
+ typed with the meta key held down.
+ 
+ @item control
+ The
+ @iftex
+ $2^{26}$
+ @end iftex
+ @ifinfo
+ 2**26
+ @end ifinfo
+ bit in the character code indicates a non-@sc{ASCII}
+ control character.
+ 
+ @sc{ASCII} control characters such as @kbd{C-a} have special basic
+ codes of their own, so Emacs needs no special bit to indicate them.
+ Thus, the code for @kbd{C-a} is just 1.
+ 
+ But if you type a control combination not in @sc{ASCII}, such as
+ @kbd{%} with the control key, the numeric value you get is the code
+ for @kbd{%} plus
+ @iftex
+ $2^{26}$
+ @end iftex
+ @ifinfo
+ 2**26
+ @end ifinfo
+ (assuming the terminal supports non-@sc{ASCII}
+ control characters).
+ 
+ @item shift
+ The
+ @iftex
+ $2^{25}$
+ @end iftex
+ @ifinfo
+ 2**25
+ @end ifinfo
+ bit in the character code indicates an @sc{ASCII} control
+ character typed with the shift key held down.
+ 
+ For letters, the basic code indicates upper versus lower case; for
+ digits and punctuation, the shift key selects an entirely different
+ character with a different basic code.  In order to keep within
+ the @sc{ASCII} character set whenever possible, Emacs avoids using
+ the
+ @iftex
+ $2^{25}$
+ @end iftex
+ @ifinfo
+ 2**25
+ @end ifinfo
+ bit for those characters.
+ 
+ However, @sc{ASCII} provides no way to distinguish @kbd{C-A} from
+ @kbd{C-a}, so Emacs uses the
+ @iftex
+ $2^{25}$
+ @end iftex
+ @ifinfo
+ 2**25
+ @end ifinfo
+ bit in @kbd{C-A} and not in
+ @kbd{C-a}.
+ 
+ @item hyper
+ The
+ @iftex
+ $2^{24}$
+ @end iftex
+ @ifinfo
+ 2**24
+ @end ifinfo
+ bit in the character code indicates a character
+ typed with the hyper key held down.
+ 
+ @item super
+ The
+ @iftex
+ $2^{23}$
+ @end iftex
+ @ifinfo
+ 2**23
+ @end ifinfo
+ bit in the character code indicates a character
+ typed with the super key held down.
+ 
+ @item alt
+ The
+ @iftex
+ $2^{22}$
+ @end iftex
+ @ifinfo
+ 2**22
+ @end ifinfo
+ bit in the character code indicates a character typed with
+ the alt key held down.  (On some terminals, the key labeled @key{ALT}
+ is actually the meta key.)
+ @end table
+ 
+   It is best to avoid mentioning specific bit numbers in your program.
+ To test the modifier bits of a character, use the function
+ @code{event-modifiers} (@pxref{Classifying Events}).  When making key
+ bindings, you can use the read syntax for characters with modifier bits
+ (@samp{\C-}, @samp{\M-}, and so on).  For making key bindings with
+ @code{define-key}, you can use lists such as @code{(control hyper ?x)} to
+ specify the characters (@pxref{Changing Key Bindings}).  The function
+ @code{event-convert-list} converts such a list into an event type
+ (@pxref{Classifying Events}).
+ 
+ @node Function Keys
+ @subsection Function Keys
+ 
+ @cindex function keys
+ Most keyboards also have @dfn{function keys}---keys that have names or
+ symbols that are not characters.  Function keys are represented in Lisp
+ as symbols; the symbol's name is the function key's label, in lower
+ case.  For example, pressing a key labeled @key{F1} places the symbol
+ @code{f1} in the input stream.
+ 
+ The event type of a function key event is the event symbol itself.
+ @xref{Classifying Events}.
+ 
+ Here are a few special cases in the symbol-naming convention for
+ function keys:
+ 
+ @table @asis
+ @item @code{backspace}, @code{tab}, @code{newline}, @code{return}, @code{delete}
+ These keys correspond to common @sc{ASCII} control characters that have
+ special keys on most keyboards.
+ 
+ In @sc{ASCII}, @kbd{C-i} and @key{TAB} are the same character.  If the
+ terminal can distinguish between them, Emacs conveys the distinction to
+ Lisp programs by representing the former as the integer 9, and the
+ latter as the symbol @code{tab}.
+ 
+ Most of the time, it's not useful to distinguish the two.  So normally
+ @code{function-key-map} is set up to map @code{tab} into 9.  Thus, a key
+ binding for character code 9 (the character @kbd{C-i}) also applies to
+ @code{tab}.  Likewise for the other symbols in this group.  The function
+ @code{read-char} likewise converts these events into characters.
+ 
+ In @sc{ASCII}, @key{BS} is really @kbd{C-h}.  But @code{backspace}
+ converts into the character code 127 (@key{DEL}), not into code 8
+ (@key{BS}).  This is what most users prefer.
+ 
+ @item @code{left}, @code{up}, @code{right}, @code{down}
+ Cursor arrow keys
+ @item @code{kp-add}, @code{kp-decimal}, @code{kp-divide}, @dots{}
+ Keypad keys (to the right of the regular keyboard).
+ @item @code{kp-0}, @code{kp-1}, @dots{}
+ Keypad keys with digits.
+ @item @code{kp-f1}, @code{kp-f2}, @code{kp-f3}, @code{kp-f4}
+ Keypad PF keys.
+ @item @code{kp-home}, @code{kp-left}, @code{kp-up}, @code{kp-right}, @code{kp-down}
+ Keypad arrow keys.  Emacs normally translates these
+ into the non-keypad keys @code{home}, @code{left}, @dots{}
+ @item @code{kp-prior}, @code{kp-next}, @code{kp-end}, @code{kp-begin}, @code{kp-insert}, @code{kp-delete}
+ Additional keypad duplicates of keys ordinarily found elsewhere.  Emacs
+ normally translates these into the like-named non-keypad keys.
+ @end table
+ 
+ You can use the modifier keys @key{ALT}, @key{CTRL}, @key{HYPER},
+ @key{META}, @key{SHIFT}, and @key{SUPER} with function keys.  The way to
+ represent them is with prefixes in the symbol name:
+ 
+ @table @samp
+ @item A-
+ The alt modifier.
+ @item C-
+ The control modifier.
+ @item H-
+ The hyper modifier.
+ @item M-
+ The meta modifier.
+ @item S-
+ The shift modifier.
+ @item s-
+ The super modifier.
+ @end table
+ 
+ Thus, the symbol for the key @key{F3} with @key{META} held down is
+ @code{M-f3}.  When you use more than one prefix, we recommend you
+ write them in alphabetical order; but the order does not matter in
+ arguments to the key-binding lookup and modification functions.
+ 
+ @node Mouse Events
+ @subsection Mouse Events
+ 
+ Emacs supports four kinds of mouse events: click events, drag events,
+ button-down events, and motion events.  All mouse events are represented
+ as lists.  The @sc{car} of the list is the event type; this says which
+ mouse button was involved, and which modifier keys were used with it.
+ The event type can also distinguish double or triple button presses
+ (@pxref{Repeat Events}).  The rest of the list elements give position
+ and time information.
+ 
+ For key lookup, only the event type matters: two events of the same type
+ necessarily run the same command.  The command can access the full
+ values of these events using the @samp{e} interactive code.
+ @xref{Interactive Codes}.
+ 
+ A key sequence that starts with a mouse event is read using the keymaps
+ of the buffer in the window that the mouse was in, not the current
+ buffer.  This does not imply that clicking in a window selects that
+ window or its buffer---that is entirely under the control of the command
+ binding of the key sequence.
+ 
+ @node Click Events
+ @subsection Click Events
+ @cindex click event
+ @cindex mouse click event
+ 
+ When the user presses a mouse button and releases it at the same
+ location, that generates a @dfn{click} event.  Mouse click events have
+ this form:
+ 
+ @example
+ (@var{event-type}
+  (@var{window} @var{buffer-pos} (@var{x} . @var{y}) @var{timestamp})
+  @var{click-count})
+ @end example
+ 
+ Here is what the elements normally mean:
+ 
+ @table @asis
+ @item @var{event-type}
+ This is a symbol that indicates which mouse button was used.  It is
+ one of the symbols @code{mouse-1}, @code{mouse-2}, @dots{}, where the
+ buttons are numbered left to right.
+ 
+ You can also use prefixes @samp{A-}, @samp{C-}, @samp{H-}, @samp{M-},
+ @samp{S-} and @samp{s-} for modifiers alt, control, hyper, meta, shift
+ and super, just as you would with function keys.
+ 
+ This symbol also serves as the event type of the event.  Key bindings
+ describe events by their types; thus, if there is a key binding for
+ @code{mouse-1}, that binding would apply to all events whose
+ @var{event-type} is @code{mouse-1}.
+ 
+ @item @var{window}
+ This is the window in which the click occurred.
+ 
+ @item @var{x}, @var{y}
+ These are the pixel-denominated coordinates of the click, relative to
+ the top left corner of @var{window}, which is @code{(0 . 0)}.
+ 
+ @item @var{buffer-pos}
+ This is the buffer position of the character clicked on.
+ 
+ @item @var{timestamp}
+ This is the time at which the event occurred, in milliseconds.  (Since
+ this value wraps around the entire range of Emacs Lisp integers in about
+ five hours, it is useful only for relating the times of nearby events.)
+ 
+ @item @var{click-count}
+ This is the number of rapid repeated presses so far of the same mouse
+ button.  @xref{Repeat Events}.
+ @end table
+ 
+ The meanings of @var{buffer-pos}, @var{x} and @var{y} are somewhat
+ different when the event location is in a special part of the screen,
+ such as the mode line or a scroll bar.
+ 
+ If the location is in a scroll bar, then @var{buffer-pos} is the symbol
+ @code{vertical-scroll-bar} or @code{horizontal-scroll-bar}, and the pair
+ @code{(@var{x} . @var{y})} is replaced with a pair @code{(@var{portion}
+ . @var{whole})}, where @var{portion} is the distance of the click from
+ the top or left end of the scroll bar, and @var{whole} is the length of
+ the entire scroll bar.
+ 
+ If the position is on a mode line or the vertical line separating
+ @var{window} from its neighbor to the right, then @var{buffer-pos} is
+ the symbol @code{mode-line} or @code{vertical-line}.  For the mode line,
+ @var{y} does not have meaningful data.  For the vertical line, @var{x}
+ does not have meaningful data.
+ 
+ In one special case, @var{buffer-pos} is a list containing a symbol (one
+ of the symbols listed above) instead of just the symbol.  This happens
+ after the imaginary prefix keys for the event are inserted into the
+ input stream.  @xref{Key Sequence Input}.
+ 
+ @node Drag Events
+ @subsection Drag Events
+ @cindex drag event
+ @cindex mouse drag event
+ 
+ With Emacs, you can have a drag event without even changing your
+ clothes.  A @dfn{drag event} happens every time the user presses a mouse
+ button and then moves the mouse to a different character position before
+ releasing the button.  Like all mouse events, drag events are
+ represented in Lisp as lists.  The lists record both the starting mouse
+ position and the final position, like this:
+ 
+ @example
+ (@var{event-type}
+  (@var{window1} @var{buffer-pos1} (@var{x1} . @var{y1}) @var{timestamp1})
+  (@var{window2} @var{buffer-pos2} (@var{x2} . @var{y2}) @var{timestamp2})
+  @var{click-count})
+ @end example
+ 
+ For a drag event, the name of the symbol @var{event-type} contains the
+ prefix @samp{drag-}.  The second and third elements of the event give
+ the starting and ending position of the drag.  Aside from that, the data
+ have the same meanings as in a click event (@pxref{Click Events}).  You
+ can access the second element of any mouse event in the same way, with
+ no need to distinguish drag events from others.
+ 
+ The @samp{drag-} prefix follows the modifier key prefixes such as
+ @samp{C-} and @samp{M-}.
+ 
+ If @code{read-key-sequence} receives a drag event that has no key
+ binding, and the corresponding click event does have a binding, it
+ changes the drag event into a click event at the drag's starting
+ position.  This means that you don't have to distinguish between click
+ and drag events unless you want to.
+ 
+ @node Button-Down Events
+ @subsection Button-Down Events
+ @cindex button-down event
+ 
+ Click and drag events happen when the user releases a mouse button.
+ They cannot happen earlier, because there is no way to distinguish a
+ click from a drag until the button is released.
+ 
+ If you want to take action as soon as a button is pressed, you need to
+ handle @dfn{button-down} events.@footnote{Button-down is the
+ conservative antithesis of drag.}  These occur as soon as a button is
+ pressed.  They are represented by lists that look exactly like click
+ events (@pxref{Click Events}), except that the @var{event-type} symbol
+ name contains the prefix @samp{down-}.  The @samp{down-} prefix follows
+ modifier key prefixes such as @samp{C-} and @samp{M-}.
+ 
+ The function @code{read-key-sequence}, and therefore the Emacs command
+ loop as well, ignore any button-down events that don't have command
+ bindings.  This means that you need not worry about defining button-down
+ events unless you want them to do something.  The usual reason to define
+ a button-down event is so that you can track mouse motion (by reading
+ motion events) until the button is released.  @xref{Motion Events}.
+ 
+ @node Repeat Events
+ @subsection Repeat Events
+ @cindex repeat events
+ @cindex double-click events
+ @cindex triple-click events
+ 
+ If you press the same mouse button more than once in quick succession
+ without moving the mouse, Emacs generates special @dfn{repeat} mouse
+ events for the second and subsequent presses.
+ 
+ The most common repeat events are @dfn{double-click} events.  Emacs
+ generates a double-click event when you click a button twice; the event
+ happens when you release the button (as is normal for all click
+ events).
+ 
+ The event type of a double-click event contains the prefix
+ @samp{double-}.  Thus, a double click on the second mouse button with
+ @key{meta} held down comes to the Lisp program as
+ @code{M-double-mouse-2}.  If a double-click event has no binding, the
+ binding of the corresponding ordinary click event is used to execute
+ it.  Thus, you need not pay attention to the double click feature 
+ unless you really want to.
+ 
+ When the user performs a double click, Emacs generates first an ordinary
+ click event, and then a double-click event.  Therefore, you must design
+ the command binding of the double click event to assume that the
+ single-click command has already run.  It must produce the desired
+ results of a double click, starting from the results of a single click.
+ 
+ This is convenient, if the meaning of a double click somehow ``builds
+ on'' the meaning of a single click---which is recommended user interface
+ design practice for double clicks.
+ 
+ If you click a button, then press it down again and start moving the
+ mouse with the button held down, then you get a @dfn{double-drag} event
+ when you ultimately release the button.  Its event type contains
+ @samp{double-drag} instead of just @samp{drag}.  If a double-drag event
+ has no binding, Emacs looks for an alternate binding as if the event
+ were an ordinary drag.
+ 
+ Before the double-click or double-drag event, Emacs generates a
+ @dfn{double-down} event when the user presses the button down for the
+ second time.  Its event type contains @samp{double-down} instead of just
+ @samp{down}.  If a double-down event has no binding, Emacs looks for an
+ alternate binding as if the event were an ordinary button-down event.
+ If it finds no binding that way either, the double-down event is
+ ignored.
+ 
+ To summarize, when you click a button and then press it again right
+ away, Emacs generates a down event and a click event for the first
+ click, a double-down event when you press the button again, and finally
+ either a double-click or a double-drag event.
+ 
+ If you click a button twice and then press it again, all in quick
+ succession, Emacs generates a @dfn{triple-down} event, followed by
+ either a @dfn{triple-click} or a @dfn{triple-drag}.  The event types of
+ these events contain @samp{triple} instead of @samp{double}.  If any
+ triple event has no binding, Emacs uses the binding that it would use
+ for the corresponding double event.
+ 
+ If you click a button three or more times and then press it again, the
+ events for the presses beyond the third are all triple events.  Emacs
+ does not have separate event types for quadruple, quintuple, etc.@:
+ events.  However, you can look at the event list to find out precisely
+ how many times the button was pressed.
+ 
+ @defun event-click-count event
+ This function returns the number of consecutive button presses that led
+ up to @var{event}.  If @var{event} is a double-down, double-click or
+ double-drag event, the value is 2.  If @var{event} is a triple event,
+ the value is 3 or greater.  If @var{event} is an ordinary mouse event
+ (not a repeat event), the value is 1.
+ @end defun
+ 
+ @defvar double-click-time
+ To generate repeat events, successive mouse button presses must be at
+ the same screen position, and the number of milliseconds between
+ successive button presses must be less than the value of
+ @code{double-click-time}.  Setting @code{double-click-time} to
+ @code{nil} disables multi-click detection entirely.  Setting it to
+ @code{t} removes the time limit; Emacs then detects multi-clicks by
+ position only.
+ @end defvar
+ 
+ @node Motion Events
+ @subsection Motion Events
+ @cindex motion event
+ @cindex mouse motion events
+ 
+ Emacs sometimes generates @dfn{mouse motion} events to describe motion
+ of the mouse without any button activity.  Mouse motion events are
+ represented by lists that look like this:
+ 
+ @example
+ (mouse-movement
+  (@var{window} @var{buffer-pos} (@var{x} . @var{y}) @var{timestamp}))
+ @end example
+ 
+ The second element of the list describes the current position of the
+ mouse, just as in a click event (@pxref{Click Events}).
+ 
+ The special form @code{track-mouse} enables generation of motion events
+ within its body.  Outside of @code{track-mouse} forms, Emacs does not
+ generate events for mere motion of the mouse, and these events do not
+ appear.
+ 
+ @defspec track-mouse body@dots{}
+ This special form executes @var{body}, with generation of mouse motion
+ events enabled.  Typically @var{body} would use @code{read-event}
+ to read the motion events and modify the display accordingly.
+ 
+ When the user releases the button, that generates a click event.
+ Typically, @var{body} should return when it sees the click event, and
+ discard that event.
+ @end defspec
+ 
+ @node Focus Events
+ @subsection Focus Events
+ @cindex focus event
+ 
+ Window systems provide general ways for the user to control which window
+ gets keyboard input.  This choice of window is called the @dfn{focus}.
+ When the user does something to switch between Emacs frames, that
+ generates a @dfn{focus event}.  The normal definition of a focus event,
+ in the global keymap, is to select a new frame within Emacs, as the user
+ would expect.  @xref{Input Focus}.
+ 
+ Focus events are represented in Lisp as lists that look like this:
+ 
+ @example
+ (switch-frame @var{new-frame})
+ @end example
+ 
+ @noindent
+ where @var{new-frame} is the frame switched to.
+ 
+ Most X window managers are set up so that just moving the mouse into a
+ window is enough to set the focus there.  Emacs appears to do this,
+ because it changes the cursor to solid in the new frame.  However, there
+ is no need for the Lisp program to know about the focus change until
+ some other kind of input arrives.  So Emacs generates a focus event only
+ when the user actually types a keyboard key or presses a mouse button in
+ the new frame; just moving the mouse between frames does not generate a
+ focus event.
+ 
+ A focus event in the middle of a key sequence would garble the
+ sequence.  So Emacs never generates a focus event in the middle of a key
+ sequence.  If the user changes focus in the middle of a key
+ sequence---that is, after a prefix key---then Emacs reorders the events
+ so that the focus event comes either before or after the multi-event key
+ sequence, and not within it.
+ 
+ @node Misc Events
+ @subsection Miscellaneous Window System Events
+ 
+ A few other event types represent occurrences within the window system.
+ 
+ @table @code
+ @cindex @code{delete-frame} event
+ @item (delete-frame (@var{frame}))
+ This kind of event indicates that the user gave the window manager
+ a command to delete a particular window, which happens to be an Emacs frame.
+ 
+ The standard definition of the @code{delete-frame} event is to delete @var{frame}.
+ 
+ @cindex @code{iconify-frame} event
+ @item (iconify-frame (@var{frame}))
+ This kind of event indicates that the user iconified @var{frame} using
+ the window manager.  Its standard definition is @code{ignore}; since
+ the frame has already been deiconified, Emacs has no work to do.
+ The purpose of this event type is so that you can keep track of such
+ events if you want to.
+ 
+ @cindex @code{make-frame-visible} event
+ @item (make-frame-visible (@var{frame}))
+ This kind of event indicates that the user deiconified @var{frame} using
+ the window manager.  Its standard definition is @code{ignore}; since the
+ frame has already been iconified, Emacs has no work to do.
+ @end table
+ 
+   If one of these events arrives in the middle of a key sequence---that
+ is, after a prefix key---then Emacs reorders the events so that this
+ event comes either before or after the multi-event key sequence, not
+ within it.
+ 
+ @node Event Examples
+ @subsection Event Examples
+ 
+ If the user presses and releases the left mouse button over the same
+ location, that generates a sequence of events like this:
+ 
+ @smallexample
+ (down-mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864320))
+ (mouse-1      (#<window 18 on NEWS> 2613 (0 . 38) -864180))
+ @end smallexample
+ 
+ While holding the control key down, the user might hold down the
+ second mouse button, and drag the mouse from one line to the next.
+ That produces two events, as shown here:
+ 
+ @smallexample
+ (C-down-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219))
+ (C-drag-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219)
+                 (#<window 18 on NEWS> 3510 (0 . 28) -729648))
+ @end smallexample
+ 
+ While holding down the meta and shift keys, the user might press the
+ second mouse button on the window's mode line, and then drag the mouse
+ into another window.  That produces a pair of events like these:
+ 
+ @smallexample
+ (M-S-down-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844))
+ (M-S-drag-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844)
+                   (#<window 20 on carlton-sanskrit.tex> 161 (33 . 3)
+                    -453816))
+ @end smallexample
+ 
+ @node Classifying Events
+ @subsection Classifying Events
+ @cindex event type
+ 
+   Every event has an @dfn{event type}, which classifies the event for
+ key binding purposes.  For a keyboard event, the event type equals the
+ event value; thus, the event type for a character is the character, and
+ the event type for a function key symbol is the symbol itself.  For
+ events that are lists, the event type is the symbol in the @sc{car} of
+ the list.  Thus, the event type is always a symbol or a character.
+ 
+   Two events of the same type are equivalent where key bindings are
+ concerned; thus, they always run the same command.  That does not
+ necessarily mean they do the same things, however, as some commands look
+ at the whole event to decide what to do.  For example, some commands use
+ the location of a mouse event to decide where in the buffer to act.
+ 
+   Sometimes broader classifications of events are useful.  For example,
+ you might want to ask whether an event involved the @key{META} key,
+ regardless of which other key or mouse button was used.
+ 
+   The functions @code{event-modifiers} and @code{event-basic-type} are
+ provided to get such information conveniently.
+ 
+ @defun event-modifiers event
+ This function returns a list of the modifiers that @var{event} has.  The
+ modifiers are symbols; they include @code{shift}, @code{control},
+ @code{meta}, @code{alt}, @code{hyper} and @code{super}.  In addition,
+ the modifiers list of a mouse event symbol always contains one of
+ @code{click}, @code{drag}, and @code{down}.
+ 
+ The argument @var{event} may be an entire event object, or just an event
+ type.
+ 
+ Here are some examples:
+ 
+ @example
+ (event-modifiers ?a)
+      @result{} nil
+ (event-modifiers ?\C-a)
+      @result{} (control)
+ (event-modifiers ?\C-%)
+      @result{} (control)
+ (event-modifiers ?\C-\S-a)
+      @result{} (control shift)
+ (event-modifiers 'f5)
+      @result{} nil
+ (event-modifiers 's-f5)
+      @result{} (super)
+ (event-modifiers 'M-S-f5)
+      @result{} (meta shift)
+ (event-modifiers 'mouse-1)
+      @result{} (click)
+ (event-modifiers 'down-mouse-1)
+      @result{} (down)
+ @end example
+ 
+ The modifiers list for a click event explicitly contains @code{click},
+ but the event symbol name itself does not contain @samp{click}.
+ @end defun
+ 
+ @defun event-basic-type event
+ This function returns the key or mouse button that @var{event}
+ describes, with all modifiers removed.  For example:
+ 
+ @example
+ (event-basic-type ?a)
+      @result{} 97
+ (event-basic-type ?A)
+      @result{} 97
+ (event-basic-type ?\C-a)
+      @result{} 97
+ (event-basic-type ?\C-\S-a)
+      @result{} 97
+ (event-basic-type 'f5)
+      @result{} f5
+ (event-basic-type 's-f5)
+      @result{} f5
+ (event-basic-type 'M-S-f5)
+      @result{} f5
+ (event-basic-type 'down-mouse-1)
+      @result{} mouse-1
+ @end example
+ @end defun
+ 
+ @defun mouse-movement-p object
+ This function returns non-@code{nil} if @var{object} is a mouse movement
+ event.
+ @end defun
+ 
+ @defun event-convert-list list
+ This function converts a list of modifier names and a basic event type
+ to an event type which specifies all of them.  For example,
+ 
+ @example
+ (event-convert-list '(control ?a))
+      @result{} 1
+ (event-convert-list '(control meta ?a))
+      @result{} -134217727
+ (event-convert-list '(control super f1))
+      @result{} C-s-f1
+ @end example
+ @end defun
+ 
+ @node Accessing Events
+ @subsection Accessing Events
+ 
+   This section describes convenient functions for accessing the data in
+ a mouse button or motion event.
+ 
+   These two functions return the starting or ending position of a
+ mouse-button event.  The position is a list of this form:
+ 
+ @example
+ (@var{window} @var{buffer-position} (@var{x} . @var{y}) @var{timestamp})
+ @end example
+ 
+ @defun event-start event
+ This returns the starting position of @var{event}.
+ 
+ If @var{event} is a click or button-down event, this returns the
+ location of the event.  If @var{event} is a drag event, this returns the
+ drag's starting position.
+ @end defun
+ 
+ @defun event-end event
+ This returns the ending position of @var{event}.
+ 
+ If @var{event} is a drag event, this returns the position where the user
+ released the mouse button.  If @var{event} is a click or button-down
+ event, the value is actually the starting position, which is the only
+ position such events have.
+ @end defun
+ 
+   These four functions take a position as described above, and return
+ various parts of it.
+ 
+ @defun posn-window position
+ Return the window that @var{position} is in.
+ @end defun
+ 
+ @defun posn-point position
+ Return the buffer position in @var{position}.  This is an integer.
+ @end defun
+ 
+ @defun posn-x-y position
+ Return the pixel-based x and y coordinates in @var{position}, as a cons
+ cell @code{(@var{x} . @var{y})}.
+ @end defun
+ 
+ @defun posn-col-row position
+ Return the row and column (in units of characters) of @var{position}, as
+ a cons cell @code{(@var{col} . @var{row})}.  These are computed from the
+ @var{x} and @var{y} values actually found in @var{position}.
+ @end defun
+ 
+ @defun posn-timestamp position
+ Return the timestamp in @var{position}.
+ @end defun
+ 
+ @defun scroll-bar-event-ratio event
+ This function returns the fractional vertical position of a scroll bar
+ event within the scroll bar.  The value is a cons cell
+ @code{(@var{portion} . @var{whole})} containing two integers whose ratio
+ is the fractional position.
+ @end defun
+ 
+ @defun scroll-bar-scale ratio total
+ This function multiplies (in effect) @var{ratio} by @var{total},
+ rounding the result to an integer.  The argument @var{ratio} is not a
+ number, but rather a pair @code{(@var{num} . @var{denom})}---typically a
+ value returned by @code{scroll-bar-event-ratio}.
+ 
+ This function is handy for scaling a position on a scroll bar into a
+ buffer position.  Here's how to do that:
+ 
+ @example
+ (+ (point-min)
+    (scroll-bar-scale
+       (posn-x-y (event-start event))
+       (- (point-max) (point-min))))
+ @end example
+ 
+ Recall that scroll bar events have two integers forming ratio in place
+ of a pair of x and y coordinates.
+ @end defun
+ 
+ @node Strings of Events
+ @subsection Putting Keyboard Events in Strings
+ 
+   In most of the places where strings are used, we conceptualize the
+ string as containing text characters---the same kind of characters found
+ in buffers or files.  Occasionally Lisp programs use strings that
+ conceptually contain keyboard characters; for example, they may be key
+ sequences or keyboard macro definitions.  There are special rules for
+ how to put keyboard characters into a string, because they are not
+ limited to the range of 0 to 255 as text characters are.
+ 
+   A keyboard character typed using the @key{META} key is called a
+ @dfn{meta character}.  The numeric code for such an event includes the
+ @iftex
+ $2^{27}$
+ @end iftex
+ @ifinfo
+ 2**27
+ @end ifinfo
+ bit; it does not even come close to fitting in a string.  However,
+ earlier Emacs versions used a different representation for these
+ characters, which gave them codes in the range of 128 to 255.  That did
+ fit in a string, and many Lisp programs contain string constants that
+ use @samp{\M-} to express meta characters, especially as the argument to
+ @code{define-key} and similar functions.
+ 
+   We provide backward compatibility to run those programs using special
+ rules for how to put a keyboard character event in a string.  Here are
+ the rules:
+ 
+ @itemize @bullet
+ @item
+ If the keyboard character value is in the range of 0 to 127, it can go
+ in the string unchanged.
+ 
+ @item
+ The meta variants of those characters, with codes in the range of
+ @iftex
+ $2^{27}$
+ @end iftex
+ @ifinfo
+ 2**27
+ @end ifinfo
+ to
+ @iftex
+ $2^{27} + 127$,
+ @end iftex
+ @ifinfo
+ 2**27+127,
+ @end ifinfo
+ can also go in the string, but you must change their
+ numeric values.  You must set the
+ @iftex
+ $2^{7}$
+ @end iftex
+ @ifinfo
+ 2**7
+ @end ifinfo
+ bit instead of the
+ @iftex
+ $2^{27}$
+ @end iftex
+ @ifinfo
+ 2**27
+ @end ifinfo
+ bit,
+ resulting in a value between 128 and 255.
+ 
+ @item
+ Other keyboard character events cannot fit in a string.  This includes
+ keyboard events in the range of 128 to 255.
+ @end itemize
+ 
+   Functions such as @code{read-key-sequence} that can construct strings
+ of keyboard input characters follow these rules.  They construct vectors
+ instead of strings, when the events won't fit in a string.
+ 
+   When you use the read syntax @samp{\M-} in a string, it produces a
+ code in the range of 128 to 255---the same code that you get if you
+ modify the corresponding keyboard event to put it in the string.  Thus,
+ meta events in strings work consistently regardless of how they get into
+ the strings.
+ 
+   The reason we changed the representation of meta characters as
+ keyboard events is to make room for basic character codes beyond 127,
+ and support meta variants of such larger character codes.
+ 
+   New programs can avoid dealing with these special compatibility rules
+ by using vectors instead of strings for key sequences when there is any
+ possibility that they might contain meta characters, and by using
+ @code{listify-key-sequence} to access a string of events.
+ 
+ @defun listify-key-sequence key
+ This function converts the string or vector @var{key} to a list of
+ events, which you can put in @code{unread-command-events}.  Converting a
+ vector is simple, but converting a string is tricky because of the
+ special representation used for meta characters in a string.
+ @end defun
+ 
+ @node Reading Input
+ @section Reading Input
+ 
+   The editor command loop reads keyboard input using the function
+ @code{read-key-sequence}, which uses @code{read-event}.  These and other
+ functions for keyboard input are also available for use in Lisp
+ programs.  See also @code{momentary-string-display} in @ref{Temporary
+ Displays}, and @code{sit-for} in @ref{Waiting}.  @xref{Terminal Input},
+ for functions and variables for controlling terminal input modes and
+ debugging terminal input.
+ 
+   For higher-level input facilities, see @ref{Minibuffers}.
+ 
+ @menu
+ * Key Sequence Input::		How to read one key sequence.
+ * Reading One Event::		How to read just one event.
+ * Quoted Character Input::	Asking the user to specify a character.
+ * Event Input Misc::    	How to reread or throw away input events.
+ @end menu
+ 
+ @node Key Sequence Input
+ @subsection Key Sequence Input
+ @cindex key sequence input
+ 
+   The command loop reads input a key sequence at a time, by calling
+ @code{read-key-sequence}.  Lisp programs can also call this function;
+ for example, @code{describe-key} uses it to read the key to describe.
+ 
+ @defun read-key-sequence prompt
+ @cindex key sequence
+ This function reads a key sequence and returns it as a string or
+ vector.  It keeps reading events until it has accumulated a full key
+ sequence; that is, enough to specify a non-prefix command using the
+ currently active keymaps.
+ 
+ If the events are all characters and all can fit in a string, then
+ @code{read-key-sequence} returns a string (@pxref{Strings of Events}).
+ Otherwise, it returns a vector, since a vector can hold all kinds of
+ events---characters, symbols, and lists.  The elements of the string or
+ vector are the events in the key sequence.
+ 
+ The function @code{read-key-sequence} suppresses quitting: @kbd{C-g}
+ typed while reading with this function works like any other character,
+ and does not set @code{quit-flag}.  @xref{Quitting}.
+ 
+ The argument @var{prompt} is either a string to be displayed in the echo
+ area as a prompt, or @code{nil}, meaning not to display a prompt.
+ 
+ In the example below, the prompt @samp{?} is displayed in the echo area,
+ and the user types @kbd{C-x C-f}.
+ 
+ @example
+ (read-key-sequence "?")
+ 
+ @group
+ ---------- Echo Area ----------
+ ?@kbd{C-x C-f}
+ ---------- Echo Area ----------
+ 
+      @result{} "^X^F"
+ @end group
+ @end example
+ @end defun
+ 
+ @defvar num-input-keys
+ @c Emacs 19 feature
+ This variable's value is the number of key sequences processed so far in
+ this Emacs session.  This includes key sequences read from the terminal
+ and key sequences read from keyboard macros being executed.
+ @end defvar
+ 
+ @cindex upper case key sequence
+ @cindex downcasing in @code{lookup-key}
+ If an input character is an upper-case letter and has no key binding,
+ but its lower-case equivalent has one, then @code{read-key-sequence}
+ converts the character to lower case.  Note that @code{lookup-key} does
+ not perform case conversion in this way.
+ 
+ The function @code{read-key-sequence} also transforms some mouse events.
+ It converts unbound drag events into click events, and discards unbound
+ button-down events entirely.  It also reshuffles focus events and
+ miscellaneous window events so that they never appear in a key sequence
+ with any other events.
+ 
+ When mouse events occur in special parts of a window, such as a mode
+ line or a scroll bar, the event type shows nothing special---it is the
+ same symbol that would normally represent that combination of mouse
+ button and modifier keys.  The information about the window part is
+ kept elsewhere in the event---in the coordinates.  But
+ @code{read-key-sequence} translates this information into imaginary
+ prefix keys, all of which are symbols: @code{mode-line},
+ @code{vertical-line}, @code{horizontal-scroll-bar} and
+ @code{vertical-scroll-bar}.
+ 
+ You can define meanings for mouse clicks in special window parts by
+ defining key sequences using these imaginary prefix keys.
+ 
+ For example, if you call @code{read-key-sequence} and then click the
+ mouse on the window's mode line, you get two events, like this:
+ 
+ @example
+ (read-key-sequence "Click on the mode line: ")
+      @result{} [mode-line
+          (mouse-1
+           (#<window 6 on NEWS> mode-line
+            (40 . 63) 5959987))]
+ @end example
+ 
+ @node Reading One Event
+ @subsection Reading One Event
+ 
+   The lowest level functions for command input are those that read a
+ single event.
+ 
+ @defun read-event
+ This function reads and returns the next event of command input, waiting
+ if necessary until an event is available.  Events can come directly from
+ the user or from a keyboard macro.
+ 
+ The function @code{read-event} does not display any message to indicate
+ it is waiting for input; use @code{message} first, if you wish to
+ display one.  If you have not displayed a message, @code{read-event}
+ prompts by echoing: it displays descriptions of the events that led to
+ or were read by the current command.  @xref{The Echo Area}.
+ 
+ If @code{cursor-in-echo-area} is non-@code{nil}, then @code{read-event}
+ moves the cursor temporarily to the echo area, to the end of any message
+ displayed there.  Otherwise @code{read-event} does not move the cursor.
+ 
+ Here is what happens if you call @code{read-event} and then press the
+ right-arrow function key:
+ 
+ @example
+ @group
+ (read-event)
+      @result{} right
+ @end group
+ @end example
+ @end defun
+ 
+ @defun read-char
+ This function reads and returns a character of command input.  It
+ discards any events that are not characters, until it gets a character.
+ 
+ In the first example, the user types the character @kbd{1} (@sc{ASCII}
+ code 49).  The second example shows a keyboard macro definition that
+ calls @code{read-char} from the minibuffer using @code{eval-expression}.
+ @code{read-char} reads the keyboard macro's very next character, which
+ is @kbd{1}.  Then @code{eval-expression} displays its return value in
+ the echo area.
+ 
+ @example
+ @group
+ (read-char)
+      @result{} 49
+ @end group
+ 
+ @group
+ ;; @r{We assume here you use @kbd{M-:} to evaluate this.}
+ (symbol-function 'foo)
+      @result{} "^[:(read-char)^M1"
+ @end group
+ @group
+ (execute-kbd-macro 'foo)
+      @print{} 49
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @node Quoted Character Input
+ @subsection Quoted Character Input
+ @cindex quoted character input
+ 
+   You can use the function @code{read-quoted-char} to ask the user to
+ specify a character, and allow the user to specify a control or meta
+ character conveniently, either literally or as an octal character code.
+ The command @code{quoted-insert} uses this function.
+ 
+ @defun read-quoted-char &optional prompt
+ @cindex octal character input
+ @cindex control characters, reading
+ @cindex nonprinting characters, reading
+ This function is like @code{read-char}, except that if the first
+ character read is an octal digit (0-7), it reads up to two more octal digits
+ (but stopping if a non-octal digit is found) and returns the
+ character represented by those digits in octal.
+ 
+ Quitting is suppressed when the first character is read, so that the
+ user can enter a @kbd{C-g}.  @xref{Quitting}.
+ 
+ If @var{prompt} is supplied, it specifies a string for prompting the
+ user.  The prompt string is always displayed in the echo area, followed
+ by a single @samp{-}.
+ 
+ In the following example, the user types in the octal number 177 (which
+ is 127 in decimal).
+ 
+ @example
+ (read-quoted-char "What character")
+ 
+ @group
+ ---------- Echo Area ----------
+ What character-@kbd{177}
+ ---------- Echo Area ----------
+ 
+      @result{} 127
+ @end group
+ @end example
+ @end defun
+ 
+ @need 2000
+ @node Event Input Misc
+ @subsection Miscellaneous Event Input Features
+ 
+ This section describes how to ``peek ahead'' at events without using
+ them up, how to check for pending input, and how to discard pending
+ input.
+ 
+ @defvar unread-command-events
+ @cindex next input
+ @cindex peeking at input
+ This variable holds a list of events waiting to be read as command
+ input.  The events are used in the order they appear in the list, and
+ removed one by one as they are used.
+ 
+ The variable is needed because in some cases a function reads a event
+ and then decides not to use it.  Storing the event in this variable
+ causes it to be processed normally, by the command loop or by the
+ functions to read command input.
+ 
+ @cindex prefix argument unreading
+ For example, the function that implements numeric prefix arguments reads
+ any number of digits.  When it finds a non-digit event, it must unread
+ the event so that it can be read normally by the command loop.
+ Likewise, incremental search uses this feature to unread events with no 
+ special meaning in a search, because these events should exit the search
+ and then execute normally.
+ 
+ The reliable and easy way to extract events from a key sequence so as to
+ put them in @code{unread-command-events} is to use
+ @code{listify-key-sequence} (@pxref{Strings of Events}).
+ @end defvar
+ 
+ @defvar unread-command-char
+ This variable holds a character to be read as command input.
+ A value of -1 means ``empty''.
+ 
+ This variable is mostly obsolete now that you can use
+ @code{unread-command-events} instead; it exists only to support programs
+ written for Emacs versions 18 and earlier.
+ @end defvar
+ 
+ @defun input-pending-p
+ @cindex waiting for command key input
+ This function determines whether any command input is currently
+ available to be read.  It returns immediately, with value @code{t} if
+ there is available input, @code{nil} otherwise.  On rare occasions it
+ may return @code{t} when no input is available.
+ @end defun
+ 
+ @defvar last-input-event
+ This variable records the last terminal input event read, whether
+ as part of a command or explicitly by a Lisp program.
+ 
+ In the example below, the Lisp program reads the character @kbd{1},
+ @sc{ASCII} code 49.  It becomes the value of @code{last-input-event},
+ while @kbd{C-e} (we assume @kbd{C-x C-e} command is used to evaluate
+ this expression) remains the value of @code{last-command-event}.
+ 
+ @example
+ @group
+ (progn (print (read-char))
+        (print last-command-event)
+        last-input-event)
+      @print{} 49
+      @print{} 5
+      @result{} 49
+ @end group
+ @end example
+ 
+ @vindex last-input-char
+ The alias @code{last-input-char} exists for compatibility with
+ Emacs version 18.
+ @end defvar
+ 
+ @defun discard-input
+ @cindex flush input
+ @cindex discard input
+ @cindex terminate keyboard macro
+ This function discards the contents of the terminal input buffer and
+ cancels any keyboard macro that might be in the process of definition.
+ It returns @code{nil}.
+ 
+ In the following example, the user may type a number of characters right
+ after starting the evaluation of the form.  After the @code{sleep-for}
+ finishes sleeping, @code{discard-input} discards any characters typed 
+ during the sleep.
+ 
+ @example
+ (progn (sleep-for 2)
+        (discard-input))
+      @result{} nil
+ @end example
+ @end defun
+ 
+ @node Waiting
+ @section Waiting for Elapsed Time or Input
+ @cindex pausing
+ @cindex waiting
+ 
+   The wait functions are designed to wait for a certain amount of time
+ to pass or until there is input.  For example, you may wish to pause in
+ the middle of a computation to allow the user time to view the display.
+ @code{sit-for} pauses and updates the screen, and returns immediately if
+ input comes in, while @code{sleep-for} pauses without updating the
+ screen.
+ 
+ @defun sit-for seconds &optional millisec nodisp
+ This function performs redisplay (provided there is no pending input
+ from the user), then waits @var{seconds} seconds, or until input is
+ available.  The value is @code{t} if @code{sit-for} waited the full
+ time with no input arriving (see @code{input-pending-p} in @ref{Event 
+ Input Misc}).  Otherwise, the value is @code{nil}.
+ 
+ The argument @var{seconds} need not be an integer.  If it is a floating
+ point number, @code{sit-for} waits for a fractional number of seconds.
+ Some systems support only a whole number of seconds; on these systems,
+ @var{seconds} is rounded down.
+ 
+ The optional argument @var{millisec} specifies an additional waiting
+ period measured in milliseconds.  This adds to the period specified by
+ @var{seconds}.  If the system doesn't support waiting fractions of a
+ second, you get an error if you specify nonzero @var{millisec}.
+ 
+ @cindex forcing redisplay
+ Redisplay is always preempted if input arrives, and does not happen at
+ all if input is available before it starts.  Thus, there is no way to
+ force screen updating if there is pending input; however, if there is no
+ input pending, you can force an update with no delay by using
+ @code{(sit-for 0)}.
+ 
+ If @var{nodisp} is non-@code{nil}, then @code{sit-for} does not
+ redisplay, but it still returns as soon as input is available (or when
+ the timeout elapses).
+ 
+ Iconifying or deiconifying a frame makes @code{sit-for} return, because
+ that generates an event.  @xref{Misc Events}.
+ 
+ The usual purpose of @code{sit-for} is to give the user time to read
+ text that you display.
+ @end defun
+ 
+ @defun sleep-for seconds &optional millisec
+ This function simply pauses for @var{seconds} seconds without updating
+ the display.  It pays no attention to available input.  It returns
+ @code{nil}.
+ 
+ The argument @var{seconds} need not be an integer.  If it is a floating
+ point number, @code{sleep-for} waits for a fractional number of seconds.
+ Some systems support only a whole number of seconds; on these systems,
+ @var{seconds} is rounded down.
+ 
+ The optional argument @var{millisec} specifies an additional waiting
+ period measured in milliseconds.  This adds to the period specified by
+ @var{seconds}.  If the system doesn't support waiting fractions of a
+ second, you get an error if you specify nonzero @var{millisec}.
+ 
+ Use @code{sleep-for} when you wish to guarantee a delay.
+ @end defun
+ 
+   @xref{Time of Day}, for functions to get the current time.
+ 
+ @node Quitting
+ @section Quitting
+ @cindex @kbd{C-g}
+ @cindex quitting
+ 
+   Typing @kbd{C-g} while a Lisp function is running causes Emacs to
+ @dfn{quit} whatever it is doing.  This means that control returns to the
+ innermost active command loop.
+ 
+   Typing @kbd{C-g} while the command loop is waiting for keyboard input
+ does not cause a quit; it acts as an ordinary input character.  In the
+ simplest case, you cannot tell the difference, because @kbd{C-g}
+ normally runs the command @code{keyboard-quit}, whose effect is to quit.
+ However, when @kbd{C-g} follows a prefix key, the result is an undefined
+ key.  The effect is to cancel the prefix key as well as any prefix
+ argument.
+ 
+   In the minibuffer, @kbd{C-g} has a different definition: it aborts out
+ of the minibuffer.  This means, in effect, that it exits the minibuffer
+ and then quits.  (Simply quitting would return to the command loop
+ @emph{within} the minibuffer.)  The reason why @kbd{C-g} does not quit
+ directly when the command reader is reading input is so that its meaning
+ can be redefined in the minibuffer in this way.  @kbd{C-g} following a
+ prefix key is not redefined in the minibuffer, and it has its normal
+ effect of canceling the prefix key and prefix argument.  This too
+ would not be possible if @kbd{C-g} always quit directly.
+ 
+   When @kbd{C-g} does directly quit, it does so by setting the variable
+ @code{quit-flag} to @code{t}.  Emacs checks this variable at appropriate
+ times and quits if it is not @code{nil}.  Setting @code{quit-flag}
+ non-@code{nil} in any way thus causes a quit.
+ 
+   At the level of C code, quitting cannot happen just anywhere; only at the
+ special places that check @code{quit-flag}.  The reason for this is
+ that quitting at other places might leave an inconsistency in Emacs's
+ internal state.  Because quitting is delayed until a safe place, quitting 
+ cannot make Emacs crash.
+ 
+   Certain functions such as @code{read-key-sequence} or
+ @code{read-quoted-char} prevent quitting entirely even though they wait
+ for input.  Instead of quitting, @kbd{C-g} serves as the requested
+ input.  In the case of @code{read-key-sequence}, this serves to bring
+ about the special behavior of @kbd{C-g} in the command loop.  In the
+ case of @code{read-quoted-char}, this is so that @kbd{C-q} can be used
+ to quote a @kbd{C-g}.  
+ 
+   You can prevent quitting for a portion of a Lisp function by binding
+ the variable @code{inhibit-quit} to a non-@code{nil} value.  Then,
+ although @kbd{C-g} still sets @code{quit-flag} to @code{t} as usual, the
+ usual result of this---a quit---is prevented.  Eventually,
+ @code{inhibit-quit} will become @code{nil} again, such as when its
+ binding is unwound at the end of a @code{let} form.  At that time, if
+ @code{quit-flag} is still non-@code{nil}, the requested quit happens
+ immediately.  This behavior is ideal when you wish to make sure that
+ quitting does not happen within a ``critical section'' of the program.
+ 
+ @cindex @code{read-quoted-char} quitting
+   In some functions (such as @code{read-quoted-char}), @kbd{C-g} is
+ handled in a special way that does not involve quitting.  This is done
+ by reading the input with @code{inhibit-quit} bound to @code{t}, and
+ setting @code{quit-flag} to @code{nil} before @code{inhibit-quit}
+ becomes @code{nil} again.  This excerpt from the definition of
+ @code{read-quoted-char} shows how this is done; it also shows that
+ normal quitting is permitted after the first character of input.
+ 
+ @example
+ (defun read-quoted-char (&optional prompt)
+   "@dots{}@var{documentation}@dots{}"
+   (let ((count 0) (code 0) char)
+     (while (< count 3)
+       (let ((inhibit-quit (zerop count))
+             (help-form nil))
+         (and prompt (message "%s-" prompt))
+         (setq char (read-char))
+         (if inhibit-quit (setq quit-flag nil)))
+       @dots{})
+     (logand 255 code)))
+ @end example
+ 
+ @defvar quit-flag
+ If this variable is non-@code{nil}, then Emacs quits immediately, unless
+ @code{inhibit-quit} is non-@code{nil}.  Typing @kbd{C-g} ordinarily sets
+ @code{quit-flag} non-@code{nil}, regardless of @code{inhibit-quit}.
+ @end defvar
+ 
+ @defvar inhibit-quit
+ This variable determines whether Emacs should quit when @code{quit-flag}
+ is set to a value other than @code{nil}.  If @code{inhibit-quit} is
+ non-@code{nil}, then @code{quit-flag} has no special effect.
+ @end defvar
+ 
+ @deffn Command keyboard-quit
+ This function signals the @code{quit} condition with @code{(signal 'quit
+ nil)}.  This is the same thing that quitting does.  (See @code{signal}
+ in @ref{Errors}.)
+ @end deffn
+ 
+   You can specify a character other than @kbd{C-g} to use for quitting.
+ See the function @code{set-input-mode} in @ref{Terminal Input}.
+  
+ @node Prefix Command Arguments
+ @section Prefix Command Arguments
+ @cindex prefix argument
+ @cindex raw prefix argument
+ @cindex numeric prefix argument
+ 
+   Most Emacs commands can use a @dfn{prefix argument}, a number
+ specified before the command itself.  (Don't confuse prefix arguments
+ with prefix keys.)  The prefix argument is at all times represented by a
+ value, which may be @code{nil}, meaning there is currently no prefix
+ argument.  Each command may use the prefix argument or ignore it.
+ 
+   There are two representations of the prefix argument: @dfn{raw} and
+ @dfn{numeric}.  The editor command loop uses the raw representation
+ internally, and so do the Lisp variables that store the information, but
+ commands can request either representation.
+ 
+   Here are the possible values of a raw prefix argument:
+ 
+ @itemize @bullet
+ @item
+ @code{nil}, meaning there is no prefix argument.  Its numeric value is
+ 1, but numerous commands make a distinction between @code{nil} and the
+ integer 1.
+ 
+ @item
+ An integer, which stands for itself.
+ 
+ @item
+ A list of one element, which is an integer.  This form of prefix
+ argument results from one or a succession of @kbd{C-u}'s with no
+ digits.  The numeric value is the integer in the list, but some
+ commands make a distinction between such a list and an integer alone.
+ 
+ @item
+ The symbol @code{-}.  This indicates that @kbd{M--} or @kbd{C-u -} was
+ typed, without following digits.  The equivalent numeric value is
+ @minus{}1, but some commands make a distinction between the integer
+ @minus{}1 and the symbol @code{-}.
+ @end itemize
+ 
+ We illustrate these possibilities by calling the following function with
+ various prefixes:
+ 
+ @example
+ @group
+ (defun display-prefix (arg)
+   "Display the value of the raw prefix arg."
+   (interactive "P")
+   (message "%s" arg))
+ @end group
+ @end example
+ 
+ @noindent
+ Here are the results of calling @code{display-prefix} with various
+ raw prefix arguments:
+ 
+ @example
+         M-x display-prefix  @print{} nil
+ 
+ C-u     M-x display-prefix  @print{} (4)
+ 
+ C-u C-u M-x display-prefix  @print{} (16)
+ 
+ C-u 3   M-x display-prefix  @print{} 3
+ 
+ M-3     M-x display-prefix  @print{} 3      ; @r{(Same as @code{C-u 3}.)}
+ 
+ C-u -   M-x display-prefix  @print{} -      
+ 
+ M--     M-x display-prefix  @print{} -      ; @r{(Same as @code{C-u -}.)}
+ 
+ C-u - 7 M-x display-prefix  @print{} -7     
+ 
+ M-- 7   M-x display-prefix  @print{} -7     ; @r{(Same as @code{C-u -7}.)}
+ @end example
+ 
+   Emacs uses two variables to store the prefix argument:
+ @code{prefix-arg} and @code{current-prefix-arg}.  Commands such as
+ @code{universal-argument} that set up prefix arguments for other
+ commands store them in @code{prefix-arg}.  In contrast,
+ @code{current-prefix-arg} conveys the prefix argument to the current
+ command, so setting it has no effect on the prefix arguments for future
+ commands.
+ 
+   Normally, commands specify which representation to use for the prefix
+ argument, either numeric or raw, in the @code{interactive} declaration.
+ (@xref{Using Interactive}.)  Alternatively, functions may look at the
+ value of the prefix argument directly in the variable
+ @code{current-prefix-arg}, but this is less clean.
+ 
+ @defun prefix-numeric-value arg
+ This function returns the numeric meaning of a valid raw prefix argument
+ value, @var{arg}.  The argument may be a symbol, a number, or a list.
+ If it is @code{nil}, the value 1 is returned; if it is @code{-}, the
+ value @minus{}1 is returned; if it is a number, that number is returned;
+ if it is a list, the @sc{car} of that list (which should be a number) is
+ returned.
+ @end defun
+ 
+ @defvar current-prefix-arg
+ This variable holds the raw prefix argument for the @emph{current}
+ command.  Commands may examine it directly, but the usual way to access
+ it is with @code{(interactive "P")}.
+ @end defvar
+ 
+ @defvar prefix-arg
+ The value of this variable is the raw prefix argument for the
+ @emph{next} editing command.  Commands that specify prefix arguments for
+ the following command work by setting this variable.
+ @end defvar
+ 
+   Do not call the functions @code{universal-argument},
+ @code{digit-argument}, or @code{negative-argument} unless you intend to
+ let the user enter the prefix argument for the @emph{next} command.
+ 
+ @deffn Command universal-argument
+ This command reads input and specifies a prefix argument for the
+ following command.  Don't call this command yourself unless you know
+ what you are doing.
+ @end deffn
+ 
+ @deffn Command digit-argument arg
+ This command adds to the prefix argument for the following command.  The
+ argument @var{arg} is the raw prefix argument as it was before this
+ command; it is used to compute the updated prefix argument.  Don't call
+ this command yourself unless you know what you are doing.
+ @end deffn
+ 
+ @deffn Command negative-argument arg
+ This command adds to the numeric argument for the next command.  The
+ argument @var{arg} is the raw prefix argument as it was before this
+ command; its value is negated to form the new prefix argument.  Don't
+ call this command yourself unless you know what you are doing.
+ @end deffn
+ 
+ @node Recursive Editing
+ @section Recursive Editing
+ @cindex recursive command loop
+ @cindex recursive editing level
+ @cindex command loop, recursive
+ 
+   The Emacs command loop is entered automatically when Emacs starts up.
+ This top-level invocation of the command loop never exits; it keeps
+ running as long as Emacs does.  Lisp programs can also invoke the
+ command loop.  Since this makes more than one activation of the command
+ loop, we call it @dfn{recursive editing}.  A recursive editing level has
+ the effect of suspending whatever command invoked it and permitting the
+ user to do arbitrary editing before resuming that command.
+ 
+   The commands available during recursive editing are the same ones
+ available in the top-level editing loop and defined in the keymaps.
+ Only a few special commands exit the recursive editing level; the others
+ return to the recursive editing level when they finish.  (The special
+ commands for exiting are always available, but they do nothing when
+ recursive editing is not in progress.)
+ 
+   All command loops, including recursive ones, set up all-purpose error
+ handlers so that an error in a command run from the command loop will
+ not exit the loop.
+ 
+ @cindex minibuffer input
+   Minibuffer input is a special kind of recursive editing.  It has a few
+ special wrinkles, such as enabling display of the minibuffer and the
+ minibuffer window, but fewer than you might suppose.  Certain keys
+ behave differently in the minibuffer, but that is only because of the
+ minibuffer's local map; if you switch windows, you get the usual Emacs
+ commands.
+ 
+ @cindex @code{throw} example
+ @kindex exit
+ @cindex exit recursive editing
+ @cindex aborting
+   To invoke a recursive editing level, call the function
+ @code{recursive-edit}.  This function contains the command loop; it also
+ contains a call to @code{catch} with tag @code{exit}, which makes it
+ possible to exit the recursive editing level by throwing to @code{exit}
+ (@pxref{Catch and Throw}).  If you throw a value other than @code{t},
+ then @code{recursive-edit} returns normally to the function that called
+ it.  The command @kbd{C-M-c} (@code{exit-recursive-edit}) does this.
+ Throwing a @code{t} value causes @code{recursive-edit} to quit, so that
+ control returns to the command loop one level up.  This is called
+ @dfn{aborting}, and is done by @kbd{C-]} (@code{abort-recursive-edit}).
+ 
+   Most applications should not use recursive editing, except as part of
+ using the minibuffer.  Usually it is more convenient for the user if you
+ change the major mode of the current buffer temporarily to a special
+ major mode, which should have a command to go back to the previous mode.
+ (The @kbd{e} command in Rmail uses this technique.)  Or, if you wish to
+ give the user different text to edit ``recursively'', create and select
+ a new buffer in a special mode.  In this mode, define a command to
+ complete the processing and go back to the previous buffer.  (The
+ @kbd{m} command in Rmail does this.)
+ 
+   Recursive edits are useful in debugging.  You can insert a call to
+ @code{debug} into a function definition as a sort of breakpoint, so that
+ you can look around when the function gets there.  @code{debug} invokes
+ a recursive edit but also provides the other features of the debugger.
+ 
+   Recursive editing levels are also used when you type @kbd{C-r} in
+ @code{query-replace} or use @kbd{C-x q} (@code{kbd-macro-query}).
+ 
+ @defun recursive-edit
+ @cindex suspend evaluation
+ This function invokes the editor command loop.  It is called
+ automatically by the initialization of Emacs, to let the user begin
+ editing.  When called from a Lisp program, it enters a recursive editing
+ level.
+ 
+   In the following example, the function @code{simple-rec} first
+ advances point one word, then enters a recursive edit, printing out a
+ message in the echo area.  The user can then do any editing desired, and
+ then type @kbd{C-M-c} to exit and continue executing @code{simple-rec}.
+ 
+ @example
+ (defun simple-rec ()
+   (forward-word 1)
+   (message "Recursive edit in progress")
+   (recursive-edit)
+   (forward-word 1))
+      @result{} simple-rec
+ (simple-rec)
+      @result{} nil
+ @end example
+ @end defun
+ 
+ @deffn Command exit-recursive-edit
+ This function exits from the innermost recursive edit (including
+ minibuffer input).  Its definition is effectively @code{(throw 'exit
+ nil)}.  
+ @end deffn
+ 
+ @deffn Command abort-recursive-edit
+ This function aborts the command that requested the innermost recursive
+ edit (including minibuffer input), by signaling @code{quit} 
+ after exiting the recursive edit.  Its definition is effectively
+ @code{(throw 'exit t)}.  @xref{Quitting}.
+ @end deffn
+ 
+ @deffn Command top-level
+ This function exits all recursive editing levels; it does not return a
+ value, as it jumps completely out of any computation directly back to
+ the main command loop.
+ @end deffn
+ 
+ @defun recursion-depth
+ This function returns the current depth of recursive edits.  When no
+ recursive edit is active, it returns 0.
+ @end defun
+ 
+ @node Disabling Commands
+ @section Disabling Commands
+ @cindex disabled command
+ 
+   @dfn{Disabling a command} marks the command as requiring user
+ confirmation before it can be executed.  Disabling is used for commands
+ which might be confusing to beginning users, to prevent them from using
+ the commands by accident.
+ 
+ @kindex disabled
+   The low-level mechanism for disabling a command is to put a
+ non-@code{nil} @code{disabled} property on the Lisp symbol for the
+ command.  These properties are normally set up by the user's
+ @file{.emacs} file with Lisp expressions such as this:
+ 
+ @example
+ (put 'upcase-region 'disabled t)
+ @end example
+ 
+ @noindent
+ For a few commands, these properties are present by default and may be
+ removed by the @file{.emacs} file.
+ 
+   If the value of the @code{disabled} property is a string, the message
+ saying the command is disabled includes that string.  For example:
+ 
+ @example
+ (put 'delete-region 'disabled
+      "Text deleted this way cannot be yanked back!\n")
+ @end example
+ 
+   @xref{Disabling,,, emacs, The GNU Emacs Manual}, for the details on
+ what happens when a disabled command is invoked interactively.
+ Disabling a command has no effect on calling it as a function from Lisp
+ programs.
+ 
+ @deffn Command enable-command command
+ Allow @var{command} to be executed without special confirmation from now
+ on, and (if the user confirms) alter the user's @file{.emacs} file so
+ that this will apply to future sessions.
+ @end deffn
+ 
+ @deffn Command disable-command command
+ Require special confirmation to execute @var{command} from now on, and
+ (if the user confirms) alter the user's @file{.emacs} file so that this
+ will apply to future sessions.
+ @end deffn
+ 
+ @defvar disabled-command-hook
+ This normal hook is run instead of a disabled command, when the user
+ invokes the disabled command interactively.  The hook functions can use
+ @code{this-command-keys} to determine what the user typed to run the
+ command, and thus find the command itself.  @xref{Hooks}.
+ 
+ By default, @code{disabled-command-hook} contains a function that asks
+ the user whether to proceed.
+ @end defvar
+ 
+ @node Command History
+ @section Command History
+ @cindex command history
+ @cindex complex command
+ @cindex history of commands
+ 
+   The command loop keeps a history of the complex commands that have
+ been executed, to make it convenient to repeat these commands.  A
+ @dfn{complex command} is one for which the interactive argument reading
+ uses the minibuffer.  This includes any @kbd{M-x} command, any
+ @kbd{M-:} command, and any command whose @code{interactive}
+ specification reads an argument from the minibuffer.  Explicit use of
+ the minibuffer during the execution of the command itself does not cause
+ the command to be considered complex.
+ 
+ @defvar command-history
+ This variable's value is a list of recent complex commands, each
+ represented as a form to evaluate.  It continues to accumulate all
+ complex commands for the duration of the editing session, but all but
+ the first (most recent) thirty elements are deleted when a garbage
+ collection takes place (@pxref{Garbage Collection}).
+ 
+ @example
+ @group
+ command-history
+ @result{} ((switch-to-buffer "chistory.texi")
+     (describe-key "^X^[")
+     (visit-tags-table "~/emacs/src/")
+     (find-tag "repeat-complex-command"))
+ @end group
+ @end example
+ @end defvar
+ 
+   This history list is actually a special case of minibuffer history
+ (@pxref{Minibuffer History}), with one special twist: the elements are
+ expressions rather than strings.
+ 
+   There are a number of commands devoted to the editing and recall of
+ previous commands.  The commands @code{repeat-complex-command}, and
+ @code{list-command-history} are described in the user manual
+ (@pxref{Repetition,,, emacs, The GNU Emacs Manual}).  Within the
+ minibuffer, the history commands used are the same ones available in any
+ minibuffer.
+ 
+ @node Keyboard Macros
+ @section Keyboard Macros
+ @cindex keyboard macros
+ 
+   A @dfn{keyboard macro} is a canned sequence of input events that can
+ be considered a command and made the definition of a key.  The Lisp
+ representation of a keyboard macro is a string or vector containing the
+ events.  Don't confuse keyboard macros with Lisp macros
+ (@pxref{Macros}).
+ 
+ @defun execute-kbd-macro macro &optional count
+ This function executes @var{macro} as a sequence of events.  If
+ @var{macro} is a string or vector, then the events in it are executed
+ exactly as if they had been input by the user.  The sequence is
+ @emph{not} expected to be a single key sequence; normally a keyboard
+ macro definition consists of several key sequences concatenated.
+ 
+ If @var{macro} is a symbol, then its function definition is used in
+ place of @var{macro}.  If that is another symbol, this process repeats.
+ Eventually the result should be a string or vector.  If the result is
+ not a symbol, string, or vector, an error is signaled.
+ 
+ The argument @var{count} is a repeat count; @var{macro} is executed that
+ many times.  If @var{count} is omitted or @code{nil}, @var{macro} is
+ executed once.  If it is 0, @var{macro} is executed over and over until it
+ encounters an error or a failing search.  
+ @end defun
+ 
+ @defvar executing-macro
+ This variable contains the string or vector that defines the keyboard
+ macro that is currently executing.  It is @code{nil} if no macro is
+ currently executing.  A command can test this variable to behave
+ differently when run from an executing macro.  Do not set this variable
+ yourself.
+ @end defvar
+ 
+ @defvar defining-kbd-macro
+ This variable indicates whether a keyboard macro is being defined.  A
+ command can test this variable to behave differently while a macro is
+ being defined.  The commands @code{start-kbd-macro} and
+ @code{end-kbd-macro} set this variable---do not set it yourself.
+ 
+ The variable is always local to the current terminal and cannot be
+ buffer-local.  @xref{Multiple Displays}.
+ @end defvar
+ 
+ @defvar last-kbd-macro
+ This variable is the definition of the most recently defined keyboard
+ macro.  Its value is a string or vector, or @code{nil}.
+ 
+ The variable is always local to the current terminal and cannot be
+ buffer-local.  @xref{Multiple Displays}.
+ @end defvar
+ 
Index: emacs/man/elisp-compile.texi
diff -c /dev/null emacs/man/elisp-compile.texi:1.2
*** /dev/null	Fri Aug  2 20:48:54 1996
--- emacs/man/elisp-compile.texi	Thu Aug  1 00:22:31 1996
***************
*** 0 ****
--- 1,731 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/compile
+ @node Byte Compilation, Debugging, Loading, Top
+ @chapter Byte Compilation
+ @cindex byte-code
+ @cindex compilation
+ 
+   GNU Emacs Lisp has a @dfn{compiler} that translates functions written
+ in Lisp into a special representation called @dfn{byte-code} that can be
+ executed more efficiently.  The compiler replaces Lisp function
+ definitions with byte-code.  When a byte-code function is called, its
+ definition is evaluated by the @dfn{byte-code interpreter}.
+ 
+   Because the byte-compiled code is evaluated by the byte-code
+ interpreter, instead of being executed directly by the machine's
+ hardware (as true compiled code is), byte-code is completely
+ transportable from machine to machine without recompilation.  It is not,
+ however, as fast as true compiled code.
+ 
+   In general, any version of Emacs can run byte-compiled code produced
+ by recent earlier versions of Emacs, but the reverse is not true.  In
+ particular, if you compile a program with Emacs 19.29, the compiled
+ code does not run in earlier versions.
+ @iftex
+ @xref{Docs and Compilation}.
+ @end iftex
+ Files compiled in versions before 19.29 may not work in 19.29 if they
+ contain character constants with modifier bits, because the bits were
+ renumbered in Emacs 19.29.
+ 
+   @xref{Compilation Errors}, for how to investigate errors occurring in
+ byte compilation.
+ 
+ @menu
+ * Speed of Byte-Code::          An example of speedup from byte compilation.
+ * Compilation Functions::       Byte compilation functions.
+ * Docs and Compilation::        Dynamic loading of documentation strings.
+ * Dynamic Loading::             Dynamic loading of individual functions.
+ * Eval During Compile::  	Code to be evaluated when you compile.
+ * Byte-Code Objects::		The data type used for byte-compiled functions.
+ * Disassembly::                 Disassembling byte-code; how to read byte-code.
+ @end menu
+ 
+ @node Speed of Byte-Code
+ @section Performance of Byte-Compiled Code
+ 
+   A byte-compiled function is not as efficient as a primitive function
+ written in C, but runs much faster than the version written in Lisp.
+ Here is an example:
+ 
+ @example
+ @group
+ (defun silly-loop (n)
+   "Return time before and after N iterations of a loop."
+   (let ((t1 (current-time-string)))
+     (while (> (setq n (1- n)) 
+               0))
+     (list t1 (current-time-string))))
+ @result{} silly-loop
+ @end group
+ 
+ @group
+ (silly-loop 100000)
+ @result{} ("Fri Mar 18 17:25:57 1994"
+     "Fri Mar 18 17:26:28 1994")  ; @r{31 seconds}
+ @end group
+ 
+ @group
+ (byte-compile 'silly-loop)
+ @result{} @r{[Compiled code not shown]}
+ @end group
+ 
+ @group
+ (silly-loop 100000)
+ @result{} ("Fri Mar 18 17:26:52 1994"
+     "Fri Mar 18 17:26:58 1994")  ; @r{6 seconds}
+ @end group
+ @end example
+ 
+   In this example, the interpreted code required 31 seconds to run,
+ whereas the byte-compiled code required 6 seconds.  These results are
+ representative, but actual results will vary greatly.
+ 
+ @node Compilation Functions
+ @comment  node-name,  next,  previous,  up
+ @section The Compilation Functions
+ @cindex compilation functions
+ 
+   You can byte-compile an individual function or macro definition with
+ the @code{byte-compile} function.  You can compile a whole file with
+ @code{byte-compile-file}, or several files with
+ @code{byte-recompile-directory} or @code{batch-byte-compile}.
+ 
+   When you run the byte compiler, you may get warnings in a buffer
+ called @samp{*Compile-Log*}.  These report things in your program that
+ suggest a problem but are not necessarily erroneous.
+ 
+ @cindex macro compilation
+   Be careful when byte-compiling code that uses macros.  Macro calls are
+ expanded when they are compiled, so the macros must already be defined
+ for proper compilation.  For more details, see @ref{Compiling Macros}.
+ 
+   Normally, compiling a file does not evaluate the file's contents or
+ load the file.  But it does execute any @code{require} calls at top
+ level in the file.  One way to ensure that necessary macro definitions
+ are available during compilation is to require the file that defines
+ them (@pxref{Named Features}).  To avoid loading the macro definition files
+ when someone @emph{runs} the compiled program, write
+ @code{eval-when-compile} around the @code{require} calls (@pxref{Eval
+ During Compile}).
+ 
+ @defun byte-compile symbol
+ This function byte-compiles the function definition of @var{symbol},
+ replacing the previous definition with the compiled one.  The function
+ definition of @var{symbol} must be the actual code for the function;
+ i.e., the compiler does not follow indirection to another symbol.
+ @code{byte-compile} returns the new, compiled definition of
+ @var{symbol}.
+ 
+   If @var{symbol}'s definition is a byte-code function object,
+ @code{byte-compile} does nothing and returns @code{nil}.  Lisp records
+ only one function definition for any symbol, and if that is already
+ compiled, non-compiled code is not available anywhere.  So there is no
+ way to ``compile the same definition again.''
+ 
+ @example
+ @group
+ (defun factorial (integer)
+   "Compute factorial of INTEGER."
+   (if (= 1 integer) 1
+     (* integer (factorial (1- integer)))))
+ @result{} factorial
+ @end group
+ 
+ @group
+ (byte-compile 'factorial)
+ @result{}
+ #[(integer)
+   "^H\301U\203^H^@@\301\207\302^H\303^HS!\"\207"
+   [integer 1 * factorial]
+   4 "Compute factorial of INTEGER."]
+ @end group
+ @end example
+ 
+ @noindent
+ The result is a byte-code function object.  The string it contains is
+ the actual byte-code; each character in it is an instruction or an
+ operand of an instruction.  The vector contains all the constants,
+ variable names and function names used by the function, except for
+ certain primitives that are coded as special instructions.
+ @end defun
+ 
+ @deffn Command compile-defun
+ This command reads the defun containing point, compiles it, and
+ evaluates the result.  If you use this on a defun that is actually a
+ function definition, the effect is to install a compiled version of that
+ function.
+ @end deffn
+ 
+ @deffn Command byte-compile-file filename
+ This function compiles a file of Lisp code named @var{filename} into
+ a file of byte-code.  The output file's name is made by appending
+ @samp{c} to the end of @var{filename}.
+ 
+ Compilation works by reading the input file one form at a time.  If it
+ is a definition of a function or macro, the compiled function or macro
+ definition is written out.  Other forms are batched together, then each
+ batch is compiled, and written so that its compiled code will be
+ executed when the file is read.  All comments are discarded when the
+ input file is read.
+ 
+ This command returns @code{t}.  When called interactively, it prompts
+ for the file name.
+ 
+ @example
+ @group
+ % ls -l push*
+ -rw-r--r--  1 lewis     791 Oct  5 20:31 push.el
+ @end group
+ 
+ @group
+ (byte-compile-file "~/emacs/push.el")
+      @result{} t
+ @end group
+ 
+ @group
+ % ls -l push*
+ -rw-r--r--  1 lewis     791 Oct  5 20:31 push.el
+ -rw-rw-rw-  1 lewis     638 Oct  8 20:25 push.elc
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command byte-recompile-directory directory flag
+ @cindex library compilation
+ This function recompiles every @samp{.el} file in @var{directory} that
+ needs recompilation.  A file needs recompilation if a @samp{.elc} file
+ exists but is older than the @samp{.el} file.
+ 
+ When a @samp{.el} file has no corresponding @samp{.elc} file, then
+ @var{flag} says what to do.  If it is @code{nil}, these files are
+ ignored.  If it is non-@code{nil}, the user is asked whether to compile
+ each such file.
+ 
+ The returned value of this command is unpredictable.
+ @end deffn
+ 
+ @defun batch-byte-compile
+ This function runs @code{byte-compile-file} on files specified on the
+ command line.  This function must be used only in a batch execution of
+ Emacs, as it kills Emacs on completion.  An error in one file does not
+ prevent processing of subsequent files.  (The file that gets the error
+ will not, of course, produce any compiled code.)
+ 
+ @example
+ % emacs -batch -f batch-byte-compile *.el
+ @end example
+ @end defun
+ 
+ @defun byte-code code-string data-vector max-stack
+ @cindex byte-code interpreter
+ This function actually interprets byte-code.  A byte-compiled function
+ is actually defined with a body that calls @code{byte-code}.  Don't call
+ this function yourself.  Only the byte compiler knows how to generate
+ valid calls to this function.
+ 
+ In newer Emacs versions (19 and up), byte-code is usually executed as
+ part of a byte-code function object, and only rarely due to an explicit
+ call to @code{byte-code}.
+ @end defun
+ 
+ @node Docs and Compilation
+ @section Documentation Strings and Compilation
+ @cindex dynamic loading of documentation
+ 
+   Functions and variables loaded from a byte-compiled file access their
+ documentation strings dynamically from the file whenever needed.  This
+ saves space within Emacs, and makes loading faster because the
+ documentation strings themselves need not be processed while loading the
+ file.  Actual access to the documentation strings becomes slower as a
+ result, but this normally is not enough to bother users.
+ 
+   Dynamic access to documentation strings does have drawbacks:
+ 
+ @itemize @bullet
+ @item
+ If you delete or move the compiled file after loading it, Emacs can no
+ longer access the documentation strings for the functions and variables
+ in the file.
+ 
+ @item
+ If you alter the compiled file (such as by compiling a new version),
+ then further access to documentation strings in this file will give
+ nonsense results.
+ @end itemize
+ 
+   If your site installs Emacs following the usual procedures, these
+ problems will never normally occur.  Installing a new version uses a new
+ directory with a different name; as long as the old version remains
+ installed, its files will remain unmodified in the places where they are
+ expected to be.
+ 
+   However, if you have built Emacs yourself and use it from the
+ directory where you built it, you will experience this problem
+ occasionally if you edit and recompile Lisp files.  When it happens, you
+ can cure the problem by reloading the file after recompiling it.
+ 
+   Byte-compiled files made with Emacs 19.29 will not load into older
+ versions because the older versions don't support this feature.  You can
+ turn off this feature by setting @code{byte-compile-dynamic-docstrings}
+ to @code{nil}.  Once this is done, you can compile files that will load
+ into older Emacs versions.  You can do this globally, or for one source
+ file by specifying a file-local binding for the variable.  Here's one
+ way to do that:
+ 
+ @example
+ -*-byte-compile-dynamic-docstrings: nil;-*-
+ @end example
+ 
+ @defvar byte-compile-dynamic-docstrings
+ If this is non-@code{nil}, the byte compiler generates compiled files
+ that are set up for dynamic loading of documentation strings.
+ @end defvar
+ 
+ @cindex @samp{#@@@var{count}}
+ @cindex @samp{#$}
+   The dynamic documentation string feature writes compiled files that
+ use a special Lisp reader construct, @samp{#@@@var{count}}.  This
+ construct skips the next @var{count} characters.  It also uses the
+ @samp{#$} construct, which stands for ``the name of this file, as a
+ string.''  It is best not to use these constructs in Lisp source files.
+ 
+ @node Dynamic Loading
+ @section Dynamic Loading of Individual Functions
+ 
+ @cindex dynamic loading of functions
+ @cindex lazy loading
+   When you compile a file, you can optionally enable the @dfn{dynamic
+ function loading} feature (also known as @dfn{lazy loading}).  With
+ dynamic function loading, loading the file doesn't fully read the
+ function definitions in the file.  Instead, each function definition
+ contains a place-holder which refers to the file.  The first time each
+ function is called, it reads the full definition from the file, to
+ replace the place-holder.
+ 
+   The advantage of dynamic function loading is that loading the file
+ becomes much faster.  This is a good thing for a file which contains
+ many separate commands, provided that using one of them does not imply
+ you will soon (or ever) use the rest.  A specialized mode which provides
+ many keyboard commands often has that usage pattern: a user may invoke
+ the mode, but use only a few of the commands it provides.
+ 
+   The dynamic loading feature has certain disadvantages:
+ 
+ @itemize @bullet
+ @item
+ If you delete or move the compiled file after loading it, Emacs can no
+ longer load the remaining function definitions not already loaded.
+ 
+ @item
+ If you alter the compiled file (such as by compiling a new version),
+ then trying to load any function not already loaded will get nonsense
+ results.
+ @end itemize
+ 
+   If you compile a new version of the file, the best thing to do is
+ immediately load the new compiled file.  That will prevent any future
+ problems.
+ 
+   The byte compiler uses the dynamic function loading feature if the
+ variable @code{byte-compile-dynamic} is non-@code{nil} at compilation
+ time.  Do not set this variable globally, since dynamic loading is
+ desirable only for certain files.  Instead, enable the feature for
+ specific source files with file-local variable bindings, like this:
+ 
+ @example
+ -*-byte-compile-dynamic: t;-*-
+ @end example
+ 
+ @defvar byte-compile-dynamic
+ If this is non-@code{nil}, the byte compiler generates compiled files
+ that are set up for dynamic function loading.
+ @end defvar
+ 
+ @defun fetch-bytecode function
+ This immediately finishes loading the definition of @var{function} from
+ its byte-compiled file, if it is not fully loaded already.  The argument
+ @var{function} may be a byte-code function object or a function name.
+ @end defun
+ 
+ @node Eval During Compile
+ @section Evaluation During Compilation
+ 
+   These features permit you to write code to be evaluated during
+ compilation of a program.
+ 
+ @defspec eval-and-compile body
+ This form marks @var{body} to be evaluated both when you compile the
+ containing code and when you run it (whether compiled or not).
+ 
+ You can get a similar result by putting @var{body} in a separate file
+ and referring to that file with @code{require}.  Using @code{require} is
+ preferable if there is a substantial amount of code to be executed in
+ this way.
+ @end defspec
+ 
+ @defspec eval-when-compile body
+ This form marks @var{body} to be evaluated at compile time and not when
+ the compiled program is loaded.  The result of evaluation by the
+ compiler becomes a constant which appears in the compiled program.  When
+ the program is interpreted, not compiled at all, @var{body} is evaluated
+ normally.
+ 
+ At top level, this is analogous to the Common Lisp idiom
+ @code{(eval-when (compile eval) @dots{})}.  Elsewhere, the Common Lisp
+ @samp{#.} reader macro (but not when interpreting) is closer to what
+ @code{eval-when-compile} does.
+ @end defspec
+ 
+ @node Byte-Code Objects
+ @section Byte-Code Function Objects
+ @cindex compiled function
+ @cindex byte-code function
+ 
+   Byte-compiled functions have a special data type: they are
+ @dfn{byte-code function objects}.
+ 
+   Internally, a byte-code function object is much like a vector;
+ however, the evaluator handles this data type specially when it appears
+ as a function to be called.  The printed representation for a byte-code
+ function object is like that for a vector, with an additional @samp{#}
+ before the opening @samp{[}.
+ 
+   In Emacs version 18, there was no byte-code function object data type;
+ compiled functions used the function @code{byte-code} to run the byte
+ code.
+ 
+   A byte-code function object must have at least four elements; there is
+ no maximum number, but only the first six elements are actually used.
+ They are:
+ 
+ @table @var
+ @item arglist
+ The list of argument symbols.
+ 
+ @item byte-code
+ The string containing the byte-code instructions.
+ 
+ @item constants
+ The vector of Lisp objects referenced by the byte code.  These include
+ symbols used as function names and variable names.
+ 
+ @item stacksize
+ The maximum stack size this function needs.
+ 
+ @item docstring
+ The documentation string (if any); otherwise, @code{nil}.  The value may
+ be a number or a list, in case the documentation string is stored in a
+ file.  Use the function @code{documentation} to get the real
+ documentation string (@pxref{Accessing Documentation}).
+ 
+ @item interactive
+ The interactive spec (if any).  This can be a string or a Lisp
+ expression.  It is @code{nil} for a function that isn't interactive.
+ @end table
+ 
+ Here's an example of a byte-code function object, in printed
+ representation.  It is the definition of the command
+ @code{backward-sexp}.
+ 
+ @example
+ #[(&optional arg)
+   "^H\204^F^@@\301^P\302^H[!\207"
+   [arg 1 forward-sexp]
+   2
+   254435
+   "p"]
+ @end example
+ 
+   The primitive way to create a byte-code object is with
+ @code{make-byte-code}:
+ 
+ @defun make-byte-code &rest elements
+ This function constructs and returns a byte-code function object
+ with @var{elements} as its elements.
+ @end defun
+ 
+   You should not try to come up with the elements for a byte-code
+ function yourself, because if they are inconsistent, Emacs may crash
+ when you call the function.  Always leave it to the byte compiler to
+ create these objects; it makes the elements consistent (we hope).
+ 
+   You can access the elements of a byte-code object using @code{aref};
+ you can also use @code{vconcat} to create a vector with the same
+ elements.
+ 
+ @node Disassembly
+ @section Disassembled Byte-Code
+ @cindex disassembled byte-code
+ 
+   People do not write byte-code; that job is left to the byte compiler.
+ But we provide a disassembler to satisfy a cat-like curiosity.  The
+ disassembler converts the byte-compiled code into humanly readable
+ form.
+ 
+   The byte-code interpreter is implemented as a simple stack machine.
+ It pushes values onto a stack of its own, then pops them off to use them
+ in calculations whose results are themselves pushed back on the stack.
+ When a byte-code function returns, it pops a value off the stack and
+ returns it as the value of the function.
+ 
+   In addition to the stack, byte-code functions can use, bind, and set
+ ordinary Lisp variables, by transferring values between variables and
+ the stack.
+ 
+ @deffn Command disassemble object &optional stream
+ This function prints the disassembled code for @var{object}.  If
+ @var{stream} is supplied, then output goes there.  Otherwise, the
+ disassembled code is printed to the stream @code{standard-output}.  The
+ argument @var{object} can be a function name or a lambda expression.
+ 
+ As a special exception, if this function is used interactively,
+ it outputs to a buffer named @samp{*Disassemble*}.
+ @end deffn
+ 
+   Here are two examples of using the @code{disassemble} function.  We
+ have added explanatory comments to help you relate the byte-code to the
+ Lisp source; these do not appear in the output of @code{disassemble}.
+ These examples show unoptimized byte-code.  Nowadays byte-code is
+ usually optimized, but we did not want to rewrite these examples, since
+ they still serve their purpose.
+ 
+ @example
+ @group
+ (defun factorial (integer)
+   "Compute factorial of an integer."
+   (if (= 1 integer) 1
+     (* integer (factorial (1- integer)))))
+      @result{} factorial
+ @end group
+ 
+ @group
+ (factorial 4)
+      @result{} 24
+ @end group
+ 
+ @group
+ (disassemble 'factorial)
+      @print{} byte-code for factorial:
+  doc: Compute factorial of an integer.
+  args: (integer)
+ @end group
+ 
+ @group
+ 0   constant 1              ; @r{Push 1 onto stack.}
+ 
+ 1   varref   integer        ; @r{Get value of @code{integer}} 
+                             ;   @r{from the environment}
+                             ;   @r{and push the value}
+                             ;   @r{onto the stack.}
+ @end group
+ 
+ @group
+ 2   eqlsign                 ; @r{Pop top two values off stack,}
+                             ;   @r{compare them,}
+                             ;   @r{and push result onto stack.}
+ @end group
+ 
+ @group
+ 3   goto-if-nil 10          ; @r{Pop and test top of stack;}
+                             ;   @r{if @code{nil}, go to 10,}
+                             ;   @r{else continue.}
+ @end group
+ 
+ @group
+ 6   constant 1              ; @r{Push 1 onto top of stack.}
+ 
+ 7   goto     17             ; @r{Go to 17 (in this case, 1 will be}
+                             ;   @r{returned by the function).}
+ @end group
+ 
+ @group
+ 10  constant *              ; @r{Push symbol @code{*} onto stack.}
+ 
+ 11  varref   integer        ; @r{Push value of @code{integer} onto stack.}
+ @end group
+ 
+ @group
+ 12  constant factorial      ; @r{Push @code{factorial} onto stack.}
+ 
+ 13  varref   integer        ; @r{Push value of @code{integer} onto stack.}
+ 
+ 14  sub1                    ; @r{Pop @code{integer}, decrement value,}
+                             ;   @r{push new value onto stack.}
+ @end group
+ 
+ @group
+                             ; @r{Stack now contains:}
+                             ;   @minus{} @r{decremented value of @code{integer}}
+                             ;   @minus{} @r{@code{factorial}} 
+                             ;   @minus{} @r{value of @code{integer}}
+                             ;   @minus{} @r{@code{*}}
+ @end group
+ 
+ @group
+ 15  call     1              ; @r{Call function @code{factorial} using}
+                             ;   @r{the first (i.e., the top) element}
+                             ;   @r{of the stack as the argument;}
+                             ;   @r{push returned value onto stack.}
+ @end group
+ 
+ @group
+                             ; @r{Stack now contains:}
+                             ;   @minus{} @r{result of recursive}
+                             ;        @r{call to @code{factorial}}
+                             ;   @minus{} @r{value of @code{integer}}
+                             ;   @minus{} @r{@code{*}}
+ @end group
+ 
+ @group
+ 16  call     2              ; @r{Using the first two}
+                             ;   @r{(i.e., the top two)}
+                             ;   @r{elements of the stack}
+                             ;   @r{as arguments,}
+                             ;   @r{call the function @code{*},}
+                             ;   @r{pushing the result onto the stack.}
+ @end group
+ 
+ @group
+ 17  return                  ; @r{Return the top element}
+                             ;   @r{of the stack.}
+      @result{} nil
+ @end group
+ @end example
+ 
+ The @code{silly-loop} function is somewhat more complex:
+ 
+ @example
+ @group
+ (defun silly-loop (n)
+   "Return time before and after N iterations of a loop."
+   (let ((t1 (current-time-string)))
+     (while (> (setq n (1- n)) 
+               0))
+     (list t1 (current-time-string))))
+      @result{} silly-loop
+ @end group
+ 
+ @group
+ (disassemble 'silly-loop)
+      @print{} byte-code for silly-loop:
+  doc: Return time before and after N iterations of a loop.
+  args: (n)
+ 
+ 0   constant current-time-string  ; @r{Push}
+                                   ;   @r{@code{current-time-string}}
+                                   ;   @r{onto top of stack.}
+ @end group
+ 
+ @group
+ 1   call     0              ; @r{Call @code{current-time-string}}
+                             ;   @r{ with no argument,}
+                             ;   @r{ pushing result onto stack.}
+ @end group
+ 
+ @group
+ 2   varbind  t1             ; @r{Pop stack and bind @code{t1}}
+                             ;   @r{to popped value.}
+ @end group
+ 
+ @group
+ 3   varref   n              ; @r{Get value of @code{n} from}
+                             ;   @r{the environment and push}
+                             ;   @r{the value onto the stack.}
+ @end group
+ 
+ @group
+ 4   sub1                    ; @r{Subtract 1 from top of stack.}
+ @end group
+ 
+ @group
+ 5   dup                     ; @r{Duplicate the top of the stack;}
+                             ;   @r{i.e., copy the top of}
+                             ;   @r{the stack and push the}
+                             ;   @r{copy onto the stack.}
+ @end group
+ 
+ @group
+ 6   varset   n              ; @r{Pop the top of the stack,}
+                             ;   @r{and bind @code{n} to the value.}
+ 
+                             ; @r{In effect, the sequence @code{dup varset}}
+                             ;   @r{copies the top of the stack}
+                             ;   @r{into the value of @code{n}}
+                             ;   @r{without popping it.}
+ @end group
+ 
+ @group
+ 7   constant 0              ; @r{Push 0 onto stack.}
+ @end group
+ 
+ @group
+ 8   gtr                     ; @r{Pop top two values off stack,}
+                             ;   @r{test if @var{n} is greater than 0}
+                             ;   @r{and push result onto stack.}
+ @end group
+ 
+ @group
+ 9   goto-if-nil-else-pop 17 ; @r{Goto 17 if @code{n} <= 0}
+                             ;   @r{(this exits the while loop).}
+                             ;   @r{else pop top of stack}
+                             ;   @r{and continue}
+ @end group
+ 
+ @group
+ 12  constant nil            ; @r{Push @code{nil} onto stack}
+                             ;   @r{(this is the body of the loop).}
+ @end group
+ 
+ @group
+ 13  discard                 ; @r{Discard result of the body}
+                             ;   @r{of the loop (a while loop}
+                             ;   @r{is always evaluated for}
+                             ;   @r{its side effects).}
+ @end group
+ 
+ @group
+ 14  goto     3              ; @r{Jump back to beginning}
+                             ;   @r{of while loop.}
+ @end group
+ 
+ @group
+ 17  discard                 ; @r{Discard result of while loop}
+                             ;   @r{by popping top of stack.}
+                             ;   @r{This result is the value @code{nil} that}
+                             ;   @r{was not popped by the goto at 9.}
+ @end group
+ 
+ @group
+ 18  varref   t1             ; @r{Push value of @code{t1} onto stack.}
+ @end group
+ 
+ @group
+ 19  constant current-time-string  ; @r{Push} 
+                                   ;   @r{@code{current-time-string}}
+                                   ;   @r{onto top of stack.}
+ @end group
+ 
+ @group
+ 20  call     0              ; @r{Call @code{current-time-string} again.}
+ @end group
+ 
+ @group
+ 21  list2                   ; @r{Pop top two elements off stack,}
+                             ;   @r{create a list of them,}
+                             ;   @r{and push list onto stack.}
+ @end group
+ 
+ @group
+ 22  unbind   1              ; @r{Unbind @code{t1} in local environment.}
+ 
+ 23  return                  ; @r{Return value of the top of stack.}
+ 
+      @result{} nil
+ @end group
+ @end example
+ 
+ 
Index: emacs/man/elisp-control.texi
diff -c /dev/null emacs/man/elisp-control.texi:1.2
*** /dev/null	Fri Aug  2 20:49:13 1996
--- emacs/man/elisp-control.texi	Thu Aug  1 00:22:32 1996
***************
*** 0 ****
--- 1,1148 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/control
+ @node Control Structures, Variables, Evaluation, Top
+ @chapter Control Structures
+ @cindex special forms for control structures
+ @cindex control structures
+ 
+   A Lisp program consists of expressions or @dfn{forms} (@pxref{Forms}).
+ We control the order of execution of the forms by enclosing them in
+ @dfn{control structures}.  Control structures are special forms which
+ control when, whether, or how many times to execute the forms they
+ contain.
+ 
+   The simplest order of execution is sequential execution: first form
+ @var{a}, then form @var{b}, and so on.  This is what happens when you
+ write several forms in succession in the body of a function, or at top
+ level in a file of Lisp code---the forms are executed in the order
+ written.  We call this @dfn{textual order}.  For example, if a function
+ body consists of two forms @var{a} and @var{b}, evaluation of the
+ function evaluates first @var{a} and then @var{b}, and the function's
+ value is the value of @var{b}.
+ 
+   Explicit control structures make possible an order of execution other
+ than sequential.
+ 
+   Emacs Lisp provides several kinds of control structure, including
+ other varieties of sequencing, conditionals, iteration, and (controlled)
+ jumps---all discussed below.  The built-in control structures are
+ special forms since their subforms are not necessarily evaluated or not
+ evaluated sequentially.  You can use macros to define your own control
+ structure constructs (@pxref{Macros}).
+ 
+ @menu
+ * Sequencing::             Evaluation in textual order.
+ * Conditionals::           @code{if}, @code{cond}.
+ * Combining Conditions::   @code{and}, @code{or}, @code{not}.
+ * Iteration::              @code{while} loops.
+ * Nonlocal Exits::         Jumping out of a sequence.
+ @end menu
+ 
+ @node Sequencing
+ @section Sequencing
+ 
+   Evaluating forms in the order they appear is the most common way
+ control passes from one form to another.  In some contexts, such as in a
+ function body, this happens automatically.  Elsewhere you must use a
+ control structure construct to do this: @code{progn}, the simplest
+ control construct of Lisp.
+ 
+   A @code{progn} special form looks like this:
+ 
+ @example
+ @group
+ (progn @var{a} @var{b} @var{c} @dots{})
+ @end group
+ @end example
+ 
+ @noindent
+ and it says to execute the forms @var{a}, @var{b}, @var{c} and so on, in
+ that order.  These forms are called the body of the @code{progn} form.
+ The value of the last form in the body becomes the value of the entire
+ @code{progn}.
+ 
+ @cindex implicit @code{progn}
+   In the early days of Lisp, @code{progn} was the only way to execute
+ two or more forms in succession and use the value of the last of them.
+ But programmers found they often needed to use a @code{progn} in the
+ body of a function, where (at that time) only one form was allowed.  So
+ the body of a function was made into an ``implicit @code{progn}'':
+ several forms are allowed just as in the body of an actual @code{progn}.
+ Many other control structures likewise contain an implicit @code{progn}.
+ As a result, @code{progn} is not used as often as it used to be.  It is
+ needed now most often inside an @code{unwind-protect}, @code{and},
+ @code{or}, or in the @var{then}-part of an @code{if}.
+ 
+ @defspec progn forms@dots{}
+ This special form evaluates all of the @var{forms}, in textual
+ order, returning the result of the final form.
+ 
+ @example
+ @group
+ (progn (print "The first form")
+        (print "The second form")
+        (print "The third form"))
+      @print{} "The first form"
+      @print{} "The second form"
+      @print{} "The third form"
+ @result{} "The third form"
+ @end group
+ @end example
+ @end defspec
+ 
+   Two other control constructs likewise evaluate a series of forms but return
+ a different value:
+ 
+ @defspec prog1 form1 forms@dots{}
+ This special form evaluates @var{form1} and all of the @var{forms}, in
+ textual order, returning the result of @var{form1}.
+ 
+ @example
+ @group
+ (prog1 (print "The first form")
+        (print "The second form")
+        (print "The third form"))
+      @print{} "The first form"
+      @print{} "The second form"
+      @print{} "The third form"
+ @result{} "The first form"
+ @end group
+ @end example
+ 
+ Here is a way to remove the first element from a list in the variable
+ @code{x}, then return the value of that former element:
+ 
+ @example
+ (prog1 (car x) (setq x (cdr x)))
+ @end example
+ @end defspec
+ 
+ @defspec prog2 form1 form2 forms@dots{}
+ This special form evaluates @var{form1}, @var{form2}, and all of the
+ following @var{forms}, in textual order, returning the result of
+ @var{form2}.
+ 
+ @example
+ @group
+ (prog2 (print "The first form")
+        (print "The second form")
+        (print "The third form"))
+      @print{} "The first form"
+      @print{} "The second form"
+      @print{} "The third form"
+ @result{} "The second form"
+ @end group
+ @end example
+ @end defspec
+ 
+ @node Conditionals
+ @section Conditionals
+ @cindex conditional evaluation
+ 
+   Conditional control structures choose among alternatives.  Emacs Lisp
+ has two conditional forms: @code{if}, which is much the same as in other
+ languages, and @code{cond}, which is a generalized case statement.
+ 
+ @defspec if condition then-form else-forms@dots{}
+ @code{if} chooses between the @var{then-form} and the @var{else-forms}
+ based on the value of @var{condition}.  If the evaluated @var{condition} is
+ non-@code{nil}, @var{then-form} is evaluated and the result returned.
+ Otherwise, the @var{else-forms} are evaluated in textual order, and the
+ value of the last one is returned.  (The @var{else} part of @code{if} is
+ an example of an implicit @code{progn}.  @xref{Sequencing}.) 
+ 
+ If @var{condition} has the value @code{nil}, and no @var{else-forms} are
+ given, @code{if} returns @code{nil}.
+ 
+ @code{if} is a special form because the branch that is not selected is
+ never evaluated---it is ignored.  Thus, in the example below,
+ @code{true} is not printed because @code{print} is never called.
+ 
+ @example
+ @group
+ (if nil 
+     (print 'true) 
+   'very-false)
+ @result{} very-false
+ @end group
+ @end example
+ @end defspec
+ 
+ @defspec cond clause@dots{}
+ @code{cond} chooses among an arbitrary number of alternatives.  Each
+ @var{clause} in the @code{cond} must be a list.  The @sc{car} of this
+ list is the @var{condition}; the remaining elements, if any, the
+ @var{body-forms}.  Thus, a clause looks like this:
+ 
+ @example
+ (@var{condition} @var{body-forms}@dots{})
+ @end example
+ 
+ @code{cond} tries the clauses in textual order, by evaluating the
+ @var{condition} of each clause.  If the value of @var{condition} is
+ non-@code{nil}, the clause ``succeeds''; then @code{cond} evaluates its
+ @var{body-forms}, and the value of the last of @var{body-forms} becomes
+ the value of the @code{cond}.  The remaining clauses are ignored.
+ 
+ If the value of @var{condition} is @code{nil}, the clause ``fails'', so
+ the @code{cond} moves on to the following clause, trying its
+ @var{condition}.
+ 
+ If every @var{condition} evaluates to @code{nil}, so that every clause
+ fails, @code{cond} returns @code{nil}.
+ 
+ A clause may also look like this:
+ 
+ @example
+ (@var{condition})
+ @end example
+ 
+ @noindent
+ Then, if @var{condition} is non-@code{nil} when tested, the value of
+ @var{condition} becomes the value of the @code{cond} form.
+ 
+ The following example has four clauses, which test for the cases where
+ the value of @code{x} is a number, string, buffer and symbol,
+ respectively:
+ 
+ @example
+ @group
+ (cond ((numberp x) x)
+       ((stringp x) x)
+       ((bufferp x)
+        (setq temporary-hack x) ; @r{multiple body-forms}
+        (buffer-name x))        ; @r{in one clause}
+       ((symbolp x) (symbol-value x)))
+ @end group
+ @end example
+ 
+ Often we want to execute the last clause whenever none of the previous
+ clauses was successful.  To do this, we use @code{t} as the
+ @var{condition} of the last clause, like this: @code{(t
+ @var{body-forms})}.  The form @code{t} evaluates to @code{t}, which is
+ never @code{nil}, so this clause never fails, provided the @code{cond}
+ gets to it at all.
+ 
+ For example, 
+ 
+ @example
+ @group
+ (cond ((eq a 'hack) 'foo)
+       (t "default"))
+ @result{} "default"
+ @end group
+ @end example
+ 
+ @noindent
+ This expression is a @code{cond} which returns @code{foo} if the value
+ of @code{a} is 1, and returns the string @code{"default"} otherwise.
+ @end defspec
+ 
+ Any conditional construct can be expressed with @code{cond} or with
+ @code{if}.  Therefore, the choice between them is a matter of style.
+ For example:
+ 
+ @example
+ @group
+ (if @var{a} @var{b} @var{c})
+ @equiv{}
+ (cond (@var{a} @var{b}) (t @var{c}))
+ @end group
+ @end example
+ 
+ @node Combining Conditions
+ @section Constructs for Combining Conditions
+ 
+   This section describes three constructs that are often used together
+ with @code{if} and @code{cond} to express complicated conditions.  The
+ constructs @code{and} and @code{or} can also be used individually as
+ kinds of multiple conditional constructs.
+ 
+ @defun not condition
+ This function tests for the falsehood of @var{condition}.  It returns
+ @code{t} if @var{condition} is @code{nil}, and @code{nil} otherwise.
+ The function @code{not} is identical to @code{null}, and we recommend
+ using the name @code{null} if you are testing for an empty list.
+ @end defun
+ 
+ @defspec and conditions@dots{}
+ The @code{and} special form tests whether all the @var{conditions} are
+ true.  It works by evaluating the @var{conditions} one by one in the
+ order written.
+ 
+ If any of the @var{conditions} evaluates to @code{nil}, then the result
+ of the @code{and} must be @code{nil} regardless of the remaining
+ @var{conditions}; so @code{and} returns right away, ignoring the
+ remaining @var{conditions}.
+ 
+ If all the @var{conditions} turn out non-@code{nil}, then the value of
+ the last of them becomes the value of the @code{and} form.
+ 
+ Here is an example.  The first condition returns the integer 1, which is
+ not @code{nil}.  Similarly, the second condition returns the integer 2,
+ which is not @code{nil}.  The third condition is @code{nil}, so the
+ remaining condition is never evaluated.
+ 
+ @example
+ @group
+ (and (print 1) (print 2) nil (print 3))
+      @print{} 1
+      @print{} 2
+ @result{} nil
+ @end group
+ @end example
+ 
+ Here is a more realistic example of using @code{and}:
+ 
+ @example
+ @group
+ (if (and (consp foo) (eq (car foo) 'x))
+     (message "foo is a list starting with x"))
+ @end group
+ @end example
+ 
+ @noindent
+ Note that @code{(car foo)} is not executed if @code{(consp foo)} returns
+ @code{nil}, thus avoiding an error.
+ 
+ @code{and} can be expressed in terms of either @code{if} or @code{cond}.
+ For example:
+ 
+ @example
+ @group
+ (and @var{arg1} @var{arg2} @var{arg3})
+ @equiv{}
+ (if @var{arg1} (if @var{arg2} @var{arg3}))
+ @equiv{}
+ (cond (@var{arg1} (cond (@var{arg2} @var{arg3}))))
+ @end group
+ @end example
+ @end defspec
+ 
+ @defspec or conditions@dots{}
+ The @code{or} special form tests whether at least one of the
+ @var{conditions} is true.  It works by evaluating all the
+ @var{conditions} one by one in the order written.
+ 
+ If any of the @var{conditions} evaluates to a non-@code{nil} value, then
+ the result of the @code{or} must be non-@code{nil}; so @code{or} returns
+ right away, ignoring the remaining @var{conditions}.  The value it
+ returns is the non-@code{nil} value of the condition just evaluated.
+ 
+ If all the @var{conditions} turn out @code{nil}, then the @code{or}
+ expression returns @code{nil}.
+ 
+ For example, this expression tests whether @code{x} is either 0 or
+ @code{nil}:
+ 
+ @example
+ (or (eq x nil) (eq x 0))
+ @end example
+ 
+ Like the @code{and} construct, @code{or} can be written in terms of
+ @code{cond}.  For example:
+ 
+ @example
+ @group
+ (or @var{arg1} @var{arg2} @var{arg3})
+ @equiv{}
+ (cond (@var{arg1})
+       (@var{arg2})
+       (@var{arg3}))
+ @end group
+ @end example
+ 
+ You could almost write @code{or} in terms of @code{if}, but not quite:
+ 
+ @example
+ @group
+ (if @var{arg1} @var{arg1}
+   (if @var{arg2} @var{arg2} 
+     @var{arg3}))
+ @end group
+ @end example
+ 
+ @noindent
+ This is not completely equivalent because it can evaluate @var{arg1} or
+ @var{arg2} twice.  By contrast, @code{(or @var{arg1} @var{arg2}
+ @var{arg3})} never evaluates any argument more than once.
+ @end defspec
+ 
+ @node Iteration
+ @section Iteration
+ @cindex iteration
+ @cindex recursion
+ 
+   Iteration means executing part of a program repetitively.  For
+ example, you might want to repeat some computation once for each element
+ of a list, or once for each integer from 0 to @var{n}.  You can do this
+ in Emacs Lisp with the special form @code{while}:
+ 
+ @defspec while condition forms@dots{}
+ @code{while} first evaluates @var{condition}.  If the result is
+ non-@code{nil}, it evaluates @var{forms} in textual order.  Then it
+ reevaluates @var{condition}, and if the result is non-@code{nil}, it
+ evaluates @var{forms} again.  This process repeats until @var{condition}
+ evaluates to @code{nil}.
+ 
+ There is no limit on the number of iterations that may occur.  The loop
+ will continue until either @var{condition} evaluates to @code{nil} or
+ until an error or @code{throw} jumps out of it (@pxref{Nonlocal Exits}).
+ 
+ The value of a @code{while} form is always @code{nil}.
+ 
+ @example
+ @group
+ (setq num 0)
+      @result{} 0
+ @end group
+ @group
+ (while (< num 4)
+   (princ (format "Iteration %d." num))
+   (setq num (1+ num)))
+      @print{} Iteration 0.
+      @print{} Iteration 1.
+      @print{} Iteration 2.
+      @print{} Iteration 3.
+      @result{} nil
+ @end group
+ @end example
+ 
+ If you would like to execute something on each iteration before the
+ end-test, put it together with the end-test in a @code{progn} as the
+ first argument of @code{while}, as shown here:
+ 
+ @example
+ @group
+ (while (progn
+          (forward-line 1)
+          (not (looking-at "^$"))))
+ @end group
+ @end example
+ 
+ @noindent
+ This moves forward one line and continues moving by lines until it
+ reaches an empty.  It is unusual in that the @code{while} has no body,
+ just the end test (which also does the real work of moving point).
+ @end defspec
+ 
+ @node Nonlocal Exits
+ @section Nonlocal Exits
+ @cindex nonlocal exits
+ 
+   A @dfn{nonlocal exit} is a transfer of control from one point in a
+ program to another remote point.  Nonlocal exits can occur in Emacs Lisp
+ as a result of errors; you can also use them under explicit control.
+ Nonlocal exits unbind all variable bindings made by the constructs being
+ exited.
+ 
+ @menu
+ * Catch and Throw::     Nonlocal exits for the program's own purposes.
+ * Examples of Catch::   Showing how such nonlocal exits can be written.
+ * Errors::              How errors are signaled and handled.
+ * Cleanups::            Arranging to run a cleanup form if an error happens.
+ @end menu
+ 
+ @node Catch and Throw
+ @subsection Explicit Nonlocal Exits: @code{catch} and @code{throw}
+ 
+   Most control constructs affect only the flow of control within the
+ construct itself.  The function @code{throw} is the exception to this
+ rule of normal program execution: it performs a nonlocal exit on
+ request.  (There are other exceptions, but they are for error handling
+ only.)  @code{throw} is used inside a @code{catch}, and jumps back to
+ that @code{catch}.  For example:
+ 
+ @example
+ @group
+ (catch 'foo
+   (progn
+     @dots{}
+     (throw 'foo t)
+     @dots{}))
+ @end group
+ @end example
+ 
+ @noindent
+ The @code{throw} transfers control straight back to the corresponding
+ @code{catch}, which returns immediately.  The code following the
+ @code{throw} is not executed.  The second argument of @code{throw} is used
+ as the return value of the @code{catch}.
+ 
+   The @code{throw} and the @code{catch} are matched through the first
+ argument: @code{throw} searches for a @code{catch} whose first argument
+ is @code{eq} to the one specified.  Thus, in the above example, the
+ @code{throw} specifies @code{foo}, and the @code{catch} specifies the
+ same symbol, so that @code{catch} is applicable.  If there is more than
+ one applicable @code{catch}, the innermost one takes precedence.
+ 
+   Executing @code{throw} exits all Lisp constructs up to the matching
+ @code{catch}, including function calls.  When binding constructs such as
+ @code{let} or function calls are exited in this way, the bindings are
+ unbound, just as they are when these constructs exit normally
+ (@pxref{Local Variables}).  Likewise, @code{throw} restores the buffer
+ and position saved by @code{save-excursion} (@pxref{Excursions}), and
+ the narrowing status saved by @code{save-restriction} and the window
+ selection saved by @code{save-window-excursion} (@pxref{Window
+ Configurations}).  It also runs any cleanups established with the
+ @code{unwind-protect} special form when it exits that form
+ (@pxref{Cleanups}).
+ 
+   The @code{throw} need not appear lexically within the @code{catch}
+ that it jumps to.  It can equally well be called from another function
+ called within the @code{catch}.  As long as the @code{throw} takes place
+ chronologically after entry to the @code{catch}, and chronologically
+ before exit from it, it has access to that @code{catch}.  This is why
+ @code{throw} can be used in commands such as @code{exit-recursive-edit}
+ that throw back to the editor command loop (@pxref{Recursive Editing}).
+ 
+ @cindex CL note---only @code{throw} in Emacs
+ @quotation
+ @b{Common Lisp note:} Most other versions of Lisp, including Common Lisp,
+ have several ways of transferring control nonsequentially: @code{return},
+ @code{return-from}, and @code{go}, for example.  Emacs Lisp has only
+ @code{throw}.
+ @end quotation
+ 
+ @defspec catch tag body@dots{}
+ @cindex tag on run time stack
+ @code{catch} establishes a return point for the @code{throw} function.  The
+ return point is distinguished from other such return points by @var{tag},
+ which may be any Lisp object.  The argument @var{tag} is evaluated normally
+ before the return point is established.
+ 
+ With the return point in effect, @code{catch} evaluates the forms of the
+ @var{body} in textual order.  If the forms execute normally, without
+ error or nonlocal exit, the value of the last body form is returned from
+ the @code{catch}.
+ 
+ If a @code{throw} is done within @var{body} specifying the same value
+ @var{tag}, the @code{catch} exits immediately; the value it returns is
+ whatever was specified as the second argument of @code{throw}.
+ @end defspec
+ 
+ @defun throw tag value
+ The purpose of @code{throw} is to return from a return point previously
+ established with @code{catch}.  The argument @var{tag} is used to choose
+ among the various existing return points; it must be @code{eq} to the value
+ specified in the @code{catch}.  If multiple return points match @var{tag},
+ the innermost one is used.
+ 
+ The argument @var{value} is used as the value to return from that
+ @code{catch}.
+ 
+ @kindex no-catch
+ If no return point is in effect with tag @var{tag}, then a @code{no-catch}
+ error is signaled with data @code{(@var{tag} @var{value})}.
+ @end defun
+ 
+ @node Examples of Catch
+ @subsection Examples of @code{catch} and @code{throw}
+ 
+   One way to use @code{catch} and @code{throw} is to exit from a doubly
+ nested loop.  (In most languages, this would be done with a ``go to''.)
+ Here we compute @code{(foo @var{i} @var{j})} for @var{i} and @var{j}
+ varying from 0 to 9:
+ 
+ @example
+ @group
+ (defun search-foo ()
+   (catch 'loop
+     (let ((i 0))
+       (while (< i 10)
+         (let ((j 0))
+           (while (< j 10)
+             (if (foo i j)
+                 (throw 'loop (list i j)))
+             (setq j (1+ j))))
+         (setq i (1+ i))))))
+ @end group
+ @end example
+ 
+ @noindent
+ If @code{foo} ever returns non-@code{nil}, we stop immediately and return a
+ list of @var{i} and @var{j}.  If @code{foo} always returns @code{nil}, the
+ @code{catch} returns normally, and the value is @code{nil}, since that
+ is the result of the @code{while}.
+ 
+   Here are two tricky examples, slightly different, showing two
+ return points at once.  First, two return points with the same tag,
+ @code{hack}:
+ 
+ @example
+ @group
+ (defun catch2 (tag)
+   (catch tag
+     (throw 'hack 'yes)))
+ @result{} catch2
+ @end group
+ 
+ @group
+ (catch 'hack 
+   (print (catch2 'hack))
+   'no)
+ @print{} yes
+ @result{} no
+ @end group
+ @end example
+ 
+ @noindent
+ Since both return points have tags that match the @code{throw}, it goes to
+ the inner one, the one established in @code{catch2}.  Therefore,
+ @code{catch2} returns normally with value @code{yes}, and this value is
+ printed.  Finally the second body form in the outer @code{catch}, which is
+ @code{'no}, is evaluated and returned from the outer @code{catch}.
+ 
+   Now let's change the argument given to @code{catch2}:
+ 
+ @example
+ @group
+ (defun catch2 (tag)
+   (catch tag
+     (throw 'hack 'yes)))
+ @result{} catch2
+ @end group
+ 
+ @group
+ (catch 'hack
+   (print (catch2 'quux))
+   'no)
+ @result{} yes
+ @end group
+ @end example
+ 
+ @noindent
+ We still have two return points, but this time only the outer one has
+ the tag @code{hack}; the inner one has the tag @code{quux} instead.
+ Therefore, @code{throw} makes the outer @code{catch} return the value
+ @code{yes}.  The function @code{print} is never called, and the
+ body-form @code{'no} is never evaluated.
+ 
+ @node Errors
+ @subsection Errors
+ @cindex errors
+ 
+   When Emacs Lisp attempts to evaluate a form that, for some reason,
+ cannot be evaluated, it @dfn{signals} an @dfn{error}.
+ 
+   When an error is signaled, Emacs's default reaction is to print an
+ error message and terminate execution of the current command.  This is
+ the right thing to do in most cases, such as if you type @kbd{C-f} at
+ the end of the buffer.
+ 
+   In complicated programs, simple termination may not be what you want.
+ For example, the program may have made temporary changes in data
+ structures, or created temporary buffers that should be deleted before
+ the program is finished.  In such cases, you would use
+ @code{unwind-protect} to establish @dfn{cleanup expressions} to be
+ evaluated in case of error.  (@xref{Cleanups}.)  Occasionally, you may
+ wish the program to continue execution despite an error in a subroutine.
+ In these cases, you would use @code{condition-case} to establish
+ @dfn{error handlers} to recover control in case of error.
+ 
+   Resist the temptation to use error handling to transfer control from
+ one part of the program to another; use @code{catch} and @code{throw}
+ instead.  @xref{Catch and Throw}.
+ 
+ @menu
+ * Signaling Errors::      How to report an error.
+ * Processing of Errors::  What Emacs does when you report an error.
+ * Handling Errors::       How you can trap errors and continue execution.
+ * Error Symbols::         How errors are classified for trapping them.
+ @end menu
+ 
+ @node Signaling Errors
+ @subsubsection How to Signal an Error
+ @cindex signaling errors
+ 
+   Most errors are signaled ``automatically'' within Lisp primitives
+ which you call for other purposes, such as if you try to take the
+ @sc{car} of an integer or move forward a character at the end of the
+ buffer; you can also signal errors explicitly with the functions
+ @code{error} and @code{signal}.
+ 
+   Quitting, which happens when the user types @kbd{C-g}, is not 
+ considered an error, but it is handled almost like an error.
+ @xref{Quitting}.
+ 
+ @defun error format-string &rest args
+ This function signals an error with an error message constructed by
+ applying @code{format} (@pxref{String Conversion}) to
+ @var{format-string} and @var{args}.
+ 
+ These examples show typical uses of @code{error}:
+ 
+ @example
+ @group
+ (error "You have committed an error.  
+         Try something else.")
+      @error{} You have committed an error.  
+         Try something else.
+ @end group
+ 
+ @group
+ (error "You have committed %d errors." 10)
+      @error{} You have committed 10 errors.  
+ @end group
+ @end example
+ 
+ @code{error} works by calling @code{signal} with two arguments: the
+ error symbol @code{error}, and a list containing the string returned by
+ @code{format}.
+ 
+ If you want to use your own string as an error message verbatim, don't
+ just write @code{(error @var{string})}.  If @var{string} contains
+ @samp{%}, it will be interpreted as a format specifier, with undesirable
+ results.  Instead, use @code{(error "%s" @var{string})}.
+ @end defun
+ 
+ @defun signal error-symbol data
+ This function signals an error named by @var{error-symbol}.  The
+ argument @var{data} is a list of additional Lisp objects relevant to the
+ circumstances of the error.
+ 
+ The argument @var{error-symbol} must be an @dfn{error symbol}---a symbol
+ bearing a property @code{error-conditions} whose value is a list of
+ condition names.  This is how Emacs Lisp classifies different sorts of
+ errors.
+ 
+ The number and significance of the objects in @var{data} depends on
+ @var{error-symbol}.  For example, with a @code{wrong-type-arg} error,
+ there are two objects in the list: a predicate that describes the type
+ that was expected, and the object that failed to fit that type.
+ @xref{Error Symbols}, for a description of error symbols.
+ 
+ Both @var{error-symbol} and @var{data} are available to any error
+ handlers that handle the error: @code{condition-case} binds a local
+ variable to a list of the form @code{(@var{error-symbol} .@:
+ @var{data})} (@pxref{Handling Errors}).  If the error is not handled,
+ these two values are used in printing the error message.
+ 
+ The function @code{signal} never returns (though in older Emacs versions
+ it could sometimes return).
+ 
+ @smallexample
+ @group
+ (signal 'wrong-number-of-arguments '(x y))
+      @error{} Wrong number of arguments: x, y
+ @end group
+ 
+ @group
+ (signal 'no-such-error '("My unknown error condition."))
+      @error{} peculiar error: "My unknown error condition."
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @cindex CL note---no continuable errors
+ @quotation
+ @b{Common Lisp note:} Emacs Lisp has nothing like the Common Lisp
+ concept of continuable errors.
+ @end quotation
+ 
+ @node Processing of Errors
+ @subsubsection How Emacs Processes Errors
+ 
+ When an error is signaled, @code{signal} searches for an active
+ @dfn{handler} for the error.  A handler is a sequence of Lisp
+ expressions designated to be executed if an error happens in part of the
+ Lisp program.  If the error has an applicable handler, the handler is
+ executed, and control resumes following the handler.  The handler
+ executes in the environment of the @code{condition-case} that
+ established it; all functions called within that @code{condition-case}
+ have already been exited, and the handler cannot return to them.
+ 
+ If there is no applicable handler for the error, the current command is
+ terminated and control returns to the editor command loop, because the
+ command loop has an implicit handler for all kinds of errors.  The
+ command loop's handler uses the error symbol and associated data to
+ print an error message.
+ 
+ @cindex @code{debug-on-error} use
+ An error that has no explicit handler may call the Lisp debugger.  The
+ debugger is enabled if the variable @code{debug-on-error} (@pxref{Error
+ Debugging}) is non-@code{nil}.  Unlike error handlers, the debugger runs
+ in the environment of the error, so that you can examine values of
+ variables precisely as they were at the time of the error.
+ 
+ @node Handling Errors
+ @subsubsection Writing Code to Handle Errors
+ @cindex error handler
+ @cindex handling errors
+ 
+   The usual effect of signaling an error is to terminate the command
+ that is running and return immediately to the Emacs editor command loop.
+ You can arrange to trap errors occurring in a part of your program by
+ establishing an error handler, with the special form
+ @code{condition-case}.  A simple example looks like this:
+ 
+ @example
+ @group
+ (condition-case nil
+     (delete-file filename)
+   (error nil))
+ @end group
+ @end example
+ 
+ @noindent
+ This deletes the file named @var{filename}, catching any error and
+ returning @code{nil} if an error occurs.
+ 
+   The second argument of @code{condition-case} is called the
+ @dfn{protected form}.  (In the example above, the protected form is a
+ call to @code{delete-file}.)  The error handlers go into effect when
+ this form begins execution and are deactivated when this form returns.
+ They remain in effect for all the intervening time.  In particular, they
+ are in effect during the execution of functions called by this form, in
+ their subroutines, and so on.  This is a good thing, since, strictly
+ speaking, errors can be signaled only by Lisp primitives (including
+ @code{signal} and @code{error}) called by the protected form, not by the
+ protected form itself.
+ 
+   The arguments after the protected form are handlers.  Each handler
+ lists one or more @dfn{condition names} (which are symbols) to specify
+ which errors it will handle.  The error symbol specified when an error
+ is signaled also defines a list of condition names.  A handler applies
+ to an error if they have any condition names in common.  In the example
+ above, there is one handler, and it specifies one condition name,
+ @code{error}, which covers all errors.
+ 
+   The search for an applicable handler checks all the established handlers
+ starting with the most recently established one.  Thus, if two nested
+ @code{condition-case} forms offer to handle the same error, the inner of
+ the two will actually handle it.
+ 
+   When an error is handled, control returns to the handler.  Before this
+ happens, Emacs unbinds all variable bindings made by binding constructs
+ that are being exited and executes the cleanups of all
+ @code{unwind-protect} forms that are exited.  Once control arrives at
+ the handler, the body of the handler is executed.
+ 
+   After execution of the handler body, execution continues by returning
+ from the @code{condition-case} form.  Because the protected form is
+ exited completely before execution of the handler, the handler cannot
+ resume execution at the point of the error, nor can it examine variable
+ bindings that were made within the protected form.  All it can do is
+ clean up and proceed.
+ 
+   @code{condition-case} is often used to trap errors that are
+ predictable, such as failure to open a file in a call to
+ @code{insert-file-contents}.  It is also used to trap errors that are
+ totally unpredictable, such as when the program evaluates an expression
+ read from the user.
+ 
+   Error signaling and handling have some resemblance to @code{throw} and
+ @code{catch}, but they are entirely separate facilities.  An error
+ cannot be caught by a @code{catch}, and a @code{throw} cannot be handled
+ by an error handler (though using @code{throw} when there is no suitable
+ @code{catch} signals an error that can be handled).
+ 
+ @defspec condition-case var protected-form handlers@dots{}
+ This special form establishes the error handlers @var{handlers} around
+ the execution of @var{protected-form}.  If @var{protected-form} executes
+ without error, the value it returns becomes the value of the
+ @code{condition-case} form; in this case, the @code{condition-case} has
+ no effect.  The @code{condition-case} form makes a difference when an
+ error occurs during @var{protected-form}.
+ 
+ Each of the @var{handlers} is a list of the form @code{(@var{conditions}
+ @var{body}@dots{})}.  Here @var{conditions} is an error condition name
+ to be handled, or a list of condition names; @var{body} is one or more
+ Lisp expressions to be executed when this handler handles an error.
+ Here are examples of handlers:
+ 
+ @smallexample
+ @group
+ (error nil)
+ 
+ (arith-error (message "Division by zero"))
+ 
+ ((arith-error file-error)
+  (message
+   "Either division by zero or failure to open a file"))
+ @end group
+ @end smallexample
+ 
+ Each error that occurs has an @dfn{error symbol} that describes what
+ kind of error it is.  The @code{error-conditions} property of this
+ symbol is a list of condition names (@pxref{Error Symbols}).  Emacs
+ searches all the active @code{condition-case} forms for a handler that
+ specifies one or more of these condition names; the innermost matching
+ @code{condition-case} handles the error.  Within this
+ @code{condition-case}, the first applicable handler handles the error.
+ 
+ After executing the body of the handler, the @code{condition-case}
+ returns normally, using the value of the last form in the handler body
+ as the overall value.
+ 
+ The argument @var{var} is a variable.  @code{condition-case} does not
+ bind this variable when executing the @var{protected-form}, only when it
+ handles an error.  At that time, it binds @var{var} locally to a list of
+ the form @code{(@var{error-symbol} . @var{data})}, giving the
+ particulars of the error.  The handler can refer to this list to decide
+ what to do.  For example, if the error is for failure opening a file,
+ the file name is the second element of @var{data}---the third element of
+ @var{var}.
+ 
+ If @var{var} is @code{nil}, that means no variable is bound.  Then the
+ error symbol and associated data are not available to the handler.
+ @end defspec
+ 
+ @cindex @code{arith-error} example
+ Here is an example of using @code{condition-case} to handle the error
+ that results from dividing by zero.  The handler prints out a warning
+ message and returns a very large number.
+ 
+ @smallexample
+ @group
+ (defun safe-divide (dividend divisor)
+   (condition-case err                
+       ;; @r{Protected form.}
+       (/ dividend divisor)              
+     ;; @r{The handler.}
+     (arith-error                        ; @r{Condition.}
+      (princ (format "Arithmetic error: %s" err))
+      1000000)))
+ @result{} safe-divide
+ @end group
+ 
+ @group
+ (safe-divide 5 0)
+      @print{} Arithmetic error: (arith-error)
+ @result{} 1000000
+ @end group
+ @end smallexample
+ 
+ @noindent
+ The handler specifies condition name @code{arith-error} so that it will handle only division-by-zero errors.  Other kinds of errors will not be handled, at least not by this @code{condition-case}.  Thus,
+ 
+ @smallexample
+ @group
+ (safe-divide nil 3)
+      @error{} Wrong type argument: integer-or-marker-p, nil
+ @end group
+ @end smallexample
+ 
+   Here is a @code{condition-case} that catches all kinds of errors,
+ including those signaled with @code{error}:
+ 
+ @smallexample
+ @group
+ (setq baz 34)
+      @result{} 34
+ @end group
+ 
+ @group
+ (condition-case err
+     (if (eq baz 35)
+         t
+       ;; @r{This is a call to the function @code{error}.}
+       (error "Rats!  The variable %s was %s, not 35" 'baz baz))
+   ;; @r{This is the handler; it is not a form.}
+   (error (princ (format "The error was: %s" err)) 
+          2))
+ @print{} The error was: (error "Rats!  The variable baz was 34, not 35")
+ @result{} 2
+ @end group
+ @end smallexample
+ 
+ @node Error Symbols
+ @subsubsection Error Symbols and Condition Names
+ @cindex error symbol
+ @cindex error name
+ @cindex condition name
+ @cindex user-defined error
+ @kindex error-conditions
+ 
+   When you signal an error, you specify an @dfn{error symbol} to specify
+ the kind of error you have in mind.  Each error has one and only one
+ error symbol to categorize it.  This is the finest classification of
+ errors defined by the Emacs Lisp language.
+ 
+   These narrow classifications are grouped into a hierarchy of wider
+ classes called @dfn{error conditions}, identified by @dfn{condition
+ names}.  The narrowest such classes belong to the error symbols
+ themselves: each error symbol is also a condition name.  There are also
+ condition names for more extensive classes, up to the condition name
+ @code{error} which takes in all kinds of errors.  Thus, each error has
+ one or more condition names: @code{error}, the error symbol if that
+ is distinct from @code{error}, and perhaps some intermediate
+ classifications.
+ 
+   In order for a symbol to be an error symbol, it must have an
+ @code{error-conditions} property which gives a list of condition names.
+ This list defines the conditions that this kind of error belongs to.
+ (The error symbol itself, and the symbol @code{error}, should always be
+ members of this list.)  Thus, the hierarchy of condition names is
+ defined by the @code{error-conditions} properties of the error symbols.
+ 
+   In addition to the @code{error-conditions} list, the error symbol
+ should have an @code{error-message} property whose value is a string to
+ be printed when that error is signaled but not handled.  If the
+ @code{error-message} property exists, but is not a string, the error
+ message @samp{peculiar error} is used.
+ @cindex peculiar error
+ 
+   Here is how we define a new error symbol, @code{new-error}:
+ 
+ @example
+ @group
+ (put 'new-error
+      'error-conditions
+      '(error my-own-errors new-error))       
+ @result{} (error my-own-errors new-error)
+ @end group
+ @group
+ (put 'new-error 'error-message "A new error")
+ @result{} "A new error"
+ @end group
+ @end example
+ 
+ @noindent
+ This error has three condition names: @code{new-error}, the narrowest
+ classification; @code{my-own-errors}, which we imagine is a wider
+ classification; and @code{error}, which is the widest of all.
+ 
+   The error string should start with a capital letter but it should
+ not end with a period.  This is for consistency with the rest of Emacs.
+  
+   Naturally, Emacs will never signal @code{new-error} on its own; only
+ an explicit call to @code{signal} (@pxref{Signaling Errors}) in your
+ code can do this:
+ 
+ @example
+ @group
+ (signal 'new-error '(x y))
+      @error{} A new error: x, y
+ @end group
+ @end example
+ 
+   This error can be handled through any of the three condition names.
+ This example handles @code{new-error} and any other errors in the class
+ @code{my-own-errors}:
+ 
+ @example
+ @group
+ (condition-case foo
+     (bar nil t)
+   (my-own-errors nil))
+ @end group
+ @end example
+ 
+   The significant way that errors are classified is by their condition
+ names---the names used to match errors with handlers.  An error symbol
+ serves only as a convenient way to specify the intended error message
+ and list of condition names.  It would be cumbersome to give
+ @code{signal} a list of condition names rather than one error symbol.
+ 
+   By contrast, using only error symbols without condition names would
+ seriously decrease the power of @code{condition-case}.  Condition names
+ make it possible to categorize errors at various levels of generality
+ when you write an error handler.  Using error symbols alone would
+ eliminate all but the narrowest level of classification.
+ 
+   @xref{Standard Errors}, for a list of all the standard error symbols
+ and their conditions.
+ 
+ @node Cleanups
+ @subsection Cleaning Up from Nonlocal Exits
+ 
+   The @code{unwind-protect} construct is essential whenever you
+ temporarily put a data structure in an inconsistent state; it permits
+ you to ensure the data are consistent in the event of an error or throw.
+ 
+ @defspec unwind-protect body cleanup-forms@dots{}
+ @cindex cleanup forms
+ @cindex protected forms
+ @cindex error cleanup
+ @cindex unwinding
+ @code{unwind-protect} executes the @var{body} with a guarantee that the
+ @var{cleanup-forms} will be evaluated if control leaves @var{body}, no
+ matter how that happens.  The @var{body} may complete normally, or
+ execute a @code{throw} out of the @code{unwind-protect}, or cause an
+ error; in all cases, the @var{cleanup-forms} will be evaluated.
+ 
+ If the @var{body} forms finish normally, @code{unwind-protect} returns
+ the value of the last @var{body} form, after it evaluates the
+ @var{cleanup-forms}.  If the @var{body} forms do not finish,
+ @code{unwind-protect} does not return any value in the normal sense.
+ 
+ Only the @var{body} is actually protected by the @code{unwind-protect}.
+ If any of the @var{cleanup-forms} themselves exits nonlocally (e.g., via
+ a @code{throw} or an error), @code{unwind-protect} is @emph{not}
+ guaranteed to evaluate the rest of them.  If the failure of one of the
+ @var{cleanup-forms} has the potential to cause trouble, then protect it
+ with another @code{unwind-protect} around that form.
+ 
+ The number of currently active @code{unwind-protect} forms counts,
+ together with the number of local variable bindings, against the limit
+ @code{max-specpdl-size} (@pxref{Local Variables}).
+ @end defspec
+ 
+   For example, here we make an invisible buffer for temporary use, and
+ make sure to kill it before finishing:
+ 
+ @smallexample
+ @group
+ (save-excursion
+   (let ((buffer (get-buffer-create " *temp*")))
+     (set-buffer buffer)
+     (unwind-protect
+         @var{body}
+       (kill-buffer buffer))))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ You might think that we could just as well write @code{(kill-buffer
+ (current-buffer))} and dispense with the variable @code{buffer}.
+ However, the way shown above is safer, if @var{body} happens to get an
+ error after switching to a different buffer!  (Alternatively, you could
+ write another @code{save-excursion} around the body, to ensure that the
+ temporary buffer becomes current in time to kill it.)
+ 
+ @findex ftp-login
+   Here is an actual example taken from the file @file{ftp.el}.  It
+ creates a process (@pxref{Processes}) to try to establish a connection
+ to a remote machine.  As the function @code{ftp-login} is highly
+ susceptible to numerous problems that the writer of the function cannot
+ anticipate, it is protected with a form that guarantees deletion of the
+ process in the event of failure.  Otherwise, Emacs might fill up with
+ useless subprocesses.
+ 
+ @smallexample
+ @group
+ (let ((win nil))
+   (unwind-protect
+       (progn
+         (setq process (ftp-setup-buffer host file))
+         (if (setq win (ftp-login process host user password))
+             (message "Logged in")
+           (error "Ftp login failed")))
+     (or win (and process (delete-process process)))))
+ @end group
+ @end smallexample
+ 
+   This example actually has a small bug: if the user types @kbd{C-g} to
+ quit, and the quit happens immediately after the function
+ @code{ftp-setup-buffer} returns but before the variable @code{process} is
+ set, the process will not be killed.  There is no easy way to fix this bug,
+ but at least it is very unlikely.
+ 
+   Here is another example which uses @code{unwind-protect} to make sure
+ to kill a temporary buffer.  In this example, the value returned by
+ @code{unwind-protect} is used.
+ 
+ @smallexample
+ (defun shell-command-string (cmd)
+   "Return the output of the shell command CMD, as a string."
+   (save-excursion
+     (set-buffer (generate-new-buffer " OS*cmd"))
+     (shell-command cmd t)
+     (unwind-protect
+         (buffer-string)
+       (kill-buffer (current-buffer)))))
+ @end smallexample
Index: emacs/man/elisp-debugging.texi
diff -c /dev/null emacs/man/elisp-debugging.texi:1.2
*** /dev/null	Fri Aug  2 20:49:46 1996
--- emacs/man/elisp-debugging.texi	Thu Aug  1 00:22:34 1996
***************
*** 0 ****
--- 1,712 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/debugging
+ @node Debugging, Read and Print, Byte Compilation, Top
+ @chapter Debugging Lisp Programs
+ 
+   There are three ways to investigate a problem in an Emacs Lisp program,
+ depending on what you are doing with the program when the problem appears.
+ 
+ @itemize @bullet
+ @item
+ If the problem occurs when you run the program, you can use a Lisp
+ debugger (either the default debugger or Edebug) to investigate what is
+ happening during execution.
+ 
+ @item
+ If the problem is syntactic, so that Lisp cannot even read the program,
+ you can use the Emacs facilities for editing Lisp to localize it.
+ 
+ @item
+ If the problem occurs when trying to compile the program with the byte
+ compiler, you need to know how to examine the compiler's input buffer.
+ @end itemize
+ 
+ @menu
+ * Debugger::            How the Emacs Lisp debugger is implemented.
+ * Syntax Errors::       How to find syntax errors.
+ * Compilation Errors::  How to find errors that show up in byte compilation.
+ * Edebug::		A source-level Emacs Lisp debugger.
+ @end menu
+ 
+   Another useful debugging tool is the dribble file.  When a dribble
+ file is open, Emacs copies all keyboard input characters to that file.
+ Afterward, you can examine the file to find out what input was used.
+ @xref{Terminal Input}.
+ 
+   For debugging problems in terminal descriptions, the
+ @code{open-termscript} function can be useful.  @xref{Terminal Output}.
+ 
+ @node Debugger
+ @section The Lisp Debugger
+ @cindex debugger
+ @cindex Lisp debugger
+ @cindex break
+ 
+   The @dfn{Lisp debugger} provides the ability to suspend evaluation of
+ a form.  While evaluation is suspended (a state that is commonly known
+ as a @dfn{break}), you may examine the run time stack, examine the
+ values of local or global variables, or change those values.  Since a
+ break is a recursive edit, all the usual editing facilities of Emacs are
+ available; you can even run programs that will enter the debugger
+ recursively.  @xref{Recursive Editing}.
+ 
+ @menu
+ * Error Debugging::       Entering the debugger when an error happens.
+ * Infinite Loops::	  Stopping and debugging a program that doesn't exit.
+ * Function Debugging::    Entering it when a certain function is called.
+ * Explicit Debug::        Entering it at a certain point in the program.
+ * Using Debugger::        What the debugger does; what you see while in it.
+ * Debugger Commands::     Commands used while in the debugger.
+ * Invoking the Debugger:: How to call the function @code{debug}.
+ * Internals of Debugger:: Subroutines of the debugger, and global variables.
+ @end menu
+ 
+ @node Error Debugging
+ @subsection Entering the Debugger on an Error
+ @cindex error debugging
+ @cindex debugging errors
+ 
+   The most important time to enter the debugger is when a Lisp error
+ happens.  This allows you to investigate the immediate causes of the
+ error.
+ 
+   However, entry to the debugger is not a normal consequence of an
+ error.  Many commands frequently get Lisp errors when invoked in
+ inappropriate contexts (such as @kbd{C-f} at the end of the buffer) and
+ during ordinary editing it would be very unpleasant to enter the
+ debugger each time this happens.  If you want errors to enter the
+ debugger, set the variable @code{debug-on-error} to non-@code{nil}.
+ 
+ @defopt debug-on-error
+ This variable determines whether the debugger is called when an error is
+ signaled and not handled.  If @code{debug-on-error} is @code{t}, all
+ errors call the debugger.  If it is @code{nil}, none call the debugger.
+ 
+ The value can also be a list of error conditions that should call the
+ debugger.  For example, if you set it to the list
+ @code{(void-variable)}, then only errors about a variable that has no
+ value invoke the debugger.
+ 
+ When this variable is non-@code{nil}, Emacs does not catch errors that
+ happen in process filter functions and sentinels.  Therefore, these
+ errors also can invoke the debugger.  @xref{Processes}.
+ @end defopt
+ 
+   To debug an error that happens during loading of the @file{.emacs}
+ file, use the option @samp{-debug-init}, which binds
+ @code{debug-on-error} to @code{t} while @file{.emacs} is loaded and
+ inhibits use of @code{condition-case} to catch init file errors.
+ 
+   If your @file{.emacs} file sets @code{debug-on-error}, the effect may
+ not last past the end of loading @file{.emacs}.  (This is an undesirable
+ byproduct of the code that implements the @samp{-debug-init} command
+ line option.)  The best way to make @file{.emacs} set
+ @code{debug-on-error} permanently is with @code{after-init-hook}, like
+ this:
+ 
+ @example
+ (add-hook 'after-init-hook
+           '(lambda () (setq debug-on-error t)))
+ @end example
+ 
+ @node Infinite Loops
+ @subsection Debugging Infinite Loops
+ @cindex infinite loops
+ @cindex loops, infinite
+ @cindex quitting from infinite loop
+ @cindex stopping an infinite loop
+ 
+   When a program loops infinitely and fails to return, your first
+ problem is to stop the loop.  On most operating systems, you can do this
+ with @kbd{C-g}, which causes quit.
+ 
+   Ordinary quitting gives no information about why the program was
+ looping.  To get more information, you can set the variable
+ @code{debug-on-quit} to non-@code{nil}.  Quitting with @kbd{C-g} is not
+ considered an error, and @code{debug-on-error} has no effect on the
+ handling of @kbd{C-g}.  Likewise, @code{debug-on-quit} has no effect on
+ errors.
+ 
+   Once you have the debugger running in the middle of the infinite loop,
+ you can proceed from the debugger using the stepping commands.  If you
+ step through the entire loop, you will probably get enough information
+ to solve the problem.
+ 
+ @defopt debug-on-quit
+ This variable determines whether the debugger is called when @code{quit}
+ is signaled and not handled.  If @code{debug-on-quit} is non-@code{nil},
+ then the debugger is called whenever you quit (that is, type @kbd{C-g}).
+ If @code{debug-on-quit} is @code{nil}, then the debugger is not called
+ when you quit.  @xref{Quitting}.
+ @end defopt
+ 
+ @node Function Debugging
+ @subsection Entering the Debugger on a Function Call
+ @cindex function call debugging
+ @cindex debugging specific functions
+ 
+   To investigate a problem that happens in the middle of a program, one
+ useful technique is to enter the debugger whenever a certain function is
+ called.  You can do this to the function in which the problem occurs,
+ and then step through the function, or you can do this to a function
+ called shortly before the problem, step quickly over the call to that
+ function, and then step through its caller.
+ 
+ @deffn Command debug-on-entry function-name
+   This function requests @var{function-name} to invoke the debugger each time
+ it is called.  It works by inserting the form @code{(debug 'debug)} into
+ the function definition as the first form.
+ 
+   Any function defined as Lisp code may be set to break on entry,
+ regardless of whether it is interpreted code or compiled code.  If the
+ function is a command, it will enter the debugger when called from Lisp
+ and when called interactively (after the reading of the arguments).  You
+ can't debug primitive functions (i.e., those written in C) this way.
+ 
+   When @code{debug-on-entry} is called interactively, it prompts
+ for @var{function-name} in the minibuffer.
+ 
+   If the function is already set up to invoke the debugger on entry,
+ @code{debug-on-entry} does nothing.
+ 
+   @strong{Note:} if you redefine a function after using
+ @code{debug-on-entry} on it, the code to enter the debugger is lost.
+ 
+   @code{debug-on-entry} returns @var{function-name}.
+ 
+ @example
+ @group
+ (defun fact (n)
+   (if (zerop n) 1
+       (* n (fact (1- n)))))
+      @result{} fact
+ @end group
+ @group
+ (debug-on-entry 'fact)
+      @result{} fact
+ @end group
+ @group
+ (fact 3)
+ @end group
+ 
+ @group
+ ------ Buffer: *Backtrace* ------
+ Entering:
+ * fact(3)
+   eval-region(4870 4878 t)
+   byte-code("...")
+   eval-last-sexp(nil)
+   (let ...)
+   eval-insert-last-sexp(nil)
+ * call-interactively(eval-insert-last-sexp)
+ ------ Buffer: *Backtrace* ------
+ @end group
+ 
+ @group
+ (symbol-function 'fact)
+      @result{} (lambda (n)
+           (debug (quote debug))
+           (if (zerop n) 1 (* n (fact (1- n)))))
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command cancel-debug-on-entry function-name
+ This function undoes the effect of @code{debug-on-entry} on
+ @var{function-name}.  When called interactively, it prompts for
+ @var{function-name} in the minibuffer.  If @var{function-name} is
+ @code{nil} or the empty string, it cancels debugging for all functions.
+ 
+ If @code{cancel-debug-on-entry} is called more than once on the same
+ function, the second call does nothing.  @code{cancel-debug-on-entry}
+ returns @var{function-name}.
+ @end deffn
+ 
+ @node Explicit Debug
+ @subsection Explicit Entry to the Debugger
+ 
+   You can cause the debugger to be called at a certain point in your
+ program by writing the expression @code{(debug)} at that point.  To do
+ this, visit the source file, insert the text @samp{(debug)} at the
+ proper place, and type @kbd{C-M-x}.  Be sure to undo this insertion
+ before you save the file!
+ 
+   The place where you insert @samp{(debug)} must be a place where an
+ additional form can be evaluated and its value ignored.  (If the value
+ of @code{(debug)} isn't ignored, it will alter the execution of the
+ program!)  The most common suitable places are inside a @code{progn} or
+ an implicit @code{progn} (@pxref{Sequencing}).
+ 
+ @node Using Debugger
+ @subsection Using the Debugger
+ 
+   When the debugger is entered, it displays the previously selected
+ buffer in one window and a buffer named @samp{*Backtrace*} in another
+ window.  The backtrace buffer contains one line for each level of Lisp
+ function execution currently going on.  At the beginning of this buffer
+ is a message describing the reason that the debugger was invoked (such
+ as the error message and associated data, if it was invoked due to an
+ error).
+ 
+   The backtrace buffer is read-only and uses a special major mode,
+ Debugger mode, in which letters are defined as debugger commands.  The
+ usual Emacs editing commands are available; thus, you can switch windows
+ to examine the buffer that was being edited at the time of the error,
+ switch buffers, visit files, or do any other sort of editing.  However,
+ the debugger is a recursive editing level (@pxref{Recursive Editing})
+ and it is wise to go back to the backtrace buffer and exit the debugger
+ (with the @kbd{q} command) when you are finished with it.  Exiting
+ the debugger gets out of the recursive edit and kills the backtrace
+ buffer.
+ 
+ @cindex current stack frame
+   The backtrace buffer shows you the functions that are executing and
+ their argument values.  It also allows you to specify a stack frame by
+ moving point to the line describing that frame.  (A stack frame is the
+ place where the Lisp interpreter records information about a particular
+ invocation of a function.)  The frame whose line point is on is
+ considered the @dfn{current frame}.  Some of the debugger commands
+ operate on the current frame.
+ 
+   The debugger itself must be run byte-compiled, since it makes
+ assumptions about how many stack frames are used for the debugger
+ itself.  These assumptions are false if the debugger is running
+ interpreted.
+ 
+ @need 3000
+ 
+ @node Debugger Commands
+ @subsection Debugger Commands
+ @cindex debugger command list
+ 
+   Inside the debugger (in Debugger mode), these special commands are
+ available in addition to the usual cursor motion commands.  (Keep in
+ mind that all the usual facilities of Emacs, such as switching windows
+ or buffers, are still available.)
+ 
+   The most important use of debugger commands is for stepping through
+ code, so that you can see how control flows.  The debugger can step
+ through the control structures of an interpreted function, but cannot do
+ so in a byte-compiled function.  If you would like to step through a
+ byte-compiled function, replace it with an interpreted definition of the
+ same function.  (To do this, visit the source file for the function and
+ type @kbd{C-M-x} on its definition.)
+ 
+   Here is a list of Debugger mode commands:
+ 
+ @table @kbd
+ @item c
+ Exit the debugger and continue execution.  When continuing is possible,
+ it resumes execution of the program as if the debugger had never been
+ entered (aside from the effect of any variables or data structures you
+ may have changed while inside the debugger).
+ 
+ Continuing is possible after entry to the debugger due to function entry
+ or exit, explicit invocation, or quitting.  You cannot continue if the
+ debugger was entered because of an error.
+ 
+ @item d
+ Continue execution, but enter the debugger the next time any Lisp
+ function is called.  This allows you to step through the
+ subexpressions of an expression, seeing what values the subexpressions
+ compute, and what else they do.
+ 
+ The stack frame made for the function call which enters the debugger in
+ this way will be flagged automatically so that the debugger will be
+ called again when the frame is exited.  You can use the @kbd{u} command
+ to cancel this flag.
+ 
+ @item b
+ Flag the current frame so that the debugger will be entered when the
+ frame is exited.  Frames flagged in this way are marked with stars
+ in the backtrace buffer.
+ 
+ @item u
+ Don't enter the debugger when the current frame is exited.  This
+ cancels a @kbd{b} command on that frame.
+ 
+ @item e
+ Read a Lisp expression in the minibuffer, evaluate it, and print the
+ value in the echo area.  The debugger alters certain important
+ variables, and the current buffer, as part of its operation; @kbd{e}
+ temporarily restores their outside-the-debugger values so you can
+ examine them.  This makes the debugger more transparent.  By contrast,
+ @kbd{M-:} does nothing special in the debugger; it shows you the
+ variable values within the debugger.
+ 
+ @item q
+ Terminate the program being debugged; return to top-level Emacs
+ command execution.
+ 
+ If the debugger was entered due to a @kbd{C-g} but you really want
+ to quit, and not debug, use the @kbd{q} command.
+ 
+ @item r
+ Return a value from the debugger.  The value is computed by reading an
+ expression with the minibuffer and evaluating it.
+ 
+ The @kbd{r} command is useful when the debugger was invoked due to exit
+ from a Lisp call frame (as requested with @kbd{b}); then the value
+ specified in the @kbd{r} command is used as the value of that frame.  It
+ is also useful if you call @code{debug} and use its return value.
+ Otherwise, @kbd{r} has the same effect as @kbd{c}, and the specified
+ return value does not matter.
+ 
+ You can't use @kbd{r} when the debugger was entered due to an error.
+ @end table
+ 
+ @node Invoking the Debugger
+ @subsection Invoking the Debugger
+ 
+   Here we describe fully the function used to invoke the debugger.
+ 
+ @defun debug &rest debugger-args
+ This function enters the debugger.  It switches buffers to a buffer
+ named @samp{*Backtrace*} (or @samp{*Backtrace*<2>} if it is the second
+ recursive entry to the debugger, etc.), and fills it with information
+ about the stack of Lisp function calls.  It then enters a recursive
+ edit, showing the backtrace buffer in Debugger mode.
+ 
+ The Debugger mode @kbd{c} and @kbd{r} commands exit the recursive edit;
+ then @code{debug} switches back to the previous buffer and returns to
+ whatever called @code{debug}.  This is the only way the function
+ @code{debug} can return to its caller.
+ 
+ If the first of the @var{debugger-args} passed to @code{debug} is
+ @code{nil} (or if it is not one of the special values in the table
+ below), then @code{debug} displays the rest of its arguments at the
+ top of the @samp{*Backtrace*} buffer.  This mechanism is used to display
+ a message to the user.
+ 
+ However, if the first argument passed to @code{debug} is one of the
+ following special values, then it has special significance.  Normally,
+ these values are passed to @code{debug} only by the internals of Emacs
+ and the debugger, and not by programmers calling @code{debug}.
+ 
+ The special values are:
+ 
+ @table @code
+ @item lambda
+ @cindex @code{lambda} in debug
+ A first argument of @code{lambda} means @code{debug} was called because
+ of entry to a function when @code{debug-on-next-call} was
+ non-@code{nil}.  The debugger displays @samp{Entering:} as a line of
+ text at the top of the buffer.
+ 
+ @item debug
+ @code{debug} as first argument indicates a call to @code{debug} because
+ of entry to a function that was set to debug on entry.  The debugger
+ displays @samp{Entering:}, just as in the @code{lambda} case.  It also
+ marks the stack frame for that function so that it will invoke the
+ debugger when exited.
+ 
+ @item t
+ When the first argument is @code{t}, this indicates a call to
+ @code{debug} due to evaluation of a list form when
+ @code{debug-on-next-call} is non-@code{nil}.  The debugger displays the
+ following as the top line in the buffer:
+ 
+ @smallexample
+ Beginning evaluation of function call form:
+ @end smallexample
+ 
+ @item exit
+ When the first argument is @code{exit}, it indicates the exit of a
+ stack frame previously marked to invoke the debugger on exit.  The
+ second argument given to @code{debug} in this case is the value being
+ returned from the frame.  The debugger displays @samp{Return value:} on
+ the top line of the buffer, followed by the value being returned.
+ 
+ @item error
+ @cindex @code{error} in debug
+ When the first argument is @code{error}, the debugger indicates that
+ it is being entered because an error or @code{quit} was signaled and not
+ handled, by displaying @samp{Signaling:} followed by the error signaled
+ and any arguments to @code{signal}.  For example,
+ 
+ @example
+ @group
+ (let ((debug-on-error t))
+   (/ 1 0))
+ @end group
+ 
+ @group
+ ------ Buffer: *Backtrace* ------
+ Signaling: (arith-error)
+   /(1 0)
+ ...
+ ------ Buffer: *Backtrace* ------
+ @end group
+ @end example
+ 
+ If an error was signaled, presumably the variable
+ @code{debug-on-error} is non-@code{nil}.  If @code{quit} was signaled,
+ then presumably the variable @code{debug-on-quit} is non-@code{nil}.
+ 
+ @item nil
+ Use @code{nil} as the first of the @var{debugger-args} when you want
+ to enter the debugger explicitly.  The rest of the @var{debugger-args}
+ are printed on the top line of the buffer.  You can use this feature to
+ display messages---for example, to remind yourself of the conditions
+ under which @code{debug} is called.
+ @end table
+ @end defun
+ 
+ @node Internals of Debugger
+ @subsection Internals of the Debugger
+ 
+   This section describes functions and variables used internally by the
+ debugger.
+ 
+ @defvar debugger
+ The value of this variable is the function to call to invoke the
+ debugger.  Its value must be a function of any number of arguments (or,
+ more typically, the name of a function).  Presumably this function will
+ enter some kind of debugger.  The default value of the variable is
+ @code{debug}.
+ 
+ The first argument that Lisp hands to the function indicates why it
+ was called.  The convention for arguments is detailed in the description
+ of @code{debug}.
+ @end defvar
+ 
+ @deffn Command backtrace
+ @cindex run time stack
+ @cindex call stack
+ This function prints a trace of Lisp function calls currently active.
+ This is the function used by @code{debug} to fill up the
+ @samp{*Backtrace*} buffer.  It is written in C, since it must have access
+ to the stack to determine which function calls are active.  The return
+ value is always @code{nil}.
+ 
+ In the following example, a Lisp expression calls @code{backtrace}
+ explicitly.  This prints the backtrace to the stream
+ @code{standard-output}: in this case, to the buffer
+ @samp{backtrace-output}.  Each line of the backtrace represents one
+ function call.  The line shows the values of the function's arguments if
+ they are all known.  If they are still being computed, the line says so.
+ The arguments of special forms are elided.
+ 
+ @smallexample
+ @group
+ (with-output-to-temp-buffer "backtrace-output"
+   (let ((var 1))
+     (save-excursion
+       (setq var (eval '(progn
+                          (1+ var)
+                          (list 'testing (backtrace))))))))
+ 
+      @result{} nil
+ @end group
+ 
+ @group
+ ----------- Buffer: backtrace-output ------------
+   backtrace()
+   (list ...computing arguments...)
+   (progn ...)
+   eval((progn (1+ var) (list (quote testing) (backtrace))))
+   (setq ...)
+   (save-excursion ...)
+   (let ...)
+   (with-output-to-temp-buffer ...)
+   eval-region(1973 2142 #<buffer *scratch*>)
+   byte-code("...  for eval-print-last-sexp ...")
+   eval-print-last-sexp(nil)
+ * call-interactively(eval-print-last-sexp)
+ ----------- Buffer: backtrace-output ------------
+ @end group
+ @end smallexample
+ 
+ The character @samp{*} indicates a frame whose debug-on-exit flag is
+ set.
+ @end deffn
+ 
+ @ignore @c Not worth mentioning
+ @defopt stack-trace-on-error
+ @cindex stack trace
+ This variable controls whether Lisp automatically displays a
+ backtrace buffer after every error that is not handled.  A quit signal
+ counts as an error for this variable.  If it is non-@code{nil} then a
+ backtrace is shown in a pop-up buffer named @samp{*Backtrace*} on every
+ error.  If it is @code{nil}, then a backtrace is not shown.
+ 
+ When a backtrace is shown, that buffer is not selected.  If either
+ @code{debug-on-quit} or @code{debug-on-error} is also non-@code{nil}, then
+ a backtrace is shown in one buffer, and the debugger is popped up in
+ another buffer with its own backtrace.
+ 
+ We consider this feature to be obsolete and superseded by the debugger
+ itself.
+ @end defopt
+ @end ignore
+ 
+ @defvar debug-on-next-call
+ @cindex @code{eval}, and debugging
+ @cindex @code{apply}, and debugging
+ @cindex @code{funcall}, and debugging
+ If this variable is non-@code{nil}, it says to call the debugger before
+ the next @code{eval}, @code{apply} or @code{funcall}.  Entering the
+ debugger sets @code{debug-on-next-call} to @code{nil}.
+ 
+ The @kbd{d} command in the debugger works by setting this variable.
+ @end defvar
+ 
+ @defun backtrace-debug level flag
+ This function sets the debug-on-exit flag of the stack frame @var{level}
+ levels down the stack, giving it the value @var{flag}.  If @var{flag} is
+ non-@code{nil}, this will cause the debugger to be entered when that
+ frame later exits.  Even a nonlocal exit through that frame will enter
+ the debugger.
+ 
+ This function is used only by the debugger.
+ @end defun
+ 
+ @defvar command-debug-status
+ This variable records the debugging status of the current interactive
+ command.  Each time a command is called interactively, this variable is
+ bound to @code{nil}.  The debugger can set this variable to leave
+ information for future debugger invocations during the same command.
+ 
+ The advantage, for the debugger, of using this variable rather than
+ another global variable is that the data will never carry over to a
+ subsequent command invocation.
+ @end defvar
+ 
+ @defun backtrace-frame frame-number
+ The function @code{backtrace-frame} is intended for use in Lisp
+ debuggers.  It returns information about what computation is happening
+ in the stack frame @var{frame-number} levels down.
+ 
+ If that frame has not evaluated the arguments yet (or is a special
+ form), the value is @code{(nil @var{function} @var{arg-forms}@dots{})}.
+ 
+ If that frame has evaluated its arguments and called its function
+ already, the value is @code{(t @var{function}
+ @var{arg-values}@dots{})}.
+ 
+ In the return value, @var{function} is whatever was supplied as the
+ @sc{car} of the evaluated list, or a @code{lambda} expression in the
+ case of a macro call.  If the function has a @code{&rest} argument, that
+ is represented as the tail of the list @var{arg-values}.
+ 
+ If @var{frame-number} is out of range, @code{backtrace-frame} returns
+ @code{nil}.
+ @end defun
+ 
+ @node Syntax Errors
+ @section Debugging Invalid Lisp Syntax
+ 
+   The Lisp reader reports invalid syntax, but cannot say where the real
+ problem is.  For example, the error ``End of file during parsing'' in
+ evaluating an expression indicates an excess of open parentheses (or
+ square brackets).  The reader detects this imbalance at the end of the
+ file, but it cannot figure out where the close parenthesis should have
+ been.  Likewise, ``Invalid read syntax: ")"'' indicates an excess close
+ parenthesis or missing open parenthesis, but does not say where the
+ missing parenthesis belongs.  How, then, to find what to change?
+ 
+   If the problem is not simply an imbalance of parentheses, a useful
+ technique is to try @kbd{C-M-e} at the beginning of each defun, and see
+ if it goes to the place where that defun appears to end.  If it does
+ not, there is a problem in that defun.
+ 
+   However, unmatched parentheses are the most common syntax errors in
+ Lisp, and we can give further advice for those cases.
+ 
+ @menu
+ * Excess Open::     How to find a spurious open paren or missing close.
+ * Excess Close::    How to find a spurious close paren or missing open.
+ @end menu
+ 
+ @node Excess Open
+ @subsection Excess Open Parentheses
+ 
+   The first step is to find the defun that is unbalanced.  If there is
+ an excess open parenthesis, the way to do this is to insert a
+ close parenthesis at the end of the file and type @kbd{C-M-b}
+ (@code{backward-sexp}).  This will move you to the beginning of the
+ defun that is unbalanced.  (Then type @kbd{C-@key{SPC} C-_ C-u
+ C-@key{SPC}} to set the mark there, undo the insertion of the
+ close parenthesis, and finally return to the mark.)
+ 
+   The next step is to determine precisely what is wrong.  There is no
+ way to be sure of this except to study the program, but often the
+ existing indentation is a clue to where the parentheses should have
+ been.  The easiest way to use this clue is to reindent with @kbd{C-M-q}
+ and see what moves.
+ 
+   Before you do this, make sure the defun has enough close parentheses.
+ Otherwise, @kbd{C-M-q} will get an error, or will reindent all the rest
+ of the file until the end.  So move to the end of the defun and insert a
+ close parenthesis there.  Don't use @kbd{C-M-e} to move there, since
+ that too will fail to work until the defun is balanced.
+ 
+   Now you can go to the beginning of the defun and type @kbd{C-M-q}.
+ Usually all the lines from a certain point to the end of the function
+ will shift to the right.  There is probably a missing close parenthesis,
+ or a superfluous open parenthesis, near that point.  (However, don't
+ assume this is true; study the code to make sure.)  Once you have found
+ the discrepancy, undo the @kbd{C-M-q} with @kbd{C-_}, since the old
+ indentation is probably appropriate to the intended parentheses.
+ 
+   After you think you have fixed the problem, use @kbd{C-M-q} again.  If
+ the old indentation actually fit the intended nesting of parentheses,
+ and you have put back those parentheses, @kbd{C-M-q} should not change
+ anything.
+ 
+ @node Excess Close
+ @subsection Excess Close Parentheses
+ 
+   To deal with an excess close parenthesis, first insert an open
+ parenthesis at the beginning of the file, back up over it, and type
+ @kbd{C-M-f} to find the end of the unbalanced defun.  (Then type
+ @kbd{C-@key{SPC} C-_ C-u C-@key{SPC}} to set the mark there, undo the
+ insertion of the open parenthesis, and finally return to the mark.)
+ 
+   Then find the actual matching close parenthesis by typing @kbd{C-M-f}
+ at the beginning of the defun.  This will leave you somewhere short of
+ the place where the defun ought to end.  It is possible that you will
+ find a spurious close parenthesis in that vicinity.
+ 
+   If you don't see a problem at that point, the next thing to do is to
+ type @kbd{C-M-q} at the beginning of the defun.  A range of lines will
+ probably shift left; if so, the missing open parenthesis or spurious
+ close parenthesis is probably near the first of those lines.  (However,
+ don't assume this is true; study the code to make sure.)  Once you have
+ found the discrepancy, undo the @kbd{C-M-q} with @kbd{C-_}, since the
+ old indentation is probably appropriate to the intended parentheses.
+ 
+   After you think you have fixed the problem, use @kbd{C-M-q} again.  If
+ the old indentation actually fit the intended nesting of parentheses,
+ and you have put back those parentheses, @kbd{C-M-q} should not change
+ anything.
+ 
+ @node Compilation Errors, Edebug, Syntax Errors, Debugging
+ @section Debugging Problems in Compilation
+ 
+   When an error happens during byte compilation, it is normally due to
+ invalid syntax in the program you are compiling.  The compiler prints a
+ suitable error message in the @samp{*Compile-Log*} buffer, and then
+ stops.  The message may state a function name in which the error was
+ found, or it may not.  Either way, here is how to find out where in the
+ file the error occurred.
+ 
+   What you should do is switch to the buffer @w{@samp{ *Compiler Input*}}.
+ (Note that the buffer name starts with a space, so it does not show
+ up in @kbd{M-x list-buffers}.)  This buffer contains the program being
+ compiled, and point shows how far the byte compiler was able to read.
+ 
+   If the error was due to invalid Lisp syntax, point shows exactly where
+ the invalid syntax was @emph{detected}.  The cause of the error is not
+ necessarily near by!  Use the techniques in the previous section to find
+ the error.
+ 
+   If the error was detected while compiling a form that had been read
+ successfully, then point is located at the end of the form.  In this
+ case, this technique can't localize the error precisely, but can still
+ show you which function to check.
+ 
+ @include elisp-edebug.texi
Index: emacs/man/elisp-display.texi
diff -c /dev/null emacs/man/elisp-display.texi:1.2
*** /dev/null	Fri Aug  2 20:50:11 1996
--- emacs/man/elisp-display.texi	Thu Aug  1 00:22:36 1996
***************
*** 0 ****
--- 1,1452 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/display
+ @node Display, Calendar, System Interface, Top
+ @chapter Emacs Display
+ 
+   This chapter describes a number of features related to the display
+ that Emacs presents to the user.
+ 
+ @menu
+ * Refresh Screen::      Clearing the screen and redrawing everything on it.
+ * Screen Size::         How big is the Emacs screen.
+ * Truncation::          Folding or wrapping long text lines.
+ * The Echo Area::       Where messages are displayed.
+ * Invisible Text::      Hiding part of the buffer text.
+ * Selective Display::   Hiding part of the buffer text (the old way).
+ * Overlay Arrow::       Display of an arrow to indicate position.
+ * Temporary Displays::  Displays that go away automatically.
+ * Overlays::		Use overlays to highlight parts of the buffer.
+ * Faces::		A face defines a graphics appearance: font, color, etc.
+ * Blinking::            How Emacs shows the matching open parenthesis.
+ * Inverse Video::	Specifying how the screen looks.
+ * Usual Display::	The usual conventions for displaying nonprinting chars.
+ * Display Tables::	How to specify other conventions.
+ * Beeping::             Audible signal to the user.
+ * Window Systems::      Which window system is being used.
+ @end menu
+ 
+ @node Refresh Screen
+ @section Refreshing the Screen
+ 
+ The function @code{redraw-frame} redisplays the entire contents of a
+ given frame.  @xref{Frames}.
+ 
+ @c Emacs 19 feature
+ @defun redraw-frame frame
+ This function clears and redisplays frame @var{frame}.
+ @end defun
+ 
+ Even more powerful is @code{redraw-display}:
+ 
+ @deffn Command redraw-display
+ This function clears and redisplays all visible frames.
+ @end deffn
+ 
+   Processing user input takes absolute priority over redisplay.  If you
+ call these functions when input is available, they do nothing
+ immediately, but a full redisplay does happen eventually---after all the
+ input has been processed.
+ 
+   Normally, suspending and resuming Emacs also refreshes the screen.
+ Some terminal emulators record separate contents for display-oriented
+ programs such as Emacs and for ordinary sequential display.  If you are
+ using such a terminal, you might want to inhibit the redisplay on
+ resumption.
+ 
+ @defvar no-redraw-on-reenter
+ @cindex suspend (cf. @code{no-redraw-on-reenter})
+ @cindex resume (cf. @code{no-redraw-on-reenter})
+ This variable controls whether Emacs redraws the entire screen after it
+ has been suspended and resumed.  Non-@code{nil} means yes, @code{nil}
+ means no.
+ @end defvar
+ 
+ @node Screen Size
+ @section Screen Size
+ @cindex size of screen
+ @cindex screen size
+ @cindex display lines
+ @cindex display columns
+ @cindex resize redisplay
+ 
+   The screen size functions access or specify the height or width of
+ the terminal.  When you are using multiple frames, they apply to the
+ selected frame (@pxref{Frames}).
+ 
+ @defun screen-height
+ This function returns the number of lines on the screen that are
+ available for display.
+ 
+ @example
+ @group
+ (screen-height)
+      @result{} 50
+ @end group
+ @end example
+ @end defun
+ 
+ @defun screen-width
+ This function returns the number of columns on the screen that are
+ available for display.
+ 
+ @example
+ @group
+ (screen-width)
+      @result{} 80
+ @end group
+ @end example
+ @end defun
+ 
+ @defun set-screen-height lines &optional not-actual-size
+ This function declares that the terminal can display @var{lines} lines.
+ The sizes of existing windows are altered proportionally to fit.
+ 
+ If @var{not-actual-size} is non-@code{nil}, then Emacs displays
+ @var{lines} lines of output, but does not change its value for the
+ actual height of the screen.  (Knowing the correct actual size may be
+ necessary for correct cursor positioning.)  Using a smaller height than
+ the terminal actually implements may be useful to reproduce behavior
+ observed on a smaller screen, or if the terminal malfunctions when using
+ its whole screen.
+ 
+ If @var{lines} is different from what it was previously, then the
+ entire screen is cleared and redisplayed using the new size.
+ 
+ This function returns @code{nil}.
+ @end defun
+ 
+ @defun set-screen-width columns &optional not-actual-size
+ This function declares that the terminal can display @var{columns}
+ columns.  The details are as in @code{set-screen-height}.
+ @end defun
+ 
+ @node Truncation
+ @section Truncation
+ @cindex line wrapping
+ @cindex continuation lines
+ @cindex @samp{$} in display
+ @cindex @samp{\} in display
+ 
+   When a line of text extends beyond the right edge of a window, the
+ line can either be continued on the next screen line, or truncated to
+ one screen line.  The additional screen lines used to display a long
+ text line are called @dfn{continuation} lines.  Normally, a @samp{$} in
+ the rightmost column of the window indicates truncation; a @samp{\} on
+ the rightmost column indicates a line that ``wraps'' or is continued
+ onto the next line.  (The display table can specify alternative
+ indicators; see @ref{Display Tables}.)
+ 
+   Note that continuation is different from filling; continuation happens
+ on the screen only, not in the buffer contents, and it breaks a line
+ precisely at the right margin, not at a word boundary.  @xref{Filling}.
+ 
+ @defopt truncate-lines
+ This buffer-local variable controls how Emacs displays lines that extend
+ beyond the right edge of the window.  The default is @code{nil}, which
+ specifies continuation.  If the value is non-@code{nil}, then these
+ lines are truncated.
+ 
+ If the variable @code{truncate-partial-width-windows} is non-@code{nil},
+ then truncation is always used for side-by-side windows (within one
+ frame) regardless of the value of @code{truncate-lines}.
+ @end defopt
+ 
+ @defopt default-truncate-lines
+ This variable is the default value for @code{truncate-lines}, for
+ buffers that do not have local values for it.
+ @end defopt
+ 
+ @defopt truncate-partial-width-windows
+ This variable controls display of lines that extend beyond the right
+ edge of the window, in side-by-side windows (@pxref{Splitting Windows}).
+ If it is non-@code{nil}, these lines are truncated; otherwise,
+ @code{truncate-lines} says what to do with them.
+ @end defopt
+ 
+   You can override the images that indicate continuation or truncation
+ with the display table; see @ref{Display Tables}.
+ 
+   If your buffer contains @strong{very} long lines, and you use
+ continuation to display them, just thinking about them can make Emacs
+ redisplay slow.  The column computation and indentation functions also
+ become slow.  Then you might find it advisable to set
+ @code{cache-long-line-scans} to @code{t}.
+ 
+ @defvar cache-long-line-scans
+ If this variable is non-@code{nil}, various indentation and motion
+ functions, and Emacs redisplay, cache the results of scanning the
+ buffer, and consult the cache to avoid rescanning regions of the buffer
+ unless they are modified.
+ 
+ Turning on the cache slows down processing of short lines somewhat.
+ 
+ This variable is automatically local in every buffer.
+ @end defvar
+ 
+ @node The Echo Area
+ @section The Echo Area
+ @cindex error display
+ @cindex echo area
+ 
+ The @dfn{echo area} is used for displaying messages made with the
+ @code{message} primitive, and for echoing keystrokes.  It is not the
+ same as the minibuffer, despite the fact that the minibuffer appears
+ (when active) in the same place on the screen as the echo area.  The
+ @cite{GNU Emacs Manual} specifies the rules for resolving conflicts
+ between the echo area and the minibuffer for use of that screen space
+ (@pxref{Minibuffer,, The Minibuffer, emacs, The GNU Emacs Manual}).
+ Error messages appear in the echo area; see @ref{Errors}.
+ 
+ You can write output in the echo area by using the Lisp printing
+ functions with @code{t} as the stream (@pxref{Output Functions}), or as
+ follows:
+ 
+ @defun message string &rest arguments
+ This function displays a one-line message in the echo area.  The
+ argument @var{string} is similar to a C language @code{printf} control
+ string.  See @code{format} in @ref{String Conversion}, for the details
+ on the conversion specifications.  @code{message} returns the
+ constructed string.
+ 
+ In batch mode, @code{message} prints the message text on the standard
+ error stream, followed by a newline.
+ 
+ @c Emacs 19 feature
+ If @var{string} is @code{nil}, @code{message} clears the echo area.  If
+ the minibuffer is active, this brings the minibuffer contents back onto
+ the screen immediately.
+ 
+ @example
+ @group
+ (message "Minibuffer depth is %d."
+          (minibuffer-depth))
+  @print{} Minibuffer depth is 0.
+ @result{} "Minibuffer depth is 0."
+ @end group
+ 
+ @group
+ ---------- Echo Area ----------
+ Minibuffer depth is 0.
+ ---------- Echo Area ----------
+ @end group
+ @end example
+ @end defun
+ 
+ Almost all the messages displayed in the echo area are also recorded
+ in the @samp{*Messages*} buffer.
+ 
+ @defopt message-log-max
+ This variable specifies how many lines to keep in the @samp{*Messages*}
+ buffer.  The value @code{t} means there is no limit on how many lines to
+ keep.  The value @code{nil} disables message logging entirely.  Here's
+ how to display a message and prevent it from being logged:
+ 
+ @example
+ (let (message-log-max)
+   (message @dots{}))
+ @end example
+ @end defopt
+ 
+ @defvar echo-keystrokes
+ This variable determines how much time should elapse before command
+ characters echo.  Its value must be an integer, which specifies the
+ number of seconds to wait before echoing.  If the user types a prefix
+ key (such as @kbd{C-x}) and then delays this many seconds before
+ continuing, the prefix key is echoed in the echo area.  Any subsequent
+ characters in the same command will be echoed as well.
+ 
+ If the value is zero, then command input is not echoed.
+ @end defvar
+ 
+ @defvar cursor-in-echo-area
+ This variable controls where the cursor appears when a message is
+ displayed in the echo area.  If it is non-@code{nil}, then the cursor
+ appears at the end of the message.  Otherwise, the cursor appears at
+ point---not in the echo area at all.
+ 
+ The value is normally @code{nil}; Lisp programs bind it to @code{t}
+ for brief periods of time.
+ @end defvar
+ 
+ @node Invisible Text
+ @section Invisible Text
+ 
+ @cindex invisible text
+ You can make characters @dfn{invisible}, so that they do not appear on
+ the screen, with the @code{invisible} property.  This can be either a
+ text property or a property of an overlay.
+ 
+ In the simplest case, any non-@code{nil} @code{invisible} property makes
+ a character invisible.  This is the default case---if you don't alter
+ the default value of @code{buffer-invisibility-spec}, this is how the
+ @code{invisibility} property works.  This feature is much like selective
+ display (@pxref{Selective Display}), but more general and cleaner.
+ 
+ More generally, you can use the variable @code{buffer-invisibility-spec}
+ to control which values of the @code{invisible} property make text
+ invisible.  This permits you to classify the text into different subsets
+ in advance, by giving them different @code{invisible} values, and
+ subsequently make various subsets visible or invisible by changing the
+ value of @code{buffer-invisibility-spec}.
+ 
+ Controlling visibility with @code{buffer-invisibility-spec} is
+ especially useful in a program to display the list of entries in a data
+ base.  It permits the implementation of convenient filtering commands to
+ view just a part of the entries in the data base.  Setting this variable
+ is very fast, much faster than scanning all the text in the buffer
+ looking for properties to change.
+ 
+ @defvar buffer-invisibility-spec
+ This variable specifies which kinds of @code{invisible} properties
+ actually make a character invisible.
+ 
+ @table @asis
+ @item @code{t}
+ A character is invisible if its @code{invisible} property is
+ non-@code{nil}.  This is the default.
+ 
+ @item a list
+ Each element of the list makes certain characters invisible.
+ Ultimately, a character is invisible if any of the elements of this list
+ applies to it.  The list can have two kinds of elements:
+ 
+ @table @code
+ @item @var{atom}
+ A character is invisible if its @code{invisible} propery value
+ is @var{atom} or if it is a list with @var{atom} as a member.
+ 
+ @item (@var{atom} . t)
+ A character is invisible if its @code{invisible} propery value
+ is @var{atom} or if it is a list with @var{atom} as a member.
+ Moreover, if this character is at the end of a line and is followed
+ by a visible newline, it displays an ellipsis.
+ @end table
+ @end table
+ @end defvar
+ 
+   Ordinarily, commands that operate on text or move point do not care
+ whether the text is invisible.  However, the user-level line motion
+ commands explicitly ignore invisible newlines.
+ 
+ @node Selective Display
+ @section Selective Display
+ @cindex selective display
+ 
+   @dfn{Selective display} is a pair of features that hide certain
+ lines on the screen.
+ 
+   The first variant, explicit selective display, is designed for use in
+ a Lisp program.  The program controls which lines are hidden by altering
+ the text.  Outline mode has traditionally used this variant.  It has
+ been partially replaced by the invisible text feature (@pxref{Invisible
+ Text}); there is a new version of Outline mode which uses that instead.
+ 
+   In the second variant, the choice of lines to hide is made
+ automatically based on indentation.  This variant is designed to be a
+ user-level feature.
+ 
+   The way you control explicit selective display is by replacing a
+ newline (control-j) with a carriage return (control-m).  The text that
+ was formerly a line following that newline is now invisible.  Strictly
+ speaking, it is temporarily no longer a line at all, since only newlines
+ can separate lines; it is now part of the previous line.
+ 
+   Selective display does not directly affect editing commands.  For
+ example, @kbd{C-f} (@code{forward-char}) moves point unhesitatingly into
+ invisible text.  However, the replacement of newline characters with
+ carriage return characters affects some editing commands.  For example,
+ @code{next-line} skips invisible lines, since it searches only for
+ newlines.  Modes that use selective display can also define commands
+ that take account of the newlines, or that make parts of the text
+ visible or invisible.
+ 
+   When you write a selectively displayed buffer into a file, all the
+ control-m's are output as newlines.  This means that when you next read
+ in the file, it looks OK, with nothing invisible.  The selective display
+ effect is seen only within Emacs.
+ 
+ @defvar selective-display
+ This buffer-local variable enables selective display.  This means that
+ lines, or portions of lines, may be made invisible.  
+ 
+ @itemize @bullet
+ @item
+ If the value of @code{selective-display} is @code{t}, then any portion
+ of a line that follows a control-m is not displayed.
+ 
+ @item
+ If the value of @code{selective-display} is a positive integer, then
+ lines that start with more than that many columns of indentation are not
+ displayed.
+ @end itemize
+ 
+ When some portion of a buffer is invisible, the vertical movement
+ commands operate as if that portion did not exist, allowing a single
+ @code{next-line} command to skip any number of invisible lines.
+ However, character movement commands (such as @code{forward-char}) do
+ not skip the invisible portion, and it is possible (if tricky) to insert
+ or delete text in an invisible portion.
+ 
+ In the examples below, we show the @emph{display appearance} of the
+ buffer @code{foo}, which changes with the value of
+ @code{selective-display}.  The @emph{contents} of the buffer do not
+ change.
+ 
+ @example
+ @group
+ (setq selective-display nil)
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ 1 on this column
+  2on this column
+   3n this column
+   3n this column
+  2on this column
+ 1 on this column
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (setq selective-display 2)
+      @result{} 2
+ 
+ ---------- Buffer: foo ----------
+ 1 on this column
+  2on this column
+  2on this column
+ 1 on this column
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end defvar
+ 
+ @defvar selective-display-ellipses
+ If this buffer-local variable is non-@code{nil}, then Emacs displays
+ @samp{@dots{}} at the end of a line that is followed by invisible text.
+ This example is a continuation of the previous one.
+ 
+ @example
+ @group
+ (setq selective-display-ellipses t)
+      @result{} t
+ 
+ ---------- Buffer: foo ----------
+ 1 on this column
+  2on this column ...
+  2on this column
+ 1 on this column
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ 
+ You can use a display table to substitute other text for the ellipsis
+ (@samp{@dots{}}).  @xref{Display Tables}.
+ @end defvar
+ 
+ @node Overlay Arrow
+ @section The Overlay Arrow
+ @cindex overlay arrow
+ 
+   The @dfn{overlay arrow} is useful for directing the user's attention
+ to a particular line in a buffer.  For example, in the modes used for
+ interface to debuggers, the overlay arrow indicates the line of code
+ about to be executed.
+ 
+ @defvar overlay-arrow-string
+ This variable holds the string to display to call attention to a
+ particular line, or @code{nil} if the arrow feature is not in use.
+ @end defvar
+ 
+ @defvar overlay-arrow-position
+ This variable holds a marker that indicates where to display the overlay
+ arrow.  It should point at the beginning of a line.  The arrow text
+ appears at the beginning of that line, overlaying any text that would
+ otherwise appear.  Since the arrow is usually short, and the line
+ usually begins with indentation, normally nothing significant is
+ overwritten.
+ 
+ The overlay string is displayed only in the buffer that this marker
+ points into.  Thus, only one buffer can have an overlay arrow at any
+ given time.
+ @c !!! overlay-arrow-position: but the overlay string may remain in the display
+ @c of some other buffer until an update is required.  This should be fixed
+ @c now.  Is it?
+ @end defvar
+ 
+   You can do the same job by creating an overlay with a
+ @code{before-string} property.  @xref{Overlay Properties}.
+ 
+ @node Temporary Displays
+ @section Temporary Displays
+ 
+   Temporary displays are used by commands to put output into a buffer
+ and then present it to the user for perusal rather than for editing.
+ Many of the help commands use this feature.
+ 
+ @defspec with-output-to-temp-buffer buffer-name forms@dots{}
+ This function executes @var{forms} while arranging to insert any
+ output they print into the buffer named @var{buffer-name}.  The buffer
+ is then shown in some window for viewing, displayed but not selected.
+ 
+ The string @var{buffer-name} specifies the temporary buffer, which
+ need not already exist.  The argument must be a string, not a buffer.
+ The buffer is erased initially (with no questions asked), and it is
+ marked as unmodified after @code{with-output-to-temp-buffer} exits.
+ 
+ @code{with-output-to-temp-buffer} binds @code{standard-output} to the
+ temporary buffer, then it evaluates the forms in @var{forms}.  Output
+ using the Lisp output functions within @var{forms} goes by default to
+ that buffer (but screen display and messages in the echo area, although
+ they are ``output'' in the general sense of the word, are not affected).
+ @xref{Output Functions}.
+ 
+ The value of the last form in @var{forms} is returned.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+  This is the contents of foo.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (with-output-to-temp-buffer "foo"
+     (print 20)
+     (print standard-output))
+ @result{} #<buffer foo>
+ 
+ ---------- Buffer: foo ----------
+ 20
+ 
+ #<buffer foo>
+ 
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end defspec
+ 
+ @defvar temp-buffer-show-function
+ If this variable is non-@code{nil}, @code{with-output-to-temp-buffer}
+ calls it as a function to do the job of displaying a help buffer.  The
+ function gets one argument, which is the buffer it should display.
+ 
+ In Emacs versions 18 and earlier, this variable was called
+ @code{temp-buffer-show-hook}.
+ @end defvar
+ 
+ @defun momentary-string-display string position &optional char message
+ This function momentarily displays @var{string} in the current buffer at
+ @var{position}.  It has no effect on the undo list or on the buffer's
+ modification status.
+ 
+ The momentary display remains until the next input event.  If the next
+ input event is @var{char}, @code{momentary-string-display} ignores it
+ and returns.  Otherwise, that event remains buffered for subsequent use
+ as input.  Thus, typing @var{char} will simply remove the string from
+ the display, while typing (say) @kbd{C-f} will remove the string from
+ the display and later (presumably) move point forward.  The argument
+ @var{char} is a space by default.
+ 
+ The return value of @code{momentary-string-display} is not meaningful.
+ 
+ If the string @var{string} does not contain control characters, you can
+ do the same job in a more general way by creating an overlay with a
+ @code{before-string} property.  @xref{Overlay Properties}.
+ 
+ If @var{message} is non-@code{nil}, it is displayed in the echo area
+ while @var{string} is displayed in the buffer.  If it is @code{nil}, a
+ default message says to type @var{char} to continue.
+ 
+ In this example, point is initially located at the beginning of the
+ second line:
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This is the contents of foo.
+ @point{}Second line.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (momentary-string-display
+   "**** Important Message! ****"
+   (point) ?\r
+   "Type RET when done reading")
+ @result{} t
+ @end group
+ 
+ @group
+ ---------- Buffer: foo ----------
+ This is the contents of foo.
+ **** Important Message! ****Second line.
+ ---------- Buffer: foo ----------
+ 
+ ---------- Echo Area ----------
+ Type RET when done reading
+ ---------- Echo Area ----------
+ @end group
+ @end example
+ @end defun
+ 
+ @node Overlays
+ @section Overlays
+ @cindex overlays
+ 
+ You can use @dfn{overlays} to alter the appearance of a buffer's text on
+ the screen, for the sake of presentation features.  An overlay is an
+ object that belongs to a particular buffer, and has a specified
+ beginning and end.  It also has properties that you can examine and set;
+ these affect the display of the text within the overlay.
+ 
+ @menu
+ * Overlay Properties::	How to read and set properties.
+ 			What properties do to the screen display.
+ * Managing Overlays::   Creating, moving, finding overlays.
+ @end menu
+ 
+ @node Overlay Properties
+ @subsection Overlay Properties
+ 
+ Overlay properties are like text properties in some respects, but the
+ differences are more important than the similarities.  Text properties
+ are considered a part of the text; overlays are specifically considered
+ not to be part of the text.  Thus, copying text between various buffers
+ and strings preserves text properties, but does not try to preserve
+ overlays.  Changing a buffer's text properties marks the buffer as
+ modified, while moving an overlay or changing its properties does not.
+ Unlike text propery changes, overlay changes are not recorded in the
+ buffer's undo list.
+ 
+ @table @code
+ @item priority
+ @kindex priority @r{(overlay property)}
+ This property's value (which should be a nonnegative number) determines
+ the priority of the overlay.  The priority matters when two or more
+ overlays cover the same character and both specify a face for display;
+ the one whose @code{priority} value is larger takes priority over the
+ other, and its face attributes override the face attributes of the lower
+ priority overlay.
+ 
+ Currently, all overlays take priority over text properties.  Please
+ avoid using negative priority values, as we have not yet decided just
+ what they should mean.
+ 
+ @item window
+ @kindex window @r{(overlay property)}
+ If the @code{window} property is non-@code{nil}, then the overlay
+ applies only on that window.
+ 
+ @item category
+ @kindex category @r{(overlay property)}
+ If an overlay has a @code{category} property, we call it the
+ @dfn{category} of the overlay.  It should be a symbol.  The properties
+ of the symbol serve as defaults for the properties of the overlay.
+ 
+ @item face
+ @kindex face @r{(overlay property)}
+ This property controls the font and color of text.  Its value is a face
+ name or a list of face names.  @xref{Faces}, for more information.  This
+ feature may be temporary; in the future, we may replace it with other
+ ways of specifying how to display text.
+ 
+ @item mouse-face
+ @kindex mouse-face @r{(overlay property)}
+ This property is used instead of @code{face} when the mouse is within
+ the range of the overlay.  This feature may be temporary, like
+ @code{face}.
+ 
+ @item modification-hooks
+ @kindex modification-hooks @r{(overlay property)}
+ This property's value is a list of functions to be called if any
+ character within the overlay is changed or if text is inserted strictly
+ within the overlay.
+ 
+ The hook functions are called both before and after each change.
+ If the functions save the information they receive, and compare notes
+ between calls, they can determine exactly what change has been made
+ in the buffer text.
+ 
+ When called before a change, each function receives four arguments: the
+ overlay, @code{nil}, and the beginning and end of the text range to be
+ modified.
+ 
+ When called after a change, each function receives five arguments: the
+ overlay, @code{t}, the beginning and end of the text range just
+ modified, and the length of the pre-change text replaced by that range.
+ (For an insertion, the pre-change length is zero; for a deletion, that
+ length is the number of characters deleted, and the post-change
+ beginning and end are equal.)
+ 
+ @item insert-in-front-hooks
+ @kindex insert-in-front-hooks @r{(overlay property)}
+ This property's value is a list of functions to be called before and
+ after inserting text right at the beginning of the overlay.  The calling
+ conventions are the same as for the @code{modification-hooks} functions.
+ 
+ @item insert-behind-hooks
+ @kindex insert-behind-hooks @r{(overlay property)}
+ This property's value is a list of functions to be called before and
+ after inserting text right at the end of the overlay.  The calling
+ conventions are the same as for the @code{modification-hooks} functions.
+ 
+ @item invisible
+ @kindex invisible @r{(overlay property)}
+ The @code{invisible} property can make the text in the overlay
+ invisible, which means that it does not appear on the screen.
+ @xref{Invisible Text}, for details.
+ 
+ @item intangible
+ @kindex intangible @r{(overlay property)}
+ The @code{intangible} property on an overlay works just like the
+ @code{intangible} text property.  @xref{Special Properties}, for details.
+ 
+ @item before-string
+ @kindex before-string @r{(overlay property)}
+ This property's value is a string to add to the display at the beginning
+ of the overlay.  The string does not appear in the buffer in any
+ sense---only on the screen.  The string should contain only characters
+ that display as a single column---control characters, including tabs or
+ newlines, will give strange results.
+ 
+ @item after-string
+ @kindex after-string @r{(overlay property)}
+ This property's value is a string to add to the display at the end of
+ the overlay.  The string does not appear in the buffer in any
+ sense---only on the screen.  The string should contain only characters
+ that display as a single column---control characters, including tabs or
+ newlines, will give strange results.
+ 
+ @item evaporate
+ @kindex evaporate @r{(overlay property)}
+ If this property is non-@code{nil}, the overlay is deleted automatically
+ if it ever becomes empty (i.e., if it spans no characters).
+ @end table
+ 
+   These are the functions for reading and writing the properties of an
+ overlay.
+ 
+ @defun overlay-get overlay prop
+ This function returns the value of property @var{prop} recorded in
+ @var{overlay}, if any.  If @var{overlay} does not record any value for
+ that property, but it does have a @code{category} property which is a
+ symbol, that symbol's @var{prop} property is used.  Otherwise, the value
+ is @code{nil}.
+ @end defun
+ 
+ @defun overlay-put overlay prop value
+ This function sets the value of property @var{prop} recorded in
+ @var{overlay} to @var{value}.  It returns @var{value}.
+ @end defun
+ 
+   See also the function @code{get-char-property} which checks both
+ overlay properties and text properties for a given character.
+ @xref{Examining Properties}.
+ 
+ @node Managing Overlays
+ @subsection Managing Overlays
+ 
+   This section describes the functions to create, delete and move
+ overlays, and to examine their contents.
+ 
+ @defun make-overlay start end &optional buffer
+ This function creates and returns an overlay that belongs to
+ @var{buffer} and ranges from @var{start} to @var{end}.  Both @var{start}
+ and @var{end} must specify buffer positions; they may be integers or
+ markers.  If @var{buffer} is omitted, the overlay is created in the
+ current buffer.
+ @end defun
+ 
+ @defun overlay-start overlay
+ This function returns the position at which @var{overlay} starts.
+ @end defun
+ 
+ @defun overlay-end overlay
+ This function returns the position at which @var{overlay} ends.
+ @end defun
+ 
+ @defun overlay-buffer overlay
+ This function returns the buffer that @var{overlay} belongs to.
+ @end defun
+ 
+ @defun delete-overlay overlay
+ This function deletes @var{overlay}.  The overlay continues to exist as
+ a Lisp object, but ceases to be part of the buffer it belonged to, and
+ ceases to have any effect on display.
+ @end defun
+ 
+ @defun move-overlay overlay start end &optional buffer
+ This function moves @var{overlay} to @var{buffer}, and places its bounds
+ at @var{start} and @var{end}.  Both arguments @var{start} and @var{end}
+ must specify buffer positions; they may be integers or markers.  If
+ @var{buffer} is omitted, the overlay stays in the same buffer.
+ 
+ The return value is @var{overlay}.
+ 
+ This is the only valid way to change the endpoints of an overlay.  Do
+ not try modifying the markers in the overlay by hand, as that fails to
+ update other vital data structures and can cause some overlays to be
+ ``lost''.
+ @end defun
+ 
+ @defun overlays-at pos
+ This function returns a list of all the overlays that contain position
+ @var{pos} in the current buffer.  The list is in no particular order.
+ An overlay contains position @var{pos} if it begins at or before
+ @var{pos}, and ends after @var{pos}.
+ @end defun
+ 
+ @defun next-overlay-change pos
+ This function returns the buffer position of the next beginning or end
+ of an overlay, after @var{pos}.
+ @end defun
+ 
+ @defun previous-overlay-change pos
+ This function returns the buffer position of the previous beginning or
+ end of an overlay, before @var{pos}.
+ @end defun
+ 
+ @node Faces
+ @section Faces
+ @cindex face
+ 
+ A @dfn{face} is a named collection of graphical attributes: font,
+ foreground color, background color and optional underlining.  Faces
+ control the display of text on the screen.
+ 
+ @cindex face id
+ Each face has its own @dfn{face id number} which distinguishes faces at
+ low levels within Emacs.  However, for most purposes, you can refer to
+ faces in Lisp programs by their names.
+ 
+ @defun facep object
+ This function returns @code{t} if @var{object} is a face name symbol (or
+ if it is a vector of the kind used internally to record face data).  It
+ returns @code{nil} otherwise.
+ @end defun
+ 
+ Each face name is meaningful for all frames, and by default it has the
+ same meaning in all frames.  But you can arrange to give a particular
+ face name a special meaning in one frame if you wish.
+ 
+ @menu
+ * Standard Faces::      The faces Emacs normally comes with.
+ * Merging Faces::	How Emacs decides which face to use for a character.
+ * Face Functions::	How to define and examine faces.
+ @end menu
+ 
+ @node Standard Faces
+ @subsection Standard Faces
+ 
+   This table lists all the standard faces and their uses.
+ 
+ @table @code
+ @item default
+ @kindex default @r{(face name)}
+ This face is used for ordinary text.
+ 
+ @item modeline
+ @kindex modeline @r{(face name)}
+ This face is used for mode lines and menu bars.
+ 
+ @item region
+ @kindex region @r{(face name)}
+ This face is used for highlighting the region in Transient Mark mode.
+ 
+ @item secondary-selection
+ @kindex secondary-selection @r{(face name)}
+ This face is used to show any secondary selection you have made.
+ 
+ @item highlight
+ @kindex highlight @r{(face name)}
+ This face is meant to be used for highlighting for various purposes.
+ 
+ @item underline
+ @kindex underline @r{(face name)}
+ This face underlines text.
+ 
+ @item bold
+ @kindex bold @r{(face name)}
+ This face uses a bold font, if possible.  It uses the bold variant of
+ the frame's font, if it has one.  It's up to you to choose a default
+ font that has a bold variant, if you want to use one.
+ 
+ @item italic
+ @kindex italic @r{(face name)}
+ This face uses the italic variant of the frame's font, if it has one.
+ 
+ @item bold-italic
+ @kindex bold-italic @r{(face name)}
+ This face uses the bold italic variant of the frame's font, if it has
+ one.
+ @end table
+ 
+ @node Merging Faces
+ @subsection Merging Faces for Display
+ 
+   Here are all the ways to specify which face to use for display of text:
+ 
+ @itemize @bullet
+ @item
+ With defaults.  Each frame has a @dfn{default face}, whose id number is
+ zero, which is used for all text that doesn't somehow specify another
+ face.
+ 
+ @item
+ With text properties.  A character may have a @code{face} property; if so,
+ it is displayed with that face.  @xref{Special Properties}.
+ 
+ If the character has a @code{mouse-face} property, that is used instead
+ of the @code{face} property when the mouse is ``near enough'' to the
+ character.
+ 
+ @item
+ With overlays.  An overlay may have @code{face} and @code{mouse-face}
+ properties too; they apply to all the text covered by the overlay.
+ 
+ @item
+ With a region that is active.  In Transient Mark mode, the region is
+ highlighted with a particular face (see @code{region-face}, below).
+ 
+ @item
+ With special glyphs.  Each glyph can specify a particular face id
+ number.  @xref{Glyphs}.
+ @end itemize
+ 
+   If these various sources together specify more than one face for a
+ particular character, Emacs merges the attributes of the various faces
+ specified.  The attributes of the faces of special glyphs come first;
+ then comes the face for region highlighting, if appropriate;
+ then come attributes of faces from overlays, followed by those from text
+ properties, and last the default face.
+ 
+   When multiple overlays cover one character, an overlay with higher
+ priority overrides those with lower priority.  @xref{Overlays}.
+ 
+   If an attribute such as the font or a color is not specified in any of
+ the above ways, the frame's own font or color is used.
+ 
+ @node Face Functions
+ @subsection Functions for Working with Faces
+ 
+   The attributes a face can specify include the font, the foreground
+ color, the background color, and underlining.  The face can also leave
+ these unspecified by giving the value @code{nil} for them.
+ 
+   Here are the primitives for creating and changing faces.
+ 
+ @defun make-face name
+ This function defines a new face named @var{name}, initially with all
+ attributes @code{nil}.  It does nothing if there is already a face named
+ @var{name}.
+ @end defun
+ 
+ @defun face-list
+ This function returns a list of all defined face names.
+ @end defun
+ 
+ @defun copy-face old-face new-name &optional frame new-frame
+ This function defines the face @var{new-name} as a copy of the existing
+ face named @var{old-face}.  It creates the face @var{new-name} if that
+ doesn't already exist.
+ 
+ If the optional argument @var{frame} is given, this function applies
+ only to that frame.  Otherwise it applies to each frame individually,
+ copying attributes from @var{old-face} in each frame to @var{new-face}
+ in the same frame.
+ 
+ If the optional argument @var{new-frame} is given, then @code{copy-face}
+ copies the attributes of @var{old-face} in @var{frame} to @var{new-name}
+ in @var{new-frame}.
+ @end defun
+ 
+   You can modify the attributes of an existing face with the following
+ functions.  If you specify @var{frame}, they affect just that frame;
+ otherwise, they affect all frames as well as the defaults that apply to
+ new frames.
+ 
+ @defun set-face-foreground face color &optional frame
+ @defunx set-face-background face color &optional frame
+ These functions set the foreground (or background, respectively) color
+ of face @var{face} to @var{color}.  The argument @var{color} should be a
+ string, the name of a color.
+ 
+ Certain shades of gray are implemented by stipple patterns on
+ black-and-white screens.
+ @end defun
+ 
+ @defun set-face-stipple face pattern &optional frame
+ This function sets the background stipple pattern of face @var{face} to
+ @var{pattern}.  The argument @var{pattern} should be the name of a
+ stipple pattern defined by the X server, or @code{nil} meaning don't use
+ stipple.
+ 
+ Normally there is no need to pay attention to stipple patterns, because
+ they are used automatically to handle certain shades of gray.
+ @end defun
+ 
+ @defun set-face-font face font &optional frame
+ This function sets the font of face @var{face}.  The argument @var{font}
+ should be a string.
+ @end defun
+ 
+ @defun set-face-underline-p face underline-p &optional frame
+ This function sets the underline attribute of face @var{face}.
+ Non-@code{nil} means do underline; @code{nil} means don't.
+ @end defun
+ 
+ @defun invert-face face &optional frame
+ Swap the foreground and background colors of face @var{face}.  If the
+ face doesn't specify both foreground and background, then its foreground
+ and background are set to the default background and foreground,
+ respectively.
+ @end defun
+ 
+   These functions examine the attributes of a face.  If you don't
+ specify @var{frame}, they refer to the default data for new frames.
+ 
+ @defun face-foreground face &optional frame
+ @defunx face-background face &optional frame
+ These functions return the foreground color (or background color,
+ respectively) of face @var{face}, as a string.
+ @end defun
+ 
+ @defun face-stipple face &optional frame
+ This function returns the name of the background stipple pattern of face
+ @var{face}, or @code{nil} if it doesn't have one.
+ @end defun
+ 
+ @defun face-font face &optional frame
+ This function returns the name of the font of face @var{face}.
+ @end defun
+ 
+ @defun face-underline-p face &optional frame
+ This function returns the underline attribute of face @var{face}.
+ @end defun
+ 
+ @defun face-id face
+ This function returns the face id number of face @var{face}.
+ @end defun
+ 
+ @defun face-equal face1 face2 &optional frame
+ This returns @code{t} if the faces @var{face1} and @var{face2} have the
+ same attributes for display.
+ @end defun
+ 
+ @defun face-differs-from-default-p face &optional frame
+ This returns @code{t} if the face @var{face} displays differently from
+ the default face.  A face is considered to be ``the same'' as the normal
+ face if each attribute is either the same as that of the default face or
+ @code{nil} (meaning to inherit from the default).
+ @end defun
+ 
+ @defvar region-face
+ This variable's value specifies the face id to use to display characters
+ in the region when it is active (in Transient Mark mode only).  The face
+ thus specified takes precedence over all faces that come from text
+ properties and overlays, for characters in the region.  @xref{The Mark},
+ for more information about Transient Mark mode.
+ 
+ Normally, the value is the id number of the face named @code{region}.
+ @end defvar
+ 
+ @node Blinking
+ @section Blinking Parentheses
+ @cindex parenthesis matching
+ @cindex blinking
+ @cindex balancing parentheses
+ @cindex close parenthesis
+ 
+   This section describes the mechanism by which Emacs shows a matching
+ open parenthesis when the user inserts a close parenthesis.
+ 
+ @vindex blink-paren-hook
+ @defvar blink-paren-function
+ The value of this variable should be a function (of no arguments) to
+ be called whenever a character with close parenthesis syntax is inserted.
+ The value of @code{blink-paren-function} may be @code{nil}, in which
+ case nothing is done.
+ 
+ @quotation
+ @strong{Please note:} This variable was named @code{blink-paren-hook} in
+ older Emacs versions, but since it is not called with the standard
+ convention for hooks, it was renamed to @code{blink-paren-function} in
+ version 19.
+ @end quotation
+ @end defvar
+ 
+ @defvar blink-matching-paren
+ If this variable is @code{nil}, then @code{blink-matching-open} does
+ nothing.
+ @end defvar
+ 
+ @defvar blink-matching-paren-distance
+ This variable specifies the maximum distance to scan for a matching
+ parenthesis before giving up.
+ @end defvar
+ 
+ @defvar blink-matching-paren-delay
+ This variable specifies the number of seconds for the cursor to remain
+ at the matching parenthesis.  A fraction of a second often gives
+ good results, but the default is 1, which works on all systems.
+ @end defvar
+ 
+ @defun blink-matching-open
+ This function is the default value of @code{blink-paren-function}.  It
+ assumes that point follows a character with close parenthesis syntax and
+ moves the cursor momentarily to the matching opening character.  If that
+ character is not already on the screen, it displays the character's
+ context in the echo area.  To avoid long delays, this function does not
+ search farther than @code{blink-matching-paren-distance} characters.
+ 
+ Here is an example of calling this function explicitly.
+ 
+ @smallexample
+ @group
+ (defun interactive-blink-matching-open ()
+ @c Do not break this line! -- rms.
+ @c The first line of a doc string
+ @c must stand alone.
+   "Indicate momentarily the start of sexp before point."
+   (interactive)
+ @end group
+ @group
+   (let ((blink-matching-paren-distance
+          (buffer-size))
+         (blink-matching-paren t))
+     (blink-matching-open)))
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Inverse Video
+ @section Inverse Video
+ @cindex Inverse Video
+ 
+ @defopt inverse-video
+ @cindex highlighting
+ This variable controls whether Emacs uses inverse video for all text
+ on the screen.  Non-@code{nil} means yes, @code{nil} means no.  The
+ default is @code{nil}.
+ @end defopt
+ 
+ @defopt mode-line-inverse-video
+ This variable controls the use of inverse video for mode lines.  If it
+ is non-@code{nil}, then mode lines are displayed in inverse video.
+ Otherwise, mode lines are displayed normally, just like text.  The
+ default is @code{t}.
+ 
+ For X window frames, this displays mode lines using the face named
+ @code{modeline}, which is normally the inverse of the default face
+ unless you change it.
+ @end defopt
+ 
+ @node Usual Display
+ @section Usual Display Conventions
+ 
+   The usual display conventions define how to display each character
+ code.  You can override these conventions by setting up a display table
+ (@pxref{Display Tables}).  Here are the usual display conventions:
+ 
+ @itemize @bullet
+ @item
+ Character codes 32 through 126 map to glyph codes 32 through 126.
+ Normally this means they display as themselves.
+ 
+ @item
+ Character code 9 is a horizontal tab.  It displays as whitespace
+ up to a position determined by @code{tab-width}.
+ 
+ @item
+ Character code 10 is a newline.
+ 
+ @item
+ All other codes in the range 0 through 31, and code 127, display in one
+ of two ways according to the value of @code{ctl-arrow}.  If it is
+ non-@code{nil}, these codes map to sequences of two glyphs, where the
+ first glyph is the @sc{ASCII} code for @samp{^}.  (A display table can
+ specify a glyph to use instead of @samp{^}.)  Otherwise, these codes map
+ just like the codes in the range 128 to 255.
+ 
+ @item
+ Character codes 128 through 255 map to sequences of four glyphs, where
+ the first glyph is the @sc{ASCII} code for @samp{\}, and the others are
+ digit characters representing the code in octal.  (A display table can
+ specify a glyph to use instead of @samp{\}.)
+ @end itemize
+ 
+   The usual display conventions apply even when there is a display
+ table, for any character whose entry in the active display table is
+ @code{nil}.  Thus, when you set up a display table, you need only
+ specify the characters for which you want unusual behavior.
+ 
+   These variables affect the way certain characters are displayed on the
+ screen.  Since they change the number of columns the characters occupy,
+ they also affect the indentation functions.
+ 
+ @defopt ctl-arrow
+ @cindex control characters in display
+ This buffer-local variable controls how control characters are
+ displayed.  If it is non-@code{nil}, they are displayed as a caret
+ followed by the character: @samp{^A}.  If it is @code{nil}, they are
+ displayed as a backslash followed by three octal digits: @samp{\001}.
+ @end defopt
+ 
+ @c Following may have overfull hbox.
+ @defvar default-ctl-arrow
+ The value of this variable is the default value for @code{ctl-arrow} in
+ buffers that do not override it.  @xref{Default Value}.
+ @end defvar
+ 
+ @defopt tab-width
+ The value of this variable is the spacing between tab stops used for
+ displaying tab characters in Emacs buffers.  The default is 8.  Note
+ that this feature is completely independent from the user-settable tab
+ stops used by the command @code{tab-to-tab-stop}.  @xref{Indent Tabs}.
+ @end defopt
+ 
+ @node Display Tables
+ @section Display Tables
+ 
+ @cindex display table
+ You can use the @dfn{display table} feature to control how all 256
+ possible character codes display on the screen.  This is useful for
+ displaying European languages that have letters not in the @sc{ASCII}
+ character set.
+ 
+ The display table maps each character code into a sequence of
+ @dfn{glyphs}, each glyph being an image that takes up one character
+ position on the screen.  You can also define how to display each glyph
+ on your terminal, using the @dfn{glyph table}.
+ 
+ @menu
+ * Display Table Format::	What a display table consists of.
+ * Active Display Table::	How Emacs selects a display table to use.
+ * Glyphs::			How to define a glyph, and what glyphs mean.
+ * ISO Latin 1::			How to use display tables
+ 				  to support the ISO Latin 1 character set.
+ @end menu
+ 
+ @node Display Table Format
+ @subsection Display Table Format
+ 
+   A display table is actually an array of 262 elements.
+ 
+ @defun make-display-table
+ This creates and returns a display table.  The table initially has
+ @code{nil} in all elements.
+ @end defun
+ 
+   The first 256 elements correspond to character codes; the @var{n}th
+ element says how to display the character code @var{n}.  The value
+ should be @code{nil} or a vector of glyph values (@pxref{Glyphs}).  If
+ an element is @code{nil}, it says to display that character according to
+ the usual display conventions (@pxref{Usual Display}).
+ 
+   If you use the display table to change the display of newline
+ characters, the whole buffer will be displayed as one long ``line.''
+ 
+   The remaining six elements of a display table serve special purposes,
+ and @code{nil} means use the default stated below.
+ 
+ @table @asis
+ @item 256
+ The glyph for the end of a truncated screen line (the default for this
+ is @samp{$}).  @xref{Glyphs}.
+ @item 257
+ The glyph for the end of a continued line (the default is @samp{\}).
+ @item 258
+ The glyph for indicating a character displayed as an octal character
+ code (the default is @samp{\}).
+ @item 259
+ The glyph for indicating a control character (the default is @samp{^}).
+ @item 260
+ A vector of glyphs for indicating the presence of invisible lines (the
+ default is @samp{...}).  @xref{Selective Display}.
+ @item 261
+ The glyph used to draw the border between side-by-side windows (the
+ default is @samp{|}).  @xref{Splitting Windows}.
+ @end table
+ 
+   For example, here is how to construct a display table that mimics the
+ effect of setting @code{ctl-arrow} to a non-@code{nil} value:
+ 
+ @example
+ (setq disptab (make-display-table))
+ (let ((i 0))
+   (while (< i 32)
+     (or (= i ?\t) (= i ?\n)
+         (aset disptab i (vector ?^ (+ i 64))))
+     (setq i (1+ i)))
+   (aset disptab 127 (vector ?^ ??)))
+ @end example
+ 
+ @node Active Display Table
+ @subsection Active Display Table
+ @cindex active display table
+ 
+   Each window can specify a display table, and so can each buffer.  When
+ a buffer @var{b} is displayed in window @var{w}, display uses the
+ display table for window @var{w} if it has one; otherwise, the display
+ table for buffer @var{b} if it has one; otherwise, the standard display
+ table if any.  The display table chosen is called the @dfn{active}
+ display table.
+ 
+ @defun window-display-table window
+ This function returns @var{window}'s display table, or @code{nil}
+ if @var{window} does not have an assigned display table.
+ @end defun
+ 
+ @defun set-window-display-table window table
+ This function sets the display table of @var{window} to @var{table}.
+ The argument @var{table} should be either a display table or
+ @code{nil}.
+ @end defun
+ 
+ @defvar buffer-display-table
+ This variable is automatically local in all buffers; its value in a
+ particular buffer is the display table for that buffer, or @code{nil} if
+ the buffer does not have an assigned display table.
+ @end defvar
+ 
+ @defvar standard-display-table
+ This variable's value is the default display table, used whenever a
+ window has no display table and neither does the buffer displayed in
+ that window.  This variable is @code{nil} by default.
+ @end defvar
+ 
+   If there is no display table to use for a particular window---that is,
+ if the window has none, its buffer has none, and
+ @code{standard-display-table} has none---then Emacs uses the usual
+ display conventions for all character codes in that window.  @xref{Usual
+ Display}.
+ 
+ @node Glyphs
+ @subsection Glyphs
+ 
+ @cindex glyph
+   A @dfn{glyph} is a generalization of a character; it stands for an
+ image that takes up a single character position on the screen.  Glyphs
+ are represented in Lisp as integers, just as characters are.
+ 
+ @cindex glyph table
+   The meaning of each integer, as a glyph, is defined by the glyph
+ table, which is the value of the variable @code{glyph-table}.
+ 
+ @defvar glyph-table
+ The value of this variable is the current glyph table.  It should be a
+ vector; the @var{g}th element defines glyph code @var{g}.  If the value
+ is @code{nil} instead of a vector, then all glyphs are simple (see
+ below).
+ @end defvar
+ 
+   Here are the possible types of elements in the glyph table:
+ 
+ @table @var
+ @item string
+ Send the characters in @var{string} to the terminal to output
+ this glyph.  This alternative is available on character terminals,
+ but not under X.
+ 
+ @item integer
+ Define this glyph code as an alias for code @var{integer}.  You can use
+ an alias to specify a face code for the glyph; see below.
+ 
+ @item @code{nil}
+ This glyph is simple.  On an ordinary terminal, the glyph code mod 256
+ is the character to output.  With X, the glyph code mod 256 is the
+ character to output, and the glyph code divided by 256 specifies the
+ @dfn{face id number} to use while outputting it.  @xref{Faces}.
+ @end table
+ 
+   If a glyph code is greater than or equal to the length of the glyph
+ table, that code is automatically simple.
+ 
+ @node ISO Latin 1
+ @subsection ISO Latin 1
+ 
+ If you have a terminal that can handle the entire ISO Latin 1 character
+ set, you can arrange to use that character set as follows:
+ 
+ @example
+ (require 'disp-table)
+ ;; @r{Set char codes 160--255 to display as themselves.}
+ ;; @r{(Codes 128--159 are the additional control characters.)}
+ (standard-display-8bit 160 255)
+ @end example
+ 
+ If you are editing buffers written in the ISO Latin 1 character set and
+ your terminal doesn't handle anything but @sc{ASCII}, you can load the
+ file @file{iso-ascii} to set up a display table that displays the other
+ ISO characters as explanatory sequences of @sc{ASCII} characters.  For
+ example, the character ``o with umlaut'' displays as @samp{@{"o@}}.
+ 
+ Some European countries have terminals that don't support ISO Latin 1
+ but do support the special characters for that country's language.  You
+ can define a display table to work one language using such terminals.
+ For an example, see @file{lisp/iso-swed.el}, which handles certain
+ Swedish terminals.
+ 
+ You can load the appropriate display table for your terminal
+ automatically by writing a terminal-specific Lisp file for the terminal
+ type.
+ 
+ @node Beeping
+ @section Beeping
+ @cindex beeping
+ @cindex bell
+ 
+   You can make Emacs ring a bell (or blink the screen) to attract the
+ user's attention.  Be conservative about how often you do this; frequent
+ bells can become irritating.  Also be careful not to use beeping alone
+ when signaling an error is appropriate.  (@xref{Errors}.)
+ 
+ @defun ding &optional dont-terminate
+ @cindex keyboard macro termination
+ This function beeps, or flashes the screen (see @code{visible-bell} below).
+ It also terminates any keyboard macro currently executing unless
+ @var{dont-terminate} is non-@code{nil}.
+ @end defun
+ 
+ @defun beep &optional dont-terminate
+ This is a synonym for @code{ding}.
+ @end defun
+ 
+ @defvar visible-bell
+ This variable determines whether Emacs should flash the screen to
+ represent a bell.  Non-@code{nil} means yes, @code{nil} means no.  This
+ is effective under X windows, and on a character-only terminal provided
+ the terminal's Termcap entry defines the visible bell capability
+ (@samp{vb}).
+ @end defvar
+ 
+ @node Window Systems
+ @section Window Systems
+ 
+   Emacs works with several window systems, most notably the X Window
+ System.  Both Emacs and X use the term ``window'', but use it
+ differently.  An Emacs frame is a single window as far as X is
+ concerned; the individual Emacs windows are not known to X at all.
+ 
+ @defvar window-system
+ @cindex X Window System
+ This variable tells Lisp programs what window system Emacs is running
+ under.  Its value should be a symbol such as @code{x} (if Emacs is
+ running under X) or @code{nil} (if Emacs is running on an ordinary
+ terminal).
+ @end defvar
+ 
+ @defvar window-setup-hook
+ This variable is a normal hook which Emacs runs after loading your
+ @file{.emacs} file and the default initialization file (if any), after
+ loading terminal-specific Lisp code, and after running the hook
+ @code{term-setup-hook}.
+ 
+ This hook is used for internal purposes: setting up communication with
+ the window system, and creating the initial window.  Users should not
+ interfere with it.
+ @end defvar
Index: emacs/man/elisp-edebug.texi
diff -c /dev/null emacs/man/elisp-edebug.texi:1.2
*** /dev/null	Fri Aug  2 20:50:49 1996
--- emacs/man/elisp-edebug.texi	Thu Aug  1 00:22:38 1996
***************
*** 0 ****
--- 1,1545 ----
+ @comment -*-texinfo-*-
+ 
+ @c This file is intended to be used as a section within the Emacs Lisp 
+ @c Reference Manual.  It may also be used by an independent Edebug User 
+ @c Manual, edebug.tex, in which case the Edebug node below should be used 
+ @c with the following links to the Bugs section and to the top level:
+ 
+ @c , Bugs and Todo List, Top, Top
+ 
+ @node Edebug,, Compilation Errors, Debugging
+ @section Edebug
+ @cindex Edebug mode
+ 
+ @cindex Edebug
+   Edebug is a source-level debugger for Emacs Lisp programs with which
+ you can:
+ 
+ @itemize @bullet
+ @item
+ Step through evaluation, stopping before and after each expression.
+ 
+ @item
+ Set conditional or unconditional breakpoints.
+ 
+ @item
+ Stop when a specified condition is true (the global break event).
+ 
+ @item
+ Trace slow or fast, stopping briefly at each stop point, or
+ at each breakpoint.
+ 
+ @item
+ Display expression results and evaluate expressions as if outside of
+ Edebug.
+ 
+ @item 
+ Automatically reevaluate a list of expressions and
+ display their results each time Edebug updates the display.
+ 
+ @item
+ Output trace info on function enter and exit.
+ 
+ @item
+ Stop when an error occurs.
+ 
+ @item
+ Display a backtrace, omitting Edebug's own frames.
+ 
+ @item
+ Specify argument evaluation for macros and defining forms.
+ 
+ @item
+ Obtain rudimentary coverage testing and frequency counts.
+ @end itemize
+ 
+ The first three sections below should tell you enough about Edebug to
+ enable you to use it.
+ 
+ @menu
+ * Using Edebug::		Introduction to use of Edebug.
+ * Instrumenting::		You must instrument your code
+ 				  in order to debug it with Edebug.
+ * Modes: Edebug Execution Modes. Execution modes, stopping more or less often.
+ * Jumping::			Commands to jump to a specified place.
+ * Misc: Edebug Misc.		Miscellaneous commands.
+ * Breakpoints::			Setting breakpoints to make the program stop.
+ * Trapping Errors::		trapping errors with Edebug.
+ * Views: Edebug Views.		Views inside and outside of Edebug.
+ * Eval: Edebug Eval.			Evaluating expressions within Edebug.
+ * Eval List::			Expressions whose values are displayed
+ 				  each time you enter Edebug.
+ * Printing in Edebug::		Customization of printing.
+ * Trace Buffer::		How to produce trace output in a buffer.
+ * Coverage Testing::		How to test evaluation coverage.
+ * The Outside Context::		Data that Edebug saves and restores.
+ * Instrumenting Macro Calls::	Specifying how to handle macro calls.
+ * Options: Edebug Options.	Option variables for customizing Edebug.
+ @end menu
+ 
+ @node Using Edebug
+ @subsection Using Edebug
+ 
+   To debug a Lisp program with Edebug, you must first @dfn{instrument}
+ the Lisp code that you want to debug.  A simple way to do this is to
+ first move point into the definition of a function or macro and then do
+ @kbd{C-u C-M-x} (@code{eval-defun} with a prefix argument).  See
+ @ref{Instrumenting}, for alternative ways to instrument code.
+ 
+   Once a function is instrumented, any call to the function activates
+ Edebug.  Activating Edebug may stop execution and let you step through
+ the function, or it may update the display and continue execution while
+ checking for debugging commands, depending on which Edebug execution
+ mode you have selected.  The default execution mode is step, which does
+ stop execution.  @xref{Edebug Execution Modes}.
+ 
+   Within Edebug, you normally view an Emacs buffer showing the source of
+ the Lisp code you are debugging.  This is referred to as the @dfn{source
+ code buffer}.  This buffer is temporarily read-only.
+ 
+   An arrow at the left margin indicates the line where the function is
+ executing.  Point initially shows where within the line the function is
+ executing, but this ceases to be true if you move point yourself.
+ 
+   If you instrument the definition of @code{fac} (shown below) and then
+ execute @code{(fac 3)}, here is what you normally see.  Point is at the
+ open-parenthesis before @code{if}.
+ 
+ @example
+ (defun fac (n)
+ =>@point{}(if (< 0 n)
+       (* n (fac (1- n)))
+     1))
+ @end example
+ 
+ @cindex stop points
+ The places within a function where Edebug can stop execution are called
+ @dfn{stop points}.  These occur both before and after each subexpression
+ that is a list, and also after each variable reference.  
+ Here we show with periods the stop points found in the function
+ @code{fac}:
+ 
+ @example
+ (defun fac (n)
+   .(if .(< 0 n.).
+       .(* n. .(fac (1- n.).).).
+     1).)
+ @end example
+ 
+ The special commands of Edebug are available in the source code buffer
+ in addition to the commands of Emacs Lisp mode.  For example, you can
+ type the Edebug command @key{SPC} to execute until the next stop point.
+ If you type @key{SPC} once after entry to @code{fac}, here is the
+ display you will see:
+ 
+ @example
+ (defun fac (n)
+ =>(if @point{}(< 0 n)
+       (* n (fac (1- n)))
+     1))
+ @end example
+ 
+ When Edebug stops execution after an expression, it displays the
+ expression's value in the echo area. 
+ 
+ Other frequently used commands are @kbd{b} to set a breakpoint at a stop
+ point, @kbd{g} to execute until a breakpoint is reached, and @kbd{q} to
+ exit Edebug and return to the top-level command loop.  Type @kbd{?} to
+ display a list of all Edebug commands.
+ 
+ @node Instrumenting
+ @subsection Instrumenting for Edebug
+ 
+   In order to use Edebug to debug Lisp code, you must first
+ @dfn{instrument} the code.  Instrumenting code inserts additional code
+ into it, to invoke Edebug at the proper places.
+ 
+ @kindex C-M-x
+ @findex eval-defun (Edebug)
+   Once you have loaded Edebug, the command @kbd{C-M-x}
+ (@code{eval-defun}) is redefined so that when invoked with a prefix
+ argument on a definition, it instruments the definition before
+ evaluating it.  (The source code itself is not modified.)  If the
+ variable @code{edebug-all-defs} is non-@code{nil}, that inverts the
+ meaning of the prefix argument: then @kbd{C-M-x} instruments the
+ definition @emph{unless} it has a prefix argument.  The default value of
+ @code{edebug-all-defs} is @code{nil}.  The command @kbd{M-x
+ edebug-all-defs} toggles the value of the variable
+ @code{edebug-all-defs}.
+ 
+ @findex edebug-all-forms
+ @findex eval-region (Edebug)
+ @findex eval-current-buffer (Edebug)
+   If @code{edebug-all-defs} is non-@code{nil}, then the commands
+ @code{eval-region}, @code{eval-current-buffer}, and @code{eval-buffer}
+ also instrument any definitions they evaluate.  Similarly,
+ @code{edebug-all-forms} controls whether @code{eval-region} should
+ instrument @emph{any} form, even non-defining forms.  This doesn't apply
+ to loading or evaluations in the minibuffer.  The command @kbd{M-x
+ edebug-all-forms} toggles this option.
+ 
+ @findex edebug-eval-top-level-form
+ Another command, @kbd{M-x edebug-eval-top-level-form}, is available to
+ instrument any top-level form regardless of the value of
+ @code{edebug-all-defs} or @code{edebug-all-forms}.
+ 
+ When Edebug is about to instrument code for the first time in a session,
+ it runs the hook @code{edebug-setup-hook}, then sets it to @code{nil}.
+ You can use this to load up Edebug specifications associated with a
+ package you are using, but only when you also use Edebug.
+ 
+ While Edebug is active, the command @kbd{I}
+ (@code{edebug-instrument-callee}) instruments the definition of the
+ function or macro called by the list form after point, if is not already
+ instrumented.  This is possible only if Edebug knows where to find the
+ source for that function; after loading Edebug, @code{eval-region}
+ records the position of every definition it evaluates, even if not
+ instrumenting it.  See also the @kbd{i} command (@pxref{Jumping}), which
+ steps into the call after instrumenting the function.
+ 
+ @cindex special forms (Edebug)
+ @cindex interactive commands (Edebug)
+ @cindex anonymous lambda expressions (Edebug)
+ @cindex Common Lisp (Edebug)
+ @pindex cl.el (Edebug)
+ @pindex cl-specs.el
+   Edebug knows how to instrument all the standard special forms, an
+ interactive form with an expression argument, anonymous lambda
+ expressions, and other defining forms.  Edebug cannot know what a
+ user-defined macro will do with the arguments of a macro call, so you
+ must tell it; @xref{Instrumenting Macro Calls}, for details.
+ 
+ @findex eval-expression (Edebug)
+   To remove instrumentation from a definition, simply reevaluate its
+ definition in a way that does not instrument.  There are two ways of
+ evaluating forms that never instrument them: from a file with
+ @code{load}, and from the minibuffer with @code{eval-expression}
+ (@kbd{M-:}).
+ 
+   If Edebug detects a syntax error while instrumenting, it leaves point
+ at the erroneous code and signals an @code{invalid-read-syntax} error.
+ 
+   @xref{Edebug Eval}, for other evaluation functions available
+ inside of Edebug.
+ 
+ @node Edebug Execution Modes
+ @subsection Edebug Execution Modes
+ 
+ @cindex Edebug execution modes
+ Edebug supports several execution modes for running the program you are
+ debugging.  We call these alternatives @dfn{Edebug execution modes}; do
+ not confuse them with major or minor modes.  The current Edebug execution mode
+ determines how far Edebug continues execution before stopping---whether
+ it stops at each stop point, or continues to the next breakpoint, for
+ example---and how much Edebug displays the progress of the evaluation
+ before it stops.
+ 
+ Normally, you specify the Edebug execution mode by typing a command to
+ continue the program in a certain mode.  Here is a table of these
+ commands.  All except for @kbd{S} resume execution of the program, at
+ least for a certain distance.
+ 
+ @table @kbd
+ @item S
+ Stop: don't execute any more of the program for now, just wait for more
+ Edebug commands (@code{edebug-stop}).
+ 
+ @item @key{SPC}
+ Step: stop at the next stop point encountered (@code{edebug-step-mode}).
+ 
+ @item n
+ Next: stop at the next stop point encountered after an expression
+ (@code{edebug-next-mode}).  Also see @code{edebug-forward-sexp} in
+ @ref{Edebug Misc}.
+ 
+ @item t
+ Trace: pause one second at each Edebug stop point (@code{edebug-trace-mode}).
+ 
+ @item T
+ Rapid trace: update the display at each stop point, but don't actually
+ pause (@code{edebug-Trace-fast-mode}).
+ 
+ @item g
+ Go: run until the next breakpoint (@code{edebug-go-mode}).  @xref{Breakpoints}.
+ 
+ @item c
+ Continue: pause one second at each breakpoint, and then continue
+ (@code{edebug-continue-mode}).
+ 
+ @item C
+ Rapid continue: move point to each breakpoint, but don't pause
+ (@code{edebug-Continue-fast-mode}).
+ 
+ @item G
+ Go non-stop: ignore breakpoints (@code{edebug-Go-nonstop-mode}).  You
+ can still stop the program by typing @kbd{S}, or any editing command.
+ @end table
+ 
+ In general, the execution modes earlier in the above list run the
+ program more slowly or stop sooner than the modes later in the list.
+ 
+ While executing or tracing, you can interrupt the execution by typing
+ any Edebug command.  Edebug stops the program at the next stop point and
+ then executes the command you typed.  For example, typing @kbd{t} during
+ execution switches to trace mode at the next stop point.  You can use
+ @kbd{S} to stop execution without doing anything else.
+ 
+ If your function happens to read input, a character you type intending
+ to interrupt execution may be read by the function instead.  You can
+ avoid such unintended results by paying attention to when your program
+ wants input.
+ 
+ @cindex keyboard macros (Edebug)
+ Keyboard macros containing the commands in this section do not
+ completely work: exiting from Edebug, to resume the program, loses track
+ of the keyboard macro.  This is not easy to fix.  Also, defining or
+ executing a keyboard macro outside of Edebug does not affect commands
+ inside Edebug.  This is usually an advantage.  But see the
+ @code{edebug-continue-kbd-macro} option (@pxref{Edebug Options}).
+ 
+ When you enter a new Edebug level, the initial execution mode comes from
+ the value of the variable @code{edebug-initial-mode}.  By default, this
+ specifies step mode.  Note that you may reenter the same Edebug level
+ several times if, for example, an instrumented function is called
+ several times from one command.
+ 
+ 
+ @node Jumping
+ @subsection Jumping
+ 
+   The commands described in this section execute until they reach a
+ specified location.  All except @kbd{i} make a temporary breakpoint to
+ establish the place to stop, then switch to go mode.  Any other
+ breakpoint reached before the intended stop point will also stop
+ execution.  @xref{Breakpoints}, for the details on breakpoints.
+ 
+   These commands may fail to work as expected in case of nonlocal exit,
+ because a nonlocal exit can bypass the temporary breakpoint where you
+ expected the program to stop.
+ 
+ @table @kbd
+ @item h
+ Proceed to the stop point near where point is (@code{edebug-goto-here}).
+ 
+ @item f
+ Run the program forward over one expression
+ (@code{edebug-forward-sexp}).
+ 
+ @item o
+ Run the program until the end of the containing sexp.
+ 
+ @item i
+ Step into the function or macro called by the form after point.
+ @end table
+ 
+ The @kbd{h} command proceeds to the stop point near the current location
+ if point, using a temporary breakpoint.  See @ref{Breakpoints}, for more
+ about breakpoints.
+ 
+ The @kbd{f} command runs the program forward over one expression.  More
+ precisely, it sets a temporary breakpoint at the position that
+ @kbd{C-M-f} would reach, then executes in go mode so that the program
+ will stop at breakpoints.
+ 
+ With a prefix argument @var{n}, the temporary breakpoint is placed
+ @var{n} sexps beyond point.  If the containing list ends before @var{n}
+ more elements, then the place to stop is after the containing
+ expression.
+ 
+ Be careful that the position @kbd{C-M-f} finds is a place that the
+ program will really get to; this may not be true in a
+ @code{cond}, for example.
+ 
+ The @kbd{f} command does @code{forward-sexp} starting at point, rather
+ than at the stop point, for flexibility.  If you want to execute one
+ expression @emph{from the current stop point}, type @kbd{w} first, to
+ move point there, and then type @kbd{f}.
+ 
+ The @kbd{o} command continues ``out of'' an expression.  It places a
+ temporary breakpoint at the end of the sexp containing point.  If the
+ containing sexp is a function definition itself, @kbd{o} continues until
+ just before the last sexp in the definition.  If that is where you are
+ now, it returns from the function and then stops.  In other words, this
+ command does not exit the currently executing function unless you are
+ positioned after the last sexp.
+ 
+ The @kbd{i} command steps into the function or macro called by the list
+ form after point, and stops at its first stop point.  Note that the form
+ need not be the one about to be evaluated.  But if the form is a
+ function call about to be evaluated, remember to use this command before
+ any of the arguments are evaluated, since otherwise it will be too late.
+ 
+ The @kbd{i} command instruments the function or macro it's supposed to
+ step into, if it isn't instrumented already.  This is convenient, but keep
+ in mind that the function or macro remains instrumented unless you explicitly
+ arrange to deinstrument it.
+ 
+ @node Edebug Misc
+ @subsection Miscellaneous Edebug Commands
+ 
+   Some miscellaneous Edebug commands are described here.
+ 
+ @table @kbd
+ @item ?
+ Display the help message for Edebug (@code{edebug-help}).
+ 
+ @item C-]
+ Abort one level back to the previous command level
+ (@code{abort-recursive-edit}).
+ 
+ @item q
+ Return to the top level editor command loop (@code{top-level}).  This
+ exits all recursive editing levels, including all levels of Edebug
+ activity.  However, instrumented code protected with
+ @code{unwind-protect} or @code{condition-case} forms may resume
+ debugging.
+ 
+ @item Q
+ Like @kbd{q} but don't stop even for protected code
+ (@code{top-level-nonstop}).
+ 
+ @item r
+ Redisplay the most recently known expression result in the echo area
+ (@code{edebug-previous-result}).
+ 
+ @item d
+ Display a backtrace, excluding Edebug's own functions for clarity
+ (@code{edebug-backtrace}).
+ 
+ You cannot use debugger commands in the backtrace buffer in Edebug as
+ you would in the standard debugger.
+ 
+ The backtrace buffer is killed automatically when you continue
+ execution.
+ @end table
+ 
+ From the Edebug recursive edit, you may invoke commands that activate
+ Edebug again recursively.  Any time Edebug is active, you can quit to
+ the top level with @kbd{q} or abort one recursive edit level with
+ @kbd{C-]}.  You can display a backtrace of all the 
+ pending evaluations with @kbd{d}.
+ 
+ @node Breakpoints
+ @subsection Breakpoints
+ 
+ @cindex breakpoints
+ Edebug's step mode stops execution at the next stop point reached.
+ There are three other ways to stop Edebug execution once it has started:
+ breakpoints, the global break condition, and source breakpoints.
+ 
+ While using Edebug, you can specify @dfn{breakpoints} in the program you
+ are testing: points where execution should stop.  You can set a
+ breakpoint at any stop point, as defined in @ref{Using Edebug}.  For
+ setting and unsetting breakpoints, the stop point that is affected is
+ the first one at or after point in the source code buffer.  Here are the
+ Edebug commands for breakpoints:
+ 
+ @table @kbd
+ @item b
+ Set a breakpoint at the stop point at or after point
+ (@code{edebug-set-breakpoint}).  If you use a prefix argument, the
+ breakpoint is temporary (it turns off the first time it stops the
+ program).
+ 
+ @item u
+ Unset the breakpoint (if any) at the stop point at or after 
+ point (@code{edebug-unset-breakpoint}).
+ 
+ @item x @var{condition} @key{RET}
+ Set a conditional breakpoint which stops the program only if
+ @var{condition} evaluates to a non-@code{nil} value
+ (@code{edebug-set-conditional-breakpoint}).  With a prefix argument, the
+ breakpoint is temporary.
+ 
+ @item B
+ Move point to the next breakpoint in the definition
+ (@code{edebug-next-breakpoint}).
+ @end table
+ 
+ While in Edebug, you can set a breakpoint with @kbd{b} and unset one
+ with @kbd{u}.  First move point to the Edebug stop point of your choice,
+ then type @kbd{b} or @kbd{u} to set or unset a breakpoint there.
+ Unsetting a breakpoint where none has been set has no effect.
+ 
+ Reevaluating or reinstrumenting a definition forgets all its breakpoints.
+ 
+ A @dfn{conditional breakpoint} tests a condition each time the program
+ gets there.  Any errors that occur as a result of evaluating the
+ condition are ignored, as if the result were @code{nil}.  To set a
+ conditional breakpoint, use @kbd{x}, and specify the condition
+ expression in the minibuffer.  Setting a conditional breakpoint at a
+ stop point that has a previously established conditional breakpoint puts
+ the previous condition expression in the minibuffer so you can edit it.
+ 
+ You can make a conditional or unconditional breakpoint
+ @dfn{temporary} by using a prefix arg with the command to set the
+ breakpoint.  When a temporary breakpoint stops the program, it is
+ automatically unset.
+ 
+ Edebug always stops or pauses at a breakpoint except when the Edebug
+ mode is Go-nonstop.  In that mode, it ignores breakpoints entirely.
+ 
+ To find out where your breakpoints are, use the @kbd{B} command, which
+ moves point to the next breakpoint following point, within the same
+ function, or to the first breakpoint if there are no following
+ breakpoints.  This command does not continue execution---it just moves
+ point in the buffer.
+ 
+ @menu
+ * Global Break Condition::	Breaking on an event. 
+ * Source Breakpoints::  	Embedding breakpoints in source code.
+ @end menu
+ 
+ 
+ @node Global Break Condition
+ @subsubsection Global Break Condition
+ 
+ @cindex stopping on events
+ @cindex global break condition
+   A @dfn{global break condition} stops execution when a specified
+ condition is satisfied, no matter where that may occur.  Edebug
+ evaluates the global break condition at every stop point.  If it
+ evaluates to a non-@code{nil} value, then execution stops or pauses
+ depending on the execution mode, as if a breakpoint had been hit.  If
+ evaluating the condition gets an error, execution does not stop.
+ 
+ @findex edebug-set-global-break-condition
+ @vindex edebug-global-break-condition
+   You can set or edit the condition expression, stored in
+ @code{edebug-global-break-condition}, using the @kbd{X} command
+ (@code{edebug-set-global-break-condition}).
+ 
+   The global break condition is the simplest way to find where in your
+ code some event occurs, but it makes code run much more slowly.  So you
+ should reset the condition to @code{nil} when not using it.
+ 
+ @node Source Breakpoints
+ @subsubsection Source Breakpoints
+ 
+ @findex edebug
+ @cindex source breakpoints
+   All breakpoints in a definition are forgotten each time you
+ reinstrument it.  To make a breakpoint that won't be forgotten, you can
+ write a @dfn{source breakpoint}, which is simply a call to the function
+ @code{edebug} in your source code.  You can, of course, make such a call
+ conditional.  For example, in the @code{fac} function, insert the first
+ line as shown below to stop when the argument reaches zero:
+ 
+ @example
+ (defun fac (n)
+   (if (= n 0) (edebug))
+   (if (< 0 n)
+       (* n (fac (1- n)))
+     1))
+ @end example
+ 
+ When the @code{fac} definition is instrumented and the function is
+ called, the call to @code{edebug} acts as a breakpoint.  Depending on
+ the execution mode, Edebug stops or pauses there.
+ 
+ If no instrumented code is being executed when @code{edebug} is called,
+ that function calls @code{debug}.
+ @c This may not be a good idea anymore.
+ 
+ @node Trapping Errors
+ @subsection Trapping Errors
+ 
+ Emacs normally displays an error message when an error is signaled and
+ not handled with @code{condition-case}.  While Edebug is active, it
+ normally responds to all unhandled errors.  You can customize this with
+ the options @code{edebug-on-error} and @code{edebug-on-quit}; see
+ @ref{Edebug Options}.
+ 
+ When Edebug responds to an error, it shows the last stop point
+ encountered before the error.  This may be the location of a call to a
+ function which was not instrumented, within which the error actually
+ occurred.  For an unbound variable error, the last known stop point
+ might be quite distant from the offending variable reference.  In that
+ case you might want to display a full backtrace (@pxref{Edebug Misc}).
+ 
+ @c Edebug should be changed for the following: -- dan
+ If you change @code{debug-on-error} or @code{debug-on-quit} while
+ Edebug is active, these changes will be forgotten when Edebug becomes
+ inactive.  Furthermore, during Edebug's recursive edit, these variables
+ are bound to the values they had outside of Edebug.
+ 
+ @node Edebug Views
+ @subsection Edebug Views
+ 
+ These Edebug commands let you view aspects of the buffer and window
+ status that obtained before entry to Edebug.  The outside window
+ configuration is the collection of windows and contents that were in
+ effect outside of Edebug.
+ 
+ @table @kbd
+ @item v
+ Temporarily view the outside window configuration
+ (@code{edebug-view-outside}).
+ 
+ @item p
+ Temporarily display the outside current buffer with point at its outside
+ position (@code{edebug-bounce-point}).  With a prefix argument @var{n},
+ pause for @var{n} seconds instead.
+ 
+ @item w
+ Move point back to the current stop point (@code{edebug-where}) in the
+ source code buffer.  Also, if you use this command in a different window
+ displaying the same buffer, that window will be used instead to display
+ the current definition in the future.
+ 
+ @item W
+ @c Its function is not simply to forget the saved configuration -- dan
+ Toggle whether Edebug saves and restores the outside window
+ configuration (@code{edebug-toggle-save-windows}).
+ 
+ With a prefix argument, @code{W} only toggles saving and restoring of
+ the selected window.  To specify a window that is not displaying the
+ source code buffer, you must use @kbd{C-x X W} from the global keymap.
+ @end table
+ 
+ You can view the outside window configuration with @kbd{v} or just
+ bounce to the point in the current buffer with @kbd{p}, even if
+ it is not normally displayed.  After moving point, you may wish to jump
+ back to the stop point with @kbd{w} from a source code buffer.
+ 
+ Each time you use @kbd{W} to turn saving @emph{off}, Edebug forgets the
+ saved outside window configuration---so that even if you turn saving
+ back @emph{on}, the current window configuration remains unchanged when
+ you next exit Edebug (by continuing the program).  However, the
+ automatic redisplay of @samp{*edebug*} and @samp{*edebug-trace*} may
+ conflict with the buffers you wish to see unless you have enough windows
+ open.
+ 
+ @node Edebug Eval
+ @subsection Evaluation
+ 
+ While within Edebug, you can evaluate expressions ``as if'' Edebug were
+ not running.  Edebug tries to be invisible to the expression's
+ evaluation and printing.  Evaluation of expressions that cause side
+ effects will work as expected except for things that Edebug explicitly
+ saves and restores.  @xref{The Outside Context}, for details on this
+ process.
+ 
+ @table @kbd
+ @item e @var{exp} @key{RET}
+ Evaluate expression @var{exp} in the context outside of Edebug
+ (@code{edebug-eval-expression}).  That is, Edebug tries to minimize its
+ interference with the evaluation.
+ 
+ @item M-: @var{exp} @key{RET}
+ Evaluate expression @var{exp} in the context of Edebug itself.
+ 
+ @item C-x C-e
+ Evaluate the expression before point, in the context outside of Edebug
+ (@code{edebug-eval-last-sexp}).
+ @end table
+ 
+ @cindex lexical binding (Edebug)
+ Edebug supports evaluation of expressions containing references to
+ lexically bound symbols created by the following constructs in
+ @file{cl.el} (version 2.03 or later): @code{lexical-let},
+ @code{macrolet}, and @code{symbol-macrolet}.
+ 
+ 
+ @node Eval List
+ @subsection Evaluation List Buffer
+ 
+ You can use the @dfn{evaluation list buffer}, called @samp{*edebug*}, to
+ evaluate expressions interactively.  You can also set up the
+ @dfn{evaluation list} of expressions to be evaluated automatically each
+ time Edebug updates the display.
+ 
+ @table @kbd
+ @item E
+ Switch to the evaluation list buffer @samp{*edebug*}
+ (@code{edebug-visit-eval-list}).
+ @end table
+ 
+ In the @samp{*edebug*} buffer you can use the commands of Lisp
+ Interaction mode (@pxref{Lisp Interaction,,, emacs, The GNU Emacs
+ Manual}) as well as these special commands:
+ 
+ @table @kbd
+ @item LFD
+ Evaluate the expression before point, in the outside context, and insert
+ the value in the buffer (@code{edebug-eval-print-last-sexp}).
+ 
+ @item C-x C-e
+ Evaluate the expression before point, in the context outside of Edebug
+ (@code{edebug-eval-last-sexp}).
+ 
+ @item C-c C-u
+ Build a new evaluation list from the contents of the buffer
+ (@code{edebug-update-eval-list}).
+ 
+ @item C-c C-d
+ Delete the evaluation list group that point is in
+ (@code{edebug-delete-eval-item}).
+ 
+ @item C-c C-w
+ Switch back to the source code buffer at the current stop point
+ (@code{edebug-where}).
+ @end table
+ 
+ You can evaluate expressions in the evaluation list window with
+ @kbd{LFD} or @kbd{C-x C-e}, just as you would in @samp{*scratch*};
+ but they are evaluated in the context outside of Edebug.
+ 
+ The expressions you enter interactively (and their results) are lost
+ when you continue execution; but you can set up an @dfn{evaluation list}
+ consisting of expressions to be evaluated each time execution stops. 
+ 
+ @cindex evaluation list group
+ To do this, write one or more @dfn{evaluation list groups} in the
+ evaluation list buffer.  An evaluation list group consists of one or
+ more Lisp expressions.  Groups are separated by comment lines.
+ 
+ The command @kbd{C-c C-u} (@code{edebug-update-eval-list}) rebuilds the
+ evaluation list, scanning the buffer and using the first expression of
+ each group.  (The idea is that the second expression of the group is the
+ value previously computed and displayed.)
+ 
+ Be careful not to add expressions that execute instrumented code since
+ that would cause an infinite loop.
+ @c There ought to be a way to fix this.
+ 
+ Each entry to Edebug redisplays the evaluation list by inserting each
+ expression in the buffer, followed by its current value.  It also
+ inserts comment lines so that each expression becomes its own group.
+ Thus, if you type @kbd{C-c C-u} again without changing the buffer text,
+ the evaluation list is effectively unchanged.
+ 
+ If an error occurs during an evaluation from the evaluation list, the
+ error message is displayed in a string as if it were the result.
+ Therefore, expressions that use variables not currently valid do not
+ interrupt your debugging.
+ 
+ Here is an example of what the evaluation list window looks like after
+ several expressions have been added to it:
+ 
+ @smallexample
+ (current-buffer)
+ #<buffer *scratch*>
+ ;---------------------------------------------------------------
+ (selected-window)
+ #<window 16 on *scratch*>
+ ;---------------------------------------------------------------
+ (point)
+ 196
+ ;---------------------------------------------------------------
+ bad-var
+ "Symbol's value as variable is void: bad-var"
+ ;---------------------------------------------------------------
+ (recursion-depth)
+ 0
+ ;---------------------------------------------------------------
+ this-command
+ eval-last-sexp
+ ;---------------------------------------------------------------
+ @end smallexample
+ 
+ To delete a group, move point into it and type @kbd{C-c C-d}, or simply
+ delete the text for the group and update the evaluation list with
+ @kbd{C-c C-u}.  To add a new expression to the evaluation list, insert
+ the expression at a suitable place, and insert a new comment line.  (You
+ need not insert dashes in the comment line---its contents don't matter.)
+ Then type @kbd{C-c C-u}.
+ 
+ After selecting @samp{*edebug*}, you can return to the source code
+ buffer with @kbd{C-c C-w}.  The @samp{*edebug*} buffer is killed when
+ you continue execution, and recreated next time it is needed.
+ 
+ 
+ @node Printing in Edebug
+ @subsection Printing in Edebug
+ 
+ @cindex printing (Edebug)
+ @cindex printing circular structures
+ @pindex cust-print
+   If an expression in your program produces a value containing circular
+ list structure, you may get an error when Edebug attempts to print it.
+ 
+ @vindex edebug-print-length
+ @vindex edebug-print-level
+   One way to cope with circular structure is to set @code{print-length}
+ or @code{print-level} to truncate the printing.  Edebug does this for
+ you; it binds @code{print-length} and @code{print-level} to 50 if they
+ were @code{nil}.  (Actually, the variables @code{edebug-print-length}
+ and @code{edebug-print-level} specify the values to use within Edebug.)
+ @xref{Output Variables}.
+ 
+   You can also print circular structures and structures that share
+ elements more informatively by using the @file{cust-print} package.
+ 
+   To load @file{cust-print} and activate custom printing only for
+ Edebug, simply use the command @kbd{M-x edebug-install-custom-print}.
+ To restore the standard print functions, use @kbd{M-x
+ edebug-uninstall-custom-print}.
+ 
+   Here is an example of code that creates a circular structure:
+ 
+ @example
+ (setq a '(x y))
+ (setcar a a))
+ @end example
+ 
+ @noindent
+ Custom printing prints this as @samp{Result: #1=(#1# y)}.  The
+ @samp{#1=} notation labels the structure that follows it with the label
+ @samp{1}, and the @samp{#1#} notation references the previously labelled
+ structure.  This notation is used for any shared elements of lists or
+ vectors.
+ 
+   Other programs can also use custom printing; see @file{cust-print.el}
+ for details.
+ 
+ @node Trace Buffer
+ @subsection Trace Buffer
+ @cindex trace buffer
+ 
+   Edebug can record an execution trace, storing it in a buffer named
+ @samp{*edebug-trace*}.  This is a log of function calls and returns,
+ showing the function names and their arguments and values.  To enable
+ trace recording, set @code{edebug-trace} to a non-@code{nil} value.
+ 
+   Making a trace buffer is not the same thing as using trace execution
+ mode (@pxref{Edebug Execution Modes}).
+ 
+   When trace recording is enabled, each function entry and exit adds
+ lines to the trace buffer.  A function entry record looks like
+ @samp{::::@{} followed by the function name and argument values.  A
+ function exit record looks like @samp{::::@}} followed by the function
+ name and result of the function.
+ 
+   The number of @samp{:}s in an entry shows its recursion depth.  You
+ can use the braces in the trace buffer to find the matching beginning or
+ end of function calls.
+ 
+ @findex edebug-print-trace-before
+ @findex edebug-print-trace-after
+   You can customize trace recording for function entry and exit by
+ redefining the functions @code{edebug-print-trace-before} and
+ @code{edebug-print-trace-after}.
+ 
+ @defmac edebug-tracing string body@dots{}
+ This macro requests additional trace information around the execution
+ of the @var{body} forms.  The argument @var{string} specifies text
+ to put in the trace buffer.  All the arguments are evaluated.
+ @code{edebug-tracing} returns the value of the last form in @var{body}.
+ @end defmac
+ 
+ @defun edebug-trace format-string &rest format-args
+ This function inserts text in the trace buffer.  It computes the text
+ with @code{(apply 'format @var{format-string} @var{format-args})}.
+ It also appends a newline to separate entries.
+ @end defun
+ 
+   @code{edebug-tracing} and @code{edebug-trace} insert lines in the trace
+ buffer even if Edebug is not active.
+ 
+   Adding text to the trace buffer also scrolls its window to show the
+ last lines inserted.
+ 
+ @node Coverage Testing
+ @subsection Coverage Testing
+ 
+ @cindex coverage testing
+ @cindex frequency counts
+ @cindex performance analysis
+ Edebug provides rudimentary coverage testing and display of execution
+ frequency.  All execution of an instrumented function accumulates
+ frequency counts, both before and after evaluation of each instrumented
+ expression, even if the execution mode is Go-nonstop.  Coverage testing
+ is more expensive, so it is only done if @code{edebug-test-coverage} is
+ non-@code{nil}.  The command @kbd{M-x edebug-display-freq-count}
+ displays both the frequency data and the coverage data (if recorded).
+ 
+ @deffn Command edebug-display-freq-count
+ This command displays the frequency count data for each line of the
+ current definition.
+ 
+ The frequency counts appear as comment lines after each line of code, and
+ you can undo all insertions with one @code{undo} command.  The counts
+ appear under the @kbd{(} before an expression or the @kbd{)} after
+ an expression, or on the last character of a symbol.  Values do not appear if
+ they are equal to the previous count on the same line.
+ 
+ The character @samp{=} following the count for an expression says that
+ the expression has returned the same value each time it was evaluated
+ This is the only coverage information that Edebug records.
+ 
+ To clear the frequency count and coverage data for a definition,
+ reinstrument it.
+ @end deffn
+ 
+ For example, after evaluating @code{(fac 5)} with a source
+ breakpoint, and setting @code{edebug-test-coverage} to @code{t}, when
+ the breakpoint is reached, the frequency data looks like this:
+ 
+ @example
+ (defun fac (n)
+   (if (= n 0) (edebug))
+ ;#6           1      0 =5 
+   (if (< 0 n)
+ ;#5         = 
+       (* n (fac (1- n)))
+ ;#    5               0  
+     1))
+ ;#   0 
+ @end example
+ 
+ The comment lines show that @code{fac} was called 6 times.  The
+ first @code{if} statement returned 5 times with the same result each
+ time; the same is true of the condition on the second @code{if}.
+ The recursive call of @code{fac} did not return at all.
+ 
+ 
+ @node The Outside Context
+ @subsection The Outside Context
+ 
+ Edebug tries to be transparent to the program you are debugging, but it
+ does not succeed completely.  Edebug also tries to be transparent when
+ you evaluate expressions with @kbd{e} or with the evaluation list
+ buffer, by temporarily restoring the outside context.  This section
+ explains precisely what context Edebug restores, and how Edebug fails to
+ be completely transparent.
+ 
+ @menu
+ * Checking Whether to Stop::	When Edebug decides what to do.
+ * Edebug Display Update::	When Edebug updates the display.
+ * Edebug Recursive Edit::	When Edebug stops execution.
+ @end menu
+ 
+ @node Checking Whether to Stop
+ @subsubsection Checking Whether to Stop
+ 
+ Whenever Edebug is entered, it needs to save and restore certain data
+ before even deciding whether to make trace information or stop the
+ program.
+ 
+ @itemize @bullet
+ @item 
+ @code{max-lisp-eval-depth} and @code{max-specpdl-size} are both
+ incremented one time to reduce Edebug's impact on the stack.
+ You could, however, still run out of stack space when using Edebug.
+ 
+ @item 
+ The state of keyboard macro execution is saved and restored.  While
+ Edebug is active, @code{executing-macro} is bound to
+ @code{edebug-continue-kbd-macro}.
+ 
+ @end itemize
+ 
+ 
+ @node Edebug Display Update
+ @subsubsection Edebug Display Update
+ 
+ @c This paragraph is not filled, because LaLiberte's conversion script
+ @c needs an xref to be on just one line.
+ When Edebug needs to display something (e.g., in trace mode), it saves
+ the current window configuration from ``outside'' Edebug 
+ (@pxref{Window Configurations}).  When you exit Edebug (by continuing
+ the program), it restores the previous window configuration.
+ 
+ Emacs redisplays only when it pauses.  Usually, when you continue
+ execution, the program comes back into Edebug at a breakpoint or after
+ stepping without pausing or reading input in between.  In such cases,
+ Emacs never gets a chance to redisplay the ``outside'' configuration.
+ What you see is the same window configuration as the last time Edebug
+ was active, with no interruption.
+ 
+ Entry to Edebug for displaying something also saves and restores the
+ following data, but some of these are deliberately not restored if an
+ error or quit signal occurs.
+ 
+ @itemize @bullet
+ @item 
+ @cindex current buffer point and mark (Edebug)
+ Which buffer is current, and the positions of point and the mark in the
+ current buffer, are saved and restored.
+ 
+ @item 
+ @cindex window configuration (Edebug)
+ The outside window configuration is saved and restored if
+ @code{edebug-save-windows} is non-@code{nil} (@pxref{Edebug Display Update}).
+ 
+ The window configuration is not restored on error or quit, but the
+ outside selected window @emph{is} reselected even on error or quit in
+ case a @code{save-excursion} is active.  If the value of
+ @code{edebug-save-windows} is a list, only the listed windows are saved
+ and restored.
+ 
+ The window start and horizontal scrolling of the source code buffer are
+ not restored, however, so that the display remains coherent within Edebug.
+ 
+ @item
+ The value of point in each displayed buffer is saved and restored if
+ @code{edebug-save-displayed-buffer-points} is non-@code{nil}.
+ 
+ @item
+ The variables @code{overlay-arrow-position} and
+ @code{overlay-arrow-string} are saved and restored.  So you can safely
+ invoke Edebug from the recursive edit elsewhere in the same buffer.
+ 
+ @item 
+ @code{cursor-in-echo-area} is locally bound to @code{nil} so that
+ the cursor shows up in the window.
+ @end itemize
+ 
+ @node Edebug Recursive Edit
+ @subsubsection Edebug Recursive Edit
+ 
+ When Edebug is entered and actually reads commands from the user, it
+ saves (and later restores) these additional data:
+ 
+ @itemize @bullet
+ @item
+ The current match data.  @xref{Match Data}.
+ 
+ @item
+ @code{last-command}, @code{this-command}, @code{last-command-char},
+ @code{last-input-char}, @code{last-input-event},
+ @code{last-command-event}, @code{last-event-frame},
+ @code{last-nonmenu-event}, and @code{track-mouse}.  Commands used within
+ Edebug do not affect these variables outside of Edebug.
+ 
+ The key sequence returned by @code{this-command-keys} is changed by
+ executing commands within Edebug and there is no way to reset
+ the key sequence from Lisp.
+ 
+ Edebug cannot save and restore the value of
+ @code{unread-command-events}.  Entering Edebug while this variable has a
+ nontrivial value can interfere with execution of the program you are
+ debugging.
+ 
+ @item
+ Complex commands executed while in Edebug are added to the variable
+ @code{command-history}.  In rare cases this can alter execution.
+ 
+ @item
+ Within Edebug, the recursion depth appears one deeper than the recursion
+ depth outside Edebug.  This is not true of the automatically updated
+ evaluation list window.
+ 
+ @item
+ @code{standard-output} and @code{standard-input} are bound to @code{nil}
+ by the @code{recursive-edit}, but Edebug temporarily restores them during
+ evaluations.
+ 
+ @item 
+ The state of keyboard macro definition is saved and restored.  While
+ Edebug is active, @code{defining-kbd-macro} is bound to
+ @code{edebug-continue-kbd-macro}.
+ @end itemize
+ 
+ @node Instrumenting Macro Calls
+ @subsection Instrumenting Macro Calls
+ 
+ When Edebug instruments an expression that calls a Lisp macro, it needs
+ additional advice to do the job properly.  This is because there is no
+ way to tell which subexpressions of the macro call are forms to be
+ evaluated.  (Evaluation may occur explicitly in the macro body, or when
+ the resulting expansion is evaluated, or any time later.)  You must
+ explain the format of calls to each macro to enable Edebug to handle it.
+ To do this, use @code{def-edebug-spec} to define the format of
+ calls to a given macro.
+ 
+ @deffn Macro def-edebug-spec macro specification
+ Specify which expressions of a call to macro @var{macro} are forms to be
+ evaluated.  For simple macros, the @var{specification} often looks very
+ similar to the formal argument list of the macro definition, but
+ specifications are much more general than macro arguments.
+ 
+ The @var{macro} argument may actually be any symbol, not just a macro
+ name.
+ @end deffn
+ 
+ Here is a simple example that defines the specification for the
+ @code{for} macro described in the Emacs Lisp Reference Manual, followed
+ by an alternative, equivalent specification.
+ 
+ @example
+ (def-edebug-spec for
+   (symbolp "from" form "to" form "do" &rest form))
+ 
+ (def-edebug-spec for
+   (symbolp ['from form] ['to form] ['do body]))
+ @end example
+ 
+ Here is a table of the possibilities for @var{specification} and how each
+ directs processing of arguments.
+ 
+ @table @asis
+ @item @code{t}
+ All arguments are instrumented for evaluation.
+ 
+ @item @code{0}
+ None of the arguments is instrumented.
+ 
+ @item a symbol
+ The symbol must have an Edebug specification which is used instead.
+ This indirection is repeated until another kind of specification is
+ found.  This allows you to inherit the specification for another macro.
+ 
+ @item a list
+ The elements of the list describe the types of the arguments of a
+ calling form.  The possible elements of a specification list are
+ described in the following sections.
+ @end table
+ 
+ @menu
+ * Specification List::		How to specify complex patterns of evaluation.
+ * Backtracking::		What Edebug does when matching fails.
+ * Specification Examples::	To help understand specifications.
+ @end menu
+ 
+ 
+ @node Specification List
+ @subsubsection Specification List
+ 
+ @cindex Edebug specification list
+ A @dfn{specification list} is required for an Edebug specification if
+ some arguments of a macro call are evaluated while others are not.  Some
+ elements in a specification list match one or more arguments, but others
+ modify the processing of all following elements.  The latter, called
+ @dfn{specification keywords}, are symbols beginning with @samp{&} (such
+ as @code{&optional}).
+ 
+ A specification list may contain sublists which match arguments that are
+ themselves lists, or it may contain vectors used for grouping.  Sublists
+ and groups thus subdivide the specification list into a hierarchy of
+ levels.  Specification keywords only apply to the remainder of the
+ sublist or group they are contained in.
+ 
+ When a specification list involves alternatives or repetition, matching
+ it against an actual macro call may require backtracking.
+ @xref{Backtracking}, for more details.
+ 
+ Edebug specifications provide the power of regular expression matching,
+ plus some context-free grammar constructs: the matching of sublists with
+ balanced parentheses, recursive processing of forms, and recursion via
+ indirect specifications.
+ 
+ Here's a table of the possible elements of a specification list, with
+ their meanings:
+ 
+ @table @code
+ @item sexp
+ A single Lisp object, not unevaluated.
+ @c "unevaluated expression" is not meaningful, because
+ @c an expression is a Lisp object intended for evaluation.
+ 
+ @item form
+ A single evaluated expression, which is instrumented.
+ 
+ @item place
+ @findex edebug-unwrap
+ A place to store a value, as in the Common Lisp @code{setf} construct.
+ 
+ @item body
+ Short for @code{&rest form}.  See @code{&rest} below.
+ 
+ @item function-form
+ A function form: either a quoted function symbol, a quoted lambda
+ expression, or a form (that should evaluate to a function symbol or
+ lambda expression).  This is useful when an argument that's a lambda
+ expression might be quoted with @code{quote} rather than
+ @code{function}, since it instruments the body of the lambda expression
+ either way.
+ 
+ @item lambda-expr
+ A lambda expression with no quoting.
+ 
+ @item &optional
+ @kindex &optional @r{(Edebug)}
+ All following elements in the specification list are optional; as soon
+ as one does not match, Edebug stops matching at this level.  
+ 
+ To make just a few elements optional followed by non-optional elements,
+ use @code{[&optional @var{specs}@dots{}]}.  To specify that several
+ elements must all match or none, use @code{&optional
+ [@var{specs}@dots{}]}.  See the @code{defun} example below.
+ 
+ @item &rest
+ @kindex &rest @r{(Edebug)}
+ All following elements in the specification list are repeated zero or
+ more times.  All the elements need not match in the last repetition,
+ however.
+ 
+ To repeat only a few elements, use @code{[&rest @var{specs}@dots{}]}.
+ To specify several elements that must all match on every repetition, use
+ @code{&rest [@var{specs}@dots{}]}.
+ 
+ @item &or
+ @kindex &or @r{(Edebug)}
+ Each of the following elements in the specification list is an
+ alternative.  One of the alternatives must match, or the @code{&or}
+ specification fails.
+ 
+ Each list element following @code{&or} is a single alternative.  To
+ group two or more list elements as a single alternative, enclose them in
+ @code{[@dots{}]}.
+ 
+ @item &not
+ @kindex &not @r{(Edebug)}
+ Each of the following elements is matched as alternatives as if by using
+ @code{&or}, but if any of them match, the specification fails.  If none
+ of them match, nothing is matched, but the @code{&not} specification
+ succeeds.
+ 
+ @item &define 
+ @kindex &define @r{(Edebug)}
+ Indicates that the specification is for a defining form.  The defining
+ form itself is not instrumented (i.e. Edebug does not stop before and
+ after the defining form), but forms inside it typically will be
+ instrumented.  The @code{&define} keyword should be the first element in
+ a list specification.
+ 
+ @item nil
+ This is successful when there are no more arguments to match at the
+ current argument list level; otherwise it fails.  See sublist
+ specifications and the backquote example below.
+ 
+ @item gate
+ @cindex preventing backtracking
+ No argument is matched but backtracking through the gate is disabled
+ while matching the remainder of the specifications at this level.  This
+ is primarily used to generate more specific syntax error messages.  See
+ @ref{Backtracking}, for more details.  Also see the @code{let} example
+ below.
+ 
+ @item @var{other-symbol}
+ @cindex indirect specifications
+ Any other symbol in a specification list may be a predicate or an
+ indirect specification.
+ 
+ If the symbol has an Edebug specification, this @dfn{indirect
+ specification} should be either a list specification that is used in
+ place of the symbol, or a function that is called to process the
+ arguments.  The specification may be defined with @code{def-edebug-spec}
+ just as for macros. See the @code{defun} example below.
+ 
+ Otherwise, the symbol should be a predicate.  The predicate is called
+ with the argument and the specification fails if the predicate returns
+ @code{nil}.  In either case, that argument is not instrumented.
+ 
+ Some suitable predicates include @code{symbolp}, @code{integerp},
+ @code{stringp}, @code{vectorp}, and @code{atom}.
+ 
+ @item [@var{elements}@dots{}]
+ @cindex [@dots{}] (Edebug)
+ A vector of elements groups the elements into a single @dfn{group
+ specification}.  Its meaning has nothing to do with vectors.
+ 
+ @item "@var{string}"
+ The argument should be a symbol named @var{string}.  This specification
+ is equivalent to the quoted symbol, @code{'@var{symbol}}, where the name
+ of @var{symbol} is the @var{string}, but the string form is preferred.
+ 
+ @item (vector @var{elements}@dots{})
+ The argument should be a vector whose elements must match the
+ @var{elements} in the specification.  See the backquote example below.
+ 
+ @item (@var{elements}@dots{})
+ Any other list is a @dfn{sublist specification} and the argument must be
+ a list whose elements match the specification @var{elements}.
+ 
+ @cindex dotted lists (Edebug)
+ A sublist specification may be a dotted list and the corresponding list
+ argument may then be a dotted list.  Alternatively, the last @sc{cdr} of a
+ dotted list specification may be another sublist specification (via a
+ grouping or an indirect specification, e.g. @code{(spec .  [(more
+ specs@dots{})])}) whose elements match the non-dotted list arguments.
+ This is useful in recursive specifications such as in the backquote
+ example below.  Also see the description of a @code{nil} specification
+ above for terminating such recursion.
+ 
+ Note that a sublist specification written as @code{(specs .  nil)}
+ is equivalent to @code{(specs)}, and @code{(specs .
+ (sublist-elements@dots{}))} is equivalent to @code{(specs
+ sublist-elements@dots{})}.
+ @end table
+ 
+ @c Need to document extensions with &symbol and :symbol
+ 
+ Here is a list of additional specifications that may only appear after
+ @code{&define}.  See the @code{defun} example below.
+ 
+ @table @code
+ @item name
+ The argument, a symbol, is the name of the defining form. 
+ 
+ A defining form is not required to have a name field; and it may have
+ multiple name fields.
+ 
+ @item :name
+ This construct does not actually match an argument.  The element
+ following @code{:name} should be a symbol; it is used as an additional
+ name component for the definition.  You can use this to add a unique,
+ static component to the name of the definition.  It may be used more
+ than once.
+ 
+ @item arg
+ The argument, a symbol, is the name of an argument of the defining form.
+ However, lambda list keywords (symbols starting with @samp{@code{&}})
+ are not allowed.
+ 
+ @item lambda-list
+ @cindex lambda-list (Edebug)
+ This matches a lambda list---the argument list of a lambda expression.
+ 
+ @item def-body
+ The argument is the body of code in a definition.  This is like
+ @code{body}, described above, but a definition body must be instrumented
+ with a different Edebug call that looks up information associated with
+ the definition.  Use @code{def-body} for the highest level list of forms
+ within the definition.
+ 
+ @item def-form
+ The argument is a single, highest-level form in a definition.  This is
+ like @code{def-body}, except use this to match a single form rather than
+ a list of forms.  As a special case, @code{def-form} also means that
+ tracing information is not output when the form is executed.  See the
+ @code{interactive} example below.
+ @end table
+ 
+ @node Backtracking
+ @subsubsection Backtracking
+ 
+ @cindex backtracking
+ @cindex syntax error (Edebug)
+ If a specification fails to match at some point, this does not
+ necessarily mean a syntax error will be signaled; instead,
+ @dfn{backtracking} will take place until all alternatives have been
+ exhausted.  Eventually every element of the argument list must be
+ matched by some element in the specification, and every required element
+ in the specification must match some argument.
+ 
+ Backtracking is disabled for the remainder of a sublist or group when
+ certain conditions occur, described below.  Backtracking is reenabled
+ when a new alternative is established by @code{&optional}, @code{&rest},
+ or @code{&or}.  It is also reenabled initially when processing a
+ sublist or group specification or an indirect specification.
+ 
+ You might want to disable backtracking to commit to some alternative so
+ that Edebug can provide a more specific syntax error message.  Normally,
+ if no alternative matches, Edebug reports that none matched, but if one
+ alternative is committed to, Edebug can report how it failed to match.
+ 
+ First, backtracking is disabled while matching any of the form
+ specifications (i.e. @code{form}, @code{body}, @code{def-form}, and
+ @code{def-body}).  These specifications will match any form so any error
+ must be in the form itself rather than at a higher level.
+ 
+ Second, backtracking is disabled after successfully matching a quoted
+ symbol or string specification, since this usually indicates a
+ recognized construct.  If you have a set of alternative constructs that
+ all begin with the same symbol, you can usually work around this
+ constraint by factoring the symbol out of the alternatives, e.g.,
+ @code{["foo" &or [first case] [second case] ...]}.
+ 
+ Third, backtracking may be explicitly disabled by using the
+ @code{gate} specification.  This is useful when you know that
+ no higher alternatives may apply.
+ 
+ @node Specification Examples
+ @subsubsection Specification Examples
+ 
+ It may be easier to understand Edebug specifications by studying
+ the examples provided here.
+ 
+ A @code{let} special form has a sequence of bindings and a body.  Each
+ of the bindings is either a symbol or a sublist with a symbol and
+ optional value.  In the specification below, notice the @code{gate}
+ inside of the sublist to prevent backtracking once a sublist is found.
+ 
+ @example
+ (def-edebug-spec let
+   ((&rest
+     &or symbolp (gate symbolp &optional form))
+    body))
+ @end example
+ 
+ Edebug uses the following specifications for @code{defun} and
+ @code{defmacro} and the associated argument list and @code{interactive}
+ specifications.  It is necessary to handle interactive forms specially
+ since an expression argument it is actually evaluated outside of the
+ function body.
+ 
+ @smallexample
+ (def-edebug-spec defmacro defun) ; @r{Indirect ref to @code{defun} spec.}
+ (def-edebug-spec defun 
+   (&define name lambda-list 
+            [&optional stringp]   ; @r{Match the doc string, if present.}
+            [&optional ("interactive" interactive)]
+            def-body))
+ 
+ (def-edebug-spec lambda-list
+   (([&rest arg]
+     [&optional ["&optional" arg &rest arg]]
+     &optional ["&rest" arg]
+     )))
+ 
+ (def-edebug-spec interactive
+   (&optional &or stringp def-form))    ; @r{Notice: @code{def-form}}
+ @end smallexample
+ 
+ The specification for backquote below illustrates how to match
+ dotted lists and use @code{nil} to terminate recursion.  It also
+ illustrates how components of a vector may be matched.  (The actual
+ specification defined by Edebug does not support dotted lists because
+ doing so causes very deep recursion that could fail.)
+ 
+ @smallexample
+ (def-edebug-spec ` (backquote-form))   ; @r{Alias just for clarity.}
+ 
+ (def-edebug-spec backquote-form
+   (&or ([&or "," ",@@"] &or ("quote" backquote-form) form)
+        (backquote-form . [&or nil backquote-form])
+        (vector &rest backquote-form)
+        sexp))
+ @end smallexample
+ 
+ 
+ @node Edebug Options
+ @subsection Edebug Options
+ 
+   These options affect the behavior of Edebug:
+ 
+ @defopt edebug-setup-hook
+ Functions to call before Edebug is used.  Each time it is set to a new
+ value, Edebug will call those functions once and then
+ @code{edebug-setup-hook} is reset to @code{nil}.  You could use this to
+ load up Edebug specifications associated with a package you are using
+ but only when you also use Edebug.
+ @xref{Instrumenting}.
+ @end defopt
+ 
+ @defopt edebug-all-defs
+ If this is non-@code{nil}, normal evaluation of defining forms such as
+ @code{defun} and @code{defmacro} instruments them for Edebug.  This
+ applies to @code{eval-defun}, @code{eval-region}, @code{eval-buffer},
+ and @code{eval-current-buffer}.
+ 
+ Use the command @kbd{M-x edebug-all-defs} to toggle the value of this
+ option.  @xref{Instrumenting}.
+ @end defopt
+ 
+ @defopt edebug-all-forms
+ If this is non-@code{nil}, the commands @code{eval-defun},
+ @code{eval-region}, @code{eval-buffer}, and @code{eval-current-buffer}
+ instrument all forms, even those that don't define anything.
+ This doesn't apply to loading or evaluations in the minibuffer.
+ 
+ Use the command @kbd{M-x edebug-all-forms} to toggle the value of this
+ option.  @xref{Instrumenting}.
+ @end defopt
+ 
+ @defopt edebug-save-windows
+ If this is non-@code{nil}, Edebug saves and restores the window
+ configuration.  That takes some time, so if your program does not care
+ what happens to the window configurations, it is better to set this
+ variable to @code{nil}.
+ 
+ If the value is a list, only the listed windows are saved and
+ restored.  
+ 
+ You can use the @kbd{W} command in Edebug to change this variable
+ interactively.  @xref{Edebug Display Update}.
+ @end defopt
+ 
+ @defopt edebug-save-displayed-buffer-points
+ If this is non-@code{nil}, Edebug saves and restores point in all
+ displayed buffers.
+ 
+ Saving and restoring point in other buffers is necessary if you are
+ debugging code that changes the point of a buffer which is displayed in
+ a non-selected window.  If Edebug or the user then selects the window,
+ point in that buffer will move to the window's value of point.
+ 
+ Saving and restoring point in all buffers is expensive, since it
+ requires selecting each window twice, so enable this only if you need
+ it.  @xref{Edebug Display Update}.
+ @end defopt
+ 
+ @defopt edebug-initial-mode
+ If this variable is non-@code{nil}, it specifies the initial execution
+ mode for Edebug when it is first activated.  Possible values are
+ @code{step}, @code{next}, @code{go}, @code{Go-nonstop}, @code{trace},
+ @code{Trace-fast}, @code{continue}, and @code{Continue-fast}.
+ 
+ The default value is @code{step}.  
+ @xref{Edebug Execution Modes}.
+ @end defopt
+ 
+ @defopt edebug-trace
+ @findex edebug-print-trace-before
+ @findex edebug-print-trace-after
+ Non-@code{nil} means display a trace of function entry and exit.
+ Tracing output is displayed in a buffer named @samp{*edebug-trace*}, one
+ function entry or exit per line, indented by the recursion level.  
+ 
+ The default value is @code{nil}.  
+ 
+ Also see @code{edebug-tracing}, in @xref{Trace Buffer}.
+ @end defopt
+ 
+ @defopt edebug-test-coverage 
+ If non-@code{nil}, Edebug tests coverage of all expressions debugged.
+ This is done by comparing the result of each expression
+ with the previous result. Coverage is considered OK if two different
+ results are found.  So to sufficiently test the coverage of your code,
+ try to execute it under conditions that evaluate all expressions more
+ than once, and produce different results for each expression.
+ 
+ Use @kbd{M-x edebug-display-freq-count} to display the frequency count
+ and coverage information for a definition.
+ @xref{Coverage Testing}.
+ @end defopt
+ 
+ @defopt edebug-continue-kbd-macro 
+ If non-@code{nil}, continue defining or executing any keyboard macro
+ that is executing outside of Edebug.   Use this with caution since it is not
+ debugged.
+ @xref{Edebug Execution Modes}.
+ @end defopt
+ 
+ @defopt edebug-print-length
+ If non-@code{nil}, bind @code{print-length} to this while printing
+ results in Edebug.  The default value is @code{50}.
+ @xref{Printing in Edebug}.
+ @end defopt
+ 
+ @defopt edebug-print-level 
+ If non-@code{nil}, bind @code{print-level} to this while printing
+ results in Edebug.  The default value is @code{50}.
+ @end defopt
+ 
+ @defopt edebug-print-circle 
+ If non-@code{nil}, bind @code{print-circle} to this while printing
+ results in Edebug.  The default value is @code{nil}.
+ @end defopt
+ 
+ @defopt edebug-on-error
+ Edebug binds @code{debug-on-error} to this value, if
+ @code{debug-on-error} was previously @code{nil}.  @xref{Trapping
+ Errors}.
+ @end defopt
+ 
+ @defopt edebug-on-quit
+ Edebug binds @code{debug-on-quit} to this value, if
+ @code{debug-on-quit} was previously @code{nil}.  @xref{Trapping
+ Errors}.
+ @end defopt
+ 
+   If you change the values of @code{edebug-on-error} or
+ @code{edebug-on-quit} while Edebug is active, their values won't be used
+ until the @emph{next} time Edebug is invoked via a new command.
+ @c Not necessarily a deeper command level.
+ @c A new command is not precisely true, but that is close enough -- dan
+ 
+ @defopt edebug-global-break-condition
+ If non-@code{nil}, an expression to test for at every stop point.
+ If the result is non-nil, then break.  Errors are ignored.
+ @xref{Global Break Condition}.
+ @end defopt
Index: emacs/man/elisp-errors.texi
diff -c /dev/null emacs/man/elisp-errors.texi:1.2
*** /dev/null	Fri Aug  2 20:51:36 1996
--- emacs/man/elisp-errors.texi	Thu Aug  1 00:22:40 1996
***************
*** 0 ****
--- 1,157 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/errors
+ @node Standard Errors, Standard Buffer-Local Variables, GNU Emacs Internals, Top
+ @appendix Standard Errors
+ 
+   Here is the complete list of the error symbols in standard Emacs,
+ grouped by concept.  The list includes each symbol's message (on the
+ @code{error-message} property of the symbol) and a cross reference to a
+ description of how the error can occur.
+ 
+   Each error symbol has an @code{error-conditions} property that is a
+ list of symbols.  Normally this list includes the error symbol itself
+ and the symbol @code{error}.  Occasionally it includes additional
+ symbols, which are intermediate classifications, narrower than
+ @code{error} but broader than a single error symbol.  For example, all
+ the errors in accessing files have the condition @code{file-error}.
+ 
+   As a special exception, the error symbol @code{quit} does not have the
+ condition @code{error}, because quitting is not considered an error.
+ 
+   @xref{Errors}, for an explanation of how errors are generated and
+ handled.
+ 
+ @table @code
+ @item @var{symbol}
+ @var{string}; @var{reference}.
+ 
+ @item error
+ @code{"error"}@*
+ @xref{Errors}.
+ 
+ @item quit
+ @code{"Quit"}@*
+ @xref{Quitting}.
+ 
+ @item args-out-of-range
+ @code{"Args out of range"}@*
+ @xref{Sequences Arrays Vectors}.
+ 
+ @item arith-error
+ @code{"Arithmetic error"}@*
+ See @code{/} and @code{%} in @ref{Numbers}.
+ 
+ @item beginning-of-buffer
+ @code{"Beginning of buffer"}@*
+ @xref{Motion}.
+ 
+ @item buffer-read-only
+ @code{"Buffer is read-only"}@*
+ @xref{Read Only Buffers}.
+ 
+ @item cyclic-function-indirection
+ @code{"Symbol's chain of function indirections contains a loop"}@*
+ @xref{Function Indirection}.
+ 
+ @item end-of-buffer
+ @code{"End of buffer"}@*
+ @xref{Motion}.
+ 
+ @item end-of-file
+ @code{"End of file during parsing"}@*
+ This is not a @code{file-error}.@*
+ @xref{Input Functions}.
+ 
+ @item file-error
+ This error and its subcategories do not have error-strings, because the
+ error message is constructed from the data items alone when the error
+ condition @code{file-error} is present.@*
+ @xref{Files}.
+ 
+ @item file-locked     
+ This is a @code{file-error}.@*
+ @xref{File Locks}.
+ 
+ @item file-already-exists
+ This is a @code{file-error}.@*
+ @xref{Writing to Files}.
+ 
+ @item file-supersession
+ This is a @code{file-error}.@*
+ @xref{Modification Time}.
+ 
+ @item invalid-function
+ @code{"Invalid function"}@*
+ @xref{Classifying Lists}.
+ 
+ @item invalid-read-syntax
+ @code{"Invalid read syntax"}@*
+ @xref{Input Functions}.
+ 
+ @item invalid-regexp
+ @code{"Invalid regexp"}@*
+ @xref{Regular Expressions}.
+ 
+ @item no-catch
+ @code{"No catch for tag"}@*
+ @xref{Catch and Throw}.
+ 
+ @item search-failed
+ @code{"Search failed"}@*
+ @xref{Searching and Matching}.
+ 
+ @item setting-constant
+ @code{"Attempt to set a constant symbol"}@* 
+ The values of the symbols @code{nil} and @code{t}
+ may not be changed.@*
+ @xref{Constant Variables, , Variables that Never Change}.
+ 
+ @item undefined-color
+ @code{"Undefined color"}@*
+ @xref{Color Names}.
+ 
+ @item void-function
+ @code{"Symbol's function definition is void"}@*
+ @xref{Function Cells}.
+ 
+ @item void-variable
+ @code{"Symbol's value as variable is void"}@*
+ @xref{Accessing Variables}.
+ 
+ @item wrong-number-of-arguments
+ @code{"Wrong number of arguments"}@*
+ @xref{Classifying Lists}.
+ 
+ @item wrong-type-argument
+ @code{"Wrong type argument"}@*
+ @xref{Type Predicates}.
+ @end table
+ 
+   These error types, which are all classified as special cases of
+ @code{arith-error}, can occur on certain systems for invalid use of
+ mathematical functions.
+ 
+ @table @code
+ @item domain-error
+ @code{"Arithmetic domain error"}@*
+ @xref{Math Functions}.
+ 
+ @item overflow-error
+ @code{"Arithmetic overflow error"}@*
+ @xref{Math Functions}.
+ 
+ @item range-error
+ @code{"Arithmetic range error"}@*
+ @xref{Math Functions}.
+ 
+ @item singularity-error
+ @code{"Arithmetic singularity error"}@*
+ @xref{Math Functions}.
+ 
+ @item underflow-error
+ @code{"Arithmetic underflow error"}@*
+ @xref{Math Functions}.
+ @end table
Index: emacs/man/elisp-eval.texi
diff -c /dev/null emacs/man/elisp-eval.texi:1.2
*** /dev/null	Fri Aug  2 20:51:41 1996
--- emacs/man/elisp-eval.texi	Thu Aug  1 00:22:41 1996
***************
*** 0 ****
--- 1,706 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/eval
+ @node Evaluation, Control Structures, Symbols, Top
+ @chapter Evaluation
+ @cindex evaluation
+ @cindex  interpreter
+ @cindex interpreter
+ @cindex value of expression
+ 
+   The @dfn{evaluation} of expressions in Emacs Lisp is performed by the
+ @dfn{Lisp interpreter}---a program that receives a Lisp object as input
+ and computes its @dfn{value as an expression}.  How it does this depends
+ on the data type of the object, according to rules described in this
+ chapter.  The interpreter runs automatically to evaluate portions of
+ your program, but can also be called explicitly via the Lisp primitive
+ function @code{eval}.
+ 
+ @ifinfo
+ @menu
+ * Intro Eval::  Evaluation in the scheme of things.
+ * Eval::        How to invoke the Lisp interpreter explicitly.
+ * Forms::       How various sorts of objects are evaluated.
+ * Quoting::     Avoiding evaluation (to put constants in the program).
+ @end menu
+ 
+ @node Intro Eval
+ @section Introduction to Evaluation
+ 
+   The Lisp interpreter, or evaluator, is the program that computes
+ the value of an expression that is given to it.  When a function 
+ written in Lisp is called, the evaluator computes the value of the
+ function by evaluating the expressions in the function body.  Thus,
+ running any Lisp program really means running the Lisp interpreter.
+ 
+   How the evaluator handles an object depends primarily on the data
+ type of the object.
+ @end ifinfo
+ 
+ @cindex forms
+ @cindex expression
+   A Lisp object that is intended for evaluation is called an
+ @dfn{expression} or a @dfn{form}.  The fact that expressions are data
+ objects and not merely text is one of the fundamental differences
+ between Lisp-like languages and typical programming languages.  Any
+ object can be evaluated, but in practice only numbers, symbols, lists
+ and strings are evaluated very often.
+ 
+   It is very common to read a Lisp expression and then evaluate the
+ expression, but reading and evaluation are separate activities, and
+ either can be performed alone.  Reading per se does not evaluate
+ anything; it converts the printed representation of a Lisp object to the
+ object itself.  It is up to the caller of @code{read} whether this
+ object is a form to be evaluated, or serves some entirely different
+ purpose.  @xref{Input Functions}.
+ 
+   Do not confuse evaluation with command key interpretation.  The
+ editor command loop translates keyboard input into a command (an
+ interactively callable function) using the active keymaps, and then
+ uses @code{call-interactively} to invoke the command.  The execution of
+ the command itself involves evaluation if the command is written in
+ Lisp, but that is not a part of command key interpretation itself.
+ @xref{Command Loop}.
+ 
+ @cindex recursive evaluation
+   Evaluation is a recursive process.  That is, evaluation of a form may
+ call @code{eval} to evaluate parts of the form.  For example, evaluation
+ of a function call first evaluates each argument of the function call,
+ and then evaluates each form in the function body.  Consider evaluation
+ of the form @code{(car x)}: the subform @code{x} must first be evaluated
+ recursively, so that its value can be passed as an argument to the
+ function @code{car}.
+ 
+   Evaluation of a function call ultimately calls the function specified
+ in it.  @xref{Functions}.  The execution of the function may itself work
+ by evaluating the function definition; or the function may be a Lisp
+ primitive implemented in C, or it may be a byte-compiled function
+ (@pxref{Byte Compilation}).
+ 
+ @cindex environment
+   The evaluation of forms takes place in a context called the
+ @dfn{environment}, which consists of the current values and bindings of
+ all Lisp variables.@footnote{This definition of ``environment'' is
+ specifically not intended to include all the data that can affect the
+ result of a program.}  Whenever the form refers to a variable without
+ creating a new binding for it, the value of the binding in the current
+ environment is used.  @xref{Variables}.
+ 
+ @cindex side effect
+   Evaluation of a form may create new environments for recursive
+ evaluation by binding variables (@pxref{Local Variables}).  These
+ environments are temporary and vanish by the time evaluation of the form
+ is complete.  The form may also make changes that persist; these changes
+ are called @dfn{side effects}.  An example of a form that produces side
+ effects is @code{(setq foo 1)}.
+ 
+   The details of what evaluation means for each kind of form are
+ described below (@pxref{Forms}).
+ 
+ @node Eval
+ @section Eval
+ @c ??? Perhaps this should be the last section in the chapter.
+ 
+   Most often, forms are evaluated automatically, by virtue of their
+ occurrence in a program being run.  On rare occasions, you may need to
+ write code that evaluates a form that is computed at run time, such as
+ after reading a form from text being edited or getting one from a
+ property list.  On these occasions, use the @code{eval} function.
+ 
+   @strong{Note:} it is generally cleaner and more flexible to call
+ functions that are stored in data structures, rather than to evaluate
+ expressions stored in data structures.  Using functions provides the
+ ability to pass information to them as arguments.
+ 
+   The functions and variables described in this section evaluate forms,
+ specify limits to the evaluation process, or record recently returned
+ values.  Loading a file also does evaluation (@pxref{Loading}).
+ 
+ @defun eval form
+ This is the basic function for performing evaluation.  It evaluates
+ @var{form} in the current environment and returns the result.  How the
+ evaluation proceeds depends on the type of the object (@pxref{Forms}).
+ 
+ Since @code{eval} is a function, the argument expression that appears
+ in a call to @code{eval} is evaluated twice: once as preparation before
+ @code{eval} is called, and again by the @code{eval} function itself.
+ Here is an example:
+ 
+ @example
+ @group
+ (setq foo 'bar)
+      @result{} bar
+ @end group
+ @group
+ (setq bar 'baz)
+      @result{} baz
+ ;; @r{@code{eval} receives argument @code{bar}, which is the value of @code{foo}}
+ (eval foo)
+      @result{} baz
+ (eval 'foo)
+      @result{} bar
+ @end group
+ @end example
+ 
+ The number of currently active calls to @code{eval} is limited to
+ @code{max-lisp-eval-depth} (see below).
+ @end defun
+ 
+ @deffn Command eval-region start end &optional stream
+ This function evaluates the forms in the current buffer in the region
+ defined by the positions @var{start} and @var{end}.  It reads forms from
+ the region and calls @code{eval} on them until the end of the region is
+ reached, or until an error is signaled and not handled.
+ 
+ If @var{stream} is supplied, @code{standard-output} is bound to it
+ during the evaluation.
+ 
+ You can use the variable @code{load-read-function} to specify a function
+ for @code{eval-region} to use instead of @code{read} for reading
+ expressions.  @xref{How Programs Do Loading}.
+ 
+ @code{eval-region} always returns @code{nil}.
+ @end deffn
+ 
+ @cindex evaluation of buffer contents
+ @deffn Command eval-current-buffer &optional stream
+ This is like @code{eval-region} except that it operates on the whole
+ buffer.
+ @end deffn
+ 
+ @defvar max-lisp-eval-depth
+ This variable defines the maximum depth allowed in calls to @code{eval},
+ @code{apply}, and @code{funcall} before an error is signaled (with error
+ message @code{"Lisp nesting exceeds max-lisp-eval-depth"}).  This counts
+ internal uses of those functions, such as for calling the functions
+ mentioned in Lisp expressions, and recursive evaluation of function call
+ arguments and function body forms.
+ 
+ This limit, with the associated error when it is exceeded, is one way
+ that Lisp avoids infinite recursion on an ill-defined function.
+ @cindex Lisp nesting error
+ 
+ The default value of this variable is 200.  If you set it to a value
+ less than 100, Lisp will reset it to 100 if the given value is reached.
+ 
+ @code{max-specpdl-size} provides another limit on nesting.
+ @xref{Local Variables}.
+ @end defvar
+ 
+ @defvar values
+ The value of this variable is a list of the values returned by all the
+ expressions that were read from buffers (including the minibuffer),
+ evaluated, and printed.  The elements are ordered most recent first.
+ 
+ @example
+ @group
+ (setq x 1)
+      @result{} 1
+ @end group
+ @group
+ (list 'A (1+ 2) auto-save-default)
+      @result{} (A 3 t)
+ @end group
+ @group
+ values
+      @result{} ((A 3 t) 1 @dots{})
+ @end group
+ @end example
+ 
+ This variable is useful for referring back to values of forms recently
+ evaluated.  It is generally a bad idea to print the value of
+ @code{values} itself, since this may be very long.  Instead, examine
+ particular elements, like this:
+ 
+ @example
+ @group
+ ;; @r{Refer to the most recent evaluation result.}
+ (nth 0 values)
+      @result{} (A 3 t)
+ @end group
+ @group
+ ;; @r{That put a new element on,}
+ ;;   @r{so all elements move back one.}
+ (nth 1 values)
+      @result{} (A 3 t)
+ @end group
+ @group
+ ;; @r{This gets the element that was next-to-most-recent}
+ ;;   @r{before this example.}
+ (nth 3 values)
+      @result{} 1
+ @end group
+ @end example
+ @end defvar
+ 
+ @node Forms
+ @section Kinds of Forms
+ 
+   A Lisp object that is intended to be evaluated is called a @dfn{form}.
+ How Emacs evaluates a form depends on its data type.  Emacs has three
+ different kinds of form that are evaluated differently: symbols, lists,
+ and ``all other types''.  This section describes all three kinds,
+ starting with ``all other types'' which are self-evaluating forms.
+ 
+ @menu
+ * Self-Evaluating Forms::   Forms that evaluate to themselves.
+ * Symbol Forms::            Symbols evaluate as variables.
+ * Classifying Lists::       How to distinguish various sorts of list forms.
+ * Function Indirection::    When a symbol appears as the car of a list,
+ 			      we find the real function via the symbol.
+ * Function Forms::          Forms that call functions.
+ * Macro Forms::             Forms that call macros.
+ * Special Forms::           ``Special forms'' are idiosyncratic primitives,
+                               most of them extremely important.
+ * Autoloading::             Functions set up to load files
+                               containing their real definitions.
+ @end menu
+ 
+ @node Self-Evaluating Forms
+ @subsection Self-Evaluating Forms
+ @cindex vector evaluation
+ @cindex literal evaluation
+ @cindex self-evaluating form
+ 
+   A @dfn{self-evaluating form} is any form that is not a list or symbol.
+ Self-evaluating forms evaluate to themselves: the result of evaluation
+ is the same object that was evaluated.  Thus, the number 25 evaluates to
+ 25, and the string @code{"foo"} evaluates to the string @code{"foo"}.
+ Likewise, evaluation of a vector does not cause evaluation of the
+ elements of the vector---it returns the same vector with its contents
+ unchanged.
+ 
+ @example
+ @group
+ '123               ; @r{An object, shown without evaluation.}
+      @result{} 123
+ @end group
+ @group
+ 123                ; @r{Evaluated as usual---result is the same.}
+      @result{} 123
+ @end group
+ @group
+ (eval '123)        ; @r{Evaluated ``by hand''---result is the same.}
+      @result{} 123
+ @end group
+ @group
+ (eval (eval '123)) ; @r{Evaluating twice changes nothing.}
+      @result{} 123
+ @end group
+ @end example
+ 
+   It is common to write numbers, characters, strings, and even vectors
+ in Lisp code, taking advantage of the fact that they self-evaluate.
+ However, it is quite unusual to do this for types that lack a read
+ syntax, because there's no way to write them textually.  It is possible
+ to construct Lisp expressions containing these types by means of a Lisp
+ program.  Here is an example:
+ 
+ @example
+ @group
+ ;; @r{Build an expression containing a buffer object.}
+ (setq buffer (list 'print (current-buffer)))
+      @result{} (print #<buffer eval.texi>)
+ @end group
+ @group
+ ;; @r{Evaluate it.}
+ (eval buffer)
+      @print{} #<buffer eval.texi>
+      @result{} #<buffer eval.texi>
+ @end group
+ @end example
+ 
+ @node Symbol Forms
+ @subsection Symbol Forms
+ @cindex symbol evaluation
+ 
+   When a symbol is evaluated, it is treated as a variable.  The result
+ is the variable's value, if it has one.  If it has none (if its value
+ cell is void), an error is signaled.  For more information on the use of
+ variables, see @ref{Variables}.
+ 
+   In the following example, we set the value of a symbol with
+ @code{setq}.  Then we evaluate the symbol, and get back the value that
+ @code{setq} stored.
+ 
+ @example
+ @group
+ (setq a 123)
+      @result{} 123
+ @end group
+ @group
+ (eval 'a)
+      @result{} 123
+ @end group
+ @group
+ a
+      @result{} 123
+ @end group
+ @end example
+ 
+   The symbols @code{nil} and @code{t} are treated specially, so that the
+ value of @code{nil} is always @code{nil}, and the value of @code{t} is
+ always @code{t}; you cannot set or bind them to any other values.  Thus,
+ these two symbols act like self-evaluating forms, even though
+ @code{eval} treats them like any other symbol.
+ 
+ @node Classifying Lists
+ @subsection Classification of List Forms
+ @cindex list form evaluation
+ 
+   A form that is a nonempty list is either a function call, a macro
+ call, or a special form, according to its first element.  These three
+ kinds of forms are evaluated in different ways, described below.  The
+ remaining list elements constitute the @dfn{arguments} for the function,
+ macro, or special form.
+ 
+   The first step in evaluating a nonempty list is to examine its first
+ element.  This element alone determines what kind of form the list is
+ and how the rest of the list is to be processed.  The first element is
+ @emph{not} evaluated, as it would be in some Lisp dialects such as
+ Scheme.
+ 
+ @node Function Indirection
+ @subsection Symbol Function Indirection
+ @cindex symbol function indirection
+ @cindex indirection
+ @cindex void function
+ 
+   If the first element of the list is a symbol then evaluation examines
+ the symbol's function cell, and uses its contents instead of the
+ original symbol.  If the contents are another symbol, this process,
+ called @dfn{symbol function indirection}, is repeated until it obtains a
+ non-symbol.  @xref{Function Names}, for more information about using a
+ symbol as a name for a function stored in the function cell of the
+ symbol.
+ 
+   One possible consequence of this process is an infinite loop, in the
+ event that a symbol's function cell refers to the same symbol.  Or a
+ symbol may have a void function cell, in which case the subroutine
+ @code{symbol-function} signals a @code{void-function} error.  But if
+ neither of these things happens, we eventually obtain a non-symbol,
+ which ought to be a function or other suitable object.
+ 
+ @kindex invalid-function
+ @cindex invalid function
+   More precisely, we should now have a Lisp function (a lambda
+ expression), a byte-code function, a primitive function, a Lisp macro, a
+ special form, or an autoload object.  Each of these types is a case
+ described in one of the following sections.  If the object is not one of
+ these types, the error @code{invalid-function} is signaled.
+ 
+   The following example illustrates the symbol indirection process.  We
+ use @code{fset} to set the function cell of a symbol and
+ @code{symbol-function} to get the function cell contents
+ (@pxref{Function Cells}).  Specifically, we store the symbol @code{car}
+ into the function cell of @code{first}, and the symbol @code{first} into
+ the function cell of @code{erste}.
+ 
+ @smallexample
+ @group
+ ;; @r{Build this function cell linkage:}
+ ;;   -------------       -----        -------        -------
+ ;;  | #<subr car> | <-- | car |  <-- | first |  <-- | erste |
+ ;;   -------------       -----        -------        -------
+ @end group
+ @end smallexample
+ 
+ @smallexample
+ @group
+ (symbol-function 'car)
+      @result{} #<subr car>
+ @end group
+ @group
+ (fset 'first 'car)
+      @result{} car
+ @end group
+ @group
+ (fset 'erste 'first)
+      @result{} first
+ @end group
+ @group
+ (erste '(1 2 3))   ; @r{Call the function referenced by @code{erste}.}
+      @result{} 1
+ @end group
+ @end smallexample
+ 
+   By contrast, the following example calls a function without any symbol
+ function indirection, because the first element is an anonymous Lisp
+ function, not a symbol.
+ 
+ @smallexample
+ @group
+ ((lambda (arg) (erste arg))
+  '(1 2 3)) 
+      @result{} 1
+ @end group
+ @end smallexample
+ 
+ @noindent
+ Executing the function itself evaluates its body; this does involve
+ symbol function indirection when calling @code{erste}.
+ 
+   The built-in function @code{indirect-function} provides an easy way to
+ perform symbol function indirection explicitly.
+ 
+ @c Emacs 19 feature
+ @defun indirect-function function
+ This function returns the meaning of @var{function} as a function.  If
+ @var{function} is a symbol, then it finds @var{function}'s function
+ definition and starts over with that value.  If @var{function} is not a
+ symbol, then it returns @var{function} itself.
+ 
+ Here is how you could define @code{indirect-function} in Lisp:
+ 
+ @smallexample
+ (defun indirect-function (function)
+   (if (symbolp function)
+       (indirect-function (symbol-function function))
+     function))
+ @end smallexample
+ @end defun
+ 
+ @node Function Forms
+ @subsection Evaluation of Function Forms
+ @cindex function form evaluation
+ @cindex function call
+ 
+   If the first element of a list being evaluated is a Lisp function
+ object, byte-code object or primitive function object, then that list is
+ a @dfn{function call}.  For example, here is a call to the function
+ @code{+}:
+ 
+ @example
+ (+ 1 x)
+ @end example
+ 
+   The first step in evaluating a function call is to evaluate the
+ remaining elements of the list from left to right.  The results are the
+ actual argument values, one value for each list element.  The next step
+ is to call the function with this list of arguments, effectively using
+ the function @code{apply} (@pxref{Calling Functions}).  If the function
+ is written in Lisp, the arguments are used to bind the argument
+ variables of the function (@pxref{Lambda Expressions}); then the forms
+ in the function body are evaluated in order, and the value of the last
+ body form becomes the value of the function call.
+ 
+ @node Macro Forms
+ @subsection Lisp Macro Evaluation
+ @cindex macro call evaluation
+ 
+   If the first element of a list being evaluated is a macro object, then
+ the list is a @dfn{macro call}.  When a macro call is evaluated, the
+ elements of the rest of the list are @emph{not} initially evaluated.
+ Instead, these elements themselves are used as the arguments of the
+ macro.  The macro definition computes a replacement form, called the
+ @dfn{expansion} of the macro, to be evaluated in place of the original
+ form.  The expansion may be any sort of form: a self-evaluating
+ constant, a symbol, or a list.  If the expansion is itself a macro call,
+ this process of expansion repeats until some other sort of form results.
+ 
+   Ordinary evaluation of a macro call finishes by evaluating the
+ expansion.  However, the macro expansion is not necessarily evaluated
+ right away, or at all, because other programs also expand macro calls,
+ and they may or may not evaluate the expansions.
+ 
+   Normally, the argument expressions are not evaluated as part of
+ computing the macro expansion, but instead appear as part of the
+ expansion, so they are computed when the expansion is computed.
+ 
+   For example, given a macro defined as follows:
+ 
+ @example
+ @group
+ (defmacro cadr (x)
+   (list 'car (list 'cdr x)))
+ @end group
+ @end example
+ 
+ @noindent
+ an expression such as @code{(cadr (assq 'handler list))} is a macro
+ call, and its expansion is:
+ 
+ @example
+ (car (cdr (assq 'handler list)))
+ @end example
+ 
+ @noindent
+ Note that the argument @code{(assq 'handler list)} appears in the
+ expansion.
+ 
+ @xref{Macros}, for a complete description of Emacs Lisp macros.
+ 
+ @node Special Forms
+ @subsection Special Forms
+ @cindex special form evaluation
+ 
+   A @dfn{special form} is a primitive function specially marked so that
+ its arguments are not all evaluated.  Most special forms define control
+ structures or perform variable bindings---things which functions cannot
+ do.
+ 
+   Each special form has its own rules for which arguments are evaluated
+ and which are used without evaluation.  Whether a particular argument is
+ evaluated may depend on the results of evaluating other arguments.
+ 
+   Here is a list, in alphabetical order, of all of the special forms in
+ Emacs Lisp with a reference to where each is described.
+ 
+ @table @code
+ @item and
+ @pxref{Combining Conditions}
+ 
+ @item catch
+ @pxref{Catch and Throw}
+ 
+ @item cond
+ @pxref{Conditionals}
+ 
+ @item condition-case
+ @pxref{Handling Errors}
+ 
+ @item defconst
+ @pxref{Defining Variables}
+ 
+ @item defmacro
+ @pxref{Defining Macros}
+ 
+ @item defun
+ @pxref{Defining Functions}
+ 
+ @item defvar
+ @pxref{Defining Variables}
+ 
+ @item function
+ @pxref{Anonymous Functions}
+ 
+ @item if
+ @pxref{Conditionals}
+ 
+ @item interactive
+ @pxref{Interactive Call}
+ 
+ @item let
+ @itemx let*
+ @pxref{Local Variables}
+ 
+ @item or
+ @pxref{Combining Conditions}
+ 
+ @item prog1
+ @itemx prog2
+ @itemx progn
+ @pxref{Sequencing}
+ 
+ @item quote
+ @pxref{Quoting}
+ 
+ @item save-excursion
+ @pxref{Excursions}
+ 
+ @item save-restriction
+ @pxref{Narrowing}
+ 
+ @item save-window-excursion
+ @pxref{Window Configurations}
+ 
+ @item setq
+ @pxref{Setting Variables}
+ 
+ @item setq-default
+ @pxref{Creating Buffer-Local}
+ 
+ @item track-mouse
+ @pxref{Mouse Tracking}
+ 
+ @item unwind-protect
+ @pxref{Nonlocal Exits}
+ 
+ @item while
+ @pxref{Iteration}
+ 
+ @item with-output-to-temp-buffer
+ @pxref{Temporary Displays}
+ @end table
+ 
+ @cindex CL note---special forms compared
+ @quotation
+ @b{Common Lisp note:} Here are some comparisons of special forms in
+ GNU Emacs Lisp and Common Lisp.  @code{setq}, @code{if}, and
+ @code{catch} are special forms in both Emacs Lisp and Common Lisp.
+ @code{defun} is a special form in Emacs Lisp, but a macro in Common
+ Lisp.  @code{save-excursion} is a special form in Emacs Lisp, but
+ doesn't exist in Common Lisp.  @code{throw} is a special form in
+ Common Lisp (because it must be able to throw multiple values), but it
+ is a function in Emacs Lisp (which doesn't have multiple
+ values).@refill
+ @end quotation
+ 
+ @node Autoloading
+ @subsection Autoloading
+ 
+   The @dfn{autoload} feature allows you to call a function or macro
+ whose function definition has not yet been loaded into Emacs.  It
+ specifies which file contains the definition.  When an autoload object
+ appears as a symbol's function definition, calling that symbol as a
+ function automatically loads the specified file; then it calls the real
+ definition loaded from that file.  @xref{Autoload}.
+ 
+ @node Quoting
+ @section Quoting
+ @cindex quoting
+ 
+   The special form @code{quote} returns its single argument, as written,
+ without evaluating it.  This provides a way to include constant symbols
+ and lists, which are not self-evaluating objects, in a program.  (It is
+ not necessary to quote self-evaluating objects such as numbers, strings,
+ and vectors.)
+ 
+ @defspec quote object
+ This special form returns @var{object}, without evaluating it.
+ @end defspec
+ 
+ @cindex @samp{'} for quoting
+ @cindex quoting using apostrophe
+ @cindex apostrophe for quoting
+ Because @code{quote} is used so often in programs, Lisp provides a
+ convenient read syntax for it.  An apostrophe character (@samp{'})
+ followed by a Lisp object (in read syntax) expands to a list whose first
+ element is @code{quote}, and whose second element is the object.  Thus,
+ the read syntax @code{'x} is an abbreviation for @code{(quote x)}.
+ 
+ Here are some examples of expressions that use @code{quote}:
+ 
+ @example
+ @group
+ (quote (+ 1 2))
+      @result{} (+ 1 2)
+ @end group
+ @group
+ (quote foo)
+      @result{} foo
+ @end group
+ @group
+ 'foo
+      @result{} foo
+ @end group
+ @group
+ ''foo
+      @result{} (quote foo)
+ @end group
+ @group
+ '(quote foo)
+      @result{} (quote foo)
+ @end group
+ @group
+ ['foo]
+      @result{} [(quote foo)]
+ @end group
+ @end example
+ 
+   Other quoting constructs include @code{function} (@pxref{Anonymous
+ Functions}), which causes an anonymous lambda expression written in Lisp
+ to be compiled, and @samp{`} (@pxref{Backquote}), which is used to quote
+ only part of a list, while computing and substituting other parts.
Index: emacs/man/elisp-files.texi
diff -c /dev/null emacs/man/elisp-files.texi:1.2
*** /dev/null	Fri Aug  2 20:51:51 1996
--- emacs/man/elisp-files.texi	Thu Aug  1 00:22:43 1996
***************
*** 0 ****
--- 1,2203 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/files
+ @node Files, Backups and Auto-Saving, Documentation, Top
+ @comment  node-name,  next,  previous,  up
+ @chapter Files
+ 
+   In Emacs, you can find, create, view, save, and otherwise work with
+ files and file directories.  This chapter describes most of the
+ file-related functions of Emacs Lisp, but a few others are described in
+ @ref{Buffers}, and those related to backups and auto-saving are
+ described in @ref{Backups and Auto-Saving}.
+ 
+   Many of the file functions take one or more arguments that are file
+ names.  A file name is actually a string.  Most of these functions
+ expand file name arguments using @code{expand-file-name}, so that
+ @file{~} is handled correctly, as are relative file names (including
+ @samp{../}).  These functions don't recognize environment variable
+ substitutions such as @samp{$HOME}.  @xref{File Name Expansion}.
+ 
+ @menu
+ * Visiting Files::           Reading files into Emacs buffers for editing.
+ * Saving Buffers::           Writing changed buffers back into files.
+ * Reading from Files::       Reading files into buffers without visiting.
+ * Writing to Files::         Writing new files from parts of buffers.
+ * File Locks::               Locking and unlocking files, to prevent
+                                simultaneous editing by two people.
+ * Information about Files::  Testing existence, accessibility, size of files.
+ * Changing File Attributes:: Renaming files, changing protection, etc.
+ * File Names::               Decomposing and expanding file names.
+ * Contents of Directories::  Getting a list of the files in a directory.
+ * Create/Delete Dirs::	     Creating and Deleting Directories.
+ * Magic File Names::	     Defining "magic" special handling
+ 			       for certain file names.
+ * Format Conversion::        Conversion to and from various file formats.
+ * Files and MS-DOS::         Distinguishing text and binary files on MS-DOS.
+ @end menu
+ 
+ @node Visiting Files
+ @section Visiting Files
+ @cindex finding files
+ @cindex visiting files
+ 
+   Visiting a file means reading a file into a buffer.  Once this is
+ done, we say that the buffer is @dfn{visiting} that file, and call the
+ file ``the visited file'' of the buffer.
+ 
+   A file and a buffer are two different things.  A file is information
+ recorded permanently in the computer (unless you delete it).  A buffer,
+ on the other hand, is information inside of Emacs that will vanish at
+ the end of the editing session (or when you kill the buffer).  Usually,
+ a buffer contains information that you have copied from a file; then we
+ say the buffer is visiting that file.  The copy in the buffer is what
+ you modify with editing commands.  Such changes to the buffer do not
+ change the file; therefore, to make the changes permanent, you must
+ @dfn{save} the buffer, which means copying the altered buffer contents
+ back into the file.
+ 
+   In spite of the distinction between files and buffers, people often
+ refer to a file when they mean a buffer and vice-versa.  Indeed, we say,
+ ``I am editing a file,'' rather than, ``I am editing a buffer that I
+ will soon save as a file of the same name.''  Humans do not usually need
+ to make the distinction explicit.  When dealing with a computer program,
+ however, it is good to keep the distinction in mind.
+ 
+ @menu
+ * Visiting Functions::         The usual interface functions for visiting.
+ * Subroutines of Visiting::    Lower-level subroutines that they use.
+ @end menu
+ 
+ @node Visiting Functions
+ @subsection Functions for Visiting Files
+ 
+   This section describes the functions normally used to visit files.
+ For historical reasons, these functions have names starting with
+ @samp{find-} rather than @samp{visit-}.  @xref{Buffer File Name}, for
+ functions and variables that access the visited file name of a buffer or
+ that find an existing buffer by its visited file name.
+ 
+   In a Lisp program, if you want to look at the contents of a file but
+ not alter it, the fastest way is to use @code{insert-file-contents} in a
+ temporary buffer.  Visiting the file is not necessary and takes longer.
+ @xref{Reading from Files}.
+ 
+ @deffn Command find-file filename
+ This command selects a buffer visiting the file @var{filename},
+ using an existing buffer if there is one, and otherwise creating a 
+ new buffer and reading the file into it.  It also returns that buffer.
+ 
+ The body of the @code{find-file} function is very simple and looks
+ like this:
+ 
+ @example
+ (switch-to-buffer (find-file-noselect filename))
+ @end example
+ 
+ @noindent
+ (See @code{switch-to-buffer} in @ref{Displaying Buffers}.)
+ 
+ When @code{find-file} is called interactively, it prompts for
+ @var{filename} in the minibuffer.
+ @end deffn
+ 
+ @defun find-file-noselect filename
+ This function is the guts of all the file-visiting functions.  It finds
+ or creates a buffer visiting the file @var{filename}, and returns it.
+ It uses an existing buffer if there is one, and otherwise creates a new
+ buffer and reads the file into it.  You may make the buffer current or
+ display it in a window if you wish, but this function does not do so.
+ 
+ When @code{find-file-noselect} uses an existing buffer, it first
+ verifies that the file has not changed since it was last visited or
+ saved in that buffer.  If the file has changed, then this function asks
+ the user whether to reread the changed file.  If the user says
+ @samp{yes}, any changes previously made in the buffer are lost.
+ 
+ If @code{find-file-noselect} needs to create a buffer, and there is no
+ file named @var{filename}, it displays the message @samp{New file} in
+ the echo area, and leaves the buffer empty.
+ 
+ The @code{find-file-noselect} function calls @code{after-find-file}
+ after reading the file (@pxref{Subroutines of Visiting}).  That function
+ sets the buffer major mode, parses local variables, warns the user if
+ there exists an auto-save file more recent than the file just visited,
+ and finishes by running the functions in @code{find-file-hooks}.
+ 
+ The @code{find-file-noselect} function returns the buffer that is
+ visiting the file @var{filename}.
+ 
+ @example
+ @group
+ (find-file-noselect "/etc/fstab")
+      @result{} #<buffer fstab>
+ @end group
+ @end example
+ @end defun
+ 
+ @deffn Command find-file-other-window filename
+ This command selects a buffer visiting the file @var{filename}, but
+ does so in a window other than the selected window.  It may use another
+ existing window or split a window; see @ref{Displaying Buffers}.
+ 
+ When this command is called interactively, it prompts for
+ @var{filename}.
+ @end deffn
+ 
+ @deffn Command find-file-read-only filename
+ This command selects a buffer visiting the file @var{filename}, like
+ @code{find-file}, but it marks the buffer as read-only.  @xref{Read Only
+ Buffers}, for related functions and variables.
+ 
+ When this command is called interactively, it prompts for
+ @var{filename}.
+ @end deffn
+ 
+ @deffn Command view-file filename
+ This command visits @var{filename} in View mode, and displays it in a
+ recursive edit, returning to the previous buffer when done.  View mode
+ is a mode that allows you to skim rapidly through the file but does not
+ let you modify it.  Entering View mode runs the normal hook
+ @code{view-mode-hook}.  @xref{Hooks}.
+ 
+ When @code{view-file} is called interactively, it prompts for
+ @var{filename}.
+ @end deffn
+ 
+ @defvar find-file-hooks
+ The value of this variable is a list of functions to be called after a
+ file is visited.  The file's local-variables specification (if any) will
+ have been processed before the hooks are run.  The buffer visiting the
+ file is current when the hook functions are run.
+ 
+ This variable works just like a normal hook, but we think that renaming
+ it would not be advisable.
+ @end defvar
+ 
+ @defvar find-file-not-found-hooks
+ The value of this variable is a list of functions to be called when
+ @code{find-file} or @code{find-file-noselect} is passed a nonexistent
+ file name.  @code{find-file-noselect} calls these functions as soon as
+ it detects a nonexistent file.  It calls them in the order of the list,
+ until one of them returns non-@code{nil}.  @code{buffer-file-name} is
+ already set up.
+ 
+ This is not a normal hook because the values of the functions are
+ used and they may not all be called.
+ @end defvar
+ 
+ @node Subroutines of Visiting
+ @comment  node-name,  next,  previous,  up
+ @subsection Subroutines of Visiting
+ 
+   The @code{find-file-noselect} function uses the
+ @code{create-file-buffer} and @code{after-find-file} functions as
+ subroutines.  Sometimes it is useful to call them directly.
+ 
+ @defun create-file-buffer filename
+ This function creates a suitably named buffer for visiting
+ @var{filename}, and returns it.  It uses @var{filename} (sans directory)
+ as the name if that name is free; otherwise, it appends a string such as
+ @samp{<2>} to get an unused name.  See also @ref{Creating Buffers}.
+ 
+ @strong{Please note:} @code{create-file-buffer} does @emph{not}
+ associate the new buffer with a file and does not select the buffer.
+ It also does not use the default major mode.
+ 
+ @example
+ @group
+ (create-file-buffer "foo")
+      @result{} #<buffer foo>
+ @end group
+ @group
+ (create-file-buffer "foo")
+      @result{} #<buffer foo<2>>
+ @end group
+ @group
+ (create-file-buffer "foo")
+      @result{} #<buffer foo<3>>
+ @end group
+ @end example
+ 
+ This function is used by @code{find-file-noselect}.
+ It uses @code{generate-new-buffer} (@pxref{Creating Buffers}).
+ @end defun
+ 
+ @defun after-find-file &optional error warn
+ This function sets the buffer major mode, and parses local variables
+ (@pxref{Auto Major Mode}).  It is called by @code{find-file-noselect}
+ and by the default revert function (@pxref{Reverting}).
+ 
+ @cindex new file message
+ @cindex file open error
+ If reading the file got an error because the file does not exist, but
+ its directory does exist, the caller should pass a non-@code{nil} value
+ for @var{error}.  In that case, @code{after-find-file} issues a warning:
+ @samp{(New File)}.  For more serious errors, the caller should usually not
+ call @code{after-find-file}.
+ 
+ If @var{warn} is non-@code{nil}, then this function issues a warning
+ if an auto-save file exists and is more recent than the visited file.
+ 
+ The last thing @code{after-find-file} does is call all the functions
+ in @code{find-file-hooks}.
+ @end defun
+ 
+ @node Saving Buffers
+ @section Saving Buffers
+ 
+   When you edit a file in Emacs, you are actually working on a buffer
+ that is visiting that file---that is, the contents of the file are
+ copied into the buffer and the copy is what you edit.  Changes to the
+ buffer do not change the file until you @dfn{save} the buffer, which
+ means copying the contents of the buffer into the file.
+ 
+ @deffn Command save-buffer &optional backup-option
+ This function saves the contents of the current buffer in its visited
+ file if the buffer has been modified since it was last visited or saved.
+ Otherwise it does nothing.
+ 
+ @code{save-buffer} is responsible for making backup files.  Normally,
+ @var{backup-option} is @code{nil}, and @code{save-buffer} makes a backup
+ file only if this is the first save since visiting the file.  Other
+ values for @var{backup-option} request the making of backup files in
+ other circumstances:
+ 
+ @itemize @bullet
+ @item
+ With an argument of 4 or 64, reflecting 1 or 3 @kbd{C-u}'s, the
+ @code{save-buffer} function marks this version of the file to be
+ backed up when the buffer is next saved.
+ 
+ @item
+ With an argument of 16 or 64, reflecting 2 or 3 @kbd{C-u}'s, the
+ @code{save-buffer} function unconditionally backs up the previous
+ version of the file before saving it.
+ @end itemize
+ @end deffn
+ 
+ @deffn Command save-some-buffers &optional save-silently-p exiting
+ This command saves some modified file-visiting buffers.  Normally it
+ asks the user about each buffer.  But if @var{save-silently-p} is
+ non-@code{nil}, it saves all the file-visiting buffers without querying
+ the user.
+ 
+ The optional @var{exiting} argument, if non-@code{nil}, requests this
+ function to offer also to save certain other buffers that are not
+ visiting files.  These are buffers that have a non-@code{nil} local
+ value of @code{buffer-offer-save}.  (A user who says yes to saving one
+ of these is asked to specify a file name to use.)  The
+ @code{save-buffers-kill-emacs} function passes a non-@code{nil} value
+ for this argument.
+ @end deffn
+ 
+ @defvar buffer-offer-save
+ When this variable is non-@code{nil} in a buffer, Emacs offers to save
+ the buffer on exit even if the buffer is not visiting a file.  The
+ variable is automatically local in all buffers.  Normally, Mail mode
+ (used for editing outgoing mail) sets this to @code{t}.
+ @end defvar
+ 
+ @deffn Command write-file filename
+ This function writes the current buffer into file @var{filename}, makes
+ the buffer visit that file, and marks it not modified.  Then it renames
+ the buffer based on @var{filename}, appending a string like @samp{<2>}
+ if necessary to make a unique buffer name.  It does most of this work by
+ calling @code{set-visited-file-name} and @code{save-buffer}.
+ @end deffn
+ 
+ @defvar write-file-hooks
+ The value of this variable is a list of functions to be called before
+ writing out a buffer to its visited file.  If one of them returns
+ non-@code{nil}, the file is considered already written and the rest of
+ the functions are not called, nor is the usual code for writing the file
+ executed.
+ 
+ If a function in @code{write-file-hooks} returns non-@code{nil}, it
+ is responsible for making a backup file (if that is appropriate).
+ To do so, execute the following code:
+ 
+ @example
+ (or buffer-backed-up (backup-buffer))
+ @end example
+ 
+ You might wish to save the file modes value returned by
+ @code{backup-buffer} and use that to set the mode bits of the file that
+ you write.  This is what @code{save-buffer} normally does.
+ 
+ Even though this is not a normal hook, you can use @code{add-hook} and
+ @code{remove-hook} to manipulate the list.  @xref{Hooks}.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @defvar local-write-file-hooks
+ This works just like @code{write-file-hooks}, but it is intended
+ to be made local to particular buffers.  It's not a good idea to make
+ @code{write-file-hooks} local to a buffer---use this variable instead.
+ 
+ The variable is marked as a permanent local, so that changing the major
+ mode does not alter a buffer-local value.  This is convenient for
+ packages that read ``file'' contents in special ways, and set up hooks
+ to save the data in a corresponding way.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @defvar write-contents-hooks
+ This works just like @code{write-file-hooks}, but it is intended for
+ hooks that pertain to the contents of the file, as opposed to hooks that
+ pertain to where the file came from.  Such hooks are usually set up by
+ major modes, as buffer-local bindings for this variable.  Switching to a
+ new major mode always resets this variable.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @defvar after-save-hook
+ This normal hook runs after a buffer has been saved in its visited file.
+ @end defvar
+ 
+ @defvar file-precious-flag
+ If this variable is non-@code{nil}, then @code{save-buffer} protects
+ against I/O errors while saving by writing the new file to a temporary
+ name instead of the name it is supposed to have, and then renaming it to
+ the intended name after it is clear there are no errors.  This procedure
+ prevents problems such as a lack of disk space from resulting in an
+ invalid file.
+ 
+ As a side effect, backups are necessarily made by copying.  @xref{Rename
+ or Copy}.  Yet, at the same time, saving a precious file always breaks
+ all hard links between the file you save and other file names.
+ 
+ Some modes set this variable non-@code{nil} locally in particular
+ buffers.
+ @end defvar
+ 
+ @defopt require-final-newline
+ This variable determines whether files may be written out that do
+ @emph{not} end with a newline.  If the value of the variable is
+ @code{t}, then @code{save-buffer} silently adds a newline at the end of
+ the file whenever the buffer being saved does not already end in one.
+ If the value of the variable is non-@code{nil}, but not @code{t}, then
+ @code{save-buffer} asks the user whether to add a newline each time the
+ case arises.
+ 
+ If the value of the variable is @code{nil}, then @code{save-buffer}
+ doesn't add newlines at all.  @code{nil} is the default value, but a few
+ major modes set it to @code{t} in particular buffers.
+ @end defopt
+ 
+ @node Reading from Files
+ @comment  node-name,  next,  previous,  up
+ @section Reading from Files
+ 
+   You can copy a file from the disk and insert it into a buffer
+ using the @code{insert-file-contents} function.  Don't use the user-level
+ command @code{insert-file} in a Lisp program, as that sets the mark.
+ 
+ @defun insert-file-contents filename &optional visit beg end replace
+ This function inserts the contents of file @var{filename} into the
+ current buffer after point.  It returns a list of the absolute file name
+ and the length of the data inserted.  An error is signaled if
+ @var{filename} is not the name of a file that can be read.
+ 
+ The function @code{insert-file-contents} checks the file contents
+ against the defined file formats, and converts the file contents if
+ appropriate.  @xref{Format Conversion}.  It also calls the functions in
+ the list @code{after-insert-file-functions}; see @ref{Saving
+ Properties}.
+ 
+ If @var{visit} is non-@code{nil}, this function additionally marks the
+ buffer as unmodified and sets up various fields in the buffer so that it
+ is visiting the file @var{filename}: these include the buffer's visited
+ file name and its last save file modtime.  This feature is used by
+ @code{find-file-noselect} and you probably should not use it yourself.
+ 
+ If @var{beg} and @var{end} are non-@code{nil}, they should be integers
+ specifying the portion of the file to insert.  In this case, @var{visit}
+ must be @code{nil}.  For example,
+ 
+ @example
+ (insert-file-contents filename nil 0 500)
+ @end example
+ 
+ @noindent
+ inserts the first 500 characters of a file.
+ 
+ If the argument @var{replace} is non-@code{nil}, it means to replace the
+ contents of the buffer (actually, just the accessible portion) with the
+ contents of the file.  This is better than simply deleting the buffer
+ contents and inserting the whole file, because (1) it preserves some
+ marker positions and (2) it puts less data in the undo list.
+ @end defun
+ 
+ If you want to pass a file name to another process so that another
+ program can read the file, use the function @code{file-local-copy}; see
+ @ref{Magic File Names}.
+ 
+ @node Writing to Files
+ @comment  node-name,  next,  previous,  up
+ @section Writing to Files
+ 
+   You can write the contents of a buffer, or part of a buffer, directly
+ to a file on disk using the @code{append-to-file} and
+ @code{write-region} functions.  Don't use these functions to write to
+ files that are being visited; that could cause confusion in the
+ mechanisms for visiting.
+ 
+ @deffn Command append-to-file start end filename
+ This function appends the contents of the region delimited by
+ @var{start} and @var{end} in the current buffer to the end of file
+ @var{filename}.  If that file does not exist, it is created.  This
+ function returns @code{nil}.
+ 
+ An error is signaled if @var{filename} specifies a nonwritable file,
+ or a nonexistent file in a directory where files cannot be created.
+ @end deffn
+ 
+ @deffn Command write-region start end filename &optional append visit
+ This function writes the region delimited by @var{start} and @var{end}
+ in the current buffer into the file specified by @var{filename}.
+ 
+ @c Emacs 19 feature
+ If @var{start} is a string, then @code{write-region} writes or appends
+ that string, rather than text from the buffer.
+ 
+ If @var{append} is non-@code{nil}, then the specified text is appended
+ to the existing file contents (if any).
+ 
+ If @var{visit} is @code{t}, then Emacs establishes an association
+ between the buffer and the file: the buffer is then visiting that file.
+ It also sets the last file modification time for the current buffer to
+ @var{filename}'s modtime, and marks the buffer as not modified.  This
+ feature is used by @code{save-buffer}, but you probably should not use
+ it yourself.
+ 
+ @c Emacs 19 feature
+ If @var{visit} is a string, it specifies the file name to visit.  This
+ way, you can write the data to one file (@var{filename}) while recording
+ the buffer as visiting another file (@var{visit}).  The argument
+ @var{visit} is used in the echo area message and also for file locking;
+ @var{visit} is stored in @code{buffer-file-name}.  This feature is used
+ to implement @code{file-precious-flag}; don't use it yourself unless you
+ really know what you're doing.
+ 
+ The function @code{write-region} converts the data which it writes to
+ the appropriate file formats specified by @code{buffer-file-format}.
+ @xref{Format Conversion}.  It also calls the functions in the list
+ @code{write-region-annotate-functions}; see @ref{Saving Properties}.
+ 
+ Normally, @code{write-region} displays a message @samp{Wrote file
+ @var{filename}} in the echo area.  If @var{visit} is neither @code{t}
+ nor @code{nil} nor a string, then this message is inhibited.  This
+ feature is useful for programs that use files for internal purposes,
+ files that the user does not need to know about.
+ @end deffn
+ 
+ @node File Locks
+ @section File Locks
+ @cindex file locks
+ 
+   When two users edit the same file at the same time, they are likely to
+ interfere with each other.  Emacs tries to prevent this situation from
+ arising by recording a @dfn{file lock} when a file is being modified.
+ Emacs can then detect the first attempt to modify a buffer visiting a
+ file that is locked by another Emacs job, and ask the user what to do.
+ 
+   File locks do not work properly when multiple machines can share
+ file systems, such as with NFS.  Perhaps a better file locking system
+ will be implemented in the future.  When file locks do not work, it is
+ possible for two users to make changes simultaneously, but Emacs can
+ still warn the user who saves second.  Also, the detection of
+ modification of a buffer visiting a file changed on disk catches some
+ cases of simultaneous editing; see @ref{Modification Time}.
+ 
+ @defun file-locked-p filename
+   This function returns @code{nil} if the file @var{filename} is not
+ locked by this Emacs process.  It returns @code{t} if it is locked by
+ this Emacs, and it returns the name of the user who has locked it if it
+ is locked by someone else.
+ 
+ @example
+ @group
+ (file-locked-p "foo")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun lock-buffer &optional filename
+   This function locks the file @var{filename}, if the current buffer is
+ modified.  The argument @var{filename} defaults to the current buffer's
+ visited file.  Nothing is done if the current buffer is not visiting a
+ file, or is not modified.
+ @end defun
+ 
+ @defun unlock-buffer
+ This function unlocks the file being visited in the current buffer,
+ if the buffer is modified.  If the buffer is not modified, then
+ the file should not be locked, so this function does nothing.  It also
+ does nothing if the current buffer is not visiting a file.
+ @end defun
+ 
+ @defun ask-user-about-lock file other-user
+ This function is called when the user tries to modify @var{file}, but it
+ is locked by another user named @var{other-user}.  The value it returns
+ determines what happens next:
+ 
+ @itemize @bullet
+ @item
+ A value of @code{t} says to grab the lock on the file.  Then
+ this user may edit the file and @var{other-user} loses the lock.
+ 
+ @item
+ A value of @code{nil} says to ignore the lock and let this
+ user edit the file anyway.
+ 
+ @item
+ @kindex file-locked
+ This function may instead signal a @code{file-locked} error, in which
+ case the change that the user was about to make does not take place.
+ 
+ The error message for this error looks like this:
+ 
+ @example
+ @error{} File is locked: @var{file} @var{other-user}
+ @end example
+ 
+ @noindent
+ where @code{file} is the name of the file and @var{other-user} is the
+ name of the user who has locked the file.
+ @end itemize
+ 
+   The default definition of this function asks the user to choose what
+ to do.  If you wish, you can replace the @code{ask-user-about-lock}
+ function with your own version that decides in another way.  The code
+ for its usual definition is in @file{userlock.el}.
+ @end defun
+ 
+ @node Information about Files
+ @section Information about Files
+ 
+   The functions described in this section all operate on strings that
+ designate file names.  All the functions have names that begin with the
+ word @samp{file}.  These functions all return information about actual
+ files or directories, so their arguments must all exist as actual files
+ or directories unless otherwise noted.
+ 
+ @menu
+ * Testing Accessibility::   Is a given file readable?  Writable?
+ * Kinds of Files::          Is it a directory?  A symbolic link?
+ * Truenames::		    Eliminating symbolic links from a file name.
+ * File Attributes::         How large is it?  Any other names?  Etc.
+ @end menu
+ 
+ @node Testing Accessibility
+ @comment  node-name,  next,  previous,  up
+ @subsection Testing Accessibility
+ @cindex accessibility of a file
+ @cindex file accessibility
+ 
+   These functions test for permission to access a file in specific ways.
+ 
+ @defun file-exists-p filename
+ This function returns @code{t} if a file named @var{filename} appears
+ to exist.  This does not mean you can necessarily read the file, only
+ that you can find out its attributes.  (On Unix, this is true if the
+ file exists and you have execute permission on the containing
+ directories, regardless of the protection of the file itself.)
+ 
+ If the file does not exist, or if fascist access control policies
+ prevent you from finding the attributes of the file, this function
+ returns @code{nil}.
+ @end defun
+ 
+ @defun file-readable-p filename
+ This function returns @code{t} if a file named @var{filename} exists
+ and you can read it.  It returns @code{nil} otherwise.
+ 
+ @example
+ @group
+ (file-readable-p "files.texi")
+      @result{} t
+ @end group
+ @group
+ (file-exists-p "/usr/spool/mqueue")
+      @result{} t
+ @end group
+ @group
+ (file-readable-p "/usr/spool/mqueue")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun file-executable-p filename
+ This function returns @code{t} if a file named @var{filename} exists and
+ you can execute it.  It returns @code{nil} otherwise.  If the file is a
+ directory, execute permission means you can check the existence and
+ attributes of files inside the directory, and open those files if their
+ modes permit.
+ @end defun
+ 
+ @defun file-writable-p filename
+ This function returns @code{t} if the file @var{filename} can be written
+ or created by you, and @code{nil} otherwise.  A file is writable if the
+ file exists and you can write it.  It is creatable if it does not exist,
+ but the specified directory does exist and you can write in that
+ directory.
+ 
+ In the third example below, @file{foo} is not writable because the
+ parent directory does not exist, even though the user could create such
+ a directory.
+ 
+ @example
+ @group
+ (file-writable-p "~/foo")
+      @result{} t
+ @end group
+ @group
+ (file-writable-p "/foo")
+      @result{} nil
+ @end group
+ @group
+ (file-writable-p "~/no-such-dir/foo")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun file-accessible-directory-p dirname
+ This function returns @code{t} if you have permission to open existing
+ files in the directory whose name as a file is @var{dirname}; otherwise
+ (or if there is no such directory), it returns @code{nil}.  The value
+ of @var{dirname} may be either a directory name or the file name of a
+ directory.
+ 
+ Example: after the following,
+ 
+ @example
+ (file-accessible-directory-p "/foo")
+      @result{} nil
+ @end example
+ 
+ @noindent
+ we can deduce that any attempt to read a file in @file{/foo/} will
+ give an error.
+ @end defun
+ 
+ @defun file-ownership-preserved-p filename
+ This function returns @code{t} if deleting the file @var{filename} and
+ then creating it anew would keep the file's owner unchanged.
+ @end defun
+ 
+ @defun file-newer-than-file-p filename1 filename2
+ @cindex file age
+ @cindex file modification time
+ This function returns @code{t} if the file @var{filename1} is
+ newer than file @var{filename2}.  If @var{filename1} does not
+ exist, it returns @code{nil}.  If @var{filename2} does not exist,
+ it returns @code{t}.
+ 
+ In the following example, assume that the file @file{aug-19} was written
+ on the 19th, @file{aug-20} was written on the 20th, and the file
+ @file{no-file} doesn't exist at all.
+ 
+ @example
+ @group
+ (file-newer-than-file-p "aug-19" "aug-20")
+      @result{} nil
+ @end group
+ @group
+ (file-newer-than-file-p "aug-20" "aug-19")
+      @result{} t
+ @end group
+ @group
+ (file-newer-than-file-p "aug-19" "no-file")
+      @result{} t
+ @end group
+ @group
+ (file-newer-than-file-p "no-file" "aug-19")
+      @result{} nil
+ @end group
+ @end example
+ 
+ You can use @code{file-attributes} to get a file's last modification
+ time as a list of two numbers.  @xref{File Attributes}.
+ @end defun
+ 
+ @node Kinds of Files
+ @comment  node-name,  next,  previous,  up
+ @subsection Distinguishing Kinds of Files
+ 
+   This section describes how to distinguish various kinds of files, such
+ as directories, symbolic links, and ordinary files.
+ 
+ @defun file-symlink-p filename
+ @cindex file symbolic links
+ If the file @var{filename} is a symbolic link, the @code{file-symlink-p}
+ function returns the file name to which it is linked.  This may be the
+ name of a text file, a directory, or even another symbolic link, or it
+ may be a nonexistent file name.
+ 
+ If the file @var{filename} is not a symbolic link (or there is no such file),
+ @code{file-symlink-p} returns @code{nil}.  
+ 
+ @example
+ @group
+ (file-symlink-p "foo")
+      @result{} nil
+ @end group
+ @group
+ (file-symlink-p "sym-link")
+      @result{} "foo"
+ @end group
+ @group
+ (file-symlink-p "sym-link2")
+      @result{} "sym-link"
+ @end group
+ @group
+ (file-symlink-p "/bin")
+      @result{} "/pub/bin"
+ @end group
+ @end example
+ 
+ @c !!! file-symlink-p: should show output of ls -l for comparison
+ @end defun
+ 
+ @defun file-directory-p filename
+ This function returns @code{t} if @var{filename} is the name of an
+ existing directory, @code{nil} otherwise.
+ 
+ @example
+ @group
+ (file-directory-p "~rms")
+      @result{} t
+ @end group
+ @group
+ (file-directory-p "~rms/lewis/files.texi")
+      @result{} nil
+ @end group
+ @group
+ (file-directory-p "~rms/lewis/no-such-file")
+      @result{} nil
+ @end group
+ @group
+ (file-directory-p "$HOME")
+      @result{} nil
+ @end group
+ @group
+ (file-directory-p
+  (substitute-in-file-name "$HOME"))
+      @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @defun file-regular-p filename
+ This function returns @code{t} if the file @var{filename} exists and is
+ a regular file (not a directory, symbolic link, named pipe, terminal, or
+ other I/O device).
+ @end defun
+ 
+ @node Truenames
+ @subsection Truenames
+ @cindex truename (of file)
+ 
+ @c Emacs 19 features
+   The @dfn{truename} of a file is the name that you get by following
+ symbolic links until none remain, then expanding to get rid of @samp{.}
+ and @samp{..} as components.  Strictly speaking, a file need not have a
+ unique truename; the number of distinct truenames a file has is equal to
+ the number of hard links to the file.  However, truenames are useful
+ because they eliminate symbolic links as a cause of name variation.
+ 
+ @defun file-truename filename
+ The function @code{file-truename} returns the true name of the file
+ @var{filename}.  This is the name that you get by following symbolic
+ links until none remain.  The argument must be an absolute file name.
+ @end defun
+ 
+   @xref{Buffer File Name}, for related information.
+ 
+ @node File Attributes
+ @comment  node-name,  next,  previous,  up
+ @subsection Other Information about Files
+ 
+   This section describes the functions for getting detailed information
+ about a file, other than its contents.  This information includes the
+ mode bits that control access permission, the owner and group numbers,
+ the number of names, the inode number, the size, and the times of access
+ and modification.
+ 
+ @defun file-modes filename
+ @cindex permission
+ @cindex file attributes
+ This function returns the mode bits of @var{filename}, as an integer.
+ The mode bits are also called the file permissions, and they specify
+ access control in the usual Unix fashion.  If the low-order bit is 1,
+ then the file is executable by all users, if the second-lowest-order bit
+ is 1, then the file is writable by all users, etc.
+ 
+ The highest value returnable is 4095 (7777 octal), meaning that
+ everyone has read, write, and execute permission, that the @sc{suid} bit
+ is set for both others and group, and that the sticky bit is set.
+ 
+ @example
+ @group
+ (file-modes "~/junk/diffs")
+      @result{} 492               ; @r{Decimal integer.}
+ @end group
+ @group
+ (format "%o" 492)
+      @result{} "754"             ; @r{Convert to octal.}
+ @end group
+ 
+ @group
+ (set-file-modes "~/junk/diffs" 438)
+      @result{} nil
+ @end group
+ 
+ @group
+ (format "%o" 438)
+      @result{} "666"             ; @r{Convert to octal.}
+ @end group
+ 
+ @group
+ % ls -l diffs
+   -rw-rw-rw-  1 lewis 0 3063 Oct 30 16:00 diffs
+ @end group
+ @end example
+ @end defun
+ 
+ @defun file-nlinks filename
+ This functions returns the number of names (i.e., hard links) that
+ file @var{filename} has.  If the file does not exist, then this function
+ returns @code{nil}.  Note that symbolic links have no effect on this
+ function, because they are not considered to be names of the files they
+ link to.
+ 
+ @example
+ @group
+ % ls -l foo*
+ -rw-rw-rw-  2 rms       4 Aug 19 01:27 foo
+ -rw-rw-rw-  2 rms       4 Aug 19 01:27 foo1
+ @end group
+ 
+ @group
+ (file-nlinks "foo")
+      @result{} 2
+ @end group
+ @group
+ (file-nlinks "doesnt-exist")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun file-attributes filename
+ This function returns a list of attributes of file @var{filename}.  If
+ the specified file cannot be opened, it returns @code{nil}.
+ 
+ The elements of the list, in order, are:
+ 
+ @enumerate 0
+ @item
+ @code{t} for a directory, a string for a symbolic link (the name
+ linked to), or @code{nil} for a text file.
+ 
+ @c Wordy so as to prevent an overfull hbox.  --rjc 15mar92
+ @item
+ The number of names the file has.  Alternate names, also known as hard
+ links, can be created by using the @code{add-name-to-file} function
+ (@pxref{Changing File Attributes}).
+ 
+ @item
+ The file's @sc{uid}.
+ 
+ @item
+ The file's @sc{gid}.
+ 
+ @item
+ The time of last access, as a list of two integers.
+ The first integer has the high-order 16 bits of time,
+ the second has the low 16 bits.  (This is similar to the
+ value of @code{current-time}; see @ref{Time of Day}.)
+ 
+ @item
+ The time of last modification as a list of two integers (as above).
+ 
+ @item
+ The time of last status change as a list of two integers (as above).
+ 
+ @item
+ The size of the file in bytes.
+ 
+ @item
+ The file's modes, as a string of ten letters or dashes,
+ as in @samp{ls -l}.
+ 
+ @item
+ @code{t} if the file's @sc{gid} would change if file were
+ deleted and recreated; @code{nil} otherwise.
+ 
+ @item
+ The file's inode number.
+ 
+ @item
+ The file system number of the file system that the file is in.  This
+ element and the file's inode number together give enough information to
+ distinguish any two files on the system---no two files can have the same
+ values for both of these numbers.
+ @end enumerate
+ 
+ For example, here are the file attributes for @file{files.texi}:
+ 
+ @example
+ @group
+ (file-attributes "files.texi")
+      @result{}  (nil 
+           1 
+           2235 
+           75 
+           (8489 20284) 
+           (8489 20284) 
+           (8489 20285)
+           14906 
+           "-rw-rw-rw-" 
+           nil 
+           129500
+           -32252)
+ @end group
+ @end example
+ 
+ @noindent
+ and here is how the result is interpreted:
+ 
+ @table @code
+ @item nil
+ is neither a directory nor a symbolic link.
+ 
+ @item 1
+ has only one name (the name @file{files.texi} in the current default
+ directory).
+ 
+ @item 2235
+ is owned by the user with @sc{uid} 2235.
+ 
+ @item 75
+ is in the group with @sc{gid} 75.
+ 
+ @item (8489 20284)
+ was last accessed on Aug 19 00:09.  Unfortunately, you cannot convert
+ this number into a time string in Emacs.
+ 
+ @item (8489 20284)
+ was last modified on Aug 19 00:09.
+ 
+ @item (8489 20285)
+ last had its inode changed on Aug 19 00:09.
+ 
+ @item 14906
+ is 14906 characters long.
+ 
+ @item "-rw-rw-rw-"
+ has a mode of read and write access for the owner, group, and world.
+ 
+ @item nil
+ would retain the same @sc{gid} if it were recreated.
+ 
+ @item 129500
+ has an inode number of 129500.
+ @item -32252
+ is on file system number -32252.
+ @end table
+ @end defun
+ 
+ @node Changing File Attributes
+ @section Changing File Names and Attributes
+ @cindex renaming files
+ @cindex copying files
+ @cindex deleting files
+ @cindex linking files
+ @cindex setting modes of files
+ 
+   The functions in this section rename, copy, delete, link, and set the
+ modes of files.
+ 
+   In the functions that have an argument @var{newname}, if a file by the
+ name of @var{newname} already exists, the actions taken depend on the
+ value of the argument @var{ok-if-already-exists}:
+ 
+ @itemize @bullet
+ @item
+ Signal a @code{file-already-exists} error if
+ @var{ok-if-already-exists} is @code{nil}.
+ 
+ @item
+ Request confirmation if @var{ok-if-already-exists} is a number.
+ 
+ @item
+ Replace the old file without confirmation if @var{ok-if-already-exists}
+ is any other value.
+ @end itemize
+ 
+ @defun add-name-to-file oldname newname &optional ok-if-already-exists
+ @cindex file with multiple names
+ @cindex file hard link
+ This function gives the file named @var{oldname} the additional name
+ @var{newname}.  This means that @var{newname} becomes a new ``hard
+ link'' to @var{oldname}.
+ 
+ In the first part of the following example, we list two files,
+ @file{foo} and @file{foo3}.
+ 
+ @example
+ @group
+ % ls -l fo*
+ -rw-rw-rw-  1 rms       29 Aug 18 20:32 foo
+ -rw-rw-rw-  1 rms       24 Aug 18 20:31 foo3
+ @end group
+ @end example
+ 
+ Then we evaluate the form @code{(add-name-to-file "~/lewis/foo"
+ "~/lewis/foo2")}.  Again we list the files.  This shows two names,
+ @file{foo} and @file{foo2}.
+ 
+ @example
+ @group
+ (add-name-to-file "~/lewis/foo1" "~/lewis/foo2")
+      @result{} nil
+ @end group
+ 
+ @group
+ % ls -l fo*
+ -rw-rw-rw-  2 rms       29 Aug 18 20:32 foo
+ -rw-rw-rw-  2 rms       29 Aug 18 20:32 foo2
+ -rw-rw-rw-  1 rms       24 Aug 18 20:31 foo3
+ @end group
+ @end example
+ 
+ @c !!! Check whether this set of examples is consistent.  --rjc 15mar92
+   Finally, we evaluate the following:
+ 
+ @example
+ (add-name-to-file "~/lewis/foo" "~/lewis/foo3" t)
+ @end example
+ 
+ @noindent
+ and list the files again.  Now there are three names
+ for one file: @file{foo}, @file{foo2}, and @file{foo3}.  The old
+ contents of @file{foo3} are lost.
+ 
+ @example
+ @group
+ (add-name-to-file "~/lewis/foo1" "~/lewis/foo3")
+      @result{} nil
+ @end group
+ 
+ @group
+ % ls -l fo*
+ -rw-rw-rw-  3 rms       29 Aug 18 20:32 foo
+ -rw-rw-rw-  3 rms       29 Aug 18 20:32 foo2
+ -rw-rw-rw-  3 rms       29 Aug 18 20:32 foo3
+ @end group
+ @end example
+ 
+   This function is meaningless on VMS, where multiple names for one file
+ are not allowed.
+ 
+   See also @code{file-nlinks} in @ref{File Attributes}.
+ @end defun
+ 
+ @deffn Command rename-file filename newname &optional ok-if-already-exists
+ This command renames the file @var{filename} as @var{newname}.
+ 
+ If @var{filename} has additional names aside from @var{filename}, it
+ continues to have those names.  In fact, adding the name @var{newname}
+ with @code{add-name-to-file} and then deleting @var{filename} has the
+ same effect as renaming, aside from momentary intermediate states.
+ 
+ In an interactive call, this function prompts for @var{filename} and
+ @var{newname} in the minibuffer; also, it requests confirmation if
+ @var{newname} already exists.
+ @end deffn
+ 
+ @deffn Command copy-file oldname newname &optional ok-if-exists time
+ This command copies the file @var{oldname} to @var{newname}.  An
+ error is signaled if @var{oldname} does not exist.
+ 
+ If @var{time} is non-@code{nil}, then this functions gives the new
+ file the same last-modified time that the old one has.  (This works on
+ only some operating systems.)
+ 
+ In an interactive call, this function prompts for @var{filename} and
+ @var{newname} in the minibuffer; also, it requests confirmation if
+ @var{newname} already exists.
+ @end deffn
+ 
+ @deffn Command delete-file filename
+ @pindex rm
+ This command deletes the file @var{filename}, like the shell command
+ @samp{rm @var{filename}}.  If the file has multiple names, it continues
+ to exist under the other names.
+ 
+ A suitable kind of @code{file-error} error is signaled if the file
+ does not exist, or is not deletable.  (On Unix, a file is deletable if
+ its directory is writable.)
+ 
+ See also @code{delete-directory} in @ref{Create/Delete Dirs}.
+ @end deffn
+ 
+ @deffn Command make-symbolic-link filename newname  &optional ok-if-exists
+ @pindex ln
+ @kindex file-already-exists
+ This command makes a symbolic link to @var{filename}, named
+ @var{newname}.  This is like the shell command @samp{ln -s
+ @var{filename} @var{newname}}.
+ 
+ In an interactive call, this function prompts for @var{filename} and
+ @var{newname} in the minibuffer; also, it requests confirmation if
+ @var{newname} already exists.
+ @end deffn
+ 
+ @defun define-logical-name varname string
+ This function defines the logical name @var{name} to have the value
+ @var{string}.  It is available only on VMS.
+ @end defun
+ 
+ @defun set-file-modes filename mode
+ This function sets mode bits of @var{filename} to @var{mode} (which must
+ be an integer).  Only the low 12 bits of @var{mode} are used.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun set-default-file-modes mode
+ This function sets the default file protection for new files created by
+ Emacs and its subprocesses.  Every file created with Emacs initially has
+ this protection.  On Unix, the default protection is the bitwise
+ complement of the ``umask'' value.
+ 
+ The argument @var{mode} must be an integer.  Only the low 9 bits of
+ @var{mode} are used.
+ 
+ Saving a modified version of an existing file does not count as creating
+ the file; it does not change the file's mode, and does not use the
+ default file protection.
+ @end defun
+ 
+ @defun default-file-modes
+ This function returns the current default protection value.
+ @end defun
+ 
+ @cindex MS-DOS and file modes
+ @cindex file modes and MS-DOS
+   On MS-DOS, there is no such thing as an ``executable'' file mode bit.
+ So Emacs considers a file executable if its name ends in @samp{.com},
+ @samp{.bat} or @samp{.exe}.  This is reflected in the values returned
+ by @code{file-modes} and @code{file-attributes}.
+ 
+ @node File Names
+ @section File Names
+ @cindex file names
+ 
+   Files are generally referred to by their names, in Emacs as elsewhere.
+ File names in Emacs are represented as strings.  The functions that
+ operate on a file all expect a file name argument.
+ 
+   In addition to operating on files themselves, Emacs Lisp programs
+ often need to operate on the names; i.e., to take them apart and to use
+ part of a name to construct related file names.  This section describes
+ how to manipulate file names.
+ 
+   The functions in this section do not actually access files, so they
+ can operate on file names that do not refer to an existing file or
+ directory.
+ 
+   On VMS, all these functions understand both VMS file-name syntax and
+ Unix syntax.  This is so that all the standard Lisp libraries can
+ specify file names in Unix syntax and work properly on VMS without
+ change.  On MS-DOS, these functions understand MS-DOS file-name syntax
+ as well as Unix syntax.
+ 
+ @menu
+ * File Name Components::  The directory part of a file name, and the rest.
+ * Directory Names::       A directory's name as a directory
+                             is different from its name as a file.
+ * Relative File Names::   Some file names are relative to a current directory.
+ * File Name Expansion::   Converting relative file names to absolute ones.
+ * Unique File Names::     Generating names for temporary files.
+ * File Name Completion::  Finding the completions for a given file name.
+ @end menu
+ 
+ @node File Name Components
+ @subsection File Name Components
+ @cindex directory part (of file name)
+ @cindex nondirectory part (of file name)
+ @cindex version number (in file name)
+ 
+   The operating system groups files into directories.  To specify a
+ file, you must specify the directory and the file's name within that
+ directory.  Therefore, Emacs considers a file name as having two main
+ parts: the @dfn{directory name} part, and the @dfn{nondirectory} part
+ (or @dfn{file name within the directory}).  Either part may be empty.
+ Concatenating these two parts reproduces the original file name.
+ 
+   On Unix, the directory part is everything up to and including the last
+ slash; the nondirectory part is the rest.  The rules in VMS syntax are
+ complicated.
+ 
+   For some purposes, the nondirectory part is further subdivided into
+ the name proper and the @dfn{version number}.  On Unix, only backup
+ files have version numbers in their names; on VMS, every file has a
+ version number, but most of the time the file name actually used in
+ Emacs omits the version number.  Version numbers are found mostly in
+ directory lists.
+ 
+ @defun file-name-directory filename
+   This function returns the directory part of @var{filename} (or
+ @code{nil} if @var{filename} does not include a directory part).  On
+ Unix, the function returns a string ending in a slash.  On VMS, it
+ returns a string ending in one of the three characters @samp{:},
+ @samp{]}, or @samp{>}.
+ 
+ @example
+ @group
+ (file-name-directory "lewis/foo")  ; @r{Unix example}
+      @result{} "lewis/"
+ @end group
+ @group
+ (file-name-directory "foo")        ; @r{Unix example}
+      @result{} nil
+ @end group
+ @group
+ (file-name-directory "[X]FOO.TMP") ; @r{VMS example}
+      @result{} "[X]"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun file-name-nondirectory filename
+   This function returns the nondirectory part of @var{filename}.
+ 
+ @example
+ @group
+ (file-name-nondirectory "lewis/foo")
+      @result{} "foo"
+ @end group
+ @group
+ (file-name-nondirectory "foo")
+      @result{} "foo"
+ @end group
+ @group
+ ;; @r{The following example is accurate only on VMS.}
+ (file-name-nondirectory "[X]FOO.TMP")
+      @result{} "FOO.TMP"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun file-name-sans-versions filename
+   This function returns @var{filename} without any file version numbers,
+ backup version numbers, or trailing tildes.
+ 
+ @example
+ @group
+ (file-name-sans-versions "~rms/foo.~1~")
+      @result{} "~rms/foo"
+ @end group
+ @group
+ (file-name-sans-versions "~rms/foo~")
+      @result{} "~rms/foo"
+ @end group
+ @group
+ (file-name-sans-versions "~rms/foo")
+      @result{} "~rms/foo"
+ @end group
+ @group
+ ;; @r{The following example applies to VMS only.}
+ (file-name-sans-versions "foo;23")
+      @result{} "foo"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun file-name-sans-extension filename
+ This function returns @var{filename} minus its ``extension,'' if any.
+ The extension, in a file name, is the part that starts with the last
+ @samp{.} in the last name component.  For example,
+ 
+ @example
+ (file-name-sans-extension "foo.lose.c")
+      @result{} "foo.lose"
+ (file-name-sans-extension "big.hack/foo")
+      @result{} "big.hack/foo"
+ @end example
+ @end defun
+ 
+ @node Directory Names
+ @comment  node-name,  next,  previous,  up
+ @subsection Directory Names
+ @cindex directory name
+ @cindex file name of directory
+ 
+   A @dfn{directory name} is the name of a directory.  A directory is a
+ kind of file, and it has a file name, which is related to the directory
+ name but not identical to it.  (This is not quite the same as the usual
+ Unix terminology.)  These two different names for the same entity are
+ related by a syntactic transformation.  On Unix, this is simple: a
+ directory name ends in a slash, whereas the directory's name as a file
+ lacks that slash.  On VMS, the relationship is more complicated.
+ 
+   The difference between a directory name and its name as a file is
+ subtle but crucial.  When an Emacs variable or function argument is
+ described as being a directory name, a file name of a directory is not
+ acceptable.
+ 
+   The following two functions convert between directory names and file
+ names.  They do nothing special with environment variable substitutions
+ such as @samp{$HOME}, and the constructs @samp{~}, and @samp{..}.
+ 
+ @defun file-name-as-directory filename
+ This function returns a string representing @var{filename} in a form
+ that the operating system will interpret as the name of a directory.  In
+ Unix, this means appending a slash to the string.  On VMS, the function
+ converts a string of the form @file{[X]Y.DIR.1} to the form
+ @file{[X.Y]}.
+ 
+ @example
+ @group
+ (file-name-as-directory "~rms/lewis")
+      @result{} "~rms/lewis/"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun directory-file-name dirname
+ This function returns a string representing @var{dirname} in a form
+ that the operating system will interpret as the name of a file.  On
+ Unix, this means removing a final slash from the string.  On VMS, the
+ function converts a string of the form @file{[X.Y]} to
+ @file{[X]Y.DIR.1}.
+ 
+ @example
+ @group
+ (directory-file-name "~lewis/")
+      @result{} "~lewis"
+ @end group
+ @end example
+ @end defun
+ 
+ @cindex directory name abbreviation
+   Directory name abbreviations are useful for directories that are
+ normally accessed through symbolic links.  Sometimes the users recognize
+ primarily the link's name as ``the name'' of the directory, and find it
+ annoying to see the directory's ``real'' name.  If you define the link
+ name as an abbreviation for the ``real'' name, Emacs shows users the
+ abbreviation instead.
+ 
+ @defvar directory-abbrev-alist
+ The variable @code{directory-abbrev-alist} contains an alist of
+ abbreviations to use for file directories.  Each element has the form
+ @code{(@var{from} . @var{to})}, and says to replace @var{from} with
+ @var{to} when it appears in a directory name.  The @var{from} string is
+ actually a regular expression; it should always start with @samp{^}.
+ The function @code{abbreviate-file-name} performs these substitutions.
+ 
+ You can set this variable in @file{site-init.el} to describe the
+ abbreviations appropriate for your site.
+ 
+ Here's an example, from a system on which file system @file{/home/fsf}
+ and so on are normally accessed through symbolic links named @file{/fsf}
+ and so on.
+ 
+ @example
+ (("^/home/fsf" . "/fsf")
+  ("^/home/gp" . "/gp")
+  ("^/home/gd" . "/gd"))
+ @end example
+ @end defvar
+ 
+   To convert a directory name to its abbreviation, use this
+ function:
+ 
+ @defun abbreviate-file-name dirname
+ This function applies abbreviations from @code{directory-abbrev-alist}
+ to its argument, and substitutes @samp{~} for the user's home
+ directory.
+ @end defun
+ 
+ @node Relative File Names
+ @subsection Absolute and Relative File Names
+ @cindex absolute file name
+ @cindex relative file name
+ 
+   All the directories in the file system form a tree starting at the
+ root directory.  A file name can specify all the directory names
+ starting from the root of the tree; then it is called an @dfn{absolute}
+ file name.  Or it can specify the position of the file in the tree
+ relative to a default directory; then it is called a @dfn{relative}
+ file name.  On Unix, an absolute file name starts with a slash or a
+ tilde (@samp{~}), and a relative one does not.  The rules on VMS are
+ complicated.
+ 
+ @defun file-name-absolute-p filename
+ This function returns @code{t} if file @var{filename} is an absolute
+ file name, @code{nil} otherwise.  On VMS, this function understands both
+ Unix syntax and VMS syntax.
+ 
+ @example
+ @group
+ (file-name-absolute-p "~rms/foo")
+      @result{} t
+ @end group
+ @group
+ (file-name-absolute-p "rms/foo")
+      @result{} nil
+ @end group
+ @group
+ (file-name-absolute-p "/user/rms/foo")
+      @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @node File Name Expansion
+ @subsection Functions that Expand Filenames
+ @cindex expansion of file names
+ 
+   @dfn{Expansion} of a file name means converting a relative file name
+ to an absolute one.  Since this is done relative to a default directory,
+ you must specify the default directory name as well as the file name to
+ be expanded.  Expansion also simplifies file names by eliminating
+ redundancies such as @file{./} and @file{@var{name}/../}.
+ 
+ @defun expand-file-name filename &optional directory
+ This function converts @var{filename} to an absolute file name.  If
+ @var{directory} is supplied, it is the directory to start with if
+ @var{filename} is relative.  (The value of @var{directory} should itself
+ be an absolute directory name; it may start with @samp{~}.)
+ Otherwise, the current buffer's value of @code{default-directory} is
+ used.  For example:
+ 
+ @example
+ @group
+ (expand-file-name "foo")
+      @result{} "/xcssun/users/rms/lewis/foo"
+ @end group
+ @group
+ (expand-file-name "../foo")
+      @result{} "/xcssun/users/rms/foo"
+ @end group
+ @group
+ (expand-file-name "foo" "/usr/spool/")
+      @result{} "/usr/spool/foo"
+ @end group
+ @group
+ (expand-file-name "$HOME/foo")
+      @result{} "/xcssun/users/rms/lewis/$HOME/foo"
+ @end group
+ @end example
+ 
+ Filenames containing @samp{.} or @samp{..} are simplified to their
+ canonical form:
+ 
+ @example
+ @group
+ (expand-file-name "bar/../foo")
+      @result{} "/xcssun/users/rms/lewis/foo"
+ @end group
+ @end example
+ 
+ @samp{~/} is expanded into the user's home directory.  A @samp{/} or
+ @samp{~} following a @samp{/} is taken to be the start of an absolute
+ file name that overrides what precedes it, so everything before that
+ @samp{/} or @samp{~} is deleted.  For example:
+ 
+ @example
+ @group
+ (expand-file-name 
+  "/a1/gnu//usr/local/lib/emacs/etc/MACHINES")
+      @result{} "/usr/local/lib/emacs/etc/MACHINES"
+ @end group
+ @group
+ (expand-file-name "/a1/gnu/~/foo")
+      @result{} "/xcssun/users/rms/foo"
+ @end group
+ @end example
+ 
+ @noindent
+ In both cases, @file{/a1/gnu/} is discarded because an absolute file
+ name follows it.
+ 
+ Note that @code{expand-file-name} does @emph{not} expand environment
+ variables; only @code{substitute-in-file-name} does that.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun file-relative-name filename directory
+ This function does the inverse of expansion---it tries to return a
+ relative name that is equivalent to @var{filename} when interpreted
+ relative to @var{directory}.  (If such a relative name would be longer
+ than the absolute name, it returns the absolute name instead.)
+ 
+ @example
+ (file-relative-name "/foo/bar" "/foo/")
+      @result{} "bar")
+ (file-relative-name "/foo/bar" "/hack/")
+      @result{} "/foo/bar")
+ @end example
+ @end defun
+ 
+ @defvar default-directory
+ The value of this buffer-local variable is the default directory for the
+ current buffer.  It should be an absolute directory name; it may start
+ with @samp{~}.  This variable is local in every buffer.
+ 
+ @code{expand-file-name} uses the default directory when its second
+ argument is @code{nil}.
+ 
+ On Unix systems, the value is always a string ending with a slash.
+ 
+ @example
+ @group
+ default-directory
+      @result{} "/user/lewis/manual/"
+ @end group
+ @end example
+ @end defvar
+ 
+ @defun substitute-in-file-name filename
+ This function replaces environment variables references in
+ @var{filename} with the environment variable values.  Following standard
+ Unix shell syntax, @samp{$} is the prefix to substitute an environment
+ variable value.
+ 
+ The environment variable name is the series of alphanumeric characters
+ (including underscores) that follow the @samp{$}.  If the character following
+ the @samp{$} is a @samp{@{}, then the variable name is everything up to the
+ matching @samp{@}}.
+ 
+ @c Wordy to avoid overfull hbox.  --rjc 15mar92
+ Here we assume that the environment variable @code{HOME}, which holds
+ the user's home directory name, has value @samp{/xcssun/users/rms}.
+ 
+ @example
+ @group
+ (substitute-in-file-name "$HOME/foo")
+      @result{} "/xcssun/users/rms/foo"
+ @end group
+ @end example
+ 
+ If a @samp{~} or a @samp{/} appears following a @samp{/}, after
+ substitution, everything before the following @samp{/} is discarded:
+ 
+ @example
+ @group
+ (substitute-in-file-name "bar/~/foo")
+      @result{} "~/foo"
+ @end group
+ @group
+ (substitute-in-file-name "/usr/local/$HOME/foo")
+      @result{} "/xcssun/users/rms/foo"
+ @end group
+ @end example
+ 
+ On VMS, @samp{$} substitution is not done, so this function does nothing
+ on VMS except discard superfluous initial components as shown above.
+ @end defun
+ 
+ @node Unique File Names
+ @subsection Generating Unique File Names
+ 
+   Some programs need to write temporary files.  Here is the usual way to
+ construct a name for such a file:
+ 
+ @example
+ (make-temp-name (concat "/tmp/" @var{name-of-application}))
+ @end example
+ 
+ @noindent
+ Here we use the directory @file{/tmp/} because that is the standard
+ place on Unix for temporary files.  The job of @code{make-temp-name} is
+ to prevent two different users or two different jobs from trying to use
+ the same name.
+ 
+ @defun make-temp-name string
+ This function generates string that can be used as a unique name.  The
+ name starts with @var{string}, and ends with a number that is different
+ in each Emacs job.
+ 
+ @example
+ @group
+ (make-temp-name "/tmp/foo")
+      @result{} "/tmp/foo021304"
+ @end group
+ @end example
+ 
+ To prevent conflicts among different libraries running in the same
+ Emacs, each Lisp program that uses @code{make-temp-name} should have its
+ own @var{string}.  The number added to the end of the name distinguishes
+ between the same application running in different Emacs jobs.
+ @end defun
+ 
+ @node File Name Completion
+ @subsection File Name Completion
+ @cindex file name completion subroutines
+ @cindex completion, file name
+ 
+   This section describes low-level subroutines for completing a file
+ name.  For other completion functions, see @ref{Completion}.
+ 
+ @defun file-name-all-completions partial-filename directory
+ This function returns a list of all possible completions for a file
+ whose name starts with @var{partial-filename} in directory
+ @var{directory}.  The order of the completions is the order of the files
+ in the directory, which is unpredictable and conveys no useful
+ information.
+ 
+ The argument @var{partial-filename} must be a file name containing no
+ directory part and no slash.  The current buffer's default directory is
+ prepended to @var{directory}, if @var{directory} is not absolute.
+ 
+ In the following example, suppose that the current default directory,
+ @file{~rms/lewis}, has five files whose names begin with @samp{f}:
+ @file{foo}, @file{file~}, @file{file.c}, @file{file.c.~1~}, and
+ @file{file.c.~2~}.@refill
+ 
+ @example
+ @group
+ (file-name-all-completions "f" "")
+      @result{} ("foo" "file~" "file.c.~2~" 
+                 "file.c.~1~" "file.c")
+ @end group
+ 
+ @group
+ (file-name-all-completions "fo" "")  
+      @result{} ("foo")
+ @end group
+ @end example
+ @end defun
+ 
+ @defun file-name-completion filename directory
+ This function completes the file name @var{filename} in directory
+ @var{directory}.  It returns the longest prefix common to all file names
+ in directory @var{directory} that start with @var{filename}.
+ 
+ If only one match exists and @var{filename} matches it exactly, the
+ function returns @code{t}.  The function returns @code{nil} if directory
+ @var{directory} contains no name starting with @var{filename}.
+ 
+ In the following example, suppose that the current default directory
+ has five files whose names begin with @samp{f}: @file{foo},
+ @file{file~}, @file{file.c}, @file{file.c.~1~}, and
+ @file{file.c.~2~}.@refill
+ 
+ @example
+ @group
+ (file-name-completion "fi" "")
+      @result{} "file"
+ @end group
+ 
+ @group
+ (file-name-completion "file.c.~1" "")
+      @result{} "file.c.~1~"
+ @end group
+ 
+ @group
+ (file-name-completion "file.c.~1~" "")
+      @result{} t
+ @end group
+ 
+ @group
+ (file-name-completion "file.c.~3" "")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defopt completion-ignored-extensions
+ @code{file-name-completion} usually ignores file names that end in any
+ string in this list.  It does not ignore them when all the possible
+ completions end in one of these suffixes or when a buffer showing all
+ possible completions is displayed.@refill
+ 
+ A typical value might look like this:
+ 
+ @example
+ @group
+ completion-ignored-extensions
+      @result{} (".o" ".elc" "~" ".dvi")
+ @end group
+ @end example
+ @end defopt
+ 
+ @node Contents of Directories
+ @section Contents of Directories
+ @cindex directory-oriented functions
+ @cindex file names in directory
+ 
+   A directory is a kind of file that contains other files entered under
+ various names.  Directories are a feature of the file system.
+ 
+   Emacs can list the names of the files in a directory as a Lisp list,
+ or display the names in a buffer using the @code{ls} shell command.  In
+ the latter case, it can optionally display information about each file,
+ depending on the options passed to the @code{ls} command.
+ 
+ @defun directory-files directory &optional full-name match-regexp nosort
+ This function returns a list of the names of the files in the directory
+ @var{directory}.  By default, the list is in alphabetical order.
+ 
+ If @var{full-name} is non-@code{nil}, the function returns the files'
+ absolute file names.  Otherwise, it returns the names relative to
+ the specified directory.
+ 
+ If @var{match-regexp} is non-@code{nil}, this function returns only
+ those file names that contain a match for that regular expression---the
+ other file names are excluded from the list.
+ 
+ @c Emacs 19 feature
+ If @var{nosort} is non-@code{nil}, @code{directory-files} does not sort
+ the list, so you get the file names in no particular order.  Use this if
+ you want the utmost possible speed and don't care what order the files
+ are processed in.  If the order of processing is visible to the user,
+ then the user will probably be happier if you do sort the names.
+ 
+ @example
+ @group
+ (directory-files "~lewis")
+      @result{} ("#foo#" "#foo.el#" "." ".."
+          "dired-mods.el" "files.texi" 
+          "files.texi.~1~")
+ @end group
+ @end example
+ 
+ An error is signaled if @var{directory} is not the name of a directory
+ that can be read.
+ @end defun
+ 
+ @defun file-name-all-versions file dirname
+ This function returns a list of all versions of the file named
+ @var{file} in directory @var{dirname}.
+ @end defun
+ 
+ @defun insert-directory file switches &optional wildcard full-directory-p
+ This function inserts (in the current buffer) a directory listing for
+ directory @var{file}, formatted with @code{ls} according to
+ @var{switches}.  It leaves point after the inserted text.
+ 
+ The argument @var{file} may be either a directory name or a file
+ specification including wildcard characters.  If @var{wildcard} is
+ non-@code{nil}, that means treat @var{file} as a file specification with
+ wildcards.
+ 
+ If @var{full-directory-p} is non-@code{nil}, that means @var{file} is a
+ directory and switches do not contain @samp{-d}, so that the listing
+ should show the full contents of the directory.  (The @samp{-d} option
+ to @code{ls} says to describe a directory itself rather than its
+ contents.)
+ 
+ This function works by running a directory listing program whose name is
+ in the variable @code{insert-directory-program}.  If @var{wildcard} is
+ non-@code{nil}, it also runs the shell specified by
+ @code{shell-file-name}, to expand the wildcards.
+ @end defun
+ 
+ @defvar insert-directory-program
+ This variable's value is the program to run to generate a directory listing
+ for the function @code{insert-directory}.
+ @end defvar
+ 
+ @node Create/Delete Dirs
+ @section Creating and Deleting Directories
+ @c Emacs 19 features
+ 
+   Most Emacs Lisp file-manipulation functions get errors when used on
+ files that are directories.  For example, you cannot delete a directory
+ with @code{delete-file}.  These special functions exist to create and
+ delete directories.
+ 
+ @defun make-directory dirname
+ This function creates a directory named @var{dirname}.
+ @end defun
+ 
+ @defun delete-directory dirname
+ This function deletes the directory named @var{dirname}.  The function
+ @code{delete-file} does not work for files that are directories; you
+ must use @code{delete-directory} for them.  If the directory contains
+ any files, @code{delete-directory} signals an error.
+ @end defun
+ 
+ @node Magic File Names
+ @section Making Certain File Names ``Magic''
+ @cindex magic file names
+ 
+ @c Emacs 19 feature
+ You can implement special handling for certain file names.  This is
+ called making those names @dfn{magic}.  You must supply a regular
+ expression to define the class of names (all those that match the
+ regular expression), plus a handler that implements all the primitive
+ Emacs file operations for file names that do match.
+ 
+ The variable @code{file-name-handler-alist} holds a list of handlers,
+ together with regular expressions that determine when to apply each
+ handler.  Each element has this form:
+ 
+ @example
+ (@var{regexp} . @var{handler})
+ @end example
+ 
+ @noindent
+ All the Emacs primitives for file access and file name transformation
+ check the given file name against @code{file-name-handler-alist}.  If
+ the file name matches @var{regexp}, the primitives handle that file by
+ calling @var{handler}.
+ 
+ The first argument given to @var{handler} is the name of the primitive;
+ the remaining arguments are the arguments that were passed to that
+ operation.  (The first of these arguments is typically the file name
+ itself.)  For example, if you do this:
+ 
+ @example
+ (file-exists-p @var{filename})
+ @end example
+ 
+ @noindent
+ and @var{filename} has handler @var{handler}, then @var{handler} is
+ called like this:
+ 
+ @example
+ (funcall @var{handler} 'file-exists-p @var{filename})
+ @end example
+ 
+ Here are the operations that a magic file name handler gets to handle:
+ 
+ @noindent
+ @code{add-name-to-file}, @code{copy-file}, @code{delete-directory},
+ @code{delete-file},@*
+ @code{diff-latest-backup-file},
+ @code{directory-file-name},
+ @code{directory-files},
+ @code{dired-compress-file}, @code{dired-uncache},
+ @code{expand-file-name},@*
+ @code{file-accessible-directory-p},
+ @code{file-attributes}, @code{file-directory-p},
+ @code{file-executable-p}, @code{file-exists-p}, @code{file-local-copy},
+ @code{file-modes}, @code{file-name-all-completions},
+ @code{file-name-as-directory}, @code{file-name-completion},
+ @code{file-name-directory}, @code{file-name-nondirectory},
+ @code{file-name-sans-versions}, @code{file-newer-than-file-p},
+ @code{file-readable-p}, @code{file-regular-p}, @code{file-symlink-p},
+ @code{file-truename}, @code{file-writable-p},
+ @code{get-file-buffer},
+ @code{insert-directory},
+ @code{insert-file-contents}, @code{load}, @code{make-directory},
+ @code{make-symbolic-link}, @code{rename-file}, @code{set-file-modes},
+ @code{set-visited-file-modtime}, @code{unhandled-file-name-directory},
+ @code{verify-visited-file-modtime}, @code{write-region}.
+ 
+ Handlers for @code{insert-file-contents} typically need to clear the
+ buffer's modified flag, with @code{(set-buffer-modified-p nil)}, if the
+ @var{visit} argument is non-@code{nil}.  This also has the effect of
+ unlocking the buffer if it is locked.
+ 
+ The handler function must handle all of the above operations, and
+ possibly others to be added in the future.  It need not implement all
+ these operations itself---when it has nothing special to do for a
+ certain operation, it can reinvoke the primitive, to handle the
+ operation ``in the usual way''.  It should always reinvoke the primitive
+ for an operation it does not recognize.  Here's one way to do this:
+ 
+ @smallexample
+ (defun my-file-handler (operation &rest args)
+   ;; @r{First check for the specific operations}
+   ;; @r{that we have special handling for.}
+   (cond ((eq operation 'insert-file-contents) @dots{})
+         ((eq operation 'write-region) @dots{})
+         @dots{}
+         ;; @r{Handle any operation we don't know about.}
+         (t (let ((inhibit-file-name-handlers
+                  (cons 'my-file-handler 
+                        (and (eq inhibit-file-name-operation operation)
+                             inhibit-file-name-handlers)))
+                 (inhibit-file-name-operation operation))
+              (apply operation args)))))
+ @end smallexample
+ 
+ When a handler function decides to call the ordinary Emacs primitive for
+ the operation at hand, it needs to prevent the primitive from calling
+ the same handler once again, thus leading to an infinite recursion.  The
+ example above shows how to do this, with the variables
+ @code{inhibit-file-name-handlers} and
+ @code{inhibit-file-name-operation}.  Be careful to use them exactly as
+ shown above; the details are crucial for proper behavior in the case of
+ multiple handlers, and for operations that have two file names that may
+ each have handlers.
+ 
+ @defvar inhibit-file-name-handlers
+ This variable holds a list of handlers whose use is presently inhibited
+ for a certain operation.
+ @end defvar
+ 
+ @defvar inhibit-file-name-operation
+ The operation for which certain handlers are presently inhibited.
+ @end defvar
+ 
+ @defun find-file-name-handler file operation
+ This function returns the handler function for file name @var{file}, or
+ @code{nil} if there is none.  The argument @var{operation} should be the
+ operation to be performed on the file---the value you will pass to the
+ handler as its first argument when you call it.  The operation is needed
+ for comparison with @code{inhibit-file-name-operation}.
+ @end defun
+ 
+ @defun file-local-copy filename
+ This function copies file @var{filename} to an ordinary non-magic file,
+ if it isn't one already.
+ 
+ If @var{filename} specifies a ``magic'' file name, which programs
+ outside Emacs cannot directly read or write, this copies the contents to
+ an ordinary file and returns that file's name.
+ 
+ If @var{filename} is an ordinary file name, not magic, then this function
+ does nothing and returns @code{nil}.
+ @end defun
+ 
+ @defun unhandled-file-name-directory filename
+ This function returns the name of a directory that is not magic.
+ It uses the directory part of @var{filename} if that is not magic.
+ Otherwise, it asks the handler what to do.
+ 
+ This is useful for running a subprocess; every subprocess must have a
+ non-magic directory to serve as its current directory, and this function
+ is a good way to come up with one.
+ @end defun
+ 
+ @node Format Conversion
+ @section File Format Conversion
+ 
+ @cindex file format conversion
+ @cindex encoding file formats
+ @cindex decoding file formats
+   The variable @code{format-alist} defines a list of @dfn{file formats},
+ which describe textual representations used in files for the data (text,
+ text-properties, and possibly other information) in an Emacs buffer.
+ Emacs performs format conversion if appropriate when reading and writing
+ files.
+ 
+ @defvar format-alist
+ This list contains one format definition for each defined file format.
+ @end defvar
+ 
+ @cindex format definition
+ Each format definition is a list of this form:
+ 
+ @example
+ (@var{name} @var{doc-string} @var{regexp} @var{from-fn} @var{to-fn} @var{modify} @var{mode-fn})
+ @end example
+ 
+ Here is what the elements in a format definition mean:
+ 
+ @table @var
+ @item name
+ The name of this format.
+ 
+ @item doc-string
+ A documentation string for the format.
+ 
+ @item regexp
+ A regular expression which is used to recognize files represented in
+ this format.
+ 
+ @item from-fn
+ A function to call to decode data in this format (to convert file data into
+ the usual Emacs data representation).
+ 
+ The @var{from-fn} is called with two args, @var{begin} and @var{end},
+ which specify the part of the buffer it should convert.  It should convert
+ the text by editing it in place.  Since this can change the length of the
+ text, @var{from-fn} should return the modified end position.
+ 
+ One responsibility of @var{from-fn} is to make sure that the beginning
+ of the file no longer matches @var{regexp}.  Otherwise it is likely to
+ get called again.
+ 
+ @item to-fn
+ A function to call to encode data in this format (to convert
+ the usual Emacs data representation into this format).
+ 
+ The @var{to-fn} is called with two args, @var{begin} and @var{end},
+ which specify the part of the buffer it should convert.  There are
+ two ways it can do the conversion:
+ 
+ @itemize @bullet
+ @item
+ By editing the buffer in place.  In this case, @var{to-fn} should
+ return the end-position of the range of text, as modified.
+ 
+ @item
+ By returning a list of annotations.  This is a list of elements of the
+ form @code{(@var{position} . @var{string})}, where @var{position} is an
+ integer specifying the relative position in the text to be written, and
+ @var{string} is the annotation to add there.  The list must be sorted in
+ order of position when @var{to-fn} returns it.
+ 
+ When @code{write-region} actually writes the text from the buffer to the
+ file, it intermixes the specified annotations at the corresponding
+ positions.  All this takes place without modifying the buffer.
+ @end itemize
+ 
+ @item modify
+ A flag, @code{t} if the encoding function modifies the buffer, and
+ @code{nil} if it works by returning a list of annotations.
+ 
+ @item mode
+ A mode function to call after visiting a file converted from this
+ format.
+ @end table
+ 
+ The function @code{insert-file-contents} automatically recognizes file
+ formats when it reads the specified file.  It checks the text of the
+ beginning of the file against the regular expressions of the format
+ definitions, and if it finds a match, it calls the decoding function for
+ that format.  Then it checks all the known formats over again.
+ It keeps checking them until none of them is applicable.
+ 
+ Visiting a file, with @code{find-file-noselect} or the commands that use
+ it, performs conversion likewise (because it calls
+ @code{insert-file-contents}); it also calls the mode function for each
+ format that it decodes.  It stores a list of the format names in the
+ buffer-local variable @code{buffer-file-format}.
+ 
+ @defvar buffer-file-format
+ This variable states the format of the visited file.  More precisely,
+ this is a list of the file format names that were decoded in the course
+ of visiting the current buffer's file.  It is always local in all
+ buffers.
+ @end defvar
+ 
+ When @code{write-region} writes data into a file, it first calls the
+ encoding functions for the formats listed in @code{buffer-file-format},
+ in the order of appearance in the list.
+ 
+ @defun format-write-file file format
+ This command writes the current buffer contents into the file @var{file}
+ in format @var{format}, and makes that format the default for future
+ saves of the buffer.  The argument @var{format} is a list of format
+ names.
+ @end defun
+ 
+ @defun format-find-file file format
+ This command finds the file @var{file}, converting it according to
+ format @var{format}.  It also makes @var{format} the default if the
+ buffer is saved later.
+ 
+ The argument @var{format} is a list of format names.  If @var{format} is
+ @code{nil}, no conversion takes place.  Interactively, typing just
+ @key{RET} for @var{format} specifies @code{nil}.
+ @end defun
+ 
+ @defun format-insert-file file format %optional beg end
+ This command inserts the contents of file @var{file}, converting it
+ according to format @var{format}.  If @var{beg} and @var{end} are
+ non-@code{nil}, they specify which part of the file to read, as in
+ @code{insert-file-contents} (@pxref{Reading from Files}).
+ 
+ The return value is like what @code{insert-file-contents} returns: a
+ list of the absolute file name and the length of the data inserted
+ (after conversion).
+ 
+ The argument @var{format} is a list of format names.  If @var{format} is
+ @code{nil}, no conversion takes place.  Interactively, typing just
+ @key{RET} for @var{format} specifies @code{nil}.
+ @end defun
+ 
+ @defun format-find-file file format
+ This command finds the file @var{file}, converting it according to
+ format @var{format}.  It also makes @var{format} the default if the
+ buffer is saved later.
+ 
+ The argument @var{format} is a list of format names.  If @var{format} is
+ @code{nil}, no conversion takes place.  Interactively, typing just
+ @key{RET} for @var{format} specifies @code{nil}.
+ @end defun
+ 
+ @defun format-insert-file file format %optional beg end
+ This command inserts the contents of file @var{file}, converting it
+ according to format @var{format}.  If @var{beg} and @var{end} are
+ non-@code{nil}, they specify which part of the file to read,
+ as in @code{insert-file-contents} (@pxref{Reading from Files}).
+ 
+ The return value is like what @code{insert-file-contents} returns: a
+ list of the absolute file name and the length of the data inserted
+ (after conversion).
+ 
+ The argument @var{format} is a list of format names.  If @var{format} is
+ @code{nil}, no conversion takes place.  Interactively, typing just
+ @key{RET} for @var{format} specifies @code{nil}.
+ @end defun
+ 
+ @defvar auto-save-file-format
+ This variable specifies the format to use for auto-saving.  Its value is
+ a list of format names, just like the value of
+ @code{buffer-file-format}; but it is used instead of
+ @code{buffer-file-format} for writing auto-save files.  This variable
+ is always local in all buffers.
+ @end defvar
+ 
+ @node Files and MS-DOS
+ @section Files and MS-DOS
+ @cindex MS-DOS file types
+ @cindex file types on MS-DOS
+ @cindex text files and binary files
+ @cindex binary files and text files
+ 
+   Emacs on MS-DOS makes a distinction between text files and binary
+ files.  This is necessary because ordinary text files on MS-DOS use a
+ two character sequence between lines: carriage-return and linefeed
+ (@sc{crlf}).  Emacs expects just a newline character (a linefeed) between
+ lines.  When Emacs reads or writes a text file on MS-DOS, it needs to
+ convert the line separators.  This means it needs to know which files
+ are text files and which are binary.  It makes this decision when
+ visiting a file, and records the decision in the variable
+ @code{buffer-file-type} for use when the file is saved.
+ 
+   @xref{MS-DOS Subprocesses}, for a related feature for subprocesses.
+ 
+ @defvar buffer-file-type
+ This variable, automatically local in each buffer, records the file type
+ of the buffer's visited file.  The value is @code{nil} for text,
+ @code{t} for binary.
+ @end defvar
+ 
+ @defun find-buffer-file-type filename
+ This function determines whether file @var{filename} is a text file
+ or a binary file.  It returns @code{nil} for text, @code{t} for binary.
+ @end defun
+ 
+ @defopt file-name-buffer-file-type-alist
+ This variable holds an alist for distinguishing text files from binary
+ files.  Each element has the form (@var{regexp} . @var{type}), where
+ @var{regexp} is matched against the file name, and @var{type} may be is
+ @code{nil} for text, @code{t} for binary, or a function to call to
+ compute which.  If it is a function, then it is called with a single
+ argument (the file name) and should return @code{t} or @code{nil}.
+ @end defopt
+ 
+ @defopt default-buffer-file-type
+ This variable specifies the default file type for files whose names
+ don't indicate anything in particular.  Its value should be @code{nil}
+ for text, or @code{t} for binary.
+ @end defopt
+ 
+ @deffn Command find-file-text filename
+ Like @code{find-file}, but treat the file as text regardless of its name.
+ @end deffn
+ 
+ @deffn Command find-file-binary filename
+ Like @code{find-file}, but treat the file as binary regardless of its
+ name.
+ @end deffn
Index: emacs/man/elisp-frames.texi
diff -c /dev/null emacs/man/elisp-frames.texi:1.2
*** /dev/null	Fri Aug  2 20:52:38 1996
--- emacs/man/elisp-frames.texi	Thu Aug  1 00:22:45 1996
***************
*** 0 ****
--- 1,1327 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/frames
+ @node Frames, Positions, Windows, Top
+ @chapter Frames
+ @cindex frame
+ 
+   A @var{frame} is a rectangle on the screen that contains one or more
+ Emacs windows.  A frame initially contains a single main window (plus
+ perhaps a minibuffer window), which you can subdivide vertically or
+ horizontally into smaller windows.
+ 
+ @cindex terminal frame
+ @cindex X window frame
+   When Emacs runs on a text-only terminal, it starts with one
+ @dfn{terminal frame}.  If you create additional ones, Emacs displays
+ one and only one at any given time---on the terminal screen, of course.
+ 
+   When Emacs communicates directly with an X server, it does not have a
+ terminal frame; instead, it starts with a single @dfn{X window frame}.
+ It can display multiple X window frames at the same time, each in its
+ own X window.
+ 
+ @defun framep object
+ This predicate returns @code{t} if @var{object} is a frame, and
+ @code{nil} otherwise.
+ @end defun
+ 
+ @menu
+ * Creating Frames::		Creating additional frames.
+ * Multiple Displays::           Creating frames on other X displays.
+ * Frame Parameters::		Controlling frame size, position, font, etc.
+ * Frame Titles::                Automatic updating of frame titles.
+ * Deleting Frames::		Frames last until explicitly deleted.
+ * Finding All Frames::		How to examine all existing frames.
+ * Frames and Windows::		A frame contains windows;
+ 				  display of text always works through windows.
+ * Minibuffers and Frames::	How a frame finds the minibuffer to use.
+ * Input Focus::			Specifying the selected frame.
+ * Visibility of Frames::	Frames may be visible or invisible, or icons.
+ * Raising and Lowering::	Raising a frame makes it hide other X windows;
+ 				  lowering it makes the others hide them.
+ * Frame Configurations::	Saving the state of all frames.
+ * Mouse Tracking::		Getting events that say when the mouse moves.
+ * Mouse Position::		Asking where the mouse is, or moving it.
+ * Pop-Up Menus::		Displaying a menu for the user to select from.
+ * Dialog Boxes::                Displaying a box to ask yes or no.
+ * Pointer Shapes::              Specifying the shape of the mouse pointer.
+ * X Selections::		Transferring text to and from other X clients.
+ * Color Names::	                Getting the definitions of color names.
+ * Resources::		        Getting resource values from the server.
+ * Server Data::		        Getting info about the X server.
+ @end menu
+ 
+   @xref{Display}, for related information.
+ 
+ @node Creating Frames
+ @section Creating Frames
+ 
+ To create a new frame, call the function @code{make-frame}.
+ 
+ @defun make-frame alist
+ This function creates a new frame.  If you are using X, it makes
+ an X window frame; otherwise, it makes a terminal frame.
+ 
+ The argument is an alist specifying frame parameters.  Any parameters
+ not mentioned in @var{alist} default according to the value of the
+ variable @code{default-frame-alist}; parameters not specified even there
+ default from the standard X defaults file and X resources.
+ 
+ The set of possible parameters depends in principle on what kind of
+ window system Emacs uses to display its frames.  @xref{X Frame
+ Parameters}, for documentation of individual parameters you can specify.
+ @end defun
+ 
+ @defvar before-make-frame-hook
+ A normal hook run by @code{make-frame} before it actually creates the
+ frame.
+ @end defvar
+ 
+ @defvar after-make-frame-hook
+ A normal hook run by @code{make-frame} after it creates the frame.
+ @end defvar
+ 
+ @node Multiple Displays
+ @section Multiple Displays
+ @cindex multiple displays
+ @cindex multiple X terminals
+ @cindex displays, multiple
+ 
+   A single Emacs can talk to more than one X Windows display.
+ Initially, Emacs uses just one display---the one chosen with the
+ @code{DISPLAY} environment variable or with the @samp{--display} option
+ (@pxref{Initial Options,,, emacs, The GNU Emacs Manual}).  To connect to
+ another display, use the command @code{make-frame-on-display} or specify
+ the @code{display} frame parameter when you create the frame.
+ 
+   Emacs treats each X server as a separate terminal, giving each one its
+ own selected frame and its own minibuffer windows.  A few Lisp variables
+ have values local to the current terminal (that is, the terminal
+ corresponding to the currently selected frame): these are
+ @code{default-minibuffer-frame}, @code{defining-kbd-macro},
+ @code{last-kbd-macro}, @code{multiple-frames} and
+ @code{system-key-alist}.  These variables are always terminal-local and
+ can never be buffer-local.
+ 
+   A single X server can handle more than one screen.  A display name
+ @samp{@var{host}.@var{server}.@var{screen}} has three parts; the last
+ part specifies the screen number for a given server.  When you use two
+ screens belonging to one server, Emacs knows by the similarity in their
+ names that they share a single keyboard, and it treats them as a single
+ terminal.
+ 
+ @deffn Command make-frame-on-display display &optional parameters
+ This creates a new frame on display @var{display}, taking the other
+ frame parameters from @var{parameters}.  Aside from the @var{display}
+ argument, it is like @code{make-frame} (@pxref{Creating Frames}).
+ @end deffn
+ 
+ @defun x-display-list
+ This returns a list that indicates which X displays Emacs has a
+ connection to.  The elements of the list are strings, and each one is
+ a display name.
+ @end defun
+ 
+ @defun x-open-connection display &optional xrm-string
+ This function opens a connection to the X display @var{display}.  It
+ does not create a frame on that display, but it permits you to check
+ that communication can be established with that display.
+ 
+ The optional argument @var{resource-string}, if not @code{nil}, is a
+ string of resource names and values, in the same format used in the
+ @file{.Xresources} file.  The values you specify override the resource
+ values recorded in the X server itself; they apply to all Emacs frames
+ created on this display.  Here's an example of what this string might
+ look like:
+ 
+ @example
+ "*BorderWidth: 3\n*InternalBorder: 2\n"
+ @end example
+ 
+ @xref{Resources}.
+ @end defun
+ 
+ @defun x-close-connection display
+ This function closes the connection to display @var{display}.  Before
+ you can do this, you must first delete all the frames that were open on
+ that display (@pxref{Deleting Frames}).
+ @end defun
+ 
+ @node Frame Parameters
+ @section Frame Parameters
+ 
+ A frame has many parameters that control its appearance and behavior.
+ Just what parameters a frame has depends on what display mechanism it
+ uses.
+ 
+ Frame parameters exist for the sake of window systems.  A terminal frame
+ has a few parameters, mostly for compatibility's sake; only the height,
+ width and @code{buffer-predicate} parameters really do something.
+ 
+ @menu
+ * Parameter Access::       How to change a frame's parameters.
+ * Initial Parameters::	   Specifying frame parameters when you make a frame.
+ * X Frame Parameters::     List of frame parameters.
+ * Size and Position::      Changing the size and position of a frame.
+ @end menu
+ 
+ @node Parameter Access
+ @subsection Access to Frame Parameters
+ 
+ These functions let you read and change the parameter values of a
+ frame.
+ 
+ @defun frame-parameters frame
+ The function @code{frame-parameters} returns an alist listing all the
+ parameters of @var{frame} and their values.
+ @end defun
+ 
+ @defun modify-frame-parameters frame alist
+ This function alters the parameters of frame @var{frame} based on the
+ elements of @var{alist}.  Each element of @var{alist} has the form
+ @code{(@var{parm} . @var{value})}, where @var{parm} is a symbol naming a
+ parameter.  If you don't mention a parameter in @var{alist}, its value
+ doesn't change.
+ @end defun
+ 
+ @node Initial Parameters
+ @subsection Initial Frame Parameters
+ 
+ You can specify the parameters for the initial startup frame
+ by setting @code{initial-frame-alist} in your @file{.emacs} file.
+ 
+ @defvar initial-frame-alist
+ This variable's value is an alist of parameter values used when creating
+ the initial X window frame.  Each element has the form:
+ 
+ @example
+ (@var{parameter} . @var{value})
+ @end example
+ 
+ Emacs creates the initial frame before it reads your @file{~/.emacs}
+ file.  After reading that file, Emacs checks @code{initial-frame-alist},
+ and applies the parameter settings in the altered value to the already
+ created initial frame.
+ 
+ If these settings affect the frame geometry and appearance, you'll see
+ the frame appear with the wrong ones and then change to the specified
+ ones.  If that bothers you, you can specify the same geometry and
+ appearance with X resources; those do take affect before the frame is
+ created.  @xref{Resources X,, X Resources, emacs, The GNU Emacs Manual}.
+ 
+ X resource settings typically apply to all frames.  If you want to
+ specify some X resources solely for the sake of the initial frame, and
+ you don't want them to apply to subsequent frames, here's how to achieve
+ this.  Specify parameters in @code{default-frame-alist} to override the
+ X resources for subsequent frames; then, to prevent these from affecting
+ the initial frame, specify the same parameters in
+ @code{initial-frame-alist} with values that match the X resources.
+ @end defvar
+ 
+ If these parameters specify a separate minibuffer-only frame with
+ @code{(minibuffer . nil)}, and you have not created one, Emacs creates
+ one for you.
+ 
+ @defvar minibuffer-frame-alist
+ This variable's value is an alist of parameter values used when creating
+ an initial minibuffer-only frame---if such a frame is needed, according
+ to the parameters for the main initial frame.
+ @end defvar
+ 
+ @defvar default-frame-alist
+ This is an alist specifying default values of frame parameters for
+ subsequent Emacs frames (not the initial ones).
+ @end defvar
+ 
+ See also @code{special-display-frame-alist}, in @ref{Choosing Window}.
+ 
+ If you use options that specify window appearance when you invoke Emacs,
+ they take effect by adding elements to @code{default-frame-alist}.  One
+ exception is @samp{-geometry}, which adds the specified position to
+ @code{initial-frame-alist} instead.  @xref{Command Arguments,,, emacs,
+ The GNU Emacs Manual}.
+ 
+ @node X Frame Parameters
+ @subsection X Window Frame Parameters
+ 
+ Just what parameters a frame has depends on what display mechanism it
+ uses.  Here is a table of the parameters of an X window frame; of these,
+ @code{name}, @code{height}, @code{width}, and @code{buffer-predicate}
+ provide meaningful information in non-X frames.
+ 
+ @table @code
+ @item name
+ The name of the frame.  Most window managers display the frame's name in
+ the frame's border, at the top of the frame.  If you don't specify a
+ name, and you have more than one frame, Emacs sets the frame name based
+ on the buffer displayed in the frame's selected window.
+ 
+ If you specify the frame name explicitly when you create the frame, the
+ name is also used (instead of the name of the Emacs executable) when
+ looking up X resources for the frame.
+ 
+ @item display
+ The display on which to open this frame.  It should be a string of the
+ form @code{"@var{host}:@var{dpy}.@var{screen}"}, just like the
+ @code{DISPLAY} environment variable.
+ 
+ @item left
+ The screen position of the left edge, in pixels, with respect to the
+ left edge of the screen.  The value may be a positive number @var{pos},
+ or a list of the form @code{(+ @var{pos})} which permits specifying a
+ negative @var{pos} value.
+ 
+ A negative number @minus{}@var{pos}, or a list of the form @code{(-
+ @var{pos})}, actually specifies the position of the right edge of the
+ window with respect to the right edge of the screen.  A positive value
+ of @var{pos} counts toward the left.  If the parameter is a negative
+ integer @minus{}@var{pos} then @var{pos} is positive!
+ 
+ @item top
+ The screen position of the top edge, in pixels, with respect to the
+ top edge of the screen.  The value may be a positive number @var{pos},
+ or a list of the form @code{(+ @var{pos})} which permits specifying a
+ negative @var{pos} value.
+ 
+ A negative number @minus{}@var{pos}, or a list of the form @code{(-
+ @var{pos})}, actually specifies the position of the bottom edge of the
+ window with respect to the bottom edge of the screen.  A positive value
+ of @var{pos} counts toward the top.  If the parameter is a negative
+ integer @minus{}@var{pos} then @var{pos} is positive!
+ 
+ @item icon-left
+ The screen position of the left edge @emph{of the frame's icon}, in
+ pixels, counting from the left edge of the screen.  This takes effect if
+ and when the frame is iconified.
+ 
+ @item icon-top
+ The screen position of the top edge @emph{of the frame's icon}, in
+ pixels, counting from the top edge of the screen.  This takes effect if
+ and when the frame is iconified.
+ 
+ @item user-position
+ Non-@code{nil} if the screen position of the frame was explicitly
+ requested by the user (for example, with the @samp{-geometry} option).
+ Nothing automatically makes this parameter non-@code{nil}; it is up to
+ Lisp programs that call @code{make-frame} to specify this parameter as
+ well as specifying the @code{left} and @code{top} parameters.
+ 
+ @item height
+ The height of the frame contents, in characters.  (To get the height in
+ pixels, call @code{frame-pixel-height}; see @ref{Size and Position}.)
+ 
+ @item width
+ The width of the frame contents, in characters.  (To get the height in
+ pixels, call @code{frame-pixel-width}; see @ref{Size and Position}.)
+ 
+ @item window-id
+ The number of the X window for the frame.
+ 
+ @item minibuffer
+ Whether this frame has its own minibuffer.  The value @code{t} means
+ yes, @code{nil} means no, @code{only} means this frame is just a
+ minibuffer.  If the value is a minibuffer window (in some other frame),
+ the new frame uses that minibuffer.
+ 
+ @item buffer-predicate
+ The buffer-predicate function for this frame.  The function
+ @code{other-buffer} uses this predicate (from the selected frame) to
+ decide which buffers it should consider, if the predicate is not
+ @code{nil}.  It calls the predicate with one arg, a buffer, once for
+ each buffer; if the predicate returns a non-@code{nil} value, it
+ considers that buffer.
+ 
+ @item font
+ The name of the font for displaying text in the frame.  This is a
+ string.
+ 
+ @item auto-raise
+ Whether selecting the frame raises it (non-@code{nil} means yes).
+ 
+ @item auto-lower
+ Whether deselecting the frame lowers it (non-@code{nil} means yes).
+ 
+ @item vertical-scroll-bars
+ Whether the frame has scroll bars for vertical scrolling
+ (non-@code{nil} means yes).
+ 
+ @item horizontal-scroll-bars
+ Whether the frame has scroll bars for horizontal scrolling
+ (non-@code{nil} means yes).  (Horizontal scroll bars are not currently
+ implemented.)
+ 
+ @item scroll-bar-width
+ The width of the vertical scroll bar, in pixels.
+ 
+ @item icon-type
+ The type of icon to use for this frame when it is iconified.  If the
+ value is a string, that specifies a file containing a bitmap to use.
+ Any other non-@code{nil} value specifies the default bitmap icon (a
+ picture of a gnu); @code{nil} specifies a text icon.
+ 
+ @item icon-name
+ The name to use in the icon for this frame, when and if the icon
+ appears.  If this is @code{nil}, the frame's title is used.
+ 
+ @item foreground-color
+ The color to use for the image of a character.  This is a string; the X
+ server defines the meaningful color names.
+ 
+ @item background-color
+ The color to use for the background of characters.
+ 
+ @item mouse-color
+ The color for the mouse pointer.
+ 
+ @item cursor-color
+ The color for the cursor that shows point.
+ 
+ @item border-color
+ The color for the border of the frame.
+ 
+ @item cursor-type
+ The way to display the cursor.  The legitimate values are @code{bar},
+ @code{box}, and @code{(bar . @var{width})}.  The symbol @code{box}
+ specifies an ordinary black box overlaying the character after point;
+ that is the default.  The symbol @code{bar} specifies a vertical bar
+ between characters as the cursor.  @code{(bar . @var{width})} specifies
+ a bar @var{width} pixels wide.
+ 
+ @item border-width
+ The width in pixels of the window border.
+ 
+ @item internal-border-width
+ The distance in pixels between text and border.
+ 
+ @item unsplittable
+ If non-@code{nil}, this frame's window is never split automatically.
+ 
+ @item visibility
+ The state of visibility of the frame.  There are three possibilities:
+ @code{nil} for invisible, @code{t} for visible, and @code{icon} for
+ iconified.  @xref{Visibility of Frames}.
+ 
+ @item menu-bar-lines
+ The number of lines to allocate at the top of the frame for a menu bar.
+ The default is 1.  @xref{Menu Bar}.  (In Emacs versions that use the X
+ toolkit, there is only one menu bar line; all that matters about the
+ number you specify is whether it is greater than zero.)
+ 
+ @item parent-id
+ @c ??? Not yet working.
+ The X window number of the window that should be the parent of this one.
+ Specifying this lets you create an Emacs window inside some other
+ application's window.  (It is not certain this will be implemented; try
+ it and see if it works.)
+ @end table
+ 
+ @node Size and Position
+ @subsection Frame Size And Position
+ 
+   You can read or change the size and position of a frame using the
+ frame parameters @code{left}, @code{top}, @code{height}, and
+ @code{width}.  Whatever geometry parameters you don't specify are chosen
+ by the window manager in its usual fashion.
+ 
+   Here are some special features for working with sizes and positions:
+ 
+ @defun set-frame-position frame left top
+ This function sets the position of the top left corner of @var{frame} to
+ @var{left} and @var{top}.  These arguments are measured in pixels, and
+ count from the top left corner of the screen.  Negative parameter values
+ count up or rightward from the top left corner of the screen.
+ @end defun
+ 
+ @defun frame-height &optional frame
+ @defunx frame-width &optional frame
+ These functions return the height and width of @var{frame}, measured in
+ characters.  If you don't supply @var{frame}, they use the selected
+ frame.
+ @end defun
+ 
+ @defun frame-pixel-height &optional frame
+ @defunx frame-pixel-width &optional frame
+ These functions return the height and width of @var{frame}, measured in
+ pixels.  If you don't supply @var{frame}, they use the selected frame.
+ @end defun
+ 
+ @defun frame-char-height &optional frame
+ @defunx frame-char-width &optional frame
+ These functions return the height and width of a character in
+ @var{frame}, measured in pixels.  The values depend on the choice of
+ font.  If you don't supply @var{frame}, these functions use the selected
+ frame.
+ @end defun
+ 
+ @defun set-frame-size frame cols rows
+ This function sets the size of @var{frame}, measured in characters;
+ @var{cols} and @var{rows} specify the new width and height.
+ 
+ To set the size based on values measured in pixels, use
+ @code{frame-char-height} and @code{frame-char-width} to convert
+ them to units of characters.
+ @end defun
+ 
+   The old-fashioned functions @code{set-screen-height} and
+ @code{set-screen-width}, which were used to specify the height and width
+ of the screen in Emacs versions that did not support multiple frames,
+ are still usable.  They apply to the selected frame.  @xref{Screen
+ Size}.
+ 
+ @defun x-parse-geometry geom
+ @cindex geometry specification
+ The function @code{x-parse-geometry} converts a standard X windows
+ geometry string to an alist that you can use as part of the argument to
+ @code{make-frame}.
+ 
+ The alist describes which parameters were specified in @var{geom}, and
+ gives the values specified for them.  Each element looks like
+ @code{(@var{parameter} . @var{value})}.  The possible @var{parameter}
+ values are @code{left}, @code{top}, @code{width}, and @code{height}.
+ 
+ For the size parameters, the value must be an integer.  The position
+ parameter names @code{left} and @code{top} are not totally accurate,
+ because some values indicate the position of the right or bottom edges
+ instead.  These are the @var{value} possibilities for the position
+ parameters:
+ 
+ @table @asis
+ @item an integer
+ A positive integer relates the left edge or top edge of the window to
+ the left or top edge of the screen.  A negative integer relates the
+ right or bottom edge of the window to the right or bottom edge of the
+ screen.
+ 
+ @item @code{(+ @var{position})}
+ This specifies the position of the left or top edge of the window
+ relative to the left or top edge of the screen.  The integer
+ @var{position} may be positive or negative; a negative value specifies a
+ position outside the screen.
+ 
+ @item @code{(- @var{position})}
+ This specifies the position of the right or bottom edge of the window
+ relative to the right or bottom edge of the screen.  The integer
+ @var{position} may be positive or negative; a negative value specifies a
+ position outside the screen.
+ @end table
+ 
+ Here is an example:
+ 
+ @example
+ (x-parse-geometry "35x70+0-0")
+      @result{} ((width . 35) (height . 70)
+          (left . 0) (top - 0))
+ @end example
+ @end defun
+ 
+ @ignore
+ New functions @code{set-frame-height} and @code{set-frame-width} set the
+ size of a specified frame.  The frame is the first argument; the size is
+ the second.
+ @end ignore
+ 
+ @node Frame Titles
+ @section Frame Titles
+ 
+ Every frame has a title; most window managers display the frame title at
+ the top of the frame.  You can specify an explicit title with the
+ @code{name} frame property.  But normally you don't specify this
+ explicitly, and Emacs computes the title automatically.
+ 
+ Emacs computes the frame title based on a template stored in the
+ variable @code{frame-title-format}.
+ 
+ @defvar frame-title-format
+ This variable specifies how to compute a title for a frame
+ when you have not explicitly specified one.
+ 
+ The variable's value is actually a mode line construct, just like
+ @code{mode-line-format}.  @xref{Mode Line Data}.
+ @end defvar
+ 
+ @defvar icon-title-format
+ This variable specifies how to compute the title for an iconified frame,
+ when you have not explicitly specified the frame title.  This title
+ appears in the icon itself.
+ @end defvar
+ 
+ @defvar multiple-frames
+ This variable is set automatically by Emacs.  Its value is @code{t} when
+ there are two or more frames (not counting minibuffer-only frames or
+ invisible frames).  The default value of @code{frame-title-format} uses
+ @code{multiple-frames} so as to put the buffer name in the frame title
+ only when there is more than one frame.
+ 
+ The variable is always local to the current terminal and cannot be
+ buffer-local.  @xref{Multiple Displays}.
+ @end defvar
+ 
+ @node Deleting Frames
+ @section Deleting Frames
+ @cindex deletion of frames
+ 
+ Frames remain potentially visible until you explicitly @dfn{delete}
+ them.  A deleted frame cannot appear on the screen, but continues to
+ exist as a Lisp object until there are no references to it.  There is no
+ way to cancel the deletion of a frame aside from restoring a saved frame
+ configuration (@pxref{Frame Configurations}); this is similar to the
+ way windows behave.
+ 
+ @deffn Command delete-frame &optional frame
+ This function deletes the frame @var{frame}.  By default, @var{frame} is
+ the selected frame.
+ @end deffn
+ 
+ @defun frame-live-p frame
+ The function @code{frame-live-p} returns non-@code{nil} if the frame
+ @var{frame} has not been deleted.
+ @end defun
+ 
+   Some window managers provide a command to delete a window.  These work
+ by sending a special message to the program that operates the window.
+ When Emacs gets one of these commands, it generates a
+ @code{delete-frame} event, whose normal definition is a command that
+ calls the function @code{delete-frame}.  @xref{Misc Events}.
+ 
+ @node Finding All Frames
+ @section Finding All Frames
+ 
+ @defun frame-list
+ The function @code{frame-list} returns a list of all the frames that
+ have not been deleted.  It is analogous to @code{buffer-list} for
+ buffers.  The list that you get is newly created, so modifying the list
+ doesn't have any effect on the internals of Emacs.
+ @end defun
+ 
+ @defun visible-frame-list
+ This function returns a list of just the currently visible frames.
+ @xref{Visibility of Frames}.  (Terminal frames always count as
+ ``visible'', even though only the selected one is actually displayed.)
+ @end defun
+ 
+ @defun next-frame &optional frame minibuf
+ The function @code{next-frame} lets you cycle conveniently through all
+ the frames from an arbitrary starting point.  It returns the ``next''
+ frame after @var{frame} in the cycle.  If @var{frame} is omitted or
+ @code{nil}, it defaults to the selected frame.
+ 
+ The second argument, @var{minibuf}, says which frames to consider:
+ 
+ @table @asis
+ @item @code{nil}
+ Exclude minibuffer-only frames.
+ @item @code{visible}
+ Consider all visible frames.
+ @item 0
+ Consider all visible or iconified frames.
+ @item a window
+ Consider only the frames using that particular window as their
+ minibuffer.
+ @item anything else
+ Consider all frames.
+ @end table
+ @end defun
+ 
+ @defun previous-frame &optional frame minibuf
+ Like @code{next-frame}, but cycles through all frames in the opposite
+ direction.
+ @end defun
+ 
+   See also @code{next-window} and @code{previous-window}, in @ref{Cyclic
+ Window Ordering}.
+ 
+ @node Frames and Windows
+ @section Frames and Windows
+ 
+   Each window is part of one and only one frame; you can get the frame
+ with @code{window-frame}.
+ 
+ @defun window-frame window
+ This function returns the frame that @var{window} is on.
+ @end defun
+ 
+   All the non-minibuffer windows in a frame are arranged in a cyclic
+ order.  The order runs from the frame's top window, which is at the
+ upper left corner, down and to the right, until it reaches the window at
+ the lower right corner (always the minibuffer window, if the frame has
+ one), and then it moves back to the top.
+ 
+ @defun frame-top-window frame
+ This returns the topmost, leftmost window of frame @var{frame}.
+ @end defun
+ 
+ At any time, exactly one window on any frame is @dfn{selected within the
+ frame}.  The significance of this designation is that selecting the
+ frame also selects this window.  You can get the frame's current
+ selected window with @code{frame-selected-window}.
+ 
+ @defun frame-selected-window frame
+ This function returns the window on @var{frame} that is selected within
+ @var{frame}.
+ @end defun
+ 
+ Conversely, selecting a window for Emacs with @code{select-window} also
+ makes that window selected within its frame.  @xref{Selecting Windows}.
+ 
+ Another function that (usually) returns one of the windows in a frame is
+ @code{minibuffer-window}.  @xref{Minibuffer Misc}.
+ 
+ @node Minibuffers and Frames
+ @section Minibuffers and Frames
+ 
+ Normally, each frame has its own minibuffer window at the bottom, which
+ is used whenever that frame is selected.  If the frame has a minibuffer,
+ you can get it with @code{minibuffer-window} (@pxref{Minibuffer Misc}).
+ 
+ However, you can also create a frame with no minibuffer.  Such a frame
+ must use the minibuffer window of some other frame.  When you create the
+ frame, you can specify explicitly the minibuffer window to use (in some
+ other frame).  If you don't, then the minibuffer is found in the frame
+ which is the value of the variable @code{default-minibuffer-frame}.  Its
+ value should be a frame that does have a minibuffer.
+ 
+ If you use a minibuffer-only frame, you might want that frame to raise
+ when you enter the minibuffer.  If so, set the variable
+ @code{minibuffer-auto-raise} to @code{t}.  @xref{Raising and Lowering}.
+ 
+ @defvar default-minibuffer-frame
+ This variable specifies the frame to use for the minibuffer window, by
+ default.  It is always local to the current terminal and cannot be
+ buffer-local.  @xref{Multiple Displays}.
+ @end defvar
+ 
+ @node Input Focus
+ @section Input Focus
+ @cindex input focus
+ @cindex selected frame
+ 
+ At any time, one frame in Emacs is the @dfn{selected frame}.  The selected
+ window always resides on the selected frame.
+ 
+ @defun selected-frame
+ This function returns the selected frame.
+ @end defun
+ 
+ The X server normally directs keyboard input to the X window that the
+ mouse is in.  Some window managers use mouse clicks or keyboard events
+ to @dfn{shift the focus} to various X windows, overriding the normal
+ behavior of the server.
+ 
+ Lisp programs can switch frames ``temporarily'' by calling
+ the function @code{select-frame}.  This does not override the window
+ manager; rather, it escapes from the window manager's control until
+ that control is somehow reasserted.
+ 
+ When using a text-only terminal, there is no window manager; therefore,
+ @code{switch-frame} is the only way to switch frames, and the effect
+ lasts until overridden by a subsequent call to @code{switch-frame}.
+ Only the selected terminal frame is actually displayed on the terminal.
+ Each terminal screen except for the initial one has a number, and the
+ number of the selected frame appears in the mode line after the word
+ @samp{Emacs} (@pxref{Mode Line Variables}).
+ 
+ @c ??? This is not yet implemented properly.
+ @defun select-frame frame
+ This function selects frame @var{frame}, temporarily disregarding the
+ focus of the X server if any.  The selection of @var{frame} lasts until
+ the next time the user does something to select a different frame, or
+ until the next time this function is called.
+ @end defun
+ 
+ Emacs cooperates with the X server and the window managers by arranging
+ to select frames according to what the server and window manager ask
+ for.  It does so by generating a special kind of input event, called a
+ @dfn{focus} event.  The command loop handles a focus event by calling
+ @code{handle-select-frame}.  @xref{Focus Events}.
+ 
+ @deffn Command handle-switch-frame frame
+ This function handles a focus event by selecting frame @var{frame}.
+ 
+ Focus events normally do their job by invoking this command.
+ Don't call it for any other reason.
+ @end deffn
+ 
+ @defun redirect-frame-focus frame focus-frame
+ This function redirects focus from @var{frame} to @var{focus-frame}.
+ This means that @var{focus-frame} will receive subsequent keystrokes
+ intended for @var{frame}.  After such an event, the value of
+ @code{last-event-frame} will be @var{focus-frame}.  Also, switch-frame
+ events specifying @var{frame} will instead select @var{focus-frame}.
+ 
+ If @var{focus-frame} is @code{nil}, that cancels any existing
+ redirection for @var{frame}, which therefore once again receives its own
+ events.
+ 
+ One use of focus redirection is for frames that don't have minibuffers.
+ These frames use minibuffers on other frames.  Activating a minibuffer
+ on another frame redirects focus to that frame.  This puts the focus on
+ the minibuffer's frame, where it belongs, even though the mouse remains
+ in the frame that activated the minibuffer.
+ 
+ Selecting a frame can also change focus redirections.  Selecting frame
+ @code{bar}, when @code{foo} had been selected, changes any redirections
+ pointing to @code{foo} so that they point to @code{bar} instead.  This
+ allows focus redirection to work properly when the user switches from
+ one frame to another using @code{select-window}.
+ 
+ This means that a frame whose focus is redirected to itself is treated
+ differently from a frame whose focus is not redirected.
+ @code{select-frame} affects the former but not the latter.
+ 
+ The redirection lasts until @code{redirect-frame-focus} is called to
+ change it.
+ @end defun
+ 
+ @node Visibility of Frames
+ @section Visibility of Frames
+ @cindex visible frame
+ @cindex invisible frame
+ @cindex iconified frame
+ @cindex frame visibility
+ 
+ An X window frame may be @dfn{visible}, @dfn{invisible}, or
+ @dfn{iconified}.  If it is visible, you can see its contents.  If it is
+ iconified, the frame's contents do not appear on the screen, but an icon
+ does.  If the frame is invisible, it doesn't show on the screen, not
+ even as an icon.
+ 
+ Visibility is meaningless for terminal frames, since only the selected
+ one is actually displayed in any case.
+ 
+ @deffn Command make-frame-visible &optional frame
+ This function makes frame @var{frame} visible.  If you omit @var{frame},
+ it makes the selected frame visible.
+ @end deffn
+ 
+ @deffn Command make-frame-invisible &optional frame
+ This function makes frame @var{frame} invisible.  If you omit
+ @var{frame}, it makes the selected frame invisible.
+ @end deffn
+ 
+ @deffn Command iconify-frame &optional frame
+ This function iconifies frame @var{frame}.  If you omit @var{frame}, it
+ iconifies the selected frame.
+ @end deffn
+ 
+ @defun frame-visible-p frame
+ This returns the visibility status of frame @var{frame}.  The value is
+ @code{t} if @var{frame} is visible, @code{nil} if it is invisible, and
+ @code{icon} if it is iconified.
+ @end defun
+ 
+   The visibility status of a frame is also available as a frame
+ parameter.  You can read or change it as such.  @xref{X Frame
+ Parameters}.
+ 
+   The user can iconify and deiconify frames with the window manager.
+ This happens below the level at which Emacs can exert any control, but
+ Emacs does provide events that you can use to keep track of such
+ changes.  @xref{Misc Events}.
+ 
+ @node Raising and Lowering
+ @section Raising and Lowering Frames
+ 
+ The X Window System uses a desktop metaphor.  Part of this metaphor is
+ the idea that windows are stacked in a notional third dimension
+ perpendicular to the screen surface, and thus ordered from ``highest''
+ to ``lowest''.  Where two windows overlap, the one higher up covers the
+ one underneath.  Even a window at the bottom of the stack can be seen if
+ no other window overlaps it.
+ 
+ @cindex raising a frame
+ @cindex lowering a frame
+ A window's place in this ordering is not fixed; in fact, users tend to
+ change the order frequently.  @dfn{Raising} a window means moving it
+ ``up'', to the top of the stack.  @dfn{Lowering} a window means moving
+ it to the bottom of the stack.  This motion is in the notional third
+ dimension only, and does not change the position of the window on the
+ screen.
+ 
+ You can raise and lower Emacs's X windows with these functions:
+ 
+ @deffn Command raise-frame frame
+ This function raises frame @var{frame}.
+ @end deffn
+ 
+ @deffn Command lower-frame frame
+ This function lowers frame @var{frame}.
+ @end deffn
+ 
+ @defopt minibuffer-auto-raise
+ If this is non-@code{nil}, activation of the minibuffer raises the frame
+ that the minibuffer window is in.
+ @end defopt
+ 
+ You can also enable auto-raise (raising automatically when a frame is
+ selected) or auto-lower (lowering automatically when it is deselected)
+ for any frame using frame parameters.  @xref{X Frame Parameters}.
+ 
+ @node Frame Configurations
+ @section Frame Configurations
+ @cindex frame configuration
+ 
+   A @dfn{frame configuration} records the current arrangement of frames,
+ all their properties, and the window configuration of each one.
+ 
+ @defun current-frame-configuration
+ This function returns a frame configuration list that describes
+ the current arrangement of frames and their contents.
+ @end defun
+ 
+ @defun set-frame-configuration configuration
+ This function restores the state of frames described in
+ @var{configuration}.
+ @end defun
+ 
+ @node Mouse Tracking
+ @section Mouse Tracking
+ @cindex mouse tracking
+ @cindex tracking the mouse
+ 
+ Sometimes it is useful to @dfn{track} the mouse, which means to display
+ something to indicate where the mouse is and move the indicator as the
+ mouse moves.  For efficient mouse tracking, you need a way to wait until
+ the mouse actually moves.
+ 
+ The convenient way to track the mouse is to ask for events to represent
+ mouse motion.  Then you can wait for motion by waiting for an event.  In
+ addition, you can easily handle any other sorts of events that may
+ occur.  That is useful, because normally you don't want to track the
+ mouse forever---only until some other event, such as the release of a
+ button.
+ 
+ @defspec track-mouse body@dots{}
+ Execute @var{body}, meanwhile generating input events for mouse motion.
+ The code in @var{body} can read these events with @code{read-event} or
+ @code{read-key-sequence}.  @xref{Motion Events}, for the format of mouse
+ motion events.
+ 
+ The value of @code{track-mouse} is that of the last form in @var{body}.
+ @end defspec
+ 
+ The usual purpose of tracking mouse motion is to indicate on the screen
+ the consequences of pushing or releasing a button at the current
+ position.
+ 
+ In many cases, you can avoid the need to track the mouse by using
+ the @code{mouse-face} text property (@pxref{Special Properties}).
+ That works at a much lower level and runs more smoothly than
+ Lisp-level mouse tracking.
+ 
+ @ignore
+ @c These are not implemented yet.
+ 
+ These functions change the screen appearance instantaneously.  The
+ effect is transient, only until the next ordinary Emacs redisplay.  That
+ is ok for mouse tracking, since it doesn't make sense for mouse tracking
+ to change the text, and the body of @code{track-mouse} normally reads
+ the events itself and does not do redisplay.
+ 
+ @defun x-contour-region window beg end
+ This function draws lines to make a box around the text from @var{beg}
+ to @var{end}, in window @var{window}.
+ @end defun
+ 
+ @defun x-uncontour-region window beg end
+ This function erases the lines that would make a box around the text
+ from @var{beg} to @var{end}, in window @var{window}.  Use it to remove
+ a contour that you previously made by calling @code{x-contour-region}.
+ @end defun
+ 
+ @defun x-draw-rectangle frame left top right bottom
+ This function draws a hollow rectangle on frame @var{frame} with the
+ specified edge coordinates, all measured in pixels from the inside top
+ left corner.  It uses the cursor color, the one used for indicating the
+ location of point.
+ @end defun
+ 
+ @defun x-erase-rectangle frame left top right bottom
+ This function erases a hollow rectangle on frame @var{frame} with the
+ specified edge coordinates, all measured in pixels from the inside top
+ left corner.  Erasure means redrawing the text and background that
+ normally belong in the specified rectangle.
+ @end defun
+ @end ignore
+ 
+ @node Mouse Position
+ @section Mouse Position
+ @cindex mouse position
+ @cindex position of mouse
+ 
+   The functions @code{mouse-position} and @code{set-mouse-position}
+ give access to the current position of the mouse.
+ 
+ @defun mouse-position
+ This function returns a description of the position of the mouse.  The
+ value looks like @code{(@var{frame} @var{x} . @var{y})}, where @var{x}
+ and @var{y} are integers giving the position in characters relative to
+ the top left corner of the inside of @var{frame}.
+ @end defun
+ 
+ @defun set-mouse-position frame x y
+ This function @dfn{warps the mouse} to position @var{x}, @var{y} in
+ frame @var{frame}.  The arguments @var{x} and @var{y} are integers,
+ giving the position in characters relative to the top left corner of the
+ inside of @var{frame}.
+ @end defun
+ 
+ @defun mouse-pixel-position
+ This function is like @code{mouse-position} except that it returns
+ coordinates in units of pixels rather than units of characters.
+ @end defun
+ 
+ @defun set-mouse-pixel-position frame x y
+ This function warps the mouse like @code{set-mouse-position} except that
+ @var{x} and @var{y} are in units of pixels rather than units of
+ characters.  These coordinates are not required to be within the frame.
+ @end defun
+ 
+ @need 3000
+ 
+ @node Pop-Up Menus
+ @section Pop-Up Menus
+ 
+   When using X windows, a Lisp program can pop up a menu which the
+ user can choose from with the mouse.
+ 
+ @defun x-popup-menu position menu
+ This function displays a pop-up menu and returns an indication of
+ what selection the user makes.
+ 
+ The argument @var{position} specifies where on the screen to put the
+ menu.  It can be either a mouse button event (which says to put the menu
+ where the user actuated the button) or a list of this form:
+ 
+ @example
+ ((@var{xoffset} @var{yoffset}) @var{window})
+ @end example
+ 
+ @noindent
+ where @var{xoffset} and @var{yoffset} are coordinates, measured in
+ pixels, counting from the top left corner of @var{window}'s frame.
+ 
+ If @var{position} is @code{t}, it means to use the current mouse
+ position.  If @var{position} is @code{nil}, it means to precompute the
+ key binding equivalents for the keymaps specified in @var{menu},
+ without actually displaying or popping up the menu.
+ 
+ The argument @var{menu} says what to display in the menu.  It can be a
+ keymap or a list of keymaps (@pxref{Menu Keymaps}).  Alternatively, it
+ can have the following form:
+ 
+ @example
+ (@var{title} @var{pane1} @var{pane2}...)
+ @end example
+ 
+ @noindent
+ where each pane is a list of form
+ 
+ @example
+ (@var{title} (@var{line} . @var{item})...)
+ @end example
+ 
+ Each @var{line} should be a string, and each @var{item} should be the
+ value to return if that @var{line} is chosen.
+ @end defun
+ 
+ @strong{Usage note:} Don't use @code{x-popup-menu} to display a menu if
+ a prefix key with a menu keymap would do the job.  If you use a menu
+ keymap to implement a menu, @kbd{C-h c} and @kbd{C-h a} can see the
+ individual items in that menu and provide help for them.  If instead you
+ implement the menu by defining a command that calls @code{x-popup-menu},
+ the help facilities cannot know what happens inside that command, so
+ they cannot give any help for the menu's items.  This is the reason why
+ all the menu bar items are normally implemented with menu keymaps
+ (@pxref{Menu Keymaps}).
+ 
+ @node Dialog Boxes
+ @section Dialog Boxes
+ @cindex dialog boxes
+ 
+   A dialog box is a variant of a pop-up menu.  It looks a little
+ different (if Emacs uses an X toolkit), it always appears in the center
+ of a frame, and it has just one level and one pane.  The main use of
+ dialog boxes is for asking questions that the user can answer with
+ ``yes'', ``no'', and a few other alternatives.  The functions
+ @code{y-or-n-p} and @code{yes-or-no-p} use dialog boxes instead of the
+ keyboard, when called from commands invoked by mouse clicks.
+ 
+ @defun x-popup-dialog position contents
+ This function displays a pop-up dialog box and returns an indication of
+ what selection the user makes.  The argument @var{contents} specifies
+ the alternatives to offer; it has this format:
+ 
+ @example
+ (@var{title} (@var{string} . @var{value})@dots{})
+ @end example
+ 
+ @noindent
+ which looks like the list that specifies a single pane for
+ @code{x-popup-menu}.
+ 
+ The return value is @var{value} from the chosen alternative.
+ 
+ An element of the list may be just a string instead of a cons cell
+ @code{(@var{string} . @var{value})}.  That makes a box that cannot
+ be selected.
+ 
+ If @code{nil} appears in the list, it separates the left-hand items from
+ the right-hand items; items that precede the @code{nil} appear on the
+ left, and items that follow the @code{nil} appear on the right.  If you
+ don't include a @code{nil} in the list, then approximately half the
+ items appear on each side.
+ 
+ Dialog boxes always appear in the center of a frame; the argument
+ @var{position} specifies which frame.  The possible values are as in
+ @code{x-popup-menu}, but the precise coordinates don't matter; only the
+ frame matters.
+ 
+ If your Emacs executable does not use an X toolkit, then it cannot
+ display a real dialog box; so instead it displays the same items in a
+ pop-up menu in the center of the frame.
+ @end defun
+ 
+ @node Pointer Shapes
+ @section Pointer Shapes
+ @cindex pointer shape
+ @cindex mouse pointer shape
+ 
+   These variables specify which shape to use for the mouse pointer in
+ various situations:
+ 
+ @table @code
+ @item x-pointer-shape
+ @vindex x-pointer-shape
+ This variable specifies the pointer shape to use ordinarily in the Emacs
+ frame.
+ 
+ @item x-sensitive-text-pointer-shape
+ @vindex x-sensitive-text-pointer-shape
+ This variable specifies the pointer shape to use when the mouse
+ is over mouse-sensitive text.
+ @end table
+ 
+   These variables affect newly created frames.  They do not normally
+ affect existing frames; however, if you set the mouse color of a frame,
+ that also updates its pointer shapes based on the current values of
+ these variables.  @xref{X Frame Parameters}.
+ 
+   The values you can use, to specify either of these pointer shapes, are
+ defined in the file @file{lisp/x-win.el}.  Use @kbd{M-x apropos
+ @key{RET} x-pointer @key{RET}} to see a list of them.
+ 
+ @node X Selections
+ @section X Selections
+ @cindex selection (for X windows)
+ 
+ The X server records a set of @dfn{selections} which permit transfer of
+ data between application programs.  The various selections are
+ distinguished by @dfn{selection types}, represented in Emacs by
+ symbols.  X clients including Emacs can read or set the selection for
+ any given type.
+ 
+ @defun x-set-selection type data
+ This function sets a ``selection'' in the X server.  It takes two
+ arguments: a selection type @var{type}, and the value to assign to it,
+ @var{data}.  If @var{data} is @code{nil}, it means to clear out the
+ selection.  Otherwise, @var{data} may be a string, a symbol, an integer
+ (or a cons of two integers or list of two integers), an overlay, or a
+ cons of two markers pointing to the same buffer.  An overlay or a pair
+ of markers stands for text in the overlay or between the markers.
+ 
+ The data may also be a vector of valid non-vector selection values.
+ 
+ Each possible @var{type} has its own selection value, which changes
+ independently.  The usual values of @var{type} are @code{PRIMARY} and
+ @code{SECONDARY}; these are symbols with upper-case names, in accord
+ with X Window System conventions.  The default is @code{PRIMARY}.
+ @end defun
+ 
+ @defun x-get-selection &optional type data-type
+ This function accesses selections set up by Emacs or by other X
+ clients.  It takes two optional arguments, @var{type} and
+ @var{data-type}.  The default for @var{type}, the selection type, is
+ @code{PRIMARY}.
+ 
+ The @var{data-type} argument specifies the form of data conversion to
+ use, to convert the raw data obtained from another X client into Lisp
+ data.  Meaningful values include @code{TEXT}, @code{STRING},
+ @code{TARGETS}, @code{LENGTH}, @code{DELETE}, @code{FILE_NAME},
+ @code{CHARACTER_POSITION}, @code{LINE_NUMBER}, @code{COLUMN_NUMBER},
+ @code{OWNER_OS}, @code{HOST_NAME}, @code{USER}, @code{CLASS},
+ @code{NAME}, @code{ATOM}, and @code{INTEGER}.  (These are symbols with
+ upper-case names in accord with X conventions.)  The default for
+ @var{data-type} is @code{STRING}.
+ @end defun
+ 
+ @cindex cut buffer
+ The X server also has a set of numbered @dfn{cut buffers} which can
+ store text or other data being moved between applications.  Cut buffers
+ are considered obsolete, but Emacs supports them for the sake of X
+ clients that still use them.
+ 
+ @defun x-get-cut-buffer n
+ This function returns the contents of cut buffer number @var{n}.
+ @end defun
+ 
+ @defun x-set-cut-buffer string
+ This function stores @var{string} into the first cut buffer (cut buffer
+ 0), moving the other values down through the series of cut buffers, much
+ like the way successive kills in Emacs move down the kill ring.
+ @end defun
+ 
+ @node Color Names
+ @section Color Names
+ 
+ @defun x-color-defined-p color
+ This function reports whether a color name is meaningful.  It returns
+ @code{t} if so; otherwise, @code{nil}.
+ 
+ Note that this does not tell you whether the display you are using
+ really supports that color.  You can ask for any defined color on any
+ kind of display, and you will get some result---that is how the X server
+ works.  Here's an approximate way to test whether your display supports
+ the color @var{color}:
+ 
+ @example
+ (defun x-color-supported-p (color)
+   (and (x-color-defined-p color)
+        (or (x-display-color-p)
+            (member color '("black" "white"))
+            (and (> (x-display-planes) 1)
+                 (equal color "gray")))))
+ @end example
+ @end defun
+ 
+ @defun x-color-values color
+ This function returns a value that describes what @var{color} should
+ ideally look like.  If @var{color} is defined, the value is a list of
+ three integers, which give the amount of red, the amount of green, and
+ the amount of blue.  Each integer ranges in principle from 0 to 65535,
+ but in practice no value seems to be above 65280.  If @var{color} is not
+ defined, the value is @code{nil}.
+ 
+ @example
+ (x-color-values "black")
+      @result{} (0 0 0)
+ (x-color-values "white")
+      @result{} (65280 65280 65280)
+ (x-color-values "red")
+      @result{} (65280 0 0)
+ (x-color-values "pink")
+      @result{} (65280 49152 51968)
+ (x-color-values "hungry")
+      @result{} nil
+ @end example
+ @end defun
+ 
+ @node Resources
+ @section X Resources
+ 
+ @defun x-get-resource attribute class &optional component subclass
+ The function @code{x-get-resource} retrieves a resource value from the X
+ Windows defaults database.
+ 
+ Resources are indexed by a combination of a @dfn{key} and a @dfn{class}.
+ This function searches using a key of the form
+ @samp{@var{instance}.@var{attribute}} (where @var{instance} is the name
+ under which Emacs was invoked), and using @samp{Emacs.@var{class}} as
+ the class.
+ 
+ The optional arguments @var{component} and @var{subclass} add to the key
+ and the class, respectively.  You must specify both of them or neither.
+ If you specify them, the key is
+ @samp{@var{instance}.@var{component}.@var{attribute}}, and the class is
+ @samp{Emacs.@var{class}.@var{subclass}}.
+ @end defun
+ 
+   @xref{Resources X,, X Resources, emacs, The GNU Emacs Manual}.
+ 
+ @node Server Data
+ @section Data about the X Server
+ 
+   This section describes functions and a variable that you can use to
+ get information about the capabilities and origin of an X display that
+ Emacs is using.  Each of these functions lets you specify the display
+ you are interested in: the @var{display} argument can be either a
+ display name, or a frame (meaning use the display that frame is on).  If
+ you omit the @var{display} argument, or specify @code{nil}, that means
+ to use the selected frame's display.
+ 
+ @defun x-display-screens &optional display
+ This function returns the number of screens associated with the display.
+ @end defun
+ 
+ @defun x-server-version &optional display
+ This function returns the list of version numbers of the X server
+ running the display.
+ @end defun
+ 
+ @defun x-server-vendor &optional display
+ This function returns the vendor that provided the X server software.
+ @end defun
+ 
+ @defun x-display-pixel-height &optional display
+ This function returns the height of the screen in pixels.
+ @end defun
+ 
+ @defun x-display-mm-height &optional display
+ This function returns the height of the screen in millimeters.
+ @end defun
+ 
+ @defun x-display-pixel-width &optional display
+ This function returns the width of the screen in pixels.
+ @end defun
+ 
+ @defun x-display-mm-width &optional display
+ This function returns the width of the screen in millimeters.
+ @end defun
+ 
+ @defun x-display-backing-store &optional display
+ This function returns the backing store capability of the screen.
+ Values can be the symbols @code{always}, @code{when-mapped}, or
+ @code{not-useful}.
+ @end defun
+ 
+ @defun x-display-save-under &optional display
+ This function returns non-@code{nil} if the display supports the
+ SaveUnder feature.
+ @end defun
+ 
+ @defun x-display-planes &optional display
+ This function returns the number of planes the display supports.
+ @end defun
+ 
+ @defun x-display-visual-class &optional display
+ This function returns the visual class for the screen.  The value is one
+ of the symbols @code{static-gray}, @code{gray-scale},
+ @code{static-color}, @code{pseudo-color}, @code{true-color}, and
+ @code{direct-color}.
+ @end defun
+ 
+ @defun x-display-grayscale-p &optional display
+ This function returns @code{t} if the screen can display shades of gray.
+ @end defun
+ 
+ @defun x-display-color-p &optional display
+ This function returns @code{t} if the screen is a color screen.
+ @end defun
+ 
+ @defun x-display-color-cells &optional display
+ This function returns the number of color cells the screen supports.
+ @end defun
+ 
+ @ignore
+ @defvar x-no-window-manager
+ This variable's value is is @code{t} if no X window manager is in use.
+ @end defvar
+ @end ignore
+ 
+ @ignore
+ @item
+ The functions @code{x-pixel-width} and @code{x-pixel-height} return the
+ width and height of an X Window frame, measured in pixels.
+ @end ignore
Index: emacs/man/elisp-functions.texi
diff -c /dev/null emacs/man/elisp-functions.texi:1.2
*** /dev/null	Fri Aug  2 20:53:01 1996
--- emacs/man/elisp-functions.texi	Thu Aug  1 00:22:47 1996
***************
*** 0 ****
--- 1,1138 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/functions
+ @node Functions, Macros, Variables, Top
+ @chapter Functions
+ 
+   A Lisp program is composed mainly of Lisp functions.  This chapter
+ explains what functions are, how they accept arguments, and how to
+ define them.
+ 
+ @menu
+ * What Is a Function::    Lisp functions vs. primitives; terminology.
+ * Lambda Expressions::    How functions are expressed as Lisp objects.
+ * Function Names::        A symbol can serve as the name of a function.
+ * Defining Functions::    Lisp expressions for defining functions.
+ * Calling Functions::     How to use an existing function.
+ * Mapping Functions::     Applying a function to each element of a list, etc.
+ * Anonymous Functions::   Lambda expressions are functions with no names.    
+ * Function Cells::        Accessing or setting the function definition
+                             of a symbol.
+ * Inline Functions::	  Defining functions that the compiler will open code.
+ * Related Topics::        Cross-references to specific Lisp primitives
+                             that have a special bearing on how functions work.
+ @end menu
+ 
+ @node What Is a Function
+ @section What Is a Function?
+ 
+   In a general sense, a function is a rule for carrying on a computation
+ given several values called @dfn{arguments}.  The result of the
+ computation is called the value of the function.  The computation can
+ also have side effects: lasting changes in the values of variables or
+ the contents of data structures.
+ 
+   Here are important terms for functions in Emacs Lisp and for other
+ function-like objects.
+ 
+ @table @dfn
+ @item function
+ @cindex function
+ In Emacs Lisp, a @dfn{function} is anything that can be applied to
+ arguments in a Lisp program.  In some cases, we use it more
+ specifically to mean a function written in Lisp.  Special forms and
+ macros are not functions.
+ 
+ @item primitive
+ @cindex primitive
+ @cindex subr
+ @cindex built-in function
+ A @dfn{primitive} is a function callable from Lisp that is written in C,
+ such as @code{car} or @code{append}.  These functions are also called
+ @dfn{built-in} functions or @dfn{subrs}.  (Special forms are also
+ considered primitives.)
+ 
+ Usually the reason that a function is a primitives is because it is
+ fundamental, because it provides a low-level interface to operating
+ system services, or because it needs to run fast.  Primitives can be
+ modified or added only by changing the C sources and recompiling the
+ editor.  See @ref{Writing Emacs Primitives}.
+ 
+ @item lambda expression
+ A @dfn{lambda expression} is a function written in Lisp.
+ These are described in the following section.
+ @ifinfo
+ @xref{Lambda Expressions}.
+ @end ifinfo
+ 
+ @item special form
+ A @dfn{special form} is a primitive that is like a function but does not
+ evaluate all of its arguments in the usual way.  It may evaluate only
+ some of the arguments, or may evaluate them in an unusual order, or
+ several times.  Many special forms are described in @ref{Control
+ Structures}.
+ 
+ @item macro
+ @cindex macro
+ A @dfn{macro} is a construct defined in Lisp by the programmer.  It
+ differs from a function in that it translates a Lisp expression that you
+ write into an equivalent expression to be evaluated instead of the
+ original expression.  Macros enable Lisp programmers to do the sorts of
+ things that special forms can do.  @xref{Macros}, for how to define and
+ use macros.
+ 
+ @item command
+ @cindex command
+ A @dfn{command} is an object that @code{command-execute} can invoke; it
+ is a possible definition for a key sequence.  Some functions are
+ commands; a function written in Lisp is a command if it contains an
+ interactive declaration (@pxref{Defining Commands}).  Such a function
+ can be called from Lisp expressions like other functions; in this case,
+ the fact that the function is a command makes no difference.
+ 
+ Keyboard macros (strings and vectors) are commands also, even though
+ they are not functions.  A symbol is a command if its function
+ definition is a command; such symbols can be invoked with @kbd{M-x}.
+ The symbol is a function as well if the definition is a function.
+ @xref{Command Overview}.
+ 
+ @item keystroke command
+ @cindex keystroke command
+ A @dfn{keystroke command} is a command that is bound to a key sequence
+ (typically one to three keystrokes).  The distinction is made here
+ merely to avoid confusion with the meaning of ``command'' in non-Emacs
+ editors; for Lisp programs, the distinction is normally unimportant.
+ 
+ @item byte-code function
+ A @dfn{byte-code function} is a function that has been compiled by the
+ byte compiler.  @xref{Byte-Code Type}.
+ @end table
+ 
+ @defun subrp object
+ This function returns @code{t} if @var{object} is a built-in function
+ (i.e., a Lisp primitive).
+ 
+ @example
+ @group
+ (subrp 'message)            ; @r{@code{message} is a symbol,}
+      @result{} nil                 ;   @r{not a subr object.}
+ @end group
+ @group
+ (subrp (symbol-function 'message))
+      @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @defun byte-code-function-p object
+ This function returns @code{t} if @var{object} is a byte-code
+ function.  For example:
+ 
+ @example
+ @group
+ (byte-code-function-p (symbol-function 'next-line))
+      @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @node Lambda Expressions
+ @section Lambda Expressions
+ @cindex lambda expression
+ 
+   A function written in Lisp is a list that looks like this:
+ 
+ @example
+ (lambda (@var{arg-variables}@dots{})
+   @r{[}@var{documentation-string}@r{]}
+   @r{[}@var{interactive-declaration}@r{]}
+   @var{body-forms}@dots{})
+ @end example
+ 
+ @noindent
+ Such a list is called a @dfn{lambda expression}.  In Emacs Lisp, it
+ actually is valid as an expression---it evaluates to itself.  In some
+ other Lisp dialects, a lambda expression is not a valid expression at
+ all.  In either case, its main use is not to be evaluated as an
+ expression, but to be called as a function.
+ 
+ @menu
+ * Lambda Components::       The parts of a lambda expression.
+ * Simple Lambda::           A simple example.
+ * Argument List::           Details and special features of argument lists.
+ * Function Documentation::  How to put documentation in a function.
+ @end menu
+ 
+ @node Lambda Components
+ @subsection Components of a Lambda Expression
+ 
+ @ifinfo
+ 
+   A function written in Lisp (a ``lambda expression'') is a list that
+ looks like this:
+ 
+ @example
+ (lambda (@var{arg-variables}@dots{})
+   [@var{documentation-string}]
+   [@var{interactive-declaration}]
+   @var{body-forms}@dots{})
+ @end example
+ @end ifinfo
+ 
+ @cindex lambda list
+   The first element of a lambda expression is always the symbol
+ @code{lambda}.  This indicates that the list represents a function.  The
+ reason functions are defined to start with @code{lambda} is so that
+ other lists, intended for other uses, will not accidentally be valid as
+ functions.
+ 
+   The second element is a list of symbols--the argument variable names.
+ This is called the @dfn{lambda list}.  When a Lisp function is called,
+ the argument values are matched up against the variables in the lambda
+ list, which are given local bindings with the values provided.
+ @xref{Local Variables}.
+ 
+   The documentation string is a Lisp string object placed within the
+ function definition to describe the function for the Emacs help
+ facilities.  @xref{Function Documentation}.
+ 
+   The interactive declaration is a list of the form @code{(interactive
+ @var{code-string})}.  This declares how to provide arguments if the
+ function is used interactively.  Functions with this declaration are called
+ @dfn{commands}; they can be called using @kbd{M-x} or bound to a key.
+ Functions not intended to be called in this way should not have interactive
+ declarations.  @xref{Defining Commands}, for how to write an interactive
+ declaration.
+ 
+ @cindex body of function
+   The rest of the elements are the @dfn{body} of the function: the Lisp
+ code to do the work of the function (or, as a Lisp programmer would say,
+ ``a list of Lisp forms to evaluate'').  The value returned by the
+ function is the value returned by the last element of the body.
+ 
+ @node Simple Lambda
+ @subsection A Simple Lambda-Expression Example
+ 
+   Consider for example the following function:
+ 
+ @example
+ (lambda (a b c) (+ a b c))
+ @end example
+ 
+ @noindent
+ We can call this function by writing it as the @sc{car} of an
+ expression, like this:
+ 
+ @example
+ @group
+ ((lambda (a b c) (+ a b c))
+  1 2 3)
+ @end group
+ @end example
+ 
+ @noindent
+ This call evaluates the body of the lambda expression  with the variable
+ @code{a} bound to 1, @code{b} bound to 2, and @code{c} bound to 3.
+ Evaluation of the body adds these three numbers, producing the result 6;
+ therefore, this call to the function returns the value 6.
+ 
+   Note that the arguments can be the results of other function calls, as in
+ this example:
+ 
+ @example
+ @group
+ ((lambda (a b c) (+ a b c))
+  1 (* 2 3) (- 5 4))
+ @end group
+ @end example
+ 
+ @noindent
+ This evaluates the arguments @code{1}, @code{(* 2 3)}, and @code{(- 5
+ 4)} from left to right.  Then it applies the lambda expression to the
+ argument values 1, 6 and 1 to produce the value 8.
+ 
+   It is not often useful to write a lambda expression as the @sc{car} of
+ a form in this way.  You can get the same result, of making local
+ variables and giving them values, using the special form @code{let}
+ (@pxref{Local Variables}).  And @code{let} is clearer and easier to use.
+ In practice, lambda expressions are either stored as the function
+ definitions of symbols, to produce named functions, or passed as
+ arguments to other functions (@pxref{Anonymous Functions}).
+ 
+   However, calls to explicit lambda expressions were very useful in the
+ old days of Lisp, before the special form @code{let} was invented.  At
+ that time, they were the only way to bind and initialize local
+ variables.
+ 
+ @node Argument List
+ @subsection Advanced Features of Argument Lists
+ @kindex wrong-number-of-arguments
+ @cindex argument binding
+ @cindex binding arguments
+ 
+   Our simple sample function, @code{(lambda (a b c) (+ a b c))},
+ specifies three argument variables, so it must be called with three
+ arguments: if you try to call it with only two arguments or four
+ arguments, you get a @code{wrong-number-of-arguments} error.
+ 
+   It is often convenient to write a function that allows certain
+ arguments to be omitted.  For example, the function @code{substring}
+ accepts three arguments---a string, the start index and the end
+ index---but the third argument defaults to the @var{length} of the
+ string if you omit it.  It is also convenient for certain functions to
+ accept an indefinite number of arguments, as the functions @code{list}
+ and @code{+} do.
+ 
+ @cindex optional arguments
+ @cindex rest arguments
+ @kindex &optional
+ @kindex &rest
+   To specify optional arguments that may be omitted when a function
+ is called, simply include the keyword @code{&optional} before the optional
+ arguments.  To specify a list of zero or more extra arguments, include the
+ keyword @code{&rest} before one final argument.
+ 
+   Thus, the complete syntax for an argument list is as follows:
+ 
+ @example
+ @group
+ (@var{required-vars}@dots{}
+  @r{[}&optional @var{optional-vars}@dots{}@r{]}
+  @r{[}&rest @var{rest-var}@r{]})
+ @end group
+ @end example
+ 
+ @noindent
+ The square brackets indicate that the @code{&optional} and @code{&rest}
+ clauses, and the variables that follow them, are optional.
+ 
+   A call to the function requires one actual argument for each of the
+ @var{required-vars}.  There may be actual arguments for zero or more of
+ the @var{optional-vars}, and there cannot be any actual arguments beyond
+ that unless the lambda list uses @code{&rest}.  In that case, there may
+ be any number of extra actual arguments.
+ 
+   If actual arguments for the optional and rest variables are omitted,
+ then they always default to @code{nil}.  There is no way for the
+ function to distinguish between an explicit argument of @code{nil} and
+ an omitted argument.  However, the body of the function is free to
+ consider @code{nil} an abbreviation for some other meaningful value.
+ This is what @code{substring} does; @code{nil} as the third argument to
+ @code{substring} means to use the length of the string supplied.
+ 
+ @cindex CL note---default optional arg
+ @quotation
+ @b{Common Lisp note:} Common Lisp allows the function to specify what
+ default value to use when an optional argument is omitted; Emacs Lisp
+ always uses @code{nil}.
+ @end quotation
+ 
+   For example, an argument list that looks like this:
+ 
+ @example
+ (a b &optional c d &rest e)
+ @end example
+ 
+ @noindent
+ binds @code{a} and @code{b} to the first two actual arguments, which are
+ required.  If one or two more arguments are provided, @code{c} and
+ @code{d} are bound to them respectively; any arguments after the first
+ four are collected into a list and @code{e} is bound to that list.  If
+ there are only two arguments, @code{c} is @code{nil}; if two or three
+ arguments, @code{d} is @code{nil}; if four arguments or fewer, @code{e}
+ is @code{nil}.
+ 
+   There is no way to have required arguments following optional
+ ones---it would not make sense.  To see why this must be so, suppose
+ that @code{c} in the example were optional and @code{d} were required.
+ Suppose three actual arguments are given; which variable would the third
+ argument be for?  Similarly, it makes no sense to have any more
+ arguments (either required or optional) after a @code{&rest} argument.
+ 
+   Here are some examples of argument lists and proper calls:
+ 
+ @smallexample
+ ((lambda (n) (1+ n))                ; @r{One required:}
+  1)                                 ; @r{requires exactly one argument.}
+      @result{} 2
+ ((lambda (n &optional n1)           ; @r{One required and one optional:}
+          (if n1 (+ n n1) (1+ n)))   ; @r{1 or 2 arguments.}
+  1 2)
+      @result{} 3
+ ((lambda (n &rest ns)               ; @r{One required and one rest:}
+          (+ n (apply '+ ns)))       ; @r{1 or more arguments.}
+  1 2 3 4 5)
+      @result{} 15
+ @end smallexample
+ 
+ @node Function Documentation
+ @subsection Documentation Strings of Functions
+ @cindex documentation of function
+ 
+   A lambda expression may optionally have a @dfn{documentation string} just
+ after the lambda list.  This string does not affect execution of the
+ function; it is a kind of comment, but a systematized comment which
+ actually appears inside the Lisp world and can be used by the Emacs help
+ facilities.  @xref{Documentation}, for how the @var{documentation-string} is
+ accessed.
+ 
+   It is a good idea to provide documentation strings for all the
+ functions in your program, even those that are only called from within
+ your program.  Documentation strings are like comments, except that they
+ are easier to access.
+ 
+   The first line of the documentation string should stand on its own,
+ because @code{apropos} displays just this first line.  It should consist
+ of one or two complete sentences that summarize the function's purpose.
+ 
+   The start of the documentation string is usually indented in the source file,
+ but since these spaces come before the starting double-quote, they are not part of
+ the string.  Some people make a practice of indenting any additional
+ lines of the string so that the text lines up in the program source.
+ @emph{This is a mistake.}  The indentation of the following lines is
+ inside the string; what looks nice in the source code will look ugly
+ when displayed by the help commands.
+ 
+   You may wonder how the documentation string could be optional, since
+ there are required components of the function that follow it (the body).
+ Since evaluation of a string returns that string, without any side effects,
+ it has no effect if it is not the last form in the body.  Thus, in
+ practice, there is no confusion between the first form of the body and the
+ documentation string; if the only body form is a string then it serves both
+ as the return value and as the documentation.
+ 
+ @node Function Names
+ @section Naming a Function
+ @cindex function definition
+ @cindex named function
+ @cindex function name
+ 
+   In most computer languages, every function has a name; the idea of a
+ function without a name is nonsensical.  In Lisp, a function in the
+ strictest sense has no name.  It is simply a list whose first element is
+ @code{lambda}, or a primitive subr-object.
+ 
+   However, a symbol can serve as the name of a function.  This happens
+ when you put the function in the symbol's @dfn{function cell}
+ (@pxref{Symbol Components}).  Then the symbol itself becomes a valid,
+ callable function, equivalent to the list or subr-object that its
+ function cell refers to.  The contents of the function cell are also
+ called the symbol's @dfn{function definition}.  The procedure of using a
+ symbol's function definition in place of the symbol is called
+ @dfn{symbol function indirection}; see @ref{Function Indirection}.
+ 
+   In practice, nearly all functions are given names in this way and
+ referred to through their names.  For example, the symbol @code{car} works
+ as a function and does what it does because the primitive subr-object
+ @code{#<subr car>} is stored in its function cell.
+ 
+   We give functions names because it is convenient to refer to them by
+ their names in Lisp expressions.  For primitive subr-objects such as
+ @code{#<subr car>}, names are the only way you can refer to them: there
+ is no read syntax for such objects.  For functions written in Lisp, the
+ name is more convenient to use in a call than an explicit lambda
+ expression.  Also, a function with a name can refer to itself---it can
+ be recursive.  Writing the function's name in its own definition is much
+ more convenient than making the function definition point to itself
+ (something that is not impossible but that has various disadvantages in
+ practice).
+ 
+   We often identify functions with the symbols used to name them.  For
+ example, we often speak of ``the function @code{car}'', not
+ distinguishing between the symbol @code{car} and the primitive
+ subr-object that is its function definition.  For most purposes, there
+ is no need to distinguish.
+ 
+   Even so, keep in mind that a function need not have a unique name.  While
+ a given function object @emph{usually} appears in the function cell of only
+ one symbol, this is just a matter of convenience.  It is easy to store
+ it in several symbols using @code{fset}; then each of the symbols is
+ equally well a name for the same function.
+ 
+   A symbol used as a function name may also be used as a variable;
+ these two uses of a symbol are independent and do not conflict.
+ 
+ @node Defining Functions
+ @section Defining Functions
+ @cindex defining a function
+ 
+   We usually give a name to a function when it is first created.  This
+ is called @dfn{defining a function}, and it is done with the
+ @code{defun} special form.
+ 
+ @defspec defun name argument-list body-forms
+ @code{defun} is the usual way to define new Lisp functions.  It
+ defines the symbol @var{name} as a function that looks like this:
+ 
+ @example
+ (lambda @var{argument-list} . @var{body-forms})
+ @end example
+ 
+ @code{defun} stores this lambda expression in the function cell of
+ @var{name}.  It returns the value @var{name}, but usually we ignore this
+ value.
+ 
+ As described previously (@pxref{Lambda Expressions}),
+ @var{argument-list} is a list of argument names and may include the
+ keywords @code{&optional} and @code{&rest}.  Also, the first two forms
+ in @var{body-forms} may be a documentation string and an interactive
+ declaration.
+ 
+ There is no conflict if the same symbol @var{name} is also used as a
+ variable, since the symbol's value cell is independent of the function
+ cell.  @xref{Symbol Components}.
+ 
+ Here are some examples:
+ 
+ @example
+ @group
+ (defun foo () 5)
+      @result{} foo
+ @end group
+ @group
+ (foo)
+      @result{} 5
+ @end group
+ 
+ @group
+ (defun bar (a &optional b &rest c)
+     (list a b c))
+      @result{} bar
+ @end group
+ @group
+ (bar 1 2 3 4 5)
+      @result{} (1 2 (3 4 5))
+ @end group
+ @group
+ (bar 1)
+      @result{} (1 nil nil)
+ @end group
+ @group
+ (bar)
+ @error{} Wrong number of arguments.
+ @end group
+ 
+ @group
+ (defun capitalize-backwards ()
+   "Upcase the last letter of a word."
+   (interactive)
+   (backward-word 1)
+   (forward-word 1)
+   (backward-char 1)
+   (capitalize-word 1))
+      @result{} capitalize-backwards
+ @end group
+ @end example
+ 
+ Be careful not to redefine existing functions unintentionally.
+ @code{defun} redefines even primitive functions such as @code{car}
+ without any hesitation or notification.  Redefining a function already
+ defined is often done deliberately, and there is no way to distinguish
+ deliberate redefinition from unintentional redefinition.
+ @end defspec
+ 
+ @defun defalias name definition
+ This special form defines the symbol @var{name} as a function, with
+ definition @var{definition} (which can be any valid Lisp function).
+ 
+ The proper place to use @code{defalias} is where a specific function
+ name is being defined---especially where that name appears explicitly in
+ the source file being loaded.  This is because @code{defalias} records
+ which file defined the function, just like @code{defun}
+ (@pxref{Unloading}).
+ 
+ By contrast, in programs that manipulate function definitions for other
+ purposes, it is better to use @code{fset}, which does not keep such
+ records.
+ @end defun
+ 
+   See also @code{defsubst}, which defines a function like @code{defun}
+ and tells the Lisp compiler to open-code it.  @xref{Inline Functions}.
+ 
+ @node Calling Functions
+ @section Calling Functions
+ @cindex function invocation
+ @cindex calling a function
+ 
+   Defining functions is only half the battle.  Functions don't do
+ anything until you @dfn{call} them, i.e., tell them to run.  Calling a
+ function is also known as @dfn{invocation}.
+ 
+   The most common way of invoking a function is by evaluating a list.
+ For example, evaluating the list @code{(concat "a" "b")} calls the
+ function @code{concat} with arguments @code{"a"} and @code{"b"}.
+ @xref{Evaluation}, for a description of evaluation.
+ 
+   When you write a list as an expression in your program, the function
+ name is part of the program.  This means that you choose which function
+ to call, and how many arguments to give it, when you write the program.
+ Usually that's just what you want.  Occasionally you need to decide at
+ run time which function to call.  To do that, use the functions
+ @code{funcall} and @code{apply}.
+ 
+ @defun funcall function &rest arguments
+ @code{funcall} calls @var{function} with @var{arguments}, and returns
+ whatever @var{function} returns.
+ 
+ Since @code{funcall} is a function, all of its arguments, including
+ @var{function}, are evaluated before @code{funcall} is called.  This
+ means that you can use any expression to obtain the function to be
+ called.  It also means that @code{funcall} does not see the expressions
+ you write for the @var{arguments}, only their values.  These values are
+ @emph{not} evaluated a second time in the act of calling @var{function};
+ @code{funcall} enters the normal procedure for calling a function at the
+ place where the arguments have already been evaluated.
+ 
+ The argument @var{function} must be either a Lisp function or a
+ primitive function.  Special forms and macros are not allowed, because
+ they make sense only when given the ``unevaluated'' argument
+ expressions.  @code{funcall} cannot provide these because, as we saw
+ above, it never knows them in the first place.
+ 
+ @example
+ @group
+ (setq f 'list)
+      @result{} list
+ @end group
+ @group
+ (funcall f 'x 'y 'z)
+      @result{} (x y z)
+ @end group
+ @group
+ (funcall f 'x 'y '(z))
+      @result{} (x y (z))
+ @end group
+ @group
+ (funcall 'and t nil)
+ @error{} Invalid function: #<subr and>
+ @end group
+ @end example
+ 
+ Compare these example with the examples of @code{apply}.
+ @end defun
+ 
+ @defun apply function &rest arguments
+ @code{apply} calls @var{function} with @var{arguments}, just like
+ @code{funcall} but with one difference: the last of @var{arguments} is a
+ list of arguments to give to @var{function}, rather than a single
+ argument.  We also say that @code{apply} @dfn{spreads} this list so that
+ each individual element becomes an argument.
+ 
+ @code{apply} returns the result of calling @var{function}.  As with
+ @code{funcall}, @var{function} must either be a Lisp function or a
+ primitive function; special forms and macros do not make sense in
+ @code{apply}.
+ 
+ @example
+ @group
+ (setq f 'list)
+      @result{} list
+ @end group
+ @group
+ (apply f 'x 'y 'z)
+ @error{} Wrong type argument: listp, z
+ @end group
+ @group
+ (apply '+ 1 2 '(3 4))
+      @result{} 10
+ @end group
+ @group
+ (apply '+ '(1 2 3 4))
+      @result{} 10
+ @end group
+ 
+ @group
+ (apply 'append '((a b c) nil (x y z) nil))
+      @result{} (a b c x y z)
+ @end group
+ @end example
+ 
+ For an interesting example of using @code{apply}, see the description of
+ @code{mapcar}, in @ref{Mapping Functions}.
+ @end defun
+ 
+ @cindex functionals
+   It is common for Lisp functions to accept functions as arguments or
+ find them in data structures (especially in hook variables and property
+ lists) and call them using @code{funcall} or @code{apply}.  Functions
+ that accept function arguments are often called @dfn{functionals}.
+ 
+   Sometimes, when you call a functional, it is useful to supply a no-op
+ function as the argument.  Here are two different kinds of no-op
+ function:
+ 
+ @defun identity arg
+ This function returns @var{arg} and has no side effects.
+ @end defun
+ 
+ @defun ignore &rest args
+ This function ignores any arguments and returns @code{nil}.
+ @end defun
+ 
+ @node Mapping Functions
+ @section Mapping Functions
+ @cindex mapping functions
+ 
+   A @dfn{mapping function} applies a given function to each element of a
+ list or other collection.  Emacs Lisp has three such functions;
+ @code{mapcar} and @code{mapconcat}, which scan a list, are described
+ here.  For the third mapping function, @code{mapatoms}, see
+ @ref{Creating Symbols}.
+ 
+ @defun mapcar function sequence
+ @code{mapcar} applies @var{function} to each element of @var{sequence}
+ in turn, and returns a list of the results.
+ 
+ The argument @var{sequence} may be a list, a vector, or a string.  The
+ result is always a list.  The length of the result is the same as the
+ length of @var{sequence}.
+ 
+ @smallexample
+ @group
+ @exdent @r{For example:}
+ 
+ (mapcar 'car '((a b) (c d) (e f)))
+      @result{} (a c e)
+ (mapcar '1+ [1 2 3])
+      @result{} (2 3 4)
+ (mapcar 'char-to-string "abc")
+      @result{} ("a" "b" "c")
+ @end group
+ 
+ @group
+ ;; @r{Call each function in @code{my-hooks}.}
+ (mapcar 'funcall my-hooks)
+ @end group
+ 
+ @group
+ (defun mapcar* (f &rest args)
+   "Apply FUNCTION to successive cars of all ARGS.
+ Return the list of results."
+   ;; @r{If no list is exhausted,}
+   (if (not (memq 'nil args))              
+       ;; @r{apply function to @sc{CAR}s.}
+       (cons (apply f (mapcar 'car args))  
+             (apply 'mapcar* f             
+                    ;; @r{Recurse for rest of elements.}
+                    (mapcar 'cdr args)))))
+ @end group
+ 
+ @group
+ (mapcar* 'cons '(a b c) '(1 2 3 4))
+      @result{} ((a . 1) (b . 2) (c . 3))
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun mapconcat function sequence separator
+ @code{mapconcat} applies @var{function} to each element of
+ @var{sequence}: the results, which must be strings, are concatenated.
+ Between each pair of result strings, @code{mapconcat} inserts the string
+ @var{separator}.  Usually @var{separator} contains a space or comma or
+ other suitable punctuation.
+ 
+ The argument @var{function} must be a function that can take one
+ argument and return a string.
+   
+ @smallexample
+ @group
+ (mapconcat 'symbol-name
+            '(The cat in the hat)
+            " ")
+      @result{} "The cat in the hat"
+ @end group
+ 
+ @group
+ (mapconcat (function (lambda (x) (format "%c" (1+ x))))
+            "HAL-8000"
+            "")
+      @result{} "IBM.9111"
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Anonymous Functions
+ @section Anonymous Functions
+ @cindex anonymous function
+ 
+   In Lisp, a function is a list that starts with @code{lambda}, a
+ byte-code function compiled from such a list, or alternatively a
+ primitive subr-object; names are ``extra''.  Although usually functions
+ are defined with @code{defun} and given names at the same time, it is
+ occasionally more concise to use an explicit lambda expression---an
+ anonymous function.  Such a list is valid wherever a function name is.
+ 
+   Any method of creating such a list makes a valid function.  Even this:
+ 
+ @smallexample
+ @group
+ (setq silly (append '(lambda (x)) (list (list '+ (* 3 4) 'x))))
+ @result{} (lambda (x) (+ 12 x))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ This computes a list that looks like @code{(lambda (x) (+ 12 x))} and
+ makes it the value (@emph{not} the function definition!) of
+ @code{silly}.
+ 
+   Here is how we might call this function:
+ 
+ @example
+ @group
+ (funcall silly 1)
+ @result{} 13
+ @end group
+ @end example
+ 
+ @noindent
+ (It does @emph{not} work to write @code{(silly 1)}, because this function
+ is not the @emph{function definition} of @code{silly}.  We have not given
+ @code{silly} any function definition, just a value as a variable.)
+ 
+   Most of the time, anonymous functions are constants that appear in
+ your program.  For example, you might want to pass one as an argument
+ to the function @code{mapcar}, which applies any given function to each
+ element of a list.  Here we pass an anonymous function that multiplies
+ a number by two:
+ 
+ @example
+ @group
+ (defun double-each (list)
+   (mapcar '(lambda (x) (* 2 x)) list))
+ @result{} double-each
+ @end group
+ @group
+ (double-each '(2 11))
+ @result{} (4 22)
+ @end group
+ @end example
+ 
+ @noindent
+ In such cases, we usually use the special form @code{function} instead
+ of simple quotation to quote the anonymous function.
+ 
+ @defspec function function-object
+ @cindex function quoting
+ This special form returns @var{function-object} without evaluating it.
+ In this, it is equivalent to @code{quote}.  However, it serves as a
+ note to the Emacs Lisp compiler that @var{function-object} is intended
+ to be used only as a function, and therefore can safely be compiled.
+ Contrast this with @code{quote}, in @ref{Quoting}.
+ @end defspec
+ 
+   Using @code{function} instead of @code{quote} makes a difference
+ inside a function or macro that you are going to compile.  For example:
+ 
+ @example
+ @group
+ (defun double-each (list)
+   (mapcar (function (lambda (x) (* 2 x))) list))
+ @result{} double-each
+ @end group
+ @group
+ (double-each '(2 11))
+ @result{} (4 22)
+ @end group
+ @end example
+ 
+ @noindent
+ If this definition of @code{double-each} is compiled, the anonymous
+ function is compiled as well.  By contrast, in the previous definition
+ where ordinary @code{quote} is used, the argument passed to
+ @code{mapcar} is the precise list shown:
+ 
+ @example
+ (lambda (x) (* x 2))
+ @end example
+ 
+ @noindent
+ The Lisp compiler cannot assume this list is a function, even though it
+ looks like one, since it does not know what @code{mapcar} does with the
+ list.  Perhaps @code{mapcar} will check that the @sc{car} of the third
+ element is the symbol @code{*}!  The advantage of @code{function} is
+ that it tells the compiler to go ahead and compile the constant
+ function.
+ 
+   We sometimes write @code{function} instead of @code{quote} when
+ quoting the name of a function, but this usage is just a sort of
+ comment.
+ 
+ @example
+ (function @var{symbol}) @equiv{} (quote @var{symbol}) @equiv{} '@var{symbol}
+ @end example
+ 
+   See @code{documentation} in @ref{Accessing Documentation}, for a
+ realistic example using @code{function} and an anonymous function.
+ 
+ @node Function Cells
+ @section Accessing Function Cell Contents
+ 
+   The @dfn{function definition} of a symbol is the object stored in the
+ function cell of the symbol.  The functions described here access, test,
+ and set the function cell of symbols.
+ 
+   See also the function @code{indirect-function} in @ref{Function
+ Indirection}.
+ 
+ @defun symbol-function symbol
+ @kindex void-function
+ This returns the object in the function cell of @var{symbol}.  If the
+ symbol's function cell is void, a @code{void-function} error is
+ signaled.
+ 
+ This function does not check that the returned object is a legitimate
+ function.
+ 
+ @example
+ @group
+ (defun bar (n) (+ n 2))
+      @result{} bar
+ @end group
+ @group
+ (symbol-function 'bar)
+      @result{} (lambda (n) (+ n 2))
+ @end group
+ @group
+ (fset 'baz 'bar)
+      @result{} bar
+ @end group
+ @group
+ (symbol-function 'baz)
+      @result{} bar
+ @end group
+ @end example
+ @end defun
+ 
+ @cindex void function cell
+   If you have never given a symbol any function definition, we say that
+ that symbol's function cell is @dfn{void}.  In other words, the function
+ cell does not have any Lisp object in it.  If you try to call such a symbol
+ as a function, it signals a @code{void-function} error.
+ 
+   Note that void is not the same as @code{nil} or the symbol
+ @code{void}.  The symbols @code{nil} and @code{void} are Lisp objects,
+ and can be stored into a function cell just as any other object can be
+ (and they can be valid functions if you define them in turn with
+ @code{defun}).  A void function cell contains no object whatsoever.
+ 
+   You can test the voidness of a symbol's function definition with
+ @code{fboundp}.  After you have given a symbol a function definition, you
+ can make it void once more using @code{fmakunbound}.
+ 
+ @defun fboundp symbol
+ This function returns @code{t} if the symbol has an object in its
+ function cell, @code{nil} otherwise.  It does not check that the object
+ is a legitimate function.
+ @end defun
+ 
+ @defun fmakunbound symbol
+ This function makes @var{symbol}'s function cell void, so that a
+ subsequent attempt to access this cell will cause a @code{void-function}
+ error.  (See also @code{makunbound}, in @ref{Local Variables}.)
+ 
+ @example
+ @group
+ (defun foo (x) x)
+      @result{} x
+ @end group
+ @group
+ (foo 1)
+      @result{}1
+ @end group
+ @group
+ (fmakunbound 'foo)
+      @result{} x
+ @end group
+ @group
+ (foo 1)
+ @error{} Symbol's function definition is void: foo
+ @end group
+ @end example
+ @end defun
+ 
+ @defun fset symbol object
+ This function stores @var{object} in the function cell of @var{symbol}.
+ The result is @var{object}.  Normally @var{object} should be a function
+ or the name of a function, but this is not checked.
+ 
+ There are three normal uses of this function:
+ 
+ @itemize @bullet
+ @item
+ Copying one symbol's function definition to another.  (In other words,
+ making an alternate name for a function.)
+ 
+ @item
+ Giving a symbol a function definition that is not a list and therefore
+ cannot be made with @code{defun}.  For example, you can use @code{fset}
+ to give a symbol @code{s1} a function definition which is another symbol
+ @code{s2}; then @code{s1} serves as an alias for whatever definition
+ @code{s2} presently has.
+ 
+ @item
+ In constructs for defining or altering functions.  If @code{defun}
+ were not a primitive, it could be written in Lisp (as a macro) using
+ @code{fset}.
+ @end itemize
+ 
+ Here are examples of the first two uses:
+ 
+ @example
+ @group
+ ;; @r{Give @code{first} the same definition @code{car} has.}
+ (fset 'first (symbol-function 'car))
+      @result{} #<subr car>
+ @end group
+ @group
+ (first '(1 2 3))
+      @result{} 1
+ @end group
+ 
+ @group
+ ;; @r{Make the symbol @code{car} the function definition of @code{xfirst}.}
+ (fset 'xfirst 'car)
+      @result{} car
+ @end group
+ @group
+ (xfirst '(1 2 3))
+      @result{} 1
+ @end group
+ @group
+ (symbol-function 'xfirst)
+      @result{} car
+ @end group
+ @group
+ (symbol-function (symbol-function 'xfirst))
+      @result{} #<subr car>
+ @end group
+ 
+ @group
+ ;; @r{Define a named keyboard macro.}
+ (fset 'kill-two-lines "\^u2\^k")
+      @result{} "\^u2\^k"
+ @end group
+ @end example
+ 
+ See also the related function @code{defalias}, in @ref{Defining
+ Functions}.
+ @end defun
+ 
+   When writing a function that extends a previously defined function,
+ the following idiom is sometimes used:
+ 
+ @example
+ (fset 'old-foo (symbol-function 'foo))
+ (defun foo ()
+   "Just like old-foo, except more so."
+ @group
+   (old-foo)
+   (more-so))
+ @end group
+ @end example
+ 
+ @noindent
+ This does not work properly if @code{foo} has been defined to autoload.
+ In such a case, when @code{foo} calls @code{old-foo}, Lisp attempts
+ to define @code{old-foo} by loading a file.  Since this presumably
+ defines @code{foo} rather than @code{old-foo}, it does not produce the
+ proper results.  The only way to avoid this problem is to make sure the
+ file is loaded before moving aside the old definition of @code{foo}.
+ 
+   But it is unmodular and unclean, in any case, for a Lisp file to
+ redefine a function defined elsewhere.
+ 
+ @node Inline Functions
+ @section Inline Functions
+ @cindex inline functions
+ 
+ @findex defsubst
+ You can define an @dfn{inline function} by using @code{defsubst} instead
+ of @code{defun}.  An inline function works just like an ordinary
+ function except for one thing: when you compile a call to the function,
+ the function's definition is open-coded into the caller.
+ 
+ Making a function inline makes explicit calls run faster.  But it also
+ has disadvantages.  For one thing, it reduces flexibility; if you change
+ the definition of the function, calls already inlined still use the old
+ definition until you recompile them.  Since the flexibility of
+ redefining functions is an important feature of Emacs, you should not
+ make a function inline unless its speed is really crucial.
+ 
+ Another disadvantage is that making a large function inline can increase
+ the size of compiled code both in files and in memory.  Since the speed
+ advantage of inline functions is greatest for small functions, you
+ generally should not make large functions inline.
+ 
+ It's possible to define a macro to expand into the same code that an
+ inline function would execute.  But the macro would have a limitation:
+ you can use it only explicitly---a macro cannot be called with
+ @code{apply}, @code{mapcar} and so on.  Also, it takes some work to
+ convert an ordinary function into a macro.  (@xref{Macros}.)  To convert
+ it into an inline function is very easy; simply replace @code{defun}
+ with @code{defsubst}.  Since each argument of an inline function is
+ evaluated exactly once, you needn't worry about how many times the
+ body uses the arguments, as you do for macros.  (@xref{Argument
+ Evaluation}.)
+ 
+ Inline functions can be used and open-coded later on in the same file,
+ following the definition, just like macros.
+ 
+ @c Emacs versions prior to 19 did not have inline functions.
+ 
+ @node Related Topics
+ @section Other Topics Related to Functions
+ 
+   Here is a table of several functions that do things related to
+ function calling and function definitions.  They are documented
+ elsewhere, but we provide cross references here.
+ 
+ @table @code
+ @item apply
+ See @ref{Calling Functions}.
+ 
+ @item autoload
+ See @ref{Autoload}.
+ 
+ @item call-interactively
+ See @ref{Interactive Call}.
+ 
+ @item commandp
+ See @ref{Interactive Call}.
+ 
+ @item documentation
+ See @ref{Accessing Documentation}.
+ 
+ @item eval
+ See @ref{Eval}.
+ 
+ @item funcall
+ See @ref{Calling Functions}.
+ 
+ @item ignore
+ See @ref{Calling Functions}.
+ 
+ @item indirect-function
+ See @ref{Function Indirection}.
+ 
+ @item interactive
+ See @ref{Using Interactive}.
+ 
+ @item interactive-p
+ See @ref{Interactive Call}.
+ 
+ @item mapatoms
+ See @ref{Creating Symbols}.
+ 
+ @item mapcar
+ See @ref{Mapping Functions}.
+ 
+ @item mapconcat
+ See @ref{Mapping Functions}.
+ 
+ @item undefined
+ See @ref{Key Lookup}.
+ @end table
+ 
Index: emacs/man/elisp-help.texi
diff -c /dev/null emacs/man/elisp-help.texi:1.2
*** /dev/null	Fri Aug  2 20:53:18 1996
--- emacs/man/elisp-help.texi	Thu Aug  1 00:22:49 1996
***************
*** 0 ****
--- 1,622 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/help
+ @node Documentation, Files, Modes, Top
+ @chapter Documentation
+ @cindex documentation strings
+ 
+   GNU Emacs Lisp has convenient on-line help facilities, most of which
+ derive their information from the documentation strings associated with
+ functions and variables.  This chapter describes how to write good
+ documentation strings for your Lisp programs, as well as how to write
+ programs to access documentation.
+ 
+   Note that the documentation strings for Emacs are not the same thing
+ as the Emacs manual.  Manuals have their own source files, written in
+ the Texinfo language; documentation strings are specified in the
+ definitions of the functions and variables they apply to.  A collection
+ of documentation strings is not sufficient as a manual because a good
+ manual is not organized in that fashion; it is organized in terms of
+ topics of discussion.
+ 
+ @menu
+ * Documentation Basics::      Good style for doc strings.
+                                 Where to put them.  How Emacs stores them.
+ * Accessing Documentation::   How Lisp programs can access doc strings.
+ * Keys in Documentation::     Substituting current key bindings.
+ * Describing Characters::     Making printable descriptions of
+                                 non-printing characters and key sequences.
+ * Help Functions::            Subroutines used by Emacs help facilities.
+ @end menu
+ 
+ @node Documentation Basics
+ @comment  node-name,  next,  previous,  up
+ @section Documentation Basics
+ @cindex documentation conventions
+ @cindex writing a documentation string
+ @cindex string, writing a doc string
+ 
+   A documentation string is written using the Lisp syntax for strings,
+ with double-quote characters surrounding the text of the string.  This
+ is because it really is a Lisp string object.  The string serves as
+ documentation when it is written in the proper place in the definition
+ of a function or variable.  In a function definition, the documentation
+ string follows the argument list.  In a variable definition, the
+ documentation string follows the initial value of the variable.
+ 
+   When you write a documentation string, make the first line a complete
+ sentence (or two complete sentences) since some commands, such as
+ @code{apropos}, show only the first line of a multi-line documentation
+ string.  Also, you should not indent the second line of a documentation
+ string, if you have one, because that looks odd when you use @kbd{C-h f}
+ (@code{describe-function}) or @kbd{C-h v} (@code{describe-variable}).
+ @xref{Documentation Tips}.
+ 
+   Documentation strings may contain several special substrings, which
+ stand for key bindings to be looked up in the current keymaps when the
+ documentation is displayed.  This allows documentation strings to refer
+ to the keys for related commands and be accurate even when a user
+ rearranges the key bindings.  (@xref{Accessing Documentation}.)
+ 
+   Within the Lisp world, a documentation string accessible through the
+ function or variable that it describes:
+ 
+ @itemize @bullet
+ @item
+ The documentation for a function is stored in the function definition
+ itself (@pxref{Lambda Expressions}).  The function
+ @code{documentation} knows how to extract it.
+ 
+ @item
+ @kindex variable-documentation
+ The documentation for a variable is stored in the variable's property
+ list under the property name @code{variable-documentation}.  The
+ function @code{documentation-property} knows how to extract it.
+ @end itemize
+ 
+ @cindex @file{DOC} (documentation) file
+ @cindex @file{emacs/etc/DOC-@var{version}}
+ @cindex @file{etc/DOC-@var{version}}
+ To save space, the documentation for preloaded functions and variables
+ (including primitive functions and autoloaded functions) is stored in
+ the file @file{emacs/etc/DOC-@var{version}}.  The documentation for
+ functions and variables loaded during the Emacs session from
+ byte-compiled files is stored in those files (@pxref{Docs and
+ Compilation}).
+ 
+ The data structure inside Emacs has an integer offset into the file, or
+ a list containing a string and an integer, in place of the documentation
+ string.  The functions @code{documentation} and
+ @code{documentation-property} use that information to read the
+ documentation from the appropriate file; this is transparent to the
+ user.
+ 
+   For information on the uses of documentation strings, see @ref{Help, ,
+ Help, emacs, The GNU Emacs Manual}.
+ 
+ @c Wordy to prevent overfull hbox.  --rjc 15mar92
+   The @file{emacs/lib-src} directory contains two utilities that you can
+ use to print nice-looking hardcopy for the file
+ @file{emacs/etc/DOC-@var{version}}.  These are @file{sorted-doc.c} and
+ @file{digest-doc.c}.
+ 
+ @node Accessing Documentation
+ @section Access to Documentation Strings
+ 
+ @defun documentation-property symbol property &optional verbatim
+ This function returns the documentation string that is recorded
+ @var{symbol}'s property list under property @var{property}.  It
+ retrieves the text from a file if necessary, and runs
+ @code{substitute-command-keys} to substitute actual key bindings.  (This
+ substitution is not done if @var{verbatim} is non-@code{nil}; the
+ @var{verbatim} argument exists only as of Emacs 19.)
+ 
+ @smallexample
+ @group
+ (documentation-property 'command-line-processed
+    'variable-documentation)
+      @result{} "t once command line has been processed"
+ @end group
+ @group
+ (symbol-plist 'command-line-processed)
+      @result{} (variable-documentation 188902)
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun documentation function &optional verbatim
+ This function returns the documentation string of @var{function}.  It
+ reads the text from a file if necessary.  Then (unless @var{verbatim} is
+ non-@code{nil}) it calls @code{substitute-command-keys}, to return a
+ value containing the actual (current) key bindings.
+ 
+ The function @code{documentation} signals a @code{void-function} error
+ if @var{function} has no function definition.  However, it is ok if
+ the function definition has no documentation string.  In that case,
+ @code{documentation} returns @code{nil}.
+ @end defun
+ 
+ @c Wordy to prevent overfull hboxes.  --rjc 15mar92
+ Here is an example of using the two functions, @code{documentation} and
+ @code{documentation-property}, to display the documentation strings for
+ several symbols in a @samp{*Help*} buffer.
+ 
+ @smallexample
+ @group
+ (defun describe-symbols (pattern)
+   "Describe the Emacs Lisp symbols matching PATTERN.
+ All symbols that have PATTERN in their name are described
+ in the `*Help*' buffer."
+   (interactive "sDescribe symbols matching: ")
+   (let ((describe-func
+          (function 
+           (lambda (s)
+ @end group
+ @group
+             ;; @r{Print description of symbol.}
+             (if (fboundp s)             ; @r{It is a function.}
+                 (princ
+                  (format "%s\t%s\n%s\n\n" s
+                    (if (commandp s) 
+                        (let ((keys (where-is-internal s)))
+                          (if keys
+                              (concat
+                               "Keys: "
+                               (mapconcat 'key-description 
+                                          keys " "))
+                            "Keys: none"))
+                      "Function")
+ @end group
+ @group
+                    (or (documentation s) 
+                        "not documented"))))
+             
+             (if (boundp s)              ; @r{It is a variable.}
+ @end group
+ @group
+                 (princ
+                  (format "%s\t%s\n%s\n\n" s
+                    (if (user-variable-p s) 
+                        "Option " "Variable")
+ @end group
+ @group
+                    (or (documentation-property 
+                          s 'variable-documentation)
+                        "not documented")))))))
+         sym-list)
+ @end group
+ 
+ @group
+     ;; @r{Build a list of symbols that match pattern.}
+     (mapatoms (function 
+                (lambda (sym)
+                  (if (string-match pattern (symbol-name sym))
+                      (setq sym-list (cons sym sym-list))))))
+ @end group
+ 
+ @group
+     ;; @r{Display the data.}
+     (with-output-to-temp-buffer "*Help*"
+       (mapcar describe-func (sort sym-list 'string<))
+       (print-help-return-message))))
+ @end group
+ @end smallexample
+ 
+   The @code{describe-symbols} function works like @code{apropos},
+ but provides more information.
+ 
+ @smallexample
+ @group
+ (describe-symbols "goal")
+ 
+ ---------- Buffer: *Help* ----------
+ goal-column     Option 
+ *Semipermanent goal column for vertical motion, as set by C-x C-n, or nil.
+ @end group
+ @c Do not blithely break or fill these lines.
+ @c That makes them incorrect.
+ 
+ @group
+ set-goal-column Command: C-x C-n
+ Set the current horizontal position as a goal for C-n and C-p.
+ @end group
+ @c DO NOT put a blank line here!  That is factually inaccurate!
+ @group
+ Those commands will move to this position in the line moved to
+ rather than trying to keep the same horizontal position.
+ With a non-nil argument, clears out the goal column
+ so that C-n and C-p resume vertical motion.
+ The goal column is stored in the variable `goal-column'.
+ @end group
+ 
+ @group
+ temporary-goal-column   Variable
+ Current goal column for vertical motion.
+ It is the column where point was
+ at the start of current run of vertical motion commands.
+ When the `track-eol' feature is doing its job, the value is 9999.
+ ---------- Buffer: *Help* ----------
+ @end group
+ @end smallexample
+ 
+ @defun Snarf-documentation filename
+   This function is used only during Emacs initialization, just before
+ the runnable Emacs is dumped.  It finds the file offsets of the
+ documentation strings stored in the file @var{filename}, and records
+ them in the in-core function definitions and variable property lists in
+ place of the actual strings.  @xref{Building Emacs}.
+ 
+   Emacs finds the file @var{filename} in the @file{emacs/etc} directory.
+ When the dumped Emacs is later executed, the same file is found in the
+ directory @code{doc-directory}.  Usually @var{filename} is
+ @code{"DOC-@var{version}"}.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defvar doc-directory
+ This variable holds the name of the directory which should contion the
+ file @code{"DOC-@var{version}"} that contains documentation strings for
+ built-in and preloaded functions and variables.
+ 
+ In most cases, this is the same as @code{data-directory}.  They may be
+ different when you run Emacs from the directory where you built it,
+ without actually installing it.  See @code{data-directory} in @ref{Help
+ Functions}.
+ 
+ In older Emacs versions, @code{exec-directory} was used for this.
+ @end defvar
+ 
+ @node Keys in Documentation
+ @section Substituting Key Bindings in Documentation
+ @cindex documentation, keys in
+ @cindex keys in documentation strings
+ @cindex substituting keys in documentation
+ 
+   When documentation strings refer to key sequences, they should use the
+ current, actual key bindings.  They can do so using certain special text
+ sequences described below.  Accessing documentation strings in the usual
+ way substitutes current key binding information for these special
+ sequences.  This works by calling @code{substitute-command-keys}.  You
+ can also call that function yourself.
+ 
+   Here is a list of the special sequences and what they mean:
+ 
+ @table @code
+ @item \[@var{command}]
+ stands for a key sequence that will invoke @var{command}, or @samp{M-x
+ @var{command}} if @var{command} has no key bindings.
+ 
+ @item \@{@var{mapvar}@} 
+ stands for a summary of the value of @var{mapvar}, which should be a
+ keymap.  The summary is made by @code{describe-bindings}.
+ 
+ @item \<@var{mapvar}> 
+ stands for no text itself.  It is used for a side effect: it specifies
+ @var{mapvar} as the keymap for any following @samp{\[@var{command}]}
+ sequences in this documentation string.
+ @end table
+ 
+ @strong{Please note:} Each @samp{\} must be doubled when written in a
+ string in Emacs Lisp.
+ 
+ @defun substitute-command-keys string
+ This function scans @var{string} for the above special sequences and
+ replaces them by what they stand for, returning the result as a string.
+ This permits display of documentation that refers accurately to the
+ user's own customized key bindings.
+ @end defun
+ 
+   Here are examples of the special sequences:
+ 
+ @smallexample
+ @group
+ (substitute-command-keys 
+    "To abort recursive edit, type: \\[abort-recursive-edit]")
+ @result{} "To abort recursive edit, type: C-]"
+ @end group
+ 
+ @group
+ (substitute-command-keys 
+    "The keys that are defined for the minibuffer here are:
+   \\@{minibuffer-local-must-match-map@}")
+ @result{} "The keys that are defined for the minibuffer here are:
+ @end group
+ 
+ ?               minibuffer-completion-help
+ SPC             minibuffer-complete-word
+ TAB             minibuffer-complete
+ LFD             minibuffer-complete-and-exit
+ RET             minibuffer-complete-and-exit
+ C-g             abort-recursive-edit
+ "
+ 
+ @group
+ (substitute-command-keys
+    "To abort a recursive edit from the minibuffer, type\
+ \\<minibuffer-local-must-match-map>\\[abort-recursive-edit].")
+ @result{} "To abort a recursive edit from the minibuffer, type C-g."
+ @end group
+ @end smallexample
+ 
+ @node Describing Characters
+ @section Describing Characters for Help Messages
+ 
+   These functions convert events, key sequences or characters to textual
+ descriptions.  These descriptions are useful for including arbitrary
+ text characters or key sequences in messages, because they convert
+ non-printing and whitespace characters to sequences of printing
+ characters.  The description of a non-whitespace printing character is
+ the character itself.
+ 
+ @defun key-description sequence
+ @cindex Emacs event standard notation
+ This function returns a string containing the Emacs standard notation
+ for the input events in @var{sequence}.  The argument @var{sequence} may
+ be a string, vector or list.  @xref{Input Events}, for more information
+ about valid events.  See also the examples for
+ @code{single-key-description}, below.
+ @end defun
+ 
+ @defun single-key-description event
+ @cindex event printing
+ @cindex character printing
+ @cindex control character printing
+ @cindex meta character printing
+ This function returns a string describing @var{event} in the standard
+ Emacs notation for keyboard input.  A normal printing character appears
+ as itself, but a control character turns into a string starting with
+ @samp{C-}, a meta character turns into a string starting with @samp{M-},
+ and space, linefeed, etc.@: appear as @samp{SPC}, @samp{LFD}, etc.  A
+ function key symbol appears as itself.  An event that is a list appears
+ as the name of the symbol in the @sc{car} of the list.
+ 
+ @smallexample
+ @group
+ (single-key-description ?\C-x)
+      @result{} "C-x"
+ @end group
+ @group
+ (key-description "\C-x \M-y \n \t \r \f123")
+      @result{} "C-x SPC M-y SPC LFD SPC TAB SPC RET SPC C-l 1 2 3"
+ @end group
+ @group
+ (single-key-description 'C-mouse-1)
+      @result{} "C-mouse-1"
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun text-char-description character
+ This function returns a string describing @var{character} in the
+ standard Emacs notation for characters that appear in text---like
+ @code{single-key-description}, except that control characters are
+ represented with a leading caret (which is how control characters in
+ Emacs buffers are usually displayed).
+ 
+ @smallexample
+ @group
+ (text-char-description ?\C-c)
+      @result{} "^C"
+ @end group
+ @group
+ (text-char-description ?\M-m)
+      @result{} "M-m"
+ @end group
+ @group
+ (text-char-description ?\C-\M-m)
+      @result{} "M-^M"
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Help Functions
+ @section Help Functions
+ 
+   Emacs provides a variety of on-line help functions, all accessible to
+ the user as subcommands of the prefix @kbd{C-h}.  For more information
+ about them, see @ref{Help, , Help, emacs, The GNU Emacs Manual}.  Here
+ we describe some program-level interfaces to the same information.
+ 
+ @deffn Command apropos regexp &optional do-all predicate
+ This function finds all symbols whose names contain a match for the
+ regular expression @var{regexp}, and returns a list of them
+ (@pxref{Regular Expressions}).  It also displays the symbols in a buffer
+ named @samp{*Help*}, each with a one-line description.
+ 
+ @c Emacs 19 feature
+ If @var{do-all} is non-@code{nil}, then @code{apropos} also shows
+ key bindings for the functions that are found.
+ 
+ If @var{predicate} is non-@code{nil}, it should be a function to be
+ called on each symbol that has matched @var{regexp}.  Only symbols for
+ which @var{predicate} returns a non-@code{nil} value are listed or
+ displayed.
+ 
+ In the first of the following examples, @code{apropos} finds all the
+ symbols with names containing @samp{exec}.  In the second example, it
+ finds and returns only those symbols that are also commands.
+ (We don't show the output that results in the @samp{*Help*} buffer.)
+ 
+ @smallexample
+ @group
+ (apropos "exec")
+      @result{} (Buffer-menu-execute command-execute exec-directory
+     exec-path execute-extended-command execute-kbd-macro
+     executing-kbd-macro executing-macro)
+ @end group
+ 
+ @group
+ (apropos "exec" nil 'commandp)
+      @result{} (Buffer-menu-execute execute-extended-command)
+ @end group
+ @ignore
+ @group
+ ---------- Buffer: *Help* ----------
+ Buffer-menu-execute
+   Function: Save and/or delete buffers marked with
+   M-x Buffer-menu-save or M-x Buffer-menu-delete commands.
+ execute-extended-command      ESC x
+   Function: Read function name, then read its 
+   arguments and call it.
+ ---------- Buffer: *Help* ----------
+ @end group
+ @end ignore
+ @end smallexample
+ 
+ The command @kbd{C-h a} (@code{command-apropos}) calls @code{apropos},
+ but specifies a @var{predicate} to restrict the output to symbols that
+ are commands.  The call to @code{apropos} looks like this:
+ 
+ @smallexample
+ (apropos string t 'commandp)
+ @end smallexample
+ @end deffn
+ 
+ @c Emacs 19 feature
+ @deffn Command super-apropos regexp &optional do-all
+ This function differs from @code{apropos} in that it searches
+ documentation strings as well as symbol names for matches for
+ @var{regexp}.  By default, it searches the documentation strings only
+ for preloaded functions and variables.  If @var{do-all} is
+ non-@code{nil}, it scans the names and documentation strings of all
+ functions and variables.
+ @end deffn
+ 
+ @defvar help-map
+ The value of this variable is a local keymap for characters following the
+ Help key, @kbd{C-h}.
+ @end defvar
+ 
+ @deffn {Prefix Command} help-command
+ This symbol is not a function; its function definition is actually the
+ keymap known as @code{help-map}.  It is defined in @file{help.el} as
+ follows:
+ 
+ @smallexample
+ @group
+ (define-key global-map "\C-h" 'help-command)
+ (fset 'help-command help-map)
+ @end group
+ @end smallexample
+ @end deffn
+ 
+ @defun print-help-return-message &optional function
+ This function builds a string that explains how to restore the previous
+ state of the windows after a help command.  After building the message,
+ it applies @var{function} to it if @var{function} is non-@code{nil}.
+ Otherwise it calls @code{message} to display it in the echo area.
+ 
+ This function expects to be called inside a
+ @code{with-output-to-temp-buffer} special form, and expects
+ @code{standard-output} to have the value bound by that special form.
+ For an example of its use, see the long example in @ref{Accessing
+ Documentation}.
+ @end defun
+ 
+ @defvar help-char
+ The value of this variable is the help character---the character that
+ Emacs recognizes as meaning Help.  By default, it is 8, which is
+ @kbd{C-h}.  When Emacs reads this character, if @code{help-form} is
+ non-@code{nil} Lisp expression, it evaluates that expression, and
+ displays the result in a window if it is a string.
+ 
+ Usually the value of @code{help-form}'s value is @code{nil}.  Then the
+ help character has no special meaning at the level of command input, and
+ it becomes part of a key sequence in the normal way.  The standard key
+ binding of @kbd{C-h} is a prefix key for several general-purpose help
+ features.
+ 
+ The help character is special after prefix keys, too.  If it has no
+ binding as a subcommand of the prefix key, it runs
+ @code{describe-prefix-bindings}, which displays a list of all the
+ subcommands of the prefix key.
+ @end defvar
+ 
+ @defvar help-form
+ If this variable is non-@code{nil}, its value is a form to evaluate
+ whenever the character @code{help-char} is read.  If evaluating the form
+ produces a string, that string is displayed.
+ 
+ A command that calls @code{read-event} or @code{read-char} probably
+ should bind @code{help-form} to a non-@code{nil} expression while it
+ does input.  (The exception is when @kbd{C-h} is meaningful input.)
+ Evaluating this expression should result in a string that explains what
+ the input is for and how to enter it properly.
+ 
+ Entry to the minibuffer binds this variable to the value of
+ @code{minibuffer-help-form} (@pxref{Minibuffer Misc}).
+ @end defvar
+ 
+ @defvar prefix-help-command
+ This variable holds a function to print help for a prefix character.
+ The function is called when the user types a prefix key followed by the
+ help character, and the help character has no binding after that prefix.
+ The variable's default value is @code{describe-prefix-bindings}.
+ @end defvar
+ 
+ @defun describe-prefix-bindings
+ This function calls @code{describe-bindings} to display a list of all
+ the subcommands of the prefix key of the most recent key sequence.  The
+ prefix described consists of all but the last event of that key
+ sequence.  (The last event is, presumably, the help character.)
+ @end defun
+ 
+   The following two functions are found in the library @file{helper}.
+ They are for modes that want to provide help without relinquishing
+ control, such as the ``electric'' modes.  You must load that library
+ with @code{(require 'helper)} in order to use them.  Their names begin
+ with @samp{Helper} to distinguish them from the ordinary help functions.
+ 
+ @deffn Command Helper-describe-bindings
+ This command pops up a window displaying a help buffer containing a
+ listing of all of the key bindings from both the local and global keymaps.
+ It works by calling @code{describe-bindings}.
+ @end deffn
+ 
+ @deffn Command Helper-help
+ This command provides help for the current mode.  It prompts the user
+ in the minibuffer with the message @samp{Help (Type ? for further
+ options)}, and then provides assistance in finding out what the key
+ bindings are, and what the mode is intended for.  It returns @code{nil}.
+ 
+ This can be customized by changing the map @code{Helper-help-map}.
+ @end deffn
+ 
+ @c Emacs 19 feature
+ @defvar data-directory
+ This variable holds the name of the directory in which Emacs finds
+ certain documentation and text files that come with Emacs.  In older
+ Emacs versions, @code{exec-directory} was used for this.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @defmac make-help-screen fname help-line help-text help-map
+ This macro defines a help command named @var{fname} that acts like a 
+ prefix key that shows a list of the subcommands it offers.
+ 
+ When invoked, @var{fname} displays @var{help-text} in a window, then
+ reads and executes a key sequence according to @var{help-map}.  The
+ string @var{help-text} should describe the bindings available in
+ @var{help-map}.
+ 
+ The command @var{fname} is defined to handle a few events itself, by
+ scrolling the display of @var{help-text}.  When @var{fname} reads one of
+ those special events, it does the scrolling and then reads another
+ event.  When it reads an event that is not one of those few, and which
+ has a binding in @var{help-map}, it executes that key's binding and
+ then returns.
+ 
+ The argument @var{help-line} should be a single-line summary of the
+ alternatives in @var{help-map}.  In the current version of Emacs, this
+ argument is used only if you set the option @code{three-step-help} to
+ @code{t}.
+ @end defmac
+ 
+ @defopt three-step-help
+ If this variable is non-@code{nil}, commands defined with
+ @code{make-help-screen} display their @var{help-line} strings in the
+ echo area at first, and display the longer @var{help-text} strings only
+ if the user types the help character again.
+ @end defopt
Index: emacs/man/elisp-hooks.texi
diff -c /dev/null emacs/man/elisp-hooks.texi:1.2
*** /dev/null	Fri Aug  2 20:53:31 1996
--- emacs/man/elisp-hooks.texi	Thu Aug  1 00:22:50 1996
***************
*** 0 ****
--- 1,126 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/hooks
+ @node Standard Hooks, Index, Standard Keymaps, Top
+ @appendix Standard Hooks
+ 
+ The following is a list of hook variables that let you provide
+ functions to be called from within Emacs on suitable occasions. 
+ 
+ Most of these variables have names ending with @samp{-hook}.  They are
+ @dfn{normal hooks}, run by means of @code{run-hooks}.  The value of such
+ a hook is a list of functions.  The recommended way to put a new
+ function on such a hook is to call @code{add-hook}.  @xref{Hooks}, for
+ more information about using hooks.
+ 
+ The variables whose names end in @samp{-function} have single functions
+ as their values.  Usually there is a specific reason why the variable is
+ not a normal hook, such as the need to pass arguments to the function.
+ (In older Emacs versions, some of these variables had names ending in
+ @samp{-hook} even though they were not normal hooks.)
+ 
+ The variables whose names end in @samp{-hooks} or @samp{-functions} have
+ lists of functions as their values, but these functions are called in a
+ special way (they are passed arguments, or else their values are used).
+ 
+ @c !!! need  xref  to where each hook is documented or else document it
+ @c by specifying what is expected, and when it is called relative to
+ @c mode initialization.)
+ 
+ @table @code
+ @item activate-mark-hook
+ @item after-change-function
+ @item after-change-functions
+ @item after-init-hook
+ @item after-insert-file-functions
+ @item after-make-frame-hook
+ @item auto-fill-function
+ @item auto-save-hook
+ @item before-change-function
+ @item before-change-functions
+ @item before-init-hook
+ @item before-make-frame-hook
+ @item blink-paren-function
+ @item c-mode-hook
+ @item calendar-load-hook
+ @item command-history-hook
+ @item comment-indent-function
+ @item deactivate-mark-hook
+ @item diary-display-hook
+ @item diary-hook
+ @item dired-mode-hook
+ @item disabled-command-hook
+ @item edit-picture-hook
+ @item electric-buffer-menu-mode-hook
+ @item electric-command-history-hook
+ @item electric-help-mode-hook
+ @item emacs-lisp-mode-hook
+ @item find-file-hooks
+ @item find-file-not-found-hooks
+ @item first-change-hook
+ @item fortran-comment-hook
+ @item fortran-mode-hook
+ @item ftp-setup-write-file-hooks
+ @item ftp-write-file-hook
+ @item indent-mim-hook
+ @item initial-calendar-window-hook
+ @item kill-buffer-query-functions
+ @item kill-emacs-query-functions
+ @item LaTeX-mode-hook
+ @item ledit-mode-hook
+ @item lisp-indent-function
+ @item lisp-interaction-mode-hook
+ @item lisp-mode-hook
+ @item list-diary-entries-hook
+ @item m2-mode-hook
+ @item mail-mode-hook
+ @item mail-setup-hook
+ @item mark-diary-entries-hook
+ @item medit-mode-hook
+ @item mh-compose-letter-hook
+ @item mh-folder-mode-hook
+ @item mh-letter-mode-hook
+ @item mim-mode-hook
+ @item minibuffer-setup-hook
+ @item minibuffer-exit-hook
+ @item news-mode-hook
+ @item news-reply-mode-hook
+ @item news-setup-hook
+ @item nongregorian-diary-listing-hook
+ @item nongregorian-diary-marking-hook
+ @item nroff-mode-hook
+ @item outline-mode-hook
+ @item plain-TeX-mode-hook
+ @item post-command-hook
+ @item pre-abbrev-expand-hook
+ @item pre-command-hook
+ @item print-diary-entries-hook
+ @item prolog-mode-hook
+ @item protect-innocence-hook
+ @item rmail-edit-mode-hook
+ @item rmail-mode-hook
+ @item rmail-summary-mode-hook
+ @item scheme-indent-hook
+ @item scheme-mode-hook
+ @item scribe-mode-hook
+ @item shell-mode-hook
+ @item shell-set-directory-error-hook
+ @item suspend-hook
+ @item suspend-resume-hook
+ @item temp-buffer-show-function
+ @item term-setup-hook
+ @item terminal-mode-hook
+ @item terminal-mode-break-hook
+ @item TeX-mode-hook
+ @item text-mode-hook
+ @item today-visible-calendar-hook
+ @item today-invisible-calendar-hook
+ @item vi-mode-hook
+ @item view-hook
+ @item window-setup-hook
+ @item write-contents-hooks
+ @item write-file-hooks
+ @item write-region-annotate-functions
+ @end table
Index: emacs/man/elisp-index.texi
diff -c /dev/null emacs/man/elisp-index.texi:1.2
*** /dev/null	Fri Aug  2 20:53:35 1996
--- emacs/man/elisp-index.texi	Thu Aug  1 00:22:52 1996
***************
*** 0 ****
--- 1,38 ----
+ @setfilename ../info/index
+ 
+ @c Indexing guidelines
+ 
+ @c I assume that all indexes will be combinded.
+ @c Therefore, if a generated findex and permutations
+ @c cover the ways an index user would look up the entry,
+ @c then no cindex is added.
+ @c Concept index (cindex) entries will also be permuted.  Therefore, they
+ @c have no commas and few irrelevant connectives in them.
+ 
+ @c I tried to include words in a cindex that give the context of the entry,
+ @c particularly if there is more than one entry for the same concept.
+ @c For example, "nil in keymap"
+ @c Similarly for explicit findex and vindex entries, e.g., "print example".
+ 
+ @c Error codes are given cindex entries, e.g., "end-of-file error".
+ 
+ @c pindex is used for .el files and Unix programs
+ 
+ @node Index,  , Standard Hooks, Top
+ @unnumbered Index
+ 
+ 
+ All variables, functions, keys, programs, files, and concepts are
+ in this one index.  
+ 
+ All names and concepts are permuted, so they appear several times, one
+ for each permutation of the parts of the name.  For example,
+ @code{function-name} would appear as @b{function-name} and @b{name,
+ function-}.
+ 
+ 
+ @c Print the indices
+ 
+ @printindex fn
+ 
+ 
Index: emacs/man/elisp-internals.texi
diff -c /dev/null emacs/man/elisp-internals.texi:1.2
*** /dev/null	Fri Aug  2 20:53:36 1996
--- emacs/man/elisp-internals.texi	Thu Aug  1 00:22:53 1996
***************
*** 0 ****
--- 1,931 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/internals
+ @node GNU Emacs Internals, Standard Errors, Tips, Top
+ @comment  node-name,  next,  previous,  up
+ @appendix GNU Emacs Internals
+ 
+ This chapter describes how the runnable Emacs executable is dumped with
+ the preloaded Lisp libraries in it, how storage is allocated, and some
+ internal aspects of GNU Emacs that may be of interest to C programmers.
+ 
+ @menu
+ * Building Emacs::      How to preload Lisp libraries into Emacs.
+ * Pure Storage::        A kludge to make preloaded Lisp functions sharable.
+ * Garbage Collection::  Reclaiming space for Lisp objects no longer used.
+ * Writing Emacs Primitives::   Writing C code for Emacs.
+ * Object Internals::    Data formats of buffers, windows, processes.
+ @end menu
+ 
+ @node Building Emacs, Pure Storage, GNU Emacs Internals, GNU Emacs Internals
+ @appendixsec Building Emacs
+ @cindex building Emacs
+ @pindex temacs
+ 
+   This section explains the steps involved in building the Emacs
+ executable.  You don't have to know this material to build and install
+ Emacs, since the makefiles do all these things automatically.  This
+ information is pertinent to Emacs maintenance.
+ 
+    Compilation of the C source files in the @file{src} directory
+ produces an executable file called @file{temacs}, also called a
+ @dfn{bare impure Emacs}.  It contains the Emacs Lisp interpreter and I/O
+ routines, but not the editing commands.
+ 
+ @cindex @file{loadup.el}
+   The command @w{@samp{temacs -l loadup}} uses @file{temacs} to create
+ the real runnable Emacs executable.  These arguments direct
+ @file{temacs} to evaluate the Lisp files specified in the file
+ @file{loadup.el}.  These files set up the normal Emacs editing
+ environment, resulting in an Emacs that is still impure but no longer
+ bare.
+ 
+   It takes a substantial time to load the standard Lisp files.  Luckily,
+ you don't have to do this each time you run Emacs; @file{temacs} can
+ dump out an executable program called @file{emacs} that has these files
+ preloaded.  @file{emacs} starts more quickly because it does not need to
+ load the files.  This is the Emacs executable that is normally
+ installed.
+ 
+   To create @file{emacs}, use the command @samp{temacs -batch -l loadup
+ dump}.  The purpose of @samp{-batch} here is to prevent @file{temacs}
+ from trying to initialize any of its data on the terminal; this ensures
+ that the tables of terminal information are empty in the dumped Emacs.
+ The argument @samp{dump} tells @file{loadup.el} to dump a new executable
+ named @file{emacs}.
+ 
+   Some operating systems don't support dumping.  On those systems, you
+ must start Emacs with the @samp{temacs -l loadup} command each time you
+ use it.  This takes a substantial time, but since you need to start
+ Emacs once a day at most---or once a week if you never log out---the
+ extra time is not too severe a problem.
+ 
+ @cindex @file{site-load.el}
+   You can specify additional files to preload by writing a library named
+ @file{site-load.el} that loads them.  You may need to increase the
+ value of @code{PURESIZE}, in @file{src/puresize.h}, to make room for the
+ additional files.  (Try adding increments of 20000 until it is big
+ enough.)  However, the advantage of preloading additional files
+ decreases as machines get faster.  On modern machines, it is usually not
+ advisable.
+ 
+ @cindex @file{site-init.el}
+   You can specify other Lisp expressions to execute just before dumping
+ by putting them in a library named @file{site-init.el}.  However, if
+ they might alter the behavior that users expect from an ordinary
+ unmodified Emacs, it is better to put them in @file{default.el}, so that
+ users can override them if they wish.  @xref{Start-up Summary}.
+ 
+   Before @file{loadup.el} dumps the new executable, it finds the
+ documentation strings for primitive and preloaded functions (and
+ variables) in the file where they are stored, by calling
+ @code{Snarf-documentation} (@pxref{Accessing Documentation}).  These
+ strings were moved out of the @file{emacs} executable to make it
+ smaller.  @xref{Documentation Basics}.
+ 
+ @defun dump-emacs to-file from-file
+ @cindex unexec
+   This function dumps the current state of Emacs into an executable file
+ @var{to-file}.  It takes symbols from @var{from-file} (this is normally
+ the executable file @file{temacs}).
+ 
+ If you use this function in an Emacs that was already dumped, you must
+ set @code{command-line-processed} to @code{nil} first for good results.
+ @xref{Command Line Arguments}.
+ @end defun
+ 
+ @deffn Command emacs-version
+   This function returns a string describing the version of Emacs that is
+ running.  It is useful to include this string in bug reports.
+ 
+ @example
+ @group
+ (emacs-version)
+   @result{} "GNU Emacs 19.29.1 (i386-debian-linux) \
+  of Tue Jun  6 1995 on balloon"
+ @end group
+ @end example
+ 
+ Called interactively, the function prints the same information in the
+ echo area.
+ @end deffn
+ 
+ @defvar emacs-build-time
+ The value of this variable is the time at which Emacs was built at the
+ local site.
+ 
+ @example
+ @group
+ emacs-build-time
+      @result{} "Tue Jun  6 14:55:57 1995"
+ @end group
+ @end example
+ @end defvar
+ 
+ @defvar emacs-version
+ The value of this variable is the version of Emacs being run.  It is a
+ string such as @code{"19.29.1"}.
+ @end defvar
+ 
+   The following two variables did not exist before Emacs version 19.23,
+ which reduces their usefulness at present, but we hope they will be
+ convenient in the future.
+ 
+ @defvar emacs-major-version
+ The major version number of Emacs, as an integer.  For Emacs version
+ 19.29, the value is 19.
+ @end defvar
+ 
+ @defvar emacs-minor-version
+ The minor version number of Emacs, as an integer.  For Emacs version
+ 19.29, the value is 29.
+ @end defvar
+ 
+ @node Pure Storage, Garbage Collection, Building Emacs, GNU Emacs Internals
+ @appendixsec Pure Storage
+ @cindex pure storage
+ 
+   Emacs Lisp uses two kinds of storage for user-created Lisp objects:
+ @dfn{normal storage} and @dfn{pure storage}.  Normal storage is where
+ all the new data created during an Emacs session is kept; see the
+ following section for information on normal storage.  Pure storage is
+ used for certain data in the preloaded standard Lisp files---data that
+ should never change during actual use of Emacs.
+ 
+   Pure storage is allocated only while @file{temacs} is loading the
+ standard preloaded Lisp libraries.  In the file @file{emacs}, it is
+ marked as read-only (on operating systems that permit this), so that
+ the memory space can be shared by all the Emacs jobs running on the
+ machine at once.  Pure storage is not expandable; a fixed amount is
+ allocated when Emacs is compiled, and if that is not sufficient for the
+ preloaded libraries, @file{temacs} crashes.  If that happens, you must
+ increase the compilation parameter @code{PURESIZE} in the file
+ @file{src/puresize.h}.  This normally won't happen unless you try to
+ preload additional libraries or add features to the standard ones.
+ 
+ @defun purecopy object
+ This function makes a copy of @var{object} in pure storage and returns
+ it.  It copies strings by simply making a new string with the same
+ characters in pure storage.  It recursively copies the contents of
+ vectors and cons cells.  It does not make copies of other objects such
+ as symbols, but just returns them unchanged.  It signals an error if
+ asked to copy markers.
+ 
+ This function is a no-op except while Emacs is being built and dumped;
+ it is usually called only in the file @file{emacs/lisp/loaddefs.el}, but
+ a few packages call it just in case you decide to preload them.
+ @end defun
+ 
+ @defvar pure-bytes-used
+ The value of this variable is the number of bytes of pure storage
+ allocated so far.  Typically, in a dumped Emacs, this number is very
+ close to the total amount of pure storage available---if it were not,
+ we would preallocate less.
+ @end defvar
+ 
+ @defvar purify-flag
+ This variable determines whether @code{defun} should make a copy of the
+ function definition in pure storage.  If it is non-@code{nil}, then the
+ function definition is copied into pure storage.
+ 
+ This flag is @code{t} while loading all of the basic functions for
+ building Emacs initially (allowing those functions to be sharable and
+ non-collectible).  Dumping Emacs as an executable always writes
+ @code{nil} in this variable, regardless of the value it actually has
+ before and after dumping.
+ 
+ You should not change this flag in a running Emacs.
+ @end defvar
+ 
+ @node Garbage Collection, Writing Emacs Primitives, Pure Storage, GNU Emacs Internals
+ @appendixsec Garbage Collection
+ @cindex garbage collector
+ 
+ @cindex memory allocation
+   When a program creates a list or the user defines a new function (such
+ as by loading a library), that data is placed in normal storage.  If
+ normal storage runs low, then Emacs asks the operating system to
+ allocate more memory in blocks of 1k bytes.  Each block is used for one
+ type of Lisp object, so symbols, cons cells, markers, etc., are
+ segregated in distinct blocks in memory.  (Vectors, long strings,
+ buffers and certain other editing types, which are fairly large, are
+ allocated in individual blocks, one per object, while small strings are
+ packed into blocks of 8k bytes.)
+ 
+   It is quite common to use some storage for a while, then release it by
+ (for example) killing a buffer or deleting the last pointer to an
+ object.  Emacs provides a @dfn{garbage collector} to reclaim this
+ abandoned storage.  (This name is traditional, but ``garbage recycler''
+ might be a more intuitive metaphor for this facility.)
+ 
+   The garbage collector operates by finding and marking all Lisp objects
+ that are still accessible to Lisp programs.  To begin with, it assumes
+ all the symbols, their values and associated function definitions, and
+ any data presently on the stack, are accessible.  Any objects that can
+ be reached indirectly through other accessible objects are also
+ accessible.
+ 
+   When marking is finished, all objects still unmarked are garbage.  No
+ matter what the Lisp program or the user does, it is impossible to refer
+ to them, since there is no longer a way to reach them.  Their space
+ might as well be reused, since no one will miss them.  The second
+ (``sweep'') phase of the garbage collector arranges to reuse them.
+ 
+ @cindex free list
+   The sweep phase puts unused cons cells onto a @dfn{free list}
+ for future allocation; likewise for symbols and markers.  It compacts
+ the accessible strings so they occupy fewer 8k blocks; then it frees the
+ other 8k blocks.  Vectors, buffers, windows, and other large objects are
+ individually allocated and freed using @code{malloc} and @code{free}.
+ 
+ @cindex CL note---allocate more storage
+ @quotation
+ @b{Common Lisp note:} Unlike other Lisps, GNU Emacs Lisp does not
+ call the garbage collector when the free list is empty.  Instead, it
+ simply requests the operating system to allocate more storage, and
+ processing continues until @code{gc-cons-threshold} bytes have been
+ used.
+ 
+ This means that you can make sure that the garbage collector will not
+ run during a certain portion of a Lisp program by calling the garbage
+ collector explicitly just before it (provided that portion of the
+ program does not use so much space as to force a second garbage
+ collection).
+ @end quotation
+ 
+ @deffn Command garbage-collect
+ This command runs a garbage collection, and returns information on
+ the amount of space in use.  (Garbage collection can also occur
+ spontaneously if you use more than @code{gc-cons-threshold} bytes of
+ Lisp data since the previous garbage collection.)
+ 
+ @code{garbage-collect} returns a list containing the following
+ information:
+ 
+ @example
+ @group
+ ((@var{used-conses} . @var{free-conses})
+  (@var{used-syms} . @var{free-syms})
+ @end group
+  (@var{used-markers} . @var{free-markers})
+  @var{used-string-chars} 
+  @var{used-vector-slots}
+  (@var{used-floats} . @var{free-floats}))
+ 
+ @group
+ (garbage-collect)
+      @result{} ((3435 . 2332) (1688 . 0)
+            (57 . 417) 24510 3839 (4 . 1))
+ @end group
+ @end example
+ 
+ Here is a table explaining each element:
+ 
+ @table @var
+ @item used-conses
+ The number of cons cells in use.
+ 
+ @item free-conses
+ The number of cons cells for which space has been obtained from the
+ operating system, but that are not currently being used.
+ 
+ @item used-syms
+ The number of symbols in use.
+ 
+ @item free-syms
+ The number of symbols for which space has been obtained from the
+ operating system, but that are not currently being used.
+ 
+ @item used-markers
+ The number of markers in use.
+ 
+ @item free-markers
+ The number of markers for which space has been obtained from the
+ operating system, but that are not currently being used.
+ 
+ @item used-string-chars
+ The total size of all strings, in characters.
+ 
+ @item used-vector-slots
+ The total number of elements of existing vectors.
+ 
+ @item used-floats
+ @c Emacs 19 feature
+ The number of floats in use.
+ 
+ @item free-floats
+ @c Emacs 19 feature
+ The number of floats for which space has been obtained from the
+ operating system, but that are not currently being used.
+ @end table
+ @end deffn
+ 
+ @defopt gc-cons-threshold
+ The value of this variable is the number of bytes of storage that must
+ be allocated for Lisp objects after one garbage collection in order to
+ trigger another garbage collection.  A cons cell counts as eight bytes,
+ a string as one byte per character plus a few bytes of overhead, and so
+ on; space allocated to the contents of buffers does not count.  Note
+ that the subsequent garbage collection does not happen immediately when
+ the threshold is exhausted, but only the next time the Lisp evaluator is
+ called.
+ 
+ The initial threshold value is 300,000.  If you specify a larger
+ value, garbage collection will happen less often.  This reduces the
+ amount of time spent garbage collecting, but increases total memory use.
+ You may want to do this when running a program that creates lots of
+ Lisp data.
+ 
+ You can make collections more frequent by specifying a smaller value,
+ down to 10,000.  A value less than 10,000 will remain in effect only
+ until the subsequent garbage collection, at which time
+ @code{garbage-collect} will set the threshold back to 10,000.
+ @end defopt
+ 
+ @c Emacs 19 feature
+ @defun memory-limit
+ This function returns the address of the last byte Emacs has allocated,
+ divided by 1024.  We divide the value by 1024 to make sure it fits in a
+ Lisp integer.
+ 
+ You can use this to get a general idea of how your actions affect the
+ memory usage.
+ @end defun
+ 
+ @node Writing Emacs Primitives, Object Internals, Garbage Collection, GNU Emacs Internals
+ @appendixsec Writing Emacs Primitives
+ @cindex primitive function internals
+ 
+   Lisp primitives are Lisp functions implemented in C.  The details of
+ interfacing the C function so that Lisp can call it are handled by a few
+ C macros.  The only way to really understand how to write new C code is
+ to read the source, but we can explain some things here.
+ 
+   An example of a special form is the definition of @code{or}, from
+ @file{eval.c}.  (An ordinary function would have the same general
+ appearance.)
+ 
+ @cindex garbage collection protection
+ @smallexample
+ @group
+ DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
+   "Eval args until one of them yields non-nil, then return that value.\n\
+ The remaining args are not evalled at all.\n\
+ @end group
+ @group
+ If all args return nil, return nil.")
+   (args)
+      Lisp_Object args;
+ @{
+   register Lisp_Object val;
+   Lisp_Object args_left;
+   struct gcpro gcpro1;
+ @end group
+ 
+ @group
+   if (NULL (args))
+     return Qnil;
+ 
+   args_left = args;
+   GCPRO1 (args_left);
+ @end group
+ 
+ @group
+   do
+     @{
+       val = Feval (Fcar (args_left));
+       if (!NULL (val))
+         break;
+       args_left = Fcdr (args_left);
+     @}
+   while (!NULL (args_left));
+ @end group
+ 
+ @group
+   UNGCPRO;
+   return val;
+ @}
+ @end group
+ @end smallexample
+ 
+   Let's start with a precise explanation of the arguments to the
+ @code{DEFUN} macro.  Here is a template for them:
+ 
+ @example
+ DEFUN (@var{lname}, @var{fname}, @var{sname}, @var{min}, @var{max}, @var{interactive}, @var{doc})
+ @end example
+ 
+ @table @var
+ @item lname
+ This is the name of the Lisp symbol to define as the function name; in
+ the example above, it is @code{or}.
+ 
+ @item fname
+ This is the C function name for this function.  This is
+ the name that is used in C code for calling the function.  The name is,
+ by convention, @samp{F} prepended to the Lisp name, with all dashes
+ (@samp{-}) in the Lisp name changed to underscores.  Thus, to call this
+ function from C code, call @code{For}.  Remember that the arguments must
+ be of type @code{Lisp_Object}; various macros and functions for creating
+ values of type @code{Lisp_Object} are declared in the file
+ @file{lisp.h}.
+ 
+ @item sname
+ This is a C variable name to use for a structure that holds the data for
+ the subr object that represents the function in Lisp.  This structure
+ conveys the Lisp symbol name to the initialization routine that will
+ create the symbol and store the subr object as its definition.  By
+ convention, this name is always @var{fname} with @samp{F} replaced with
+ @samp{S}.
+ 
+ @item min
+ This is the minimum number of arguments that the function requires.  The
+ function @code{or} allows a minimum of zero arguments.
+ 
+ @item max
+ This is the maximum number of arguments that the function accepts, if
+ there is a fixed maximum.  Alternatively, it can be @code{UNEVALLED},
+ indicating a special form that receives unevaluated arguments, or
+ @code{MANY}, indicating an unlimited number of evaluated arguments (the
+ equivalent of @code{&rest}).  Both @code{UNEVALLED} and @code{MANY} are
+ macros.  If @var{max} is a number, it may not be less than @var{min} and
+ it may not be greater than seven.
+ 
+ @item interactive
+ This is an interactive specification, a string such as might be used as
+ the argument of @code{interactive} in a Lisp function.  In the case of
+ @code{or}, it is 0 (a null pointer), indicating that @code{or} cannot be
+ called interactively.  A value of @code{""} indicates a function that
+ should receive no arguments when called interactively.
+ 
+ @item doc
+ This is the documentation string.  It is written just like a
+ documentation string for a function defined in Lisp, except you must
+ write @samp{\n\} at the end of each line.  In particular, the first line
+ should be a single sentence.
+ @end table
+ 
+   After the call to the @code{DEFUN} macro, you must write the argument
+ name list that every C function must have, followed by ordinary C
+ declarations for the arguments.  For a function with a fixed maximum
+ number of arguments, declare a C argument for each Lisp argument, and
+ give them all type @code{Lisp_Object}.  When a Lisp function has no
+ upper limit on the number of arguments, its implementation in C actually
+ receives exactly two arguments: the first is the number of Lisp
+ arguments, and the second is the address of a block containing their
+ values.  They have types @code{int} and @w{@code{Lisp_Object *}}.
+ 
+   Within the function @code{For} itself, note the use of the macros
+ @code{GCPRO1} and @code{UNGCPRO}.  @code{GCPRO1} is used to ``protect''
+ a variable from garbage collection---to inform the garbage collector that
+ it must look in that variable and regard its contents as an accessible
+ object.  This is necessary whenever you call @code{Feval} or anything
+ that can directly or indirectly call @code{Feval}.  At such a time, any
+ Lisp object that you intend to refer to again must be protected somehow.
+ @code{UNGCPRO} cancels the protection of the variables that are
+ protected in the current function.  It is necessary to do this explicitly.
+ 
+   For most data types, it suffices to protect at least one pointer to
+ the object; as long as the object is not recycled, all pointers to it
+ remain valid.  This is not so for strings, because the garbage collector
+ can move them.  When the garbage collector moves a string, it relocates
+ all the pointers it knows about; any other pointers become invalid.
+ Therefore, you must protect all pointers to strings across any point
+ where garbage collection may be possible.
+ 
+   The macro @code{GCPRO1} protects just one local variable.  If you want
+ to protect two, use @code{GCPRO2} instead; repeating @code{GCPRO1} will
+ not work.  Macros @code{GCPRO3} and @code{GCPRO4} also exist.
+ 
+   These macros implicitly use local variables such as @code{gcpro1}; you
+ must declare these explicitly, with type @code{struct gcpro}.  Thus, if
+ you use @code{GCPRO2}, you must declare @code{gcpro1} and @code{gcpro2}.
+ Alas, we can't explain all the tricky details here.
+ 
+   You must not use C initializers for static or global variables unless
+ they are never written once Emacs is dumped.  These variables with
+ initializers are allocated in an area of memory that becomes read-only
+ (on certain operating systems) as a result of dumping Emacs.  @xref{Pure
+ Storage}.
+ 
+   Do not use static variables within functions---place all static
+ variables at top level in the file.  This is necessary because Emacs on
+ some operating systems defines the keyword @code{static} as a null
+ macro.  (This definition is used because those systems put all variables
+ declared static in a place that becomes read-only after dumping, whether
+ they have initializers or not.)
+ 
+   Defining the C function is not enough to make a Lisp primitive
+ available; you must also create the Lisp symbol for the primitive and
+ store a suitable subr object in its function cell.  The code looks like
+ this:
+ 
+ @example
+ defsubr (&@var{subr-structure-name});
+ @end example
+ 
+ @noindent
+ Here @var{subr-structure-name} is the name you used as the third
+ argument to @code{DEFUN}.
+ 
+   If you add a new primitive to a file that already has Lisp primitives
+ defined in it, find the function (near the end of the file) named
+ @code{syms_of_@var{something}}, and add the call to @code{defsubr}
+ there.  If the file doesn't have this function, or if you create a new
+ file, add to it a @code{syms_of_@var{filename}} (e.g.,
+ @code{syms_of_myfile}).  Then find the spot in @file{emacs.c} where all
+ of these functions are called, and add a call to
+ @code{syms_of_@var{filename}} there.
+ 
+   The function @code{syms_of_@var{filename}} is also the place to define
+ any C variables that are to be visible as Lisp variables.
+ @code{DEFVAR_LISP} makes a C variable of type @code{Lisp_Object} visible
+ in Lisp.  @code{DEFVAR_INT} makes a C variable of type @code{int}
+ visible in Lisp with a value that is always an integer.
+ @code{DEFVAR_BOOL} makes a C variable of type @code{int} visible in Lisp
+ with a value that is either @code{t} or @code{nil}.
+ 
+   Here is another example function, with more complicated arguments.
+ This comes from the code for the X Window System, and it demonstrates
+ the use of macros and functions to manipulate Lisp objects.
+ 
+ @smallexample
+ @group
+ DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
+   Scoordinates_in_window_p, 2, 2,
+   "xSpecify coordinate pair: \nXExpression which evals to window: ",
+   "Return non-nil if POSITIONS is in WINDOW.\n\  
+   \(POSITIONS is a list, (SCREEN-X SCREEN-Y)\)\n\
+ @end group
+ @group
+   Returned value is list of positions expressed\n\
+   relative to window upper left corner.")
+   (coordinate, window)
+      register Lisp_Object coordinate, window;
+ @{
+   register Lisp_Object xcoord, ycoord;
+ @end group
+ 
+ @group
+   if (!CONSP (coordinate)) wrong_type_argument (Qlistp, coordinate);
+   CHECK_WINDOW (window, 2);
+   xcoord = Fcar (coordinate);
+   ycoord = Fcar (Fcdr (coordinate));
+   CHECK_NUMBER (xcoord, 0);
+   CHECK_NUMBER (ycoord, 1);
+ @end group
+ @group
+   if ((XINT (xcoord) < XINT (XWINDOW (window)->left))
+       || (XINT (xcoord) >= (XINT (XWINDOW (window)->left)
+                             + XINT (XWINDOW (window)->width))))
+     return Qnil;
+   XFASTINT (xcoord) -= XFASTINT (XWINDOW (window)->left);
+ @end group
+ @group
+   if (XINT (ycoord) == (screen_height - 1))
+     return Qnil;
+ @end group
+ @group
+   if ((XINT (ycoord) < XINT (XWINDOW (window)->top))
+       || (XINT (ycoord) >= (XINT (XWINDOW (window)->top)
+                             + XINT (XWINDOW (window)->height)) - 1))
+     return Qnil;
+ @end group
+ @group
+   XFASTINT (ycoord) -= XFASTINT (XWINDOW (window)->top);
+   return (Fcons (xcoord, Fcons (ycoord, Qnil)));
+ @}
+ @end group
+ @end smallexample
+ 
+   Note that C code cannot call functions by name unless they are defined
+ in C.  The way to call a function written in Lisp is to use
+ @code{Ffuncall}, which embodies the Lisp function @code{funcall}.  Since
+ the Lisp function @code{funcall} accepts an unlimited number of
+ arguments, in C it takes two: the number of Lisp-level arguments, and a
+ one-dimensional array containing their values.  The first Lisp-level
+ argument is the Lisp function to call, and the rest are the arguments to
+ pass to it.  Since @code{Ffuncall} can call the evaluator, you must
+ protect pointers from garbage collection around the call to
+ @code{Ffuncall}.
+ 
+   The C functions @code{call0}, @code{call1}, @code{call2}, and so on,
+ provide handy ways to call a Lisp function conveniently with a fixed
+ number of arguments.  They work by calling @code{Ffuncall}.
+ 
+   @file{eval.c} is a very good file to look through for examples;
+ @file{lisp.h} contains the definitions for some important macros and
+ functions.
+ 
+ @node Object Internals,  , Writing Emacs Primitives, GNU Emacs Internals
+ @appendixsec Object Internals
+ @cindex object internals
+ 
+   GNU Emacs Lisp manipulates many different types of data.  The actual
+ data are stored in a heap and the only access that programs have to it is
+ through pointers.  Pointers are thirty-two bits wide in most
+ implementations.  Depending on the operating system and type of machine
+ for which you compile Emacs, twenty-four to twenty-six bits are used to
+ address the object, and the remaining six to eight bits are used for a
+ tag that identifies the object's type.
+ 
+   Because Lisp objects are represented as tagged pointers, it is always
+ possible to determine the Lisp data type of any object.  The C data type
+ @code{Lisp_Object} can hold any Lisp object of any data type.  Ordinary
+ variables have type @code{Lisp_Object}, which means they can hold any
+ type of Lisp value; you can determine the actual data type only at run
+ time.  The same is true for function arguments; if you want a function
+ to accept only a certain type of argument, you must check the type
+ explicitly using a suitable predicate (@pxref{Type Predicates}).
+ @cindex type checking internals
+ 
+ @menu
+ * Buffer Internals::    Components of a buffer structure.
+ * Window Internals::    Components of a window structure.
+ * Process Internals::   Components of a process structure.
+ @end menu
+ 
+ @node Buffer Internals, Window Internals, Object Internals, Object Internals
+ @appendixsubsec Buffer Internals
+ @cindex internals, of buffer
+ @cindex buffer internals
+ 
+   Buffers contain fields not directly accessible by the Lisp programmer.
+ We describe them here, naming them by the names used in the C code.
+ Many are accessible indirectly in Lisp programs via Lisp primitives.
+ 
+ @table @code
+ @item name
+ The buffer name is a string that names the buffer.  It is guaranteed to
+ be unique.  @xref{Buffer Names}.
+ 
+ @item save_modified
+ This field contains the time when the buffer was last saved, as an integer.
+ @xref{Buffer Modification}.
+ 
+ @item modtime
+ This field contains the modification time of the visited file.  It is
+ set when the file is written or read.  Every time the buffer is written
+ to the file, this field is compared to the modification time of the
+ file.  @xref{Buffer Modification}.
+ 
+ @item auto_save_modified
+ This field contains the time when the buffer was last auto-saved.
+ 
+ @item last_window_start
+ This field contains the @code{window-start} position in the buffer as of
+ the last time the buffer was displayed in a window.
+ 
+ @item undo_list
+ This field points to the buffer's undo list.  @xref{Undo}.
+ 
+ @item syntax_table_v
+ This field contains the syntax table for the buffer.  @xref{Syntax Tables}.
+ 
+ @item downcase_table
+ This field contains the conversion table for converting text to lower case.
+ @xref{Case Table}.
+ 
+ @item upcase_table
+ This field contains the conversion table for converting text to upper case.
+ @xref{Case Table}.
+ 
+ @item case_canon_table
+ This field contains the conversion table for canonicalizing text for
+ case-folding search.  @xref{Case Table}.
+ 
+ @item case_eqv_table
+ This field contains the equivalence table for case-folding search.
+ @xref{Case Table}.
+ 
+ @item display_table
+ This field contains the buffer's display table, or @code{nil} if it doesn't
+ have one.  @xref{Display Tables}.
+ 
+ @item markers
+ This field contains the chain of all markers that currently point into
+ the buffer.  Deletion of text in the buffer, and motion of the buffer's
+ gap, must check each of these markers and perhaps update it.
+ @xref{Markers}.
+ 
+ @item backed_up
+ This field is a flag that tells whether a backup file has been made
+ for the visited file of this buffer.
+ 
+ @item mark
+ This field contains the mark for the buffer.  The mark is a marker,
+ hence it is also included on the list @code{markers}.  @xref{The Mark}.
+ 
+ @item mark_active
+ This field is non-@code{nil} if the buffer's mark is active.
+ 
+ @item local_var_alist
+ This field contains the association list describing the variables local
+ in this buffer, and their values, with the exception of local variables
+ that have special slots in the buffer object.  (Those slots are omitted
+ from this table.)  @xref{Buffer-Local Variables}.
+ 
+ @item base_buffer
+ This field holds the buffer's base buffer (if it is an indirect buffer),
+ or @code{nil}.
+ 
+ @item keymap
+ This field holds the buffer's local keymap.  @xref{Keymaps}.
+ 
+ @item overlay_center
+ This field holds the current overlay center position.  @xref{Overlays}.
+ 
+ @item overlays_before
+ This field holds a list of the overlays in this buffer that end at or
+ before the current overlay center position.  They are sorted in order of
+ decreasing end position.
+ 
+ @item overlays_after
+ This field holds a list of the overlays in this buffer that end after
+ the current overlay center position.  They are sorted in order of
+ increasing beginning position.
+ @end table
+ 
+ @node Window Internals, Process Internals, Buffer Internals, Object Internals
+ @appendixsubsec Window Internals
+ @cindex internals, of window
+ @cindex window internals
+ 
+   Windows have the following accessible fields:
+ 
+ @table @code
+ @item frame
+ The frame that this window is on.
+ 
+ @item mini_p
+ Non-@code{nil} if this window is a minibuffer window.
+ 
+ @item buffer
+ The buffer that the window is displaying.  This may change often during
+ the life of the window.
+ 
+ @item dedicated
+ Non-@code{nil} if this window is dedicated to its buffer.
+ 
+ @item pointm
+ @cindex window point internals
+ This is the value of point in the current buffer when this window is
+ selected; when it is not selected, it retains its previous value.
+ 
+ @item start
+ The position in the buffer that is the first character to be displayed
+ in the window.
+ 
+ @item force_start
+ If this flag is non-@code{nil}, it says that the window has been
+ scrolled explicitly by the Lisp program.  This affects what the next
+ redisplay does if point is off the screen: instead of scrolling the
+ window to show the text around point, it moves point to a location that
+ is on the screen.
+ 
+ @item last_modified
+ The @code{modified} field of the window's buffer, as of the last time
+ a redisplay completed in this window.
+ 
+ @item last_point
+ The buffer's value of point, as of the last time
+ a redisplay completed in this window.
+ 
+ @item left
+ This is the left-hand edge of the window, measured in columns.  (The
+ leftmost column on the screen is @w{column 0}.)
+ 
+ @item top
+ This is the top edge of the window, measured in lines.  (The top line on
+ the screen is @w{line 0}.)
+ 
+ @item height
+ The height of the window, measured in lines.
+ 
+ @item width
+ The width of the window, measured in columns.
+ 
+ @item next
+ This is the window that is the next in the chain of siblings.  It is
+ @code{nil} in a window that is the rightmost or bottommost of a group of
+ siblings.
+ 
+ @item prev
+ This is the window that is the previous in the chain of siblings.  It is
+ @code{nil} in a window that is the leftmost or topmost of a group of
+ siblings.
+ 
+ @item parent
+ Internally, Emacs arranges windows in a tree; each group of siblings has
+ a parent window whose area includes all the siblings.  This field points
+ to a window's parent.
+ 
+ Parent windows do not display buffers, and play little role in display
+ except to shape their child windows.  Emacs Lisp programs usually have
+ no access to the parent windows; they operate on the windows at the
+ leaves of the tree, which actually display buffers.
+ 
+ @item hscroll
+ This is the number of columns that the display in the window is scrolled
+ horizontally to the left.  Normally, this is 0.
+ 
+ @item use_time
+ This is the last time that the window was selected.  The function
+ @code{get-lru-window} uses this field.
+ 
+ @item display_table
+ The window's display table, or @code{nil} if none is specified for it.
+ 
+ @item update_mode_line
+ Non-@code{nil} means this window's mode line needs to be updated.
+ 
+ @item base_line_number
+ The line number of a certain position in the buffer, or @code{nil}.
+ This is used for displaying the line number of point in the mode line.
+ 
+ @item base_line_pos
+ The position in the buffer for which the line number is known, or
+ @code{nil} meaning none is known.
+ 
+ @item region_showing
+ If the region (or part of it) is highlighted in this window, this field
+ holds the mark position that made one end of that region.  Otherwise,
+ this field is @code{nil}.
+ @end table
+ 
+ @node Process Internals,  , Window Internals, Object Internals
+ @appendixsubsec Process Internals
+ @cindex internals, of process
+ @cindex process internals
+ 
+   The fields of a process are:
+ 
+ @table @code
+ @item name
+ A string, the name of the process.
+ 
+ @item command
+ A list containing the command arguments that were used to start this
+ process.
+ 
+ @item filter
+ A function used to accept output from the process instead of a buffer,
+ or @code{nil}.
+ 
+ @item sentinel
+ A function called whenever the process receives a signal, or @code{nil}.
+ 
+ @item buffer
+ The associated buffer of the process.
+ 
+ @item pid
+ An integer, the Unix process @sc{id}.
+ 
+ @item childp
+ A flag, non-@code{nil} if this is really a child process.
+ It is @code{nil} for a network connection.
+ 
+ @item mark
+ A marker indicating the position of the end of the last output from this
+ process inserted into the buffer.  This is often but not always the end
+ of the buffer.
+ 
+ @item kill_without_query
+ If this is non-@code{nil}, killing Emacs while this process is still
+ running does not ask for confirmation about killing the process.
+ 
+ @item raw_status_low
+ @itemx raw_status_high
+ These two fields record 16 bits each of the process status returned by
+ the @code{wait} system call.
+ 
+ @item status
+ The process status, as @code{process-status} should return it.
+ 
+ @item tick
+ @itemx update_tick
+ If these two fields are not equal, a change in the status of the process
+ needs to be reported, either by running the sentinel or by inserting a
+ message in the process buffer.
+ 
+ @item pty_flag
+ Non-@code{nil} if communication with the subprocess uses a @sc{pty};
+ @code{nil} if it uses a pipe.
+ 
+ @item infd
+ The file descriptor for input from the process.
+ 
+ @item outfd
+ The file descriptor for output to the process.
+ 
+ @item subtty
+ The file descriptor for the terminal that the subprocess is using.  (On
+ some systems, there is no need to record this, so the value is
+ @code{nil}.)
+ 
+ @item tty_name
+ The name of the terminal that the subprocess is using,
+ or @code{nil} if it is using pipes.
+ @end table
Index: emacs/man/elisp-intro.texi
diff -c /dev/null emacs/man/elisp-intro.texi:1.2
*** /dev/null	Fri Aug  2 20:53:52 1996
--- emacs/man/elisp-intro.texi	Thu Aug  1 00:22:55 1996
***************
*** 0 ****
--- 1,866 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/intro
+ 
+ @node Copying, Introduction, Top, Top
+ @comment  node-name,  next,  previous,  up
+ @unnumbered GNU GENERAL PUBLIC LICENSE
+ @center Version 2, June 1991
+ 
+ @display
+ Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ 
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+ @end display
+ 
+ @unnumberedsec Preamble
+ 
+   The licenses for most software are designed to take away your
+ freedom to share and change it.  By contrast, the GNU General Public
+ License is intended to guarantee your freedom to share and change free
+ software---to make sure the software is free for all its users.  This
+ General Public License applies to most of the Free Software
+ Foundation's software and to any other program whose authors commit to
+ using it.  (Some other Free Software Foundation software is covered by
+ the GNU Library General Public License instead.)  You can apply it to
+ your programs, too.
+ 
+   When we speak of free software, we are referring to freedom, not
+ price.  Our General Public Licenses are designed to make sure that you
+ have the freedom to distribute copies of free software (and charge for
+ this service if you wish), that you receive source code or can get it
+ if you want it, that you can change the software or use pieces of it
+ in new free programs; and that you know you can do these things.
+ 
+   To protect your rights, we need to make restrictions that forbid
+ anyone to deny you these rights or to ask you to surrender the rights.
+ These restrictions translate to certain responsibilities for you if you
+ distribute copies of the software, or if you modify it.
+ 
+   For example, if you distribute copies of such a program, whether
+ gratis or for a fee, you must give the recipients all the rights that
+ you have.  You must make sure that they, too, receive or can get the
+ source code.  And you must show them these terms so they know their
+ rights.
+ 
+   We protect your rights with two steps: (1) copyright the software, and
+ (2) offer you this license which gives you legal permission to copy,
+ distribute and/or modify the software.
+ 
+   Also, for each author's protection and ours, we want to make certain
+ that everyone understands that there is no warranty for this free
+ software.  If the software is modified by someone else and passed on, we
+ want its recipients to know that what they have is not the original, so
+ that any problems introduced by others will not reflect on the original
+ authors' reputations.
+ 
+   Finally, any free program is threatened constantly by software
+ patents.  We wish to avoid the danger that redistributors of a free
+ program will individually obtain patent licenses, in effect making the
+ program proprietary.  To prevent this, we have made it clear that any
+ patent must be licensed for everyone's free use or not licensed at all.
+ 
+   The precise terms and conditions for copying, distribution and
+ modification follow.
+ 
+ @iftex
+ @unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+ @end iftex
+ @ifinfo
+ @center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+ @end ifinfo
+ 
+ @enumerate 0
+ @item
+ This License applies to any program or other work which contains
+ a notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License.  The ``Program'', below,
+ refers to any such program or work, and a ``work based on the Program''
+ means either the Program or any derivative work under copyright law:
+ that is to say, a work containing the Program or a portion of it,
+ either verbatim or with modifications and/or translated into another
+ language.  (Hereinafter, translation is included without limitation in
+ the term ``modification''.)  Each licensee is addressed as ``you''.
+ 
+ Activities other than copying, distribution and modification are not
+ covered by this License; they are outside its scope.  The act of
+ running the Program is not restricted, and the output from the Program
+ is covered only if its contents constitute a work based on the
+ Program (independent of having been made by running the Program).
+ Whether that is true depends on what the Program does.
+ 
+ @item
+ You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any warranty;
+ and give any other recipients of the Program a copy of this License
+ along with the Program.
+ 
+ You may charge a fee for the physical act of transferring a copy, and
+ you may at your option offer warranty protection in exchange for a fee.
+ 
+ @item
+ You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+ 
+ @enumerate a
+ @item
+ You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+ 
+ @item
+ You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+ 
+ @item
+ If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License.  (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+ @end enumerate
+ 
+ These requirements apply to the modified work as a whole.  If
+ identifiable sections of that work are not derived from the Program,
+ and can be reasonably considered independent and separate works in
+ themselves, then this License, and its terms, do not apply to those
+ sections when you distribute them as separate works.  But when you
+ distribute the same sections as part of a whole which is a work based
+ on the Program, the distribution of the whole must be on the terms of
+ this License, whose permissions for other licensees extend to the
+ entire whole, and thus to each and every part regardless of who wrote it.
+ 
+ Thus, it is not the intent of this section to claim rights or contest
+ your rights to work written entirely by you; rather, the intent is to
+ exercise the right to control the distribution of derivative or
+ collective works based on the Program.
+ 
+ In addition, mere aggregation of another work not based on the Program
+ with the Program (or with a work based on the Program) on a volume of
+ a storage or distribution medium does not bring the other work under
+ the scope of this License.
+ 
+ @item
+ You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms of
+ Sections 1 and 2 above provided that you also do one of the following:
+ 
+ @enumerate a
+ @item
+ Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+ 
+ @item
+ Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+ 
+ @item
+ Accompany it with the information you received as to the offer
+ to distribute corresponding source code.  (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+ @end enumerate
+ 
+ The source code for a work means the preferred form of the work for
+ making modifications to it.  For an executable work, complete source
+ code means all the source code for all modules it contains, plus any
+ associated interface definition files, plus the scripts used to
+ control compilation and installation of the executable.  However, as a
+ special exception, the source code distributed need not include
+ anything that is normally distributed (in either source or binary
+ form) with the major components (compiler, kernel, and so on) of the
+ operating system on which the executable runs, unless that component
+ itself accompanies the executable.
+ 
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+ 
+ @item
+ You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License.  Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this License.
+ However, parties who have received copies, or rights, from you under
+ this License will not have their licenses terminated so long as such
+ parties remain in full compliance.
+ 
+ @item
+ You are not required to accept this License, since you have not
+ signed it.  However, nothing else grants you permission to modify or
+ distribute the Program or its derivative works.  These actions are
+ prohibited by law if you do not accept this License.  Therefore, by
+ modifying or distributing the Program (or any work based on the
+ Program), you indicate your acceptance of this License to do so, and
+ all its terms and conditions for copying, distributing or modifying
+ the Program or works based on it.
+ 
+ @item
+ Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program subject to
+ these terms and conditions.  You may not impose any further
+ restrictions on the recipients' exercise of the rights granted herein.
+ You are not responsible for enforcing compliance by third parties to
+ this License.
+ 
+ @item
+ If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent issues),
+ conditions are imposed on you (whether by court order, agreement or
+ otherwise) that contradict the conditions of this License, they do not
+ excuse you from the conditions of this License.  If you cannot
+ distribute so as to satisfy simultaneously your obligations under this
+ License and any other pertinent obligations, then as a consequence you
+ may not distribute the Program at all.  For example, if a patent
+ license would not permit royalty-free redistribution of the Program by
+ all those who receive copies directly or indirectly through you, then
+ the only way you could satisfy both it and this License would be to
+ refrain entirely from distribution of the Program.
+ 
+ If any portion of this section is held invalid or unenforceable under
+ any particular circumstance, the balance of the section is intended to
+ apply and the section as a whole is intended to apply in other
+ circumstances.
+ 
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of any
+ such claims; this section has the sole purpose of protecting the
+ integrity of the free software distribution system, which is
+ implemented by public license practices.  Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is willing
+ to distribute software through any other system and a licensee cannot
+ impose that choice.
+ 
+ This section is intended to make thoroughly clear what is believed to
+ be a consequence of the rest of this License.
+ 
+ @item
+ If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces, the
+ original copyright holder who places the Program under this License
+ may add an explicit geographical distribution limitation excluding
+ those countries, so that distribution is permitted only in or among
+ countries not thus excluded.  In such case, this License incorporates
+ the limitation as if written in the body of this License.
+ 
+ @item
+ The Free Software Foundation may publish revised and/or new versions
+ of the General Public License from time to time.  Such new versions will
+ be similar in spirit to the present version, but may differ in detail to
+ address new problems or concerns.
+ 
+ Each version is given a distinguishing version number.  If the Program
+ specifies a version number of this License which applies to it and ``any
+ later version'', you have the option of following the terms and conditions
+ either of that version or of any later version published by the Free
+ Software Foundation.  If the Program does not specify a version number of
+ this License, you may choose any version ever published by the Free Software
+ Foundation.
+ 
+ @item
+ If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the author
+ to ask for permission.  For software which is copyrighted by the Free
+ Software Foundation, write to the Free Software Foundation; we sometimes
+ make exceptions for this.  Our decision will be guided by the two goals
+ of preserving the free status of all derivatives of our free software and
+ of promoting the sharing and reuse of software generally.
+ 
+ @iftex
+ @heading NO WARRANTY
+ @end iftex
+ @ifinfo
+ @center NO WARRANTY
+ @end ifinfo
+ 
+ @item
+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW@.  EXCEPT WHEN
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+ PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE@.  THE ENTIRE RISK AS
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU@.  SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+ REPAIR OR CORRECTION.
+ 
+ @item
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGES.
+ @end enumerate
+ 
+ @iftex
+ @heading END OF TERMS AND CONDITIONS
+ @end iftex
+ @ifinfo
+ @center END OF TERMS AND CONDITIONS
+ @end ifinfo
+ 
+ @page
+ @unnumberedsec How to Apply These Terms to Your New Programs
+ 
+   If you develop a new program, and you want it to be of the greatest
+ possible use to the public, the best way to achieve this is to make it
+ free software which everyone can redistribute and change under these terms.
+ 
+   To do so, attach the following notices to the program.  It is safest
+ to attach them to the start of each source file to most effectively
+ convey the exclusion of warranty; and each file should have at least
+ the ``copyright'' line and a pointer to where the full notice is found.
+ 
+ @smallexample
+ @var{one line to give the program's name and an idea of what it does.}
+ Copyright (C) 19@var{yy}  @var{name of author}
+ 
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+ 
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE@.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ @end smallexample
+ 
+ Also add information on how to contact you by electronic and paper mail.
+ 
+ If the program is interactive, make it output a short notice like this
+ when it starts in an interactive mode:
+ 
+ @smallexample
+ Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+ type `show w'.  This is free software, and you are welcome
+ to redistribute it under certain conditions; type `show c' 
+ for details.
+ @end smallexample
+ 
+ The hypothetical commands @samp{show w} and @samp{show c} should show
+ the appropriate parts of the General Public License.  Of course, the
+ commands you use may be called something other than @samp{show w} and
+ @samp{show c}; they could even be mouse-clicks or menu items---whatever
+ suits your program.
+ 
+ You should also get your employer (if you work as a programmer) or your
+ school, if any, to sign a ``copyright disclaimer'' for the program, if
+ necessary.  Here is a sample; alter the names:
+ 
+ @smallexample
+ @group
+ Yoyodyne, Inc., hereby disclaims all copyright
+ interest in the program `Gnomovision'
+ (which makes passes at compilers) written 
+ by James Hacker.
+ 
+ @var{signature of Ty Coon}, 1 April 1989
+ Ty Coon, President of Vice
+ @end group
+ @end smallexample
+ 
+ This General Public License does not permit incorporating your program into
+ proprietary programs.  If your program is a subroutine library, you may
+ consider it more useful to permit linking proprietary applications with the
+ library.  If this is what you want to do, use the GNU Library General
+ Public License instead of this License.
+ 
+ @node Introduction, Lisp Data Types, Copying, Top
+ @chapter Introduction
+ 
+   Most of the GNU Emacs text editor is written in the programming
+ language called Emacs Lisp.  You can write new code in Emacs Lisp and
+ install it as an extension to the editor.  However, Emacs Lisp is more
+ than a mere ``extension language''; it is a full computer programming
+ language in its own right.  You can use it as you would any other
+ programming language.
+ 
+   Because Emacs Lisp is designed for use in an editor, it has special
+ features for scanning and parsing text as well as features for handling
+ files, buffers, displays, subprocesses, and so on.  Emacs Lisp is
+ closely integrated with the editing facilities; thus, editing commands
+ are functions that can also conveniently be called from Lisp programs,
+ and parameters for customization are ordinary Lisp variables.
+ 
+   This manual describes Emacs Lisp, presuming considerable familiarity
+ with the use of Emacs for editing.  (See @cite{The GNU Emacs Manual}
+ for this basic information.)  Generally speaking, the earlier chapters
+ describe features of Emacs Lisp that have counterparts in many
+ programming languages, and later chapters describe features that are
+ peculiar to Emacs Lisp or relate specifically to editing.
+ 
+   This is edition 2.4.
+ 
+ @menu
+ * Caveats::             Flaws and a request for help.
+ * Lisp History::        Emacs Lisp is descended from Maclisp.
+ * Conventions::         How the manual is formatted.
+ * Acknowledgements::    The authors, editors, and sponsors of this manual.
+ @end menu
+ 
+ @node Caveats
+ @section Caveats
+ 
+   This manual has gone through numerous drafts.  It is nearly complete
+ but not flawless.  There are a few topics that are not covered, either
+ because we consider them secondary (such as most of the individual
+ modes) or because they are yet to be written.  Because we are not able
+ to deal with them completely, we have left out several parts
+ intentionally.  This includes most information about usage on VMS.
+ 
+   The manual should be fully correct in what it does cover, and it is
+ therefore open to criticism on anything it says---from specific examples
+ and descriptive text, to the ordering of chapters and sections.  If
+ something is confusing, or you find that you have to look at the sources
+ or experiment to learn something not covered in the manual, then perhaps
+ the manual should be fixed.  Please let us know.
+ 
+ @iftex
+   As you use the manual, we ask that you mark pages with corrections so
+ you can later look them up and send them in.  If you think of a simple,
+ real-life example for a function or group of functions, please make an
+ effort to write it up and send it in.  Please reference any comments to
+ the chapter name, section name, and function name, as appropriate, since
+ page numbers and chapter and section numbers will change and we may have
+ trouble finding the text you are talking about.  Also state the number
+ of the edition you are criticizing.
+ @end iftex
+ @ifinfo
+ 
+ As you use this manual, we ask that you send corrections as soon as you
+ find them.  If you think of a simple, real life example for a function
+ or group of functions, please make an effort to write it up and send it
+ in.  Please reference any comments to the node name and function or
+ variable name, as appropriate.  Also state the number of the edition
+ which you are criticizing.
+ @end ifinfo
+ 
+ Please mail comments and corrections to
+ 
+ @example
+ bug-lisp-manual@@prep.ai.mit.edu
+ @end example
+ 
+ @noindent
+ We let mail to this list accumulate unread until someone decides to
+ apply the corrections.  Months, and sometimes years, go by between
+ updates.  So please attach no significance to the lack of a reply---your
+ mail @emph{will} be acted on in due time.  If you want to contact the
+ Emacs maintainers more quickly, send mail to
+ @code{bug-gnu-emacs@@prep.ai.mit.edu}.
+ 
+ @display
+  --Bil Lewis, Dan LaLiberte, Richard Stallman
+ @end display
+ 
+ @node Lisp History
+ @section Lisp History
+ @cindex Lisp history
+ 
+   Lisp (LISt Processing language) was first developed in the late 1950's
+ at the Massachusetts Institute of Technology for research in artificial
+ intelligence.  The great power of the Lisp language makes it superior
+ for other purposes as well, such as writing editing commands.
+ 
+ @cindex Maclisp
+ @cindex Common Lisp
+   Dozens of Lisp implementations have been built over the years, each
+ with its own idiosyncrasies.  Many of them were inspired by Maclisp,
+ which was written in the 1960's at MIT's Project MAC.  Eventually the
+ implementors of the descendants of Maclisp came together and developed a
+ standard for Lisp systems, called Common Lisp.
+ 
+   GNU Emacs Lisp is largely inspired by Maclisp, and a little by Common
+ Lisp.  If you know Common Lisp, you will notice many similarities.
+ However, many of the features of Common Lisp have been omitted or
+ simplified in order to reduce the memory requirements of GNU Emacs.
+ Sometimes the simplifications are so drastic that a Common Lisp user
+ might be very confused.  We will occasionally point out how GNU Emacs
+ Lisp differs from Common Lisp.  If you don't know Common Lisp, don't
+ worry about it; this manual is self-contained.
+ 
+ @node Conventions
+ @section Conventions
+ 
+ This section explains the notational conventions that are used in this
+ manual.  You may want to skip this section and refer back to it later.
+ 
+ @menu
+ * Some Terms::               Explanation of terms we use in this manual.
+ * nil and t::                How the symbols @code{nil} and @code{t} are used.
+ * Evaluation Notation::      The format we use for examples of evaluation.
+ * Printing Notation::        The format we use for examples that print output.
+ * Error Messages::           The format we use for examples of errors.
+ * Buffer Text Notation::     The format we use for buffer contents in examples.
+ * Format of Descriptions::   Notation for describing functions, variables, etc.
+ @end menu
+ 
+ @node Some Terms
+ @subsection Some Terms
+ 
+   Throughout this manual, the phrases ``the Lisp reader'' and ``the Lisp
+ printer'' are used to refer to those routines in Lisp that convert
+ textual representations of Lisp objects into actual Lisp objects, and vice
+ versa.  @xref{Printed Representation}, for more details.  You, the
+ person reading this manual, are thought of as ``the programmer'' and are
+ addressed as ``you''.  ``The user'' is the person who uses Lisp programs,
+ including those you write.
+ 
+ @cindex fonts
+   Examples of Lisp code appear in this font or form: @code{(list 1 2
+ 3)}.  Names that represent arguments or metasyntactic variables appear
+ in this font or form: @var{first-number}.
+ 
+ @node nil and t
+ @subsection @code{nil} and @code{t}
+ @cindex @code{nil}, uses of
+ @cindex truth value
+ @cindex boolean
+ @cindex false
+ 
+   In Lisp, the symbol @code{nil} has three separate meanings: it
+ is a symbol with the name @samp{nil}; it is the logical truth value
+ @var{false}; and it is the empty list---the list of zero elements.
+ When used as a variable, @code{nil} always has the value @code{nil}.
+ 
+   As far as the Lisp reader is concerned, @samp{()} and @samp{nil} are
+ identical: they stand for the same object, the symbol @code{nil}.  The
+ different ways of writing the symbol are intended entirely for human
+ readers.  After the Lisp reader has read either @samp{()} or @samp{nil},
+ there is no way to determine which representation was actually written
+ by the programmer.
+ 
+   In this manual, we use @code{()} when we wish to emphasize that it
+ means the empty list, and we use @code{nil} when we wish to emphasize
+ that it means the truth value @var{false}.  That is a good convention to use
+ in Lisp programs also.
+ 
+ @example
+ (cons 'foo ())                ; @r{Emphasize the empty list}
+ (not nil)                     ; @r{Emphasize the truth value @var{false}}
+ @end example
+ 
+ @cindex @code{t} and truth
+ @cindex true
+   In contexts where a truth value is expected, any non-@code{nil} value
+ is considered to be @var{true}.  However, @code{t} is the preferred way
+ to represent the truth value @var{true}.  When you need to choose a
+ value which represents @var{true}, and there is no other basis for
+ choosing, use @code{t}.  The symbol @code{t} always has value @code{t}.
+ 
+   In Emacs Lisp, @code{nil} and @code{t} are special symbols that always
+ evaluate to themselves.  This is so that you do not need to quote them
+ to use them as constants in a program.  An attempt to change their
+ values results in a @code{setting-constant} error.  @xref{Accessing
+ Variables}.
+ 
+ @node Evaluation Notation
+ @subsection Evaluation Notation
+ @cindex evaluation notation
+ @cindex documentation notation
+ 
+   A Lisp expression that you can evaluate is called a @dfn{form}.
+ Evaluating a form always produces a result, which is a Lisp object.  In
+ the examples in this manual, this is indicated with @samp{@result{}}:
+ 
+ @example
+ (car '(1 2))
+      @result{} 1
+ @end example
+ 
+ @noindent
+ You can read this as ``@code{(car '(1 2))} evaluates to 1''.
+ 
+   When a form is a macro call, it expands into a new form for Lisp to
+ evaluate.  We show the result of the expansion with
+ @samp{@expansion{}}.  We may or may not show the actual result of the
+ evaluation of the expanded form.
+ 
+ @example
+ (third '(a b c))
+      @expansion{} (car (cdr (cdr '(a b c))))
+      @result{} c
+ @end example
+ 
+   Sometimes to help describe one form we show another form that
+ produces identical results.  The exact equivalence of two forms is
+ indicated with @samp{@equiv{}}.
+ 
+ @example
+ (make-sparse-keymap) @equiv{} (list 'keymap)
+ @end example
+ 
+ @node Printing Notation
+ @subsection Printing Notation
+ @cindex printing notation
+ 
+   Many of the examples in this manual print text when they are
+ evaluated.  If you execute example code in a Lisp Interaction buffer
+ (such as the buffer @samp{*scratch*}), the printed text is inserted into
+ the buffer.  If you execute the example by other means (such as by
+ evaluating the function @code{eval-region}), the printed text is
+ displayed in the echo area.  You should be aware that text displayed in
+ the echo area is truncated to a single line.
+ 
+   Examples in this manual indicate printed text with @samp{@print{}},
+ irrespective of where that text goes.  The value returned by evaluating
+ the form (here @code{bar}) follows on a separate line.
+ 
+ @example
+ @group
+ (progn (print 'foo) (print 'bar))
+      @print{} foo
+      @print{} bar
+      @result{} bar
+ @end group
+ @end example
+ 
+ @node Error Messages
+ @subsection Error Messages
+ @cindex error message notation
+ 
+   Some examples signal errors.  This normally displays an error message
+ in the echo area.  We show the error message on a line starting with
+ @samp{@error{}}.  Note that @samp{@error{}} itself does not appear in
+ the echo area.
+ 
+ @example
+ (+ 23 'x)
+ @error{} Wrong type argument: integer-or-marker-p, x
+ @end example
+ 
+ @node Buffer Text Notation
+ @subsection Buffer Text Notation
+ @cindex buffer text notation
+ 
+   Some examples show modifications to text in a buffer, with ``before''
+ and ``after'' versions of the text.  These examples show the contents of
+ the buffer in question between two lines of dashes containing the buffer
+ name.  In addition, @samp{@point{}} indicates the location of point.
+ (The symbol for point, of course, is not part of the text in the buffer;
+ it indicates the place @emph{between} two characters where point is
+ located.)
+ 
+ @example
+ ---------- Buffer: foo ----------
+ This is the @point{}contents of foo.
+ ---------- Buffer: foo ----------
+ 
+ (insert "changed ")
+      @result{} nil
+ ---------- Buffer: foo ----------
+ This is the changed @point{}contents of foo.
+ ---------- Buffer: foo ----------
+ @end example
+ 
+ @node Format of Descriptions
+ @subsection Format of Descriptions
+ @cindex description format
+ 
+   Functions, variables, macros, commands, user options, and special
+ forms are described in this manual in a uniform format.  The first
+ line of a description contains the name of the item followed by its
+ arguments, if any.
+ @ifinfo
+ The category---function, variable, or whatever---appears at the
+ beginning of the line.
+ @end ifinfo
+ @iftex
+ The category---function, variable, or whatever---is printed next to the
+ right margin.
+ @end iftex
+ The description follows on succeeding lines, sometimes with examples.
+ 
+ @menu
+ * A Sample Function Description::       A description of an imaginary
+                                           function, @code{foo}.
+ * A Sample Variable Description::       A description of an imaginary
+                                           variable,
+                                           @code{electric-future-map}.  
+ @end menu
+ 
+ @node A Sample Function Description
+ @subsubsection A Sample Function Description
+ @cindex function descriptions
+ @cindex command descriptions
+ @cindex macro descriptions
+ @cindex special form descriptions
+ 
+   In a function description, the name of the function being described
+ appears first.  It is followed on the same line by a list of parameters.
+ The names used for the parameters are also used in the body of the
+ description.
+ 
+   The appearance of the keyword @code{&optional} in the parameter list
+ indicates that the arguments for subsequent parameters may be omitted
+ (omitted parameters default to @code{nil}).  Do not write
+ @code{&optional} when you call the function.
+ 
+   The keyword @code{&rest} (which will always be followed by a single
+ parameter) indicates that any number of arguments can follow.  The value
+ of the single following parameter will be a list of all these arguments.
+ Do not write @code{&rest} when you call the function.
+ 
+   Here is a description of an imaginary function @code{foo}:
+ 
+ @defun foo integer1 &optional integer2 &rest integers
+ The function @code{foo} subtracts @var{integer1} from @var{integer2},
+ then adds all the rest of the arguments to the result.  If @var{integer2}
+ is not supplied, then the number 19 is used by default.
+ 
+ @example
+ (foo 1 5 3 9)
+      @result{} 16
+ (foo 5)
+      @result{} 14
+ @end example
+ 
+ More generally,
+ 
+ @example
+ (foo @var{w} @var{x} @var{y}@dots{})
+ @equiv{}
+ (+ (- @var{x} @var{w}) @var{y}@dots{})
+ @end example
+ @end defun
+ 
+   Any parameter whose name contains the name of a type (e.g.,
+ @var{integer}, @var{integer1} or @var{buffer}) is expected to be of that
+ type.  A plural of a type (such as @var{buffers}) often means a list of
+ objects of that type.  Parameters named @var{object} may be of any type.
+ (@xref{Lisp Data Types}, for a list of Emacs object types.)
+ Parameters with other sorts of names (e.g., @var{new-file}) are
+ discussed specifically in the description of the function.  In some
+ sections, features common to parameters of several functions are
+ described at the beginning.
+ 
+   @xref{Lambda Expressions}, for a more complete description of optional
+ and rest arguments.
+ 
+   Command, macro, and special form descriptions have the same format,
+ but the word `Function' is replaced by `Command', `Macro', or `Special
+ Form', respectively.  Commands are simply functions that may be called
+ interactively; macros process their arguments differently from functions
+ (the arguments are not evaluated), but are presented the same way.
+ 
+   Special form descriptions use a more complex notation to specify
+ optional and repeated parameters because they can break the argument
+ list down into separate arguments in more complicated ways.
+ @samp{@code{@r{[}@var{optional-arg}@r{]}}} means that @var{optional-arg} is
+ optional and @samp{@var{repeated-args}@dots{}} stands for zero or more
+ arguments.  Parentheses are used when several arguments are grouped into
+ additional levels of list structure.  Here is an example:
+ 
+ @defspec count-loop (@var{var} [@var{from} @var{to} [@var{inc}]]) @var{body}@dots{}
+ This imaginary special form implements a loop that executes the
+ @var{body} forms and then increments the variable @var{var} on each
+ iteration.  On the first iteration, the variable has the value
+ @var{from}; on subsequent iterations, it is incremented by 1 (or by
+ @var{inc} if that is given).  The loop exits before executing @var{body}
+ if @var{var} equals @var{to}.  Here is an example:
+ 
+ @example
+ (count-loop (i 0 10)
+   (prin1 i) (princ " ")
+   (prin1 (aref vector i)) (terpri))
+ @end example
+ 
+ If @var{from} and @var{to} are omitted, then @var{var} is bound to
+ @code{nil} before the loop begins, and the loop exits if @var{var} is
+ non-@code{nil} at the beginning of an iteration.  Here is an example:
+ 
+ @example
+ (count-loop (done)
+   (if (pending)
+       (fixit)
+     (setq done t)))
+ @end example
+ 
+ In this special form, the arguments @var{from} and @var{to} are
+ optional, but must both be present or both absent.  If they are present,
+ @var{inc} may optionally be specified as well.  These arguments are
+ grouped with the argument @var{var} into a list, to distinguish them
+ from @var{body}, which includes all remaining elements of the form.
+ @end defspec
+ 
+ @node A Sample Variable Description
+ @subsubsection A Sample Variable Description
+ @cindex variable descriptions
+ @cindex option descriptions
+ 
+   A @dfn{variable} is a name that can hold a value.  Although any
+ variable can be set by the user, certain variables that exist
+ specifically so that users can change them are called @dfn{user
+ options}.  Ordinary variables and user options are described using a
+ format like that for functions except that there are no arguments.
+ 
+   Here is a description of the imaginary @code{electric-future-map}
+ variable.@refill
+ 
+ @defvar electric-future-map
+ The value of this variable is a full keymap used by Electric Command
+ Future mode.  The functions in this map allow you to edit commands you
+ have not yet thought about executing.
+ @end defvar
+ 
+   User option descriptions have the same format, but `Variable' is
+ replaced by `User Option'.
+ 
+ @node Acknowledgements
+ @section Acknowledgements
+ 
+   This manual was written by Robert Krawitz, Bil Lewis, Dan LaLiberte,
+ Richard M. Stallman and Chris Welty, the volunteers of the GNU manual
+ group, in an effort extending over several years.  Robert J. Chassell
+ helped to review and edit the manual, with the support of the Defense
+ Advanced Research Projects Agency, ARPA Order 6082, arranged by Warren
+ A. Hunt, Jr. of Computational Logic, Inc.
+ 
+   Corrections were supplied by Karl Berry, Jim Blandy, Bard Bloom,
+ Stephane Boucher, David Boyes, Alan Carroll, Richard Davis, Lawrence
+ R. Dodd, Peter Doornbosch, David A. Duff, Chris Eich, Beverly
+ Erlebacher, David Eckelkamp, Ralf Fassel, Eirik Fuller, Stephen Gildea,
+ Bob Glickstein, Eric Hanchrow, George Hartzell, Nathan Hess, Masayuki
+ Ida, Dan Jacobson, Jak Kirman, Bob Knighten, Frederick M. Korz, Joe
+ Lammens, Glenn M. Lewis, K. Richard Magill, Brian Marick, Roland
+ McGrath, Skip Montanaro, John Gardiner Myers, Thomas A. Peterson,
+ Francesco Potorti, Friedrich Pukelsheim, Arnold D. Robbins, Raul
+ Rockwell, Per Starback, Shinichirou Sugou, Kimmo Suominen, Edward Tharp,
+ Bill Trost, Rickard Westman, Jean White, Matthew Wilding, Carl Witty,
+ Dale Worley, Rusty Wright, and David D. Zuhn.
Index: emacs/man/elisp-keymaps.texi
diff -c /dev/null emacs/man/elisp-keymaps.texi:1.2
*** /dev/null	Fri Aug  2 20:54:08 1996
--- emacs/man/elisp-keymaps.texi	Thu Aug  1 00:22:57 1996
***************
*** 0 ****
--- 1,1729 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/keymaps
+ @node Keymaps, Modes, Command Loop, Top
+ @chapter Keymaps
+ @cindex keymap
+ 
+   The bindings between input events and commands are recorded in data
+ structures called @dfn{keymaps}.  Each binding in a keymap associates
+ (or @dfn{binds}) an individual event type either with another keymap or
+ with a command.  When an event is bound to a keymap, that keymap is
+ used to look up the next input event; this continues until a command
+ is found.  The whole process is called @dfn{key lookup}.
+ 
+ @menu
+ * Keymap Terminology::        	Definitions of terms pertaining to keymaps.
+ * Format of Keymaps::		What a keymap looks like as a Lisp object.
+ * Creating Keymaps:: 		Functions to create and copy keymaps.
+ * Inheritance and Keymaps::	How one keymap can inherit the bindings
+ 				   of another keymap.
+ * Prefix Keys::                 Defining a key with a keymap as its definition.
+ * Active Keymaps::	        Each buffer has a local keymap
+                                    to override the standard (global) bindings.
+ 				   A minor mode can also override them.
+ * Key Lookup::                  How extracting elements from keymaps works.
+ * Functions for Key Lookup::    How to request key lookup.
+ * Changing Key Bindings::       Redefining a key in a keymap.
+ * Key Binding Commands::        Interactive interfaces for redefining keys.
+ * Scanning Keymaps::            Looking through all keymaps, for printing help.
+ * Menu Keymaps::		A keymap can define a menu.
+ @end menu
+ 
+ @node Keymap Terminology
+ @section Keymap Terminology
+ @cindex key
+ @cindex keystroke
+ @cindex key binding
+ @cindex binding of a key
+ @cindex complete key
+ @cindex undefined key
+ 
+   A @dfn{keymap} is a table mapping event types to definitions (which
+ can be any Lisp objects, though only certain types are meaningful for
+ execution by the command loop).  Given an event (or an event type) and a
+ keymap, Emacs can get the event's definition.  Events include ordinary
+ @sc{ASCII} characters, function keys, and mouse actions (@pxref{Input
+ Events}).
+ 
+   A sequence of input events that form a unit is called a
+ @dfn{key sequence}, or @dfn{key} for short.  A sequence of one event
+ is always a key sequence, and so are some multi-event sequences.
+ 
+   A keymap determines a binding or definition for any key sequence.  If
+ the key sequence is a single event, its binding is the definition of the
+ event in the keymap.  The binding of a key sequence of more than one
+ event is found by an iterative process: the binding of the first event
+ is found, and must be a keymap; then the second event's binding is found
+ in that keymap, and so on until all the events in the key sequence are
+ used up.
+ 
+   If the binding of a key sequence is a keymap, we call the key sequence
+ a @dfn{prefix key}.  Otherwise, we call it a @dfn{complete key} (because
+ no more events can be added to it).  If the binding is @code{nil},
+ we call the key @dfn{undefined}.  Examples of prefix keys are @kbd{C-c},
+ @kbd{C-x}, and @kbd{C-x 4}.  Examples of defined complete keys are
+ @kbd{X}, @key{RET}, and @kbd{C-x 4 C-f}.  Examples of undefined complete
+ keys are @kbd{C-x C-g}, and @kbd{C-c 3}.  @xref{Prefix Keys}, for more
+ details.
+ 
+   The rule for finding the binding of a key sequence assumes that the
+ intermediate bindings (found for the events before the last) are all
+ keymaps; if this is not so, the sequence of events does not form a
+ unit---it is not really a key sequence.  In other words, removing one or
+ more events from the end of any valid key must always yield a prefix
+ key.  For example, @kbd{C-f C-n} is not a key; @kbd{C-f} is not a prefix
+ key, so a longer sequence starting with @kbd{C-f} cannot be a key.
+ 
+   Note that the set of possible multi-event key sequences depends on the
+ bindings for prefix keys; therefore, it can be different for different
+ keymaps, and can change when bindings are changed.  However, a one-event
+ sequence is always a key sequence, because it does not depend on any
+ prefix keys for its well-formedness.
+ 
+   At any time, several primary keymaps are @dfn{active}---that is, in
+ use for finding key bindings.  These are the @dfn{global map}, which is
+ shared by all buffers; the @dfn{local keymap}, which is usually
+ associated with a specific major mode; and zero or more @dfn{minor mode
+ keymaps}, which belong to currently enabled minor modes.  (Not all minor
+ modes have keymaps.)  The local keymap bindings shadow (i.e., take
+ precedence over) the corresponding global bindings.  The minor mode
+ keymaps shadow both local and global keymaps.  @xref{Active Keymaps},
+ for details.
+ 
+ @node Format of Keymaps
+ @section Format of Keymaps
+ @cindex format of keymaps
+ @cindex keymap format
+ @cindex full keymap
+ @cindex sparse keymap
+ 
+   A keymap is a list whose @sc{car} is the symbol @code{keymap}.  The
+ remaining elements of the list define the key bindings of the keymap.
+ Use the function @code{keymapp} (see below) to test whether an object is
+ a keymap.
+ 
+   Each ordinary binding applies to events of a particular @dfn{event
+ type}, which is always a character or a symbol.  @xref{Classifying
+ Events}.
+ 
+   An ordinary element of a keymap is a cons cell of the form
+ @code{(@var{type} .@: @var{binding})}.  This specifies one binding, for
+ events of type @var{type}.
+ 
+ @cindex default key binding
+ @c Emacs 19 feature
+   A cons cell whose @sc{car} is @code{t} is a @dfn{default key binding};
+ any event not bound by other elements of the keymap is given
+ @var{binding} as its binding.  Default bindings allow a keymap to bind
+ all possible event types without having to enumerate all of them.  A
+ keymap that has a default binding completely masks any lower-precedence
+ keymap.
+ 
+   If an element of a keymap is a vector, the vector counts as bindings
+ for all the @sc{ASCII} characters; vector element @var{n} is the binding
+ for the character with code @var{n}.  This is a compact way to
+ record lots of bindings.  A keymap with such a vector is called a
+ @dfn{full keymap}.  Other keymaps are called @dfn{sparse keymaps}.
+ 
+   When a keymap contains a vector, it always defines a binding for every
+ @sc{ASCII} character even if the vector element is @code{nil}.  Such a
+ binding of @code{nil} overrides any default binding in the keymap.
+ However, default bindings are still meaningful for events that are not
+ @sc{ASCII} characters.  A binding of @code{nil} does @emph{not}
+ override lower-precedence keymaps; thus, if the local map gives a
+ binding of @code{nil}, Emacs uses the binding from the global map.
+ 
+ @cindex keymap prompt string
+ @cindex overall prompt string
+ @cindex prompt string of keymap
+   Aside from bindings, a keymap can also have a string as an element.
+ This is called the @dfn{overall prompt string} and makes it possible to
+ use the keymap as a menu.  @xref{Menu Keymaps}.
+ 
+ @cindex meta characters lookup
+   Keymaps do not directly record bindings for the meta characters, whose
+ codes are from 128 to 255.  Instead, meta characters are regarded for
+ purposes of key lookup as sequences of two characters, the first of
+ which is @key{ESC} (or whatever is currently the value of
+ @code{meta-prefix-char}).  Thus, the key @kbd{M-a} is really represented
+ as @kbd{@key{ESC} a}, and its global binding is found at the slot for
+ @kbd{a} in @code{esc-map} (@pxref{Prefix Keys}).
+ 
+   Here as an example is the local keymap for Lisp mode, a sparse
+ keymap.  It defines bindings for @key{DEL} and @key{TAB}, plus @kbd{C-c
+ C-l}, @kbd{M-C-q}, and @kbd{M-C-x}.
+ 
+ @example
+ @group
+ lisp-mode-map
+ @result{} 
+ @end group
+ @group
+ (keymap 
+  ;; @key{TAB}
+  (9 . lisp-indent-line)                 
+ @end group
+ @group
+  ;; @key{DEL}
+  (127 . backward-delete-char-untabify)  
+ @end group
+ @group
+  (3 keymap 
+     ;; @kbd{C-c C-l}
+     (12 . run-lisp))                    
+ @end group
+ @group
+  (27 keymap 
+      ;; @r{@kbd{M-C-q}, treated as @kbd{@key{ESC} C-q}}
+      (17 . indent-sexp)                 
+      ;; @r{@kbd{M-C-x}, treated as @kbd{@key{ESC} C-x}}
+      (24 . lisp-send-defun)))           
+ @end group
+ @end example
+ 
+ @defun keymapp object
+ This function returns @code{t} if @var{object} is a keymap, @code{nil}
+ otherwise.  More precisely, this function tests for a list whose
+ @sc{car} is @code{keymap}.
+ 
+ @example
+ @group
+ (keymapp '(keymap))
+     @result{} t
+ @end group
+ @group
+ (keymapp (current-global-map))
+     @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @node Creating Keymaps
+ @section Creating Keymaps
+ @cindex creating keymaps
+ 
+   Here we describe the functions for creating keymaps.
+ 
+ @c ??? This should come after makr-sparse-keymap
+ @defun make-keymap &optional prompt
+ This function creates and returns a new full keymap (i.e., one
+ containing a vector of length 128 for defining all the @sc{ASCII}
+ characters).  The new keymap initially binds all @sc{ASCII} characters
+ to @code{nil}, and does not bind any other kind of event.
+ 
+ @example
+ @group
+ (make-keymap)
+     @result{} (keymap [nil nil nil @dots{} nil nil])
+ @end group
+ @end example
+ 
+ If you specify @var{prompt}, that becomes the overall prompt string for
+ the keymap.  The prompt string is useful for menu keymaps (@pxref{Menu
+ Keymaps}).
+ @end defun
+ 
+ @defun make-sparse-keymap &optional prompt
+ This function creates and returns a new sparse keymap with no entries.
+ The new keymap does not bind any events.  The argument @var{prompt}
+ specifies a prompt string, as in @code{make-keymap}.
+ 
+ @example
+ @group
+ (make-sparse-keymap)
+     @result{} (keymap)
+ @end group
+ @end example
+ @end defun
+ 
+ @defun copy-keymap keymap
+ This function returns a copy of @var{keymap}.  Any keymaps that
+ appear directly as bindings in @var{keymap} are also copied recursively,
+ and so on to any number of levels.  However, recursive copying does not
+ take place when the definition of a character is a symbol whose function
+ definition is a keymap; the same symbol appears in the new copy.
+ @c Emacs 19 feature
+ 
+ @example
+ @group
+ (setq map (copy-keymap (current-local-map)))
+ @result{} (keymap
+ @end group
+ @group
+      ;; @r{(This implements meta characters.)}
+      (27 keymap         
+          (83 . center-paragraph)
+          (115 . center-line))
+      (9 . tab-to-tab-stop))
+ @end group
+ 
+ @group
+ (eq map (current-local-map))
+     @result{} nil
+ @end group
+ @group
+ (equal map (current-local-map))
+     @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @node Inheritance and Keymaps
+ @section Inheritance and Keymaps
+ @cindex keymap inheritance
+ @cindex inheriting a keymap's bindings
+ 
+   A keymap can inherit the bindings of another keymap.  Do do this, make
+ a keymap whose ``tail'' is another existing keymap to inherit from.
+ Such a keymap looks like this:
+ 
+ @example
+ (keymap @var{bindings}@dots{} . @var{other-keymap})
+ @end example
+ 
+ @noindent
+ The effect is that this keymap inherits all the bindings of
+ @var{other-keymap}, whatever they may be at the time a key is looked up,
+ but can add to them or override them with @var{bindings}.
+ 
+ If you change the bindings in @var{other-keymap} using @code{define-key}
+ or other key-binding functions, these changes are visible in the
+ inheriting keymap unless shadowed by @var{bindings}.  The converse is
+ not true: if you use @code{define-key} to change the inheriting keymap,
+ that affects @var{bindings}, but has no effect on @var{other-keymap}.
+ 
+ Here is an example showing how to make a keymap that inherits
+ from @code{text-mode-map}:
+ 
+ @example
+ (setq my-mode-map (cons 'keymap text-mode-map))
+ @end example
+ 
+ @node Prefix Keys
+ @section Prefix Keys
+ @cindex prefix key
+ 
+   A @dfn{prefix key} has an associated keymap that defines what to do
+ with key sequences that start with the prefix key.  For example,
+ @kbd{C-x} is a prefix key, and it uses a keymap that is also stored in
+ the variable @code{ctl-x-map}.  Here is a list of the standard prefix
+ keys of Emacs and their keymaps:
+ 
+ @itemize @bullet
+ @item
+ @vindex esc-map
+ @findex ESC-prefix
+ @code{esc-map} is used for events that follow @key{ESC}.  Thus, the
+ global definitions of all meta characters are actually found here.  This
+ map is also the function definition of @code{ESC-prefix}.
+ 
+ @item
+ @cindex @kbd{C-h}
+ @code{help-map} is used for events that follow @kbd{C-h}.
+ 
+ @item
+ @cindex @kbd{C-c}
+ @vindex mode-specific-map
+ @code{mode-specific-map} is for events that follow @kbd{C-c}.  This
+ map is not actually mode specific; its name was chosen to be informative
+ for the user in @kbd{C-h b} (@code{display-bindings}), where it
+ describes the main use of the @kbd{C-c} prefix key.
+ 
+ @item
+ @cindex @kbd{C-x}
+ @vindex ctl-x-map
+ @findex Control-X-prefix
+ @code{ctl-x-map} is the map used for events that follow @kbd{C-x}.  This
+ map is also the function definition of @code{Control-X-prefix}.
+ 
+ @item
+ @cindex @kbd{C-x 4}
+ @vindex ctl-x-4-map
+ @code{ctl-x-4-map} is used for events that follow @kbd{C-x 4}.
+ 
+ @c Emacs 19 feature
+ @item
+ @cindex @kbd{C-x 5}
+ @vindex ctl-x-5-map
+ @code{ctl-x-5-map} is used for events that follow @kbd{C-x 5}.
+ 
+ @c Emacs 19 feature
+ @item
+ @cindex @kbd{C-x n}
+ @cindex @kbd{C-x r}
+ @cindex @kbd{C-x a}
+ The prefix keys @kbd{C-x n}, @kbd{C-x r} and @kbd{C-x a} use keymaps
+ that have no special name.
+ @end itemize
+ 
+   The binding of a prefix key is the keymap to use for looking up the
+ events that follow the prefix key.  (It may instead be a symbol whose
+ function definition is a keymap.  The effect is the same, but the symbol
+ serves as a name for the prefix key.)  Thus, the binding of @kbd{C-x} is
+ the symbol @code{Control-X-prefix}, whose function definition is the
+ keymap for @kbd{C-x} commands.  (The same keymap is also the value of
+ @code{ctl-x-map}.)
+ 
+   Prefix key definitions can appear in any active keymap.  The
+ definitions of @kbd{C-c}, @kbd{C-x}, @kbd{C-h} and @key{ESC} as prefix
+ keys appear in the global map, so these prefix keys are always
+ available.  Major and minor modes can redefine a key as a prefix by
+ putting a prefix key definition for it in the local map or the minor
+ mode's map.  @xref{Active Keymaps}.
+ 
+   If a key is defined as a prefix in more than one active map, then its
+ various definitions are in effect merged: the commands defined in the
+ minor mode keymaps come first, followed by those in the local map's
+ prefix definition, and then by those from the global map.
+ 
+   In the following example, we make @kbd{C-p} a prefix key in the local
+ keymap, in such a way that @kbd{C-p} is identical to @kbd{C-x}.  Then
+ the binding for @kbd{C-p C-f} is the function @code{find-file}, just
+ like @kbd{C-x C-f}.  The key sequence @kbd{C-p 6} is not found in any
+ active keymap.
+ 
+ @example
+ @group
+ (use-local-map (make-sparse-keymap))
+     @result{} nil
+ @end group
+ @group
+ (local-set-key "\C-p" ctl-x-map)
+     @result{} nil
+ @end group
+ @group
+ (key-binding "\C-p\C-f")
+     @result{} find-file
+ @end group
+ 
+ @group
+ (key-binding "\C-p6")
+     @result{} nil
+ @end group
+ @end example
+ 
+ @defun define-prefix-command symbol
+ @cindex prefix command
+ This function defines @var{symbol} as a prefix command: it creates a
+ full keymap and stores it as @var{symbol}'s function definition.
+ Storing the symbol as the binding of a key makes the key a prefix key
+ that has a name.  The function also sets @var{symbol} as a variable, to
+ have the keymap as its value.  It returns @var{symbol}.
+ 
+   In Emacs version 18, only the function definition of @var{symbol} was
+ set, not the value as a variable.
+ @end defun
+ 
+ @node Active Keymaps
+ @section Active Keymaps
+ @cindex active keymap
+ @cindex global keymap
+ @cindex local keymap
+ 
+   Emacs normally contains many keymaps; at any given time, just a few of
+ them are @dfn{active} in that they participate in the interpretation
+ of user input.  These are the global keymap, the current buffer's
+ local keymap, and the keymaps of any enabled minor modes.
+ 
+   The @dfn{global keymap} holds the bindings of keys that are defined
+ regardless of the current buffer, such as @kbd{C-f}.  The variable
+ @code{global-map} holds this keymap, which is always active.
+ 
+   Each buffer may have another keymap, its @dfn{local keymap}, which may
+ contain new or overriding definitions for keys.  The current buffer's
+ local keymap is always active except when @code{overriding-local-map}
+ overrides it.  Text properties can specify an alternative local map for
+ certain parts of the buffer; see @ref{Special Properties}.
+ 
+   Each minor mode may have a keymap; if it does, the keymap is active
+ when the minor mode is enabled.
+ 
+   The variable @code{overriding-local-map}, if non-@code{nil}, specifies
+ another local keymap that overrides the buffer's local map and all the 
+ minor mode keymaps.
+ 
+   All the active keymaps are used together to determine what command to
+ execute when a key is entered.  Emacs searches these maps one by one, in
+ order of decreasing precedence, until it finds a binding in one of the maps.
+ 
+   Normally, Emacs @emph{first} searches for the key in the minor mode
+ maps (one map at a time); if they do not supply a binding for the key,
+ Emacs searches the local map; if that too has no binding, Emacs then
+ searches the global map.  However, if @code{overriding-local-map} is
+ non-@code{nil}, Emacs searches that map first, followed by the global
+ map.
+ 
+   The procedure for searching a single keymap is called
+ @dfn{key lookup}; see @ref{Key Lookup}.
+ 
+ @cindex major mode keymap
+   Since every buffer that uses the same major mode normally uses the
+ same local keymap, you can think of the keymap as local to the mode.  A
+ change to the local keymap of a buffer (using @code{local-set-key}, for
+ example) is seen also in the other buffers that share that keymap.
+ 
+   The local keymaps that are used for Lisp mode, C mode, and several
+ other major modes exist even if they have not yet been used.  These
+ local maps are the values of the variables @code{lisp-mode-map},
+ @code{c-mode-map}, and so on.  For most other modes, which are less
+ frequently used, the local keymap is constructed only when the mode is
+ used for the first time in a session.
+ 
+   The minibuffer has local keymaps, too; they contain various completion
+ and exit commands.  @xref{Intro to Minibuffers}.
+ 
+   @xref{Standard Keymaps}, for a list of standard keymaps.
+ 
+ @defvar global-map
+ This variable contains the default global keymap that maps Emacs
+ keyboard input to commands.  The global keymap is normally this keymap.
+ The default global keymap is a full keymap that binds
+ @code{self-insert-command} to all of the printing characters.
+ 
+ It is normal practice to change the bindings in the global map, but you
+ should not assign this variable any value other than the keymap it starts
+ out with.
+ @end defvar
+ 
+ @defun current-global-map
+ This function returns the current global keymap.  This is the
+ same as the value of @code{global-map} unless you change one or the
+ other.
+ 
+ @example
+ @group
+ (current-global-map)
+ @result{} (keymap [set-mark-command beginning-of-line @dots{} 
+             delete-backward-char])
+ @end group
+ @end example
+ @end defun
+ 
+ @defun current-local-map
+ This function returns the current buffer's local keymap, or @code{nil}
+ if it has none.  In the following example, the keymap for the
+ @samp{*scratch*} buffer (using Lisp Interaction mode) is a sparse keymap
+ in which the entry for @key{ESC}, @sc{ASCII} code 27, is another sparse
+ keymap.
+ 
+ @example
+ @group
+ (current-local-map)
+ @result{} (keymap 
+     (10 . eval-print-last-sexp) 
+     (9 . lisp-indent-line) 
+     (127 . backward-delete-char-untabify) 
+ @end group
+ @group
+     (27 keymap 
+         (24 . eval-defun) 
+         (17 . indent-sexp)))
+ @end group
+ @end example
+ @end defun
+ 
+ @defun current-minor-mode-maps
+ This function returns a list of the keymaps of currently enabled minor modes.
+ @end defun
+ 
+ @defun use-global-map keymap
+ This function makes @var{keymap} the new current global keymap.  It
+ returns @code{nil}.
+ 
+ It is very unusual to change the global keymap.
+ @end defun
+ 
+ @defun use-local-map keymap
+ This function makes @var{keymap} the new local keymap of the current
+ buffer.  If @var{keymap} is @code{nil}, then the buffer has no local
+ keymap.  @code{use-local-map} returns @code{nil}.  Most major mode
+ commands use this function.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defvar minor-mode-map-alist
+ This variable is an alist describing keymaps that may or may not be
+ active according to the values of certain variables.  Its elements look
+ like this:
+ 
+ @example
+ (@var{variable} . @var{keymap})
+ @end example
+ 
+ The keymap @var{keymap} is active whenever @var{variable} has a
+ non-@code{nil} value.  Typically @var{variable} is the variable that
+ enables or disables a minor mode.  @xref{Keymaps and Minor Modes}.
+ 
+ Note that elements of @code{minor-mode-map-alist} do not have the same
+ structure as elements of @code{minor-mode-alist}.  The map must be the
+ @sc{cdr} of the element; a list with the map as the second element will
+ not do.
+ 
+ What's more, the keymap itself must appear in the @sc{cdr}.  It does not
+ work to store a variable in the @sc{cdr} and make the map the value of
+ that variable.
+ 
+ When more than one minor mode keymap is active, their order of priority
+ is the order of @code{minor-mode-map-alist}.  But you should design
+ minor modes so that they don't interfere with each other.  If you do
+ this properly, the order will not matter.
+ 
+ See also @code{minor-mode-key-binding}, above.  See @ref{Keymaps and
+ Minor Modes}, for more information about minor modes.
+ @end defvar
+ 
+ @defvar overriding-local-map
+ If non-@code{nil}, this variable holds a keymap to use instead of the
+ buffer's local keymap and instead of all the minor mode keymaps.  This
+ keymap, if any, overrides all other maps that would have been active,
+ except for the current global map.
+ @end defvar
+ 
+ @defvar overriding-local-map-menu-flag
+ If this variable is non-@code{nil}, the value of
+ @code{overriding-local-map} can affect the display of the menu bar.  The
+ default value is @code{nil}, so @code{overriding-local-map} has no
+ effect on the menu bar.
+ 
+ Note that @code{overriding-local-map} does affect the execution of key
+ sequences entered using the menu bar, even if it does not affect the
+ menu bar display.  So if a menu bar key sequence comes in, you should
+ clear @code{overriding-local-map} before looking up and executing that
+ key sequence.  Modes that use @code{overriding-local-map} would
+ typically do this anyway; normally they respond to events that they do
+ not handle by ``unreading'' them and exiting.
+ @end defvar
+ 
+ @node Key Lookup
+ @section Key Lookup
+ @cindex key lookup
+ @cindex keymap entry
+ 
+   @dfn{Key lookup} is the process of finding the binding of a key
+ sequence from a given keymap.  Actual execution of the binding is not
+ part of key lookup.
+ 
+   Key lookup uses just the event type of each event in the key
+ sequence; the rest of the event is ignored.  In fact, a key sequence
+ used for key lookup may designate mouse events with just their types
+ (symbols) instead of with entire mouse events (lists).  @xref{Input
+ Events}.  Such a pseudo-key-sequence is insufficient for
+ @code{command-execute}, but it is sufficient for looking up or rebinding
+ a key.
+ 
+   When the key sequence consists of multiple events, key lookup
+ processes the events sequentially: the binding of the first event is
+ found, and must be a keymap; then the second event's binding is found in
+ that keymap, and so on until all the events in the key sequence are used
+ up.  (The binding thus found for the last event may or may not be a
+ keymap.)  Thus, the process of key lookup is defined in terms of a
+ simpler process for looking up a single event in a keymap.  How that is
+ done depends on the type of object associated with the event in that
+ keymap.
+ 
+   Let's use the term @dfn{keymap entry} to describe the value found by
+ looking up an event type in a keymap.  (This doesn't include the item
+ string and other extra elements in menu key bindings because
+ @code{lookup-key} and other key lookup functions don't include them in
+ the returned value.)  While any Lisp object may be stored in a keymap as
+ a keymap entry, not all make sense for key lookup.  Here is a list of
+ the meaningful kinds of keymap entries:
+ 
+ @table @asis
+ @item @code{nil}
+ @cindex @code{nil} in keymap
+ @code{nil} means that the events used so far in the lookup form an
+ undefined key.  When a keymap fails to mention an event type at all, and
+ has no default binding, that is equivalent to a binding of @code{nil}
+ for that event type.
+ 
+ @item @var{keymap}
+ @cindex keymap in keymap
+ The events used so far in the lookup form a prefix key.  The next
+ event of the key sequence is looked up in @var{keymap}.
+ 
+ @item @var{command}
+ @cindex command in keymap
+ The events used so far in the lookup form a complete key,
+ and @var{command} is its binding.  @xref{What Is a Function}.
+ 
+ @item @var{array}
+ @cindex string in keymap
+ The array (either a string or a vector) is a keyboard macro.  The events
+ used so far in the lookup form a complete key, and the array is its
+ binding.  See @ref{Keyboard Macros}, for more information.
+ 
+ @item @var{list}
+ @cindex list in keymap
+ The meaning of a list depends on the types of the elements of the list.
+ 
+ @itemize @bullet
+ @item
+ If the @sc{car} of @var{list} is the symbol @code{keymap}, then the list
+ is a keymap, and is treated as a keymap (see above).
+ 
+ @item
+ @cindex @code{lambda} in keymap
+ If the @sc{car} of @var{list} is @code{lambda}, then the list is a
+ lambda expression.  This is presumed to be a command, and is treated as
+ such (see above).
+ 
+ @item
+ If the @sc{car} of @var{list} is a keymap and the @sc{cdr} is an event
+ type, then this is an @dfn{indirect entry}:
+ 
+ @example
+ (@var{othermap} . @var{othertype})
+ @end example
+ 
+ When key lookup encounters an indirect entry, it looks up instead the
+ binding of @var{othertype} in @var{othermap} and uses that.
+ 
+ This feature permits you to define one key as an alias for another key.
+ For example, an entry whose @sc{car} is the keymap called @code{esc-map}
+ and whose @sc{cdr} is 32 (the code for @key{SPC}) means, ``Use the global
+ binding of @kbd{Meta-@key{SPC}}, whatever that may be.''
+ @end itemize
+ 
+ @item @var{symbol}
+ @cindex symbol in keymap
+ The function definition of @var{symbol} is used in place of
+ @var{symbol}.  If that too is a symbol, then this process is repeated,
+ any number of times.  Ultimately this should lead to an object that is
+ a keymap, a command or a keyboard macro.  A list is allowed if it is a
+ keymap or a command, but indirect entries are not understood when found
+ via symbols.
+ 
+ Note that keymaps and keyboard macros (strings and vectors) are not
+ valid functions, so a symbol with a keymap, string, or vector as its
+ function definition is invalid as a function.  It is, however, valid as
+ a key binding.  If the definition is a keyboard macro, then the symbol
+ is also valid as an argument to @code{command-execute}
+ (@pxref{Interactive Call}).
+ 
+ @cindex @code{undefined} in keymap
+ The symbol @code{undefined} is worth special mention: it means to treat
+ the key as undefined.  Strictly speaking, the key is defined, and its
+ binding is the command @code{undefined}; but that command does the same
+ thing that is done automatically for an undefined key: it rings the bell
+ (by calling @code{ding}) but does not signal an error.
+ 
+ @cindex preventing prefix key
+ @code{undefined} is used in local keymaps to override a global key
+ binding and make the key ``undefined'' locally.  A local binding of
+ @code{nil} would fail to do this because it would not override the
+ global binding.
+ 
+ @item @var{anything else}
+ If any other type of object is found, the events used so far in the
+ lookup form a complete key, and the object is its binding, but the
+ binding is not executable as a command.
+ @end table
+ 
+   In short, a keymap entry may be a keymap, a command, a keyboard macro,
+ a symbol that leads to one of them, or an indirection or @code{nil}.
+ Here is an example of a sparse keymap with two characters bound to
+ commands and one bound to another keymap.  This map is the normal value
+ of @code{emacs-lisp-mode-map}.  Note that 9 is the code for @key{TAB},
+ 127 for @key{DEL}, 27 for @key{ESC}, 17 for @kbd{C-q} and 24 for
+ @kbd{C-x}.
+ 
+ @example
+ @group
+ (keymap (9 . lisp-indent-line)
+         (127 . backward-delete-char-untabify)
+         (27 keymap (17 . indent-sexp) (24 . eval-defun)))
+ @end group
+ @end example
+ 
+ @node Functions for Key Lookup
+ @section Functions for Key Lookup
+ 
+   Here are the functions and variables pertaining to key lookup.
+ 
+ @defun lookup-key keymap key &optional accept-defaults
+ This function returns the definition of @var{key} in @var{keymap}.  If
+ the string or vector @var{key} is not a valid key sequence according to
+ the prefix keys specified in @var{keymap} (which means it is ``too
+ long'' and has extra events at the end), then the value is a number, the
+ number of events at the front of @var{key} that compose a complete key.
+ 
+ @c Emacs 19 feature
+ If @var{accept-defaults} is non-@code{nil}, then @code{lookup-key}
+ considers default bindings as well as bindings for the specific events
+ in @var{key}.  Otherwise, @code{lookup-key} reports only bindings for
+ the specific sequence @var{key}, ignoring default bindings except when
+ you explicitly ask about them.  (To do this, supply @code{t} as an
+ element of @var{key}; see @ref{Format of Keymaps}.)
+ 
+ All the other functions described in this chapter that look up keys use
+ @code{lookup-key}.
+ 
+ @example
+ @group
+ (lookup-key (current-global-map) "\C-x\C-f")
+     @result{} find-file
+ @end group
+ @group
+ (lookup-key (current-global-map) "\C-x\C-f12345")
+     @result{} 2
+ @end group
+ @end example
+ 
+   If @var{key} contains a meta character, that character is implicitly
+ replaced by a two-character sequence: the value of
+ @code{meta-prefix-char}, followed by the corresponding non-meta
+ character.  Thus, the first example below is handled by conversion into
+ the second example.
+ 
+ @example
+ @group
+ (lookup-key (current-global-map) "\M-f")
+     @result{} forward-word
+ @end group
+ @group
+ (lookup-key (current-global-map) "\ef")
+     @result{} forward-word
+ @end group
+ @end example
+ 
+ Unlike @code{read-key-sequence}, this function does not modify the
+ specified events in ways that discard information (@pxref{Key Sequence
+ Input}).  In particular, it does not convert letters to lower case and
+ it does not change drag events to clicks.
+ @end defun
+ 
+ @deffn Command undefined
+ Used in keymaps to undefine keys.  It calls @code{ding}, but does
+ not cause an error.
+ @end deffn
+ 
+ @defun key-binding key &optional accept-defaults
+ This function returns the binding for @var{key} in the current
+ keymaps, trying all the active keymaps.  The result is @code{nil} if
+ @var{key} is undefined in the keymaps.
+ 
+ @c Emacs 19 feature
+ The argument @var{accept-defaults} controls checking for default
+ bindings, as in @code{lookup-key} (above).
+ 
+ An error is signaled if @var{key} is not a string or a vector.
+ 
+ @example
+ @group
+ (key-binding "\C-x\C-f")
+     @result{} find-file
+ @end group
+ @end example
+ @end defun
+ 
+ @defun local-key-binding key &optional accept-defaults
+ This function returns the binding for @var{key} in the current
+ local keymap, or @code{nil} if it is undefined there.
+ 
+ @c Emacs 19 feature
+ The argument @var{accept-defaults} controls checking for default bindings,
+ as in @code{lookup-key} (above).
+ @end defun
+ 
+ @defun global-key-binding key &optional accept-defaults
+ This function returns the binding for command @var{key} in the
+ current global keymap, or @code{nil} if it is undefined there.
+ 
+ @c Emacs 19 feature
+ The argument @var{accept-defaults} controls checking for default bindings,
+ as in @code{lookup-key} (above).
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun minor-mode-key-binding key &optional accept-defaults
+ This function returns a list of all the active minor mode bindings of
+ @var{key}.  More precisely, it returns an alist of pairs
+ @code{(@var{modename} . @var{binding})}, where @var{modename} is the
+ variable that enables the minor mode, and @var{binding} is @var{key}'s
+ binding in that mode.  If @var{key} has no minor-mode bindings, the
+ value is @code{nil}.
+ 
+ If the first binding is not a prefix command, all subsequent bindings
+ from other minor modes are omitted, since they would be completely
+ shadowed.  Similarly, the list omits non-prefix bindings that follow
+ prefix bindings.
+ 
+ The argument @var{accept-defaults} controls checking for default
+ bindings, as in @code{lookup-key} (above).
+ @end defun
+ 
+ @defvar meta-prefix-char
+ @cindex @key{ESC}
+ This variable is the meta-prefix character code.  It is used when
+ translating a meta character to a two-character sequence so it can be
+ looked up in a keymap.  For useful results, the value should be a prefix
+ event (@pxref{Prefix Keys}).  The default value is 27, which is the
+ @sc{ASCII} code for @key{ESC}.
+ 
+ As long as the value of @code{meta-prefix-char} remains 27, key
+ lookup translates @kbd{M-b} into @kbd{@key{ESC} b}, which is normally
+ defined as the @code{backward-word} command.  However, if you set
+ @code{meta-prefix-char} to 24, the code for @kbd{C-x}, then Emacs will
+ translate @kbd{M-b} into @kbd{C-x b}, whose standard binding is the
+ @code{switch-to-buffer} command.
+ 
+ @smallexample
+ @group
+ meta-prefix-char                    ; @r{The default value.}
+      @result{} 27
+ @end group
+ @group
+ (key-binding "\M-b")
+      @result{} backward-word
+ @end group
+ @group
+ ?\C-x                               ; @r{The print representation}
+      @result{} 24                          ;   @r{of a character.}
+ @end group
+ @group
+ (setq meta-prefix-char 24)
+      @result{} 24      
+ @end group
+ @group
+ (key-binding "\M-b")
+      @result{} switch-to-buffer            ; @r{Now, typing @kbd{M-b} is}
+                                     ;   @r{like typing @kbd{C-x b}.}
+ 
+ (setq meta-prefix-char 27)          ; @r{Avoid confusion!}
+      @result{} 27                          ; @r{Restore the default value!}
+ @end group
+ @end smallexample
+ @end defvar
+ 
+ @node Changing Key Bindings
+ @section Changing Key Bindings
+ @cindex changing key bindings
+ @cindex rebinding
+ 
+   The way to rebind a key is to change its entry in a keymap.  If you
+ change a binding in the global keymap, the change is effective in all
+ buffers (though it has no direct effect in buffers that shadow the
+ global binding with a local one).  If you change the current buffer's
+ local map, that usually affects all buffers using the same major mode.
+ The @code{global-set-key} and @code{local-set-key} functions are
+ convenient interfaces for these operations (@pxref{Key Binding
+ Commands}).  You can also use @code{define-key}, a more general
+ function; then you must specify explicitly the map to change.
+ 
+ @cindex meta character key constants
+ @cindex control character key constants
+   In writing the key sequence to rebind, it is good to use the special
+ escape sequences for control and meta characters (@pxref{String Type}).
+ The syntax @samp{\C-} means that the following character is a control
+ character and @samp{\M-} means that the following character is a meta
+ character.  Thus, the string @code{"\M-x"} is read as containing a
+ single @kbd{M-x}, @code{"\C-f"} is read as containing a single
+ @kbd{C-f}, and @code{"\M-\C-x"} and @code{"\C-\M-x"} are both read as
+ containing a single @kbd{C-M-x}.  You can also use this escape syntax in
+ vectors, as well as others that aren't allowed in strings; one example
+ is @samp{[?\C-\H-x home]}.  @xref{Character Type}.
+ 
+   The key definition and lookup functions accept an alternate syntax for
+ event types in a key sequence that is a vector: you can use a list
+ containing modifier names plus one base event (a character or function
+ key name).  For example, @code{(control ?a)} is equivalent to
+ @code{?\C-a} and @code{(hyper control left)} is equivalent to
+ @code{C-H-left}.
+ 
+   One advantage of using a list to represent the event type is that the
+ precise numeric codes for the modifier bits don't appear in compiled
+ files.
+ 
+   For the functions below, an error is signaled if @var{keymap} is not a
+ keymap or if @var{key} is not a string or vector representing a key
+ sequence.  You can use event types (symbols) as shorthand for events
+ that are lists.
+ 
+ @defun define-key keymap key binding
+ This function sets the binding for @var{key} in @var{keymap}.  (If
+ @var{key} is more than one event long, the change is actually made
+ in another keymap reached from @var{keymap}.)  The argument
+ @var{binding} can be any Lisp object, but only certain types are
+ meaningful.  (For a list of meaningful types, see @ref{Key Lookup}.)
+ The value returned by @code{define-key} is @var{binding}.
+ 
+ @cindex invalid prefix key error
+ @cindex key sequence error
+ Every prefix of @var{key} must be a prefix key (i.e., bound to a
+ keymap) or undefined; otherwise an error is signaled.
+ 
+ If some prefix of @var{key} is undefined, then @code{define-key} defines
+ it as a prefix key so that the rest of @var{key} may be defined as
+ specified.
+ @end defun
+ 
+   Here is an example that creates a sparse keymap and makes a number of
+ bindings in it:
+ 
+ @smallexample
+ @group
+ (setq map (make-sparse-keymap))
+     @result{} (keymap)
+ @end group
+ @group
+ (define-key map "\C-f" 'forward-char)
+     @result{} forward-char
+ @end group
+ @group
+ map
+     @result{} (keymap (6 . forward-char))
+ @end group
+ 
+ @group
+ ;; @r{Build sparse submap for @kbd{C-x} and bind @kbd{f} in that.}
+ (define-key map "\C-xf" 'forward-word)
+     @result{} forward-word
+ @end group
+ @group
+ map
+ @result{} (keymap 
+     (24 keymap                ; @kbd{C-x}
+         (102 . forward-word)) ;      @kbd{f}
+     (6 . forward-char))       ; @kbd{C-f}
+ @end group
+ 
+ @group
+ ;; @r{Bind @kbd{C-p} to the @code{ctl-x-map}.}
+ (define-key map "\C-p" ctl-x-map)
+ ;; @code{ctl-x-map}
+ @result{} [nil @dots{} find-file @dots{} backward-kill-sentence] 
+ @end group
+ 
+ @group
+ ;; @r{Bind @kbd{C-f} to @code{foo} in the @code{ctl-x-map}.}
+ (define-key map "\C-p\C-f" 'foo)
+ @result{} 'foo
+ @end group
+ @group
+ map
+ @result{} (keymap     ; @r{Note @code{foo} in @code{ctl-x-map}.}
+     (16 keymap [nil @dots{} foo @dots{} backward-kill-sentence])
+     (24 keymap 
+         (102 . forward-word))
+     (6 . forward-char))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ Note that storing a new binding for @kbd{C-p C-f} actually works by
+ changing an entry in @code{ctl-x-map}, and this has the effect of
+ changing the bindings of both @kbd{C-p C-f} and @kbd{C-x C-f} in the
+ default global map.
+ 
+ @defun substitute-key-definition olddef newdef keymap &optional oldmap
+ @cindex replace bindings
+ This function replaces @var{olddef} with @var{newdef} for any keys in
+ @var{keymap} that were bound to @var{olddef}.  In other words,
+ @var{olddef} is replaced with @var{newdef} wherever it appears.  The
+ function returns @code{nil}.
+ 
+ For example, this redefines @kbd{C-x C-f}, if you do it in an Emacs with
+ standard bindings:
+ 
+ @smallexample
+ @group
+ (substitute-key-definition 
+  'find-file 'find-file-read-only (current-global-map))
+ @end group
+ @end smallexample
+ 
+ @c Emacs 19 feature
+ If @var{oldmap} is non-@code{nil}, then its bindings determine which
+ keys to rebind.  The rebindings still happen in @var{newmap}, not in
+ @var{oldmap}.  Thus, you can change one map under the control of the
+ bindings in another.  For example,
+ 
+ @smallexample
+ (substitute-key-definition
+   'delete-backward-char 'my-funny-delete
+   my-map global-map)
+ @end smallexample
+ 
+ @noindent
+ puts the special deletion command in @code{my-map} for whichever keys
+ are globally bound to the standard deletion command.
+ 
+ @ignore
+ @c Emacs 18 only
+ Prefix keymaps that appear within @var{keymap} are not checked
+ recursively for keys bound to @var{olddef}; they are not changed at all.
+ Perhaps it would be better to check nested keymaps recursively.
+ @end ignore
+ 
+ Here is an example showing a keymap before and after substitution:
+ 
+ @smallexample
+ @group
+ (setq map '(keymap 
+             (?1 . olddef-1) 
+             (?2 . olddef-2) 
+             (?3 . olddef-1)))
+ @result{} (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))
+ @end group
+ 
+ @group
+ (substitute-key-definition 'olddef-1 'newdef map)
+ @result{} nil
+ @end group
+ @group
+ map
+ @result{} (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun suppress-keymap keymap &optional nodigits
+ @cindex @code{self-insert-command} override
+ This function changes the contents of the full keymap @var{keymap} by
+ making all the printing characters undefined.  More precisely, it binds
+ them to the command @code{undefined}.  This makes ordinary insertion of
+ text impossible.  @code{suppress-keymap} returns @code{nil}.
+ 
+ If @var{nodigits} is @code{nil}, then @code{suppress-keymap} defines
+ digits to run @code{digit-argument}, and @kbd{-} to run
+ @code{negative-argument}.  Otherwise it makes them undefined like the
+ rest of the printing characters.
+ 
+ @cindex yank suppression 
+ @cindex @code{quoted-insert} suppression 
+ The @code{suppress-keymap} function does not make it impossible to
+ modify a buffer, as it does not suppress commands such as @code{yank}
+ and @code{quoted-insert}.  To prevent any modification of a buffer, make
+ it read-only (@pxref{Read Only Buffers}).
+ 
+ Since this function modifies @var{keymap}, you would normally use it
+ on a newly created keymap.  Operating on an existing keymap
+ that is used for some other purpose is likely to cause trouble; for
+ example, suppressing @code{global-map} would make it impossible to use
+ most of Emacs.
+ 
+ Most often, @code{suppress-keymap} is used to initialize local
+ keymaps of modes such as Rmail and Dired where insertion of text is not
+ desirable and the buffer is read-only.  Here is an example taken from
+ the file @file{emacs/lisp/dired.el}, showing how the local keymap for
+ Dired mode is set up:
+ 
+ @smallexample
+ @group
+   @dots{}
+   (setq dired-mode-map (make-keymap))
+   (suppress-keymap dired-mode-map)
+   (define-key dired-mode-map "r" 'dired-rename-file)
+   (define-key dired-mode-map "\C-d" 'dired-flag-file-deleted)
+   (define-key dired-mode-map "d" 'dired-flag-file-deleted)
+   (define-key dired-mode-map "v" 'dired-view-file)
+   (define-key dired-mode-map "e" 'dired-find-file)
+   (define-key dired-mode-map "f" 'dired-find-file)
+   @dots{}
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Key Binding Commands
+ @section Commands for Binding Keys
+ 
+   This section describes some convenient interactive interfaces for
+ changing key bindings.  They work by calling @code{define-key}.
+ 
+   People often use @code{global-set-key} in their @file{.emacs} file for
+ simple customization.  For example,
+ 
+ @smallexample
+ (global-set-key "\C-x\C-\\" 'next-line)
+ @end smallexample
+ 
+ @noindent
+ or
+ 
+ @smallexample
+ (global-set-key [?\C-x ?\C-\\] 'next-line)
+ @end smallexample
+ 
+ @noindent
+ or
+ 
+ @smallexample
+ (global-set-key [(control ?x) (control ?\\)] 'next-line)
+ @end smallexample
+ 
+ @noindent
+ redefines @kbd{C-x C-\} to move down a line.
+ 
+ @smallexample
+ (global-set-key [M-mouse-1] 'mouse-set-point)
+ @end smallexample
+ 
+ @noindent
+ redefines the first (leftmost) mouse button, typed with the Meta key, to
+ set point where you click.
+ 
+ @deffn Command global-set-key key definition
+ This function sets the binding of @var{key} in the current global map
+ to @var{definition}.
+ 
+ @smallexample
+ @group
+ (global-set-key @var{key} @var{definition})
+ @equiv{}
+ (define-key (current-global-map) @var{key} @var{definition})
+ @end group
+ @end smallexample
+ @end deffn
+ 
+ @deffn Command global-unset-key key
+ @cindex unbinding keys
+ This function removes the binding of @var{key} from the current
+ global map.
+ 
+ One use of this function is in preparation for defining a longer key
+ that uses @var{key} as a prefix---which would not be allowed if
+ @var{key} has a non-prefix binding.  For example:
+ 
+ @smallexample
+ @group
+ (global-unset-key "\C-l")
+     @result{} nil
+ @end group
+ @group
+ (global-set-key "\C-l\C-l" 'redraw-display)
+     @result{} nil
+ @end group
+ @end smallexample
+ 
+ This function is implemented simply using @code{define-key}:
+ 
+ @smallexample
+ @group
+ (global-unset-key @var{key})
+ @equiv{}
+ (define-key (current-global-map) @var{key} nil)
+ @end group
+ @end smallexample
+ @end deffn
+ 
+ @deffn Command local-set-key key definition
+ This function sets the binding of @var{key} in the current local
+ keymap to @var{definition}.
+ 
+ @smallexample
+ @group
+ (local-set-key @var{key} @var{definition})
+ @equiv{}
+ (define-key (current-local-map) @var{key} @var{definition})
+ @end group
+ @end smallexample
+ @end deffn
+ 
+ @deffn Command local-unset-key key
+ This function removes the binding of @var{key} from the current
+ local map.
+ 
+ @smallexample
+ @group
+ (local-unset-key @var{key})
+ @equiv{}
+ (define-key (current-local-map) @var{key} nil)
+ @end group
+ @end smallexample
+ @end deffn
+ 
+ @node Scanning Keymaps
+ @section Scanning Keymaps
+ 
+   This section describes functions used to scan all the current keymaps
+ for the sake of printing help information.
+ 
+ @defun accessible-keymaps keymap &optional prefix
+ This function returns a list of all the keymaps that can be accessed
+ (via prefix keys) from @var{keymap}.  The value is an association list
+ with elements of the form @code{(@var{key} .@: @var{map})}, where
+ @var{key} is a prefix key whose definition in @var{keymap} is
+ @var{map}.
+ 
+ The elements of the alist are ordered so that the @var{key} increases
+ in length.  The first element is always @code{("" .@: @var{keymap})},
+ because the specified keymap is accessible from itself with a prefix of
+ no events.
+ 
+ If @var{prefix} is given, it should be a prefix key sequence; then
+ @code{accessible-keymaps} includes only the submaps whose prefixes start
+ with @var{prefix}.  These elements look just as they do in the value of
+ @code{(accessible-keymaps)}; the only difference is that some elements
+ are omitted.
+ 
+ In the example below, the returned alist indicates that the key
+ @key{ESC}, which is displayed as @samp{^[}, is a prefix key whose
+ definition is the sparse keymap @code{(keymap (83 .@: center-paragraph)
+ (115 .@: foo))}.
+ 
+ @smallexample
+ @group
+ (accessible-keymaps (current-local-map))
+ @result{}(("" keymap 
+       (27 keymap   ; @r{Note this keymap for @key{ESC} is repeated below.}
+           (83 . center-paragraph)
+           (115 . center-line))
+       (9 . tab-to-tab-stop))
+ @end group
+ 
+ @group
+    ("^[" keymap 
+     (83 . center-paragraph) 
+     (115 . foo)))
+ @end group
+ @end smallexample
+ 
+ In the following example, @kbd{C-h} is a prefix key that uses a sparse
+ keymap starting with @code{(keymap (118 . describe-variable)@dots{})}.
+ Another prefix, @kbd{C-x 4}, uses a keymap which is also the value of
+ the variable @code{ctl-x-4-map}.  The event @code{mode-line} is one of
+ several dummy events used as prefixes for mouse actions in special parts
+ of a window.
+ 
+ @smallexample
+ @group
+ (accessible-keymaps (current-global-map))
+ @result{} (("" keymap [set-mark-command beginning-of-line @dots{} 
+                    delete-backward-char])
+ @end group
+ @group
+     ("^H" keymap (118 . describe-variable) @dots{}
+      (8 . help-for-help))
+ @end group
+ @group
+     ("^X" keymap [x-flush-mouse-queue @dots{}
+      backward-kill-sentence])
+ @end group
+ @group
+     ("^[" keymap [mark-sexp backward-sexp @dots{}
+      backward-kill-word])
+ @end group
+     ("^X4" keymap (15 . display-buffer) @dots{})
+ @group
+     ([mode-line] keymap
+      (S-mouse-2 . mouse-split-window-horizontally) @dots{}))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ These are not all the keymaps you would see in an actual case.
+ @end defun
+ 
+ @defun where-is-internal command &optional keymap firstonly noindirect
+ This function returns a list of key sequences (of any length) that are
+ bound to @var{command} in a set of keymaps.
+ 
+ The argument @var{command} can be any object; it is compared with all
+ keymap entries using @code{eq}.
+ 
+ If @var{keymap} is @code{nil}, then the maps used are the current active
+ keymaps, disregarding @code{overriding-local-map} (that is, pretending
+ its value is @code{nil}).  If @var{keymap} is non-@code{nil}, then the
+ maps searched are @var{keymap} and the global keymap.
+ 
+ Usually it's best to use @code{overriding-local-map} as the expression
+ for @var{keymap}.  Then @code{where-is-internal} searches precisely the
+ keymaps that are active.  To search only the global map, pass
+ @code{(keymap)} (an empty keymap) as @var{keymap}.
+ 
+ If @var{firstonly} is @code{non-ascii}, then the value is a single
+ string representing the first key sequence found, rather than a list of
+ all possible key sequences.  If @var{firstonly} is @code{t}, then the
+ value is the first key sequence, except that key sequences consisting
+ entirely of @sc{ASCII} characters (or meta variants of @sc{ASCII}
+ characters) are preferred to all other key sequences.
+ 
+ If @var{noindirect} is non-@code{nil}, @code{where-is-internal} doesn't
+ follow indirect keymap bindings.  This makes it possible to search for
+ an indirect definition itself.
+ 
+ This function is used by @code{where-is} (@pxref{Help, , Help, emacs,
+ The GNU Emacs Manual}).
+ 
+ @smallexample
+ @group
+ (where-is-internal 'describe-function)
+     @result{} ("\^hf" "\^hd")
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @deffn Command describe-bindings prefix
+ This function creates a listing of all defined keys and their
+ definitions.  It writes the listing in a buffer named @samp{*Help*} and
+ displays it in a window.
+ 
+ If @var{prefix} is non-@code{nil}, it should be a prefix key; then the
+ listing includes only keys that start with @var{prefix}.
+ 
+ The listing describes meta characters as @key{ESC} followed by the
+ corresponding non-meta character.
+ 
+ When several characters with consecutive @sc{ASCII} codes have the
+ same definition, they are shown together, as
+ @samp{@var{firstchar}..@var{lastchar}}.  In this instance, you need to
+ know the @sc{ASCII} codes to understand which characters this means.
+ For example, in the default global map, the characters @samp{@key{SPC}
+ ..@: ~} are described by a single line.  @key{SPC} is @sc{ASCII} 32,
+ @kbd{~} is @sc{ASCII} 126, and the characters between them include all
+ the normal printing characters, (e.g., letters, digits, punctuation,
+ etc.@:); all these characters are bound to @code{self-insert-command}.
+ @end deffn
+ 
+ @node Menu Keymaps
+ @section Menu Keymaps
+ @cindex menu keymaps
+ 
+ @c Emacs 19 feature
+ A keymap can define a menu as well as bindings for keyboard keys and
+ mouse button.  Menus are usually actuated with the mouse, but they can
+ work with the keyboard also.
+ 
+ @menu
+ * Defining Menus::		How to make a keymap that defines a menu.
+ * Mouse Menus::			How users actuate the menu with the mouse.
+ * Keyboard Menus::		How they actuate it with the keyboard.
+ * Menu Example::		Making a simple menu.
+ * Menu Bar::			How to customize the menu bar.
+ * Modifying Menus::             How to add new items to a menu.
+ @end menu
+ 
+ @node Defining Menus
+ @subsection Defining Menus
+ @cindex defining menus
+ @cindex menu prompt string
+ @cindex prompt string (of menu)
+ 
+ A keymap is suitable for menu use if it has an @dfn{overall prompt
+ string}, which is a string that appears as an element of the keymap.
+ (@xref{Format of Keymaps}.)  The string should describe the purpose of
+ the menu.  The easiest way to construct a keymap with a prompt string is
+ to specify the string as an argument when you call @code{make-keymap} or
+ @code{make-sparse-keymap} (@pxref{Creating Keymaps}).
+ 
+ The order of items in the menu is the same as the order of bindings in
+ the keymap.  Since @code{define-key} puts new bindings at the front, you
+ should define the menu items starting at the bottom of the menu and
+ moving to the top, if you care about the order.  When you add an item to
+ an existing menu, you can specify its position in the menu using
+ @code{define-key-after} (@pxref{Modifying Menus}).
+ 
+ The individual bindings in the menu keymap should have item
+ strings; these strings become the items displayed in the menu.  A
+ binding with an item string looks like this:
+ 
+ @example
+ (@var{string} . @var{real-binding})
+ @end example
+ 
+ The item string for a binding should be short---one or two words.  It
+ should describe the action of the command it corresponds to.
+ 
+ As far as @code{define-key} is concerned, @var{string} is part of the
+ event's binding.  However, @code{lookup-key} returns just
+ @var{real-binding}, and only @var{real-binding} is used for executing
+ the key.
+ 
+ You can also supply a second string, called the help string, as follows:
+ 
+ @example
+ (@var{string} @var{help-string} . @var{real-binding})
+ @end example
+ 
+ Currently Emacs does not actually use @var{help-string}; it knows only
+ how to ignore @var{help-string} in order to extract @var{real-binding}.
+ In the future we may use @var{help-string} as extended documentation for
+ the menu item, available on request.
+ 
+ If @var{real-binding} is @code{nil}, then @var{string} appears in the
+ menu but cannot be selected.
+ 
+ If @var{real-binding} is a symbol and has a non-@code{nil}
+ @code{menu-enable} property, that property is an expression that
+ controls whether the menu item is enabled.  Every time the keymap is
+ used to display a menu, Emacs evaluates the expression, and it enables
+ the menu item only if the expression's value is non-@code{nil}.  When a
+ menu item is disabled, it is displayed in a ``fuzzy'' fashion, and
+ cannot be selected with the mouse.
+ 
+ The menu bar does not recalculate which items are enabled every time you
+ look at a menu.  This is because the X toolkit requires the whole tree
+ of menus in advance.  To force recalculation of the menu bar, call
+ @code{force-mode-line-update} (@pxref{Mode Line Format}).
+ 
+ Sometimes it is useful to make menu items that use the ``same'' command
+ but with different enable conditions.  You can do this by defining alias
+ commands.  Here's an example that makes two aliases for
+ @code{toggle-read-only} and gives them different enable conditions:
+ 
+ @example
+ (defalias 'make-read-only 'toggle-read-only)
+ (put 'make-read-only 'menu-enable '(not buffer-read-only))
+ (defalias 'make-writable 'toggle-read-only)
+ (put 'make-writable 'menu-enable 'buffer-read-only)
+ @end example
+ 
+ You've probably noticed that menu items show the equivalent keyboard key
+ sequence (if any) to invoke the same command.  To save time on
+ recalculation, menu display caches this information in a sublist in the
+ binding, like this:
+ 
+ @c This line is not too long--rms.
+ @example
+ (@var{string} @r{[}@var{help-string}@r{]} (@var{key-binding-data}) . @var{real-binding})
+ @end example
+ 
+ Don't put these sublists in the menu item yourself; menu display
+ calculates them automatically.  Don't add keyboard equivalents to the
+ item strings in a mouse menu, since that is redundant.
+ 
+ If an alias command has no keyboard equivalent itself, menus show the
+ keyboard equivalent of its underlying command.  In the example above,
+ menu items defined to run @code{make-read-only} or @code{make-writable}
+ would show the keyboard equivalents of @code{toggle-read-only}.
+ 
+ @node Mouse Menus
+ @subsection Menus and the Mouse
+ 
+ The way to make a menu keymap produce a menu is to make it the
+ definition of a prefix key.
+ 
+ If the prefix key ends with a mouse event, Emacs handles the menu keymap
+ by popping up a visible menu, so that the user can select a choice with
+ the mouse.  When the user clicks on a menu item, the event generated is
+ whatever character or symbol has the binding that brought about that
+ menu item.  (A menu item may generate a series of events if the menu has
+ multiple levels or comes from the menu bar.)
+ 
+ It's often best to use a button-down event to trigger the menu.  Then
+ the user can select a menu item by releasing the button.
+ 
+ A single keymap can appear as multiple menu panes, if you explicitly
+ arrange for this.  The way to do this is to make a keymap for each pane,
+ then create a binding for each of those maps in the main keymap of the
+ menu.  Give each of these bindings an item string that starts with
+ @samp{@@}.  The rest of the item string becomes the name of the pane.
+ See the file @file{lisp/mouse.el} for an example of this.  Any ordinary
+ bindings with @samp{@@}-less item strings are grouped into one pane,
+ which appears along with the other panes explicitly created for the
+ submaps.
+ 
+ X toolkit menus don't have panes; instead, they can have submenus.
+ Every nested keymap becomes a submenu, whether the item string starts
+ with @samp{@@} or not.  In a toolkit version of Emacs, the only thing
+ special about @samp{@@} at the beginning of an item string is that the
+ @samp{@@} doesn't appear in the menu item.
+ 
+ You can also get multiple panes from separate keymaps.  The full
+ definition of a prefix key always comes from merging the definitions
+ supplied by the various active keymaps (minor mode, local, and
+ global).  When more than one of these keymaps is a menu, each of them
+ makes a separate pane or panes.  @xref{Active Keymaps}.
+ 
+ In toolkit versions of Emacs, menus don't have panes, so submenus are
+ used to represent the separate keymaps.  Each keymap's contribution
+ becomes one submenu.
+ 
+ A Lisp program can explicitly pop up a menu and receive the user's
+ choice.  You can use keymaps for this also.  @xref{Pop-Up Menus}.
+ 
+ @node Keyboard Menus
+ @subsection Menus and the Keyboard
+ 
+ When a prefix key ending with a keyboard event (a character or function
+ key) has a definition that is a menu keymap, the user can use the
+ keyboard to choose a menu item.
+ 
+ Emacs displays the menu alternatives (the item strings of the bindings)
+ in the echo area.  If they don't all fit at once, the user can type
+ @key{SPC} to see the next line of alternatives.  Successive uses of
+ @key{SPC} eventually get to the end of the menu and then cycle around to
+ the beginning.  (The variable @code{menu-prompt-more-char} specifies
+ which character is used for this; @key{SPC} is the default.)
+ 
+ When the user has found the desired alternative from the menu, he or she
+ should type the corresponding character---the one whose binding is that
+ alternative.
+ 
+ @ignore
+ In a menu intended for keyboard use, each menu item must clearly
+ indicate what character to type.  The best convention to use is to make
+ the character the first letter of the item string---that is something
+ users will understand without being told.  We plan to change this; by
+ the time you read this manual, keyboard menus may explicitly name the
+ key for each alternative.
+ @end ignore
+ 
+ This way of using menus in an Emacs-like editor was inspired by the
+ Hierarkey system.
+ 
+ @defvar menu-prompt-more-char
+ This variable specifies the character to use to ask to see
+ the next line of a menu.  Its initial value is 32, the code
+ for @key{SPC}.
+ @end defvar
+ 
+ @node Menu Example
+ @subsection Menu Example
+ 
+   Here is a simple example of how to set up a menu for mouse use.
+ 
+ @example
+ (defvar my-menu-map
+   (make-sparse-keymap "Key Commands <==> Functions"))
+ (fset 'help-for-keys my-menu-map)
+ 
+ (define-key my-menu-map [bindings]
+   '("List all keystroke commands" . describe-bindings))
+ (define-key my-menu-map [key]
+   '("Describe key briefly" . describe-key-briefly))
+ (define-key my-menu-map [key-verbose]
+   '("Describe key verbose" . describe-key))
+ (define-key my-menu-map [function]
+   '("Describe Lisp function" . describe-function))
+ (define-key my-menu-map [where-is]
+   '("Where is this command" . where-is))
+ 
+ (define-key global-map [C-S-down-mouse-1] 'help-for-keys)
+ @end example
+ 
+   The symbols used in the key sequences bound in the menu are fictitious
+ ``function keys''; they don't appear on the keyboard, but that doesn't
+ stop you from using them in the menu.  Their names were chosen to be
+ mnemonic, because they show up in the output of @code{where-is} and
+ @code{apropos} to identify the corresponding menu items.
+ 
+   However, if you want the menu to be usable from the keyboard as well,
+ you must bind real @sc{ASCII} characters as well as fictitious function
+ keys.
+ 
+ @node Menu Bar
+ @subsection The Menu Bar
+ @cindex menu bar
+ 
+   Most window systems allow each frame to have a @dfn{menu bar}---a
+ permanently displayed menu stretching horizontally across the top of the
+ frame.  The items of the menu bar are the subcommands of the fake
+ ``function key'' @code{menu-bar}, as defined by all the active keymaps.
+ 
+   To add an item to the menu bar, invent a fake ``function key'' of your
+ own (let's call it @var{key}), and make a binding for the key sequence
+ @code{[menu-bar @var{key}]}.  Most often, the binding is a menu keymap,
+ so that pressing a button on the menu bar item leads to another menu.
+ 
+   When more than one active keymap defines the same fake function key
+ for the menu bar, the item appears just once.  If the user clicks on
+ that menu bar item, it brings up a single, combined submenu containing
+ all the subcommands of that item---the global subcommands, the local
+ subcommands, and the minor mode subcommands, all together.
+ 
+   The variable @code{overriding-local-map} is normally ignored when
+ determining the menu bar contents.  That is, the menu bar is computed
+ from the keymaps that would be active if @code{overriding-local-map}
+ were @code{nil}.  @xref{Active Keymaps}.
+ 
+   In order for a frame to display a menu bar, its @code{menu-bar-lines}
+ parameter must be greater than zero.  Emacs uses just one line for the
+ menu bar itself; if you specify more than one line, the other lines
+ serve to separate the menu bar from the windows in the frame.  We
+ recommend 1 or 2 as the value of @code{menu-bar-lines}.  @xref{X Frame
+ Parameters}.
+ 
+   Here's an example of setting up a menu bar item:
+ 
+ @example
+ @group
+ (modify-frame-parameters (selected-frame)
+                          '((menu-bar-lines . 2)))
+ @end group
+ 
+ @group
+ ;; @r{Make a menu keymap (with a prompt string)}
+ ;; @r{and make it the menu bar item's definition.}
+ (define-key global-map [menu-bar words]
+   (cons "Words" (make-sparse-keymap "Words")))
+ @end group
+ 
+ @group
+ ;; @r{Define specific subcommands in the item's menu.}
+ (define-key global-map
+   [menu-bar words forward]
+   '("Forward word" . forward-word))
+ @end group
+ @group
+ (define-key global-map
+   [menu-bar words backward]
+   '("Backward word" . backward-word))
+ @end group
+ @end example
+ 
+   A local keymap can cancel a menu bar item made by the global keymap by
+ rebinding the same fake function key with @code{undefined} as the
+ binding.  For example, this is how Dired suppresses the @samp{Edit} menu
+ bar item:
+ 
+ @example
+ (define-key dired-mode-map [menu-bar edit] 'undefined)
+ @end example
+ 
+ @noindent
+ @code{edit} is the fake function key used by the global map for the
+ @samp{Edit} menu bar item.  The main reason to suppress a global
+ menu bar item is to regain space for mode-specific items.
+ 
+ @defvar menu-bar-final-items
+ Normally the menu bar shows global items followed by items defined by the
+ local maps.
+ 
+ This variable holds a list of fake function keys for items to display at
+ the end of the menu bar rather than in normal sequence.  The default
+ value is @code{(help)}; thus, the @samp{Help} menu item normally appears
+ at the end of the menu bar, following local menu items.
+ @end defvar
+ 
+ @node Modifying Menus
+ @subsection Modifying Menus
+ 
+   When you insert a new item in an existing menu, you probably want to
+ put it in a particular place among the menu's existing items.  If you
+ use @code{define-key} to add the item, it normally goes at the front of
+ the menu.  To put it elsewhere, use @code{define-key-after}:
+ 
+ @defun define-key-after map key binding after
+ Define a binding in @var{map} for @var{key}, with value @var{binding},
+ just like @code{define-key}, but position the binding in @var{map} after
+ the binding for the event @var{after}.  The argument @var{key} should
+ be of length one---a vector or string with just one element.
+ 
+ For example,
+ 
+ @example
+ (define-key-after my-menu [drink]
+                   '("Drink" . drink-command) 'eat)
+ @end example
+ 
+ @noindent
+ makes a binding for the fake function key @key{drink} and puts it
+ right after the binding for @key{eat}.
+ 
+ Here is how to insert an item called @samp{Work} in the @samp{Signals}
+ menu of Shell mode, after the item @code{break}:
+ 
+ @example
+ (define-key-after
+   (lookup-key shell-mode-map [menu-bar signals])
+   [work] '("Work" . work-command) 'break)
+ @end example
+ 
+ Note that @var{key} is a sequence containing just one event type, but
+ @var{after} is just an event type (not a sequence).
+ @end defun
Index: emacs/man/elisp-lists.texi
diff -c /dev/null emacs/man/elisp-lists.texi:1.2
*** /dev/null	Fri Aug  2 20:54:37 1996
--- emacs/man/elisp-lists.texi	Thu Aug  1 00:22:59 1996
***************
*** 0 ****
--- 1,1416 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/lists
+ @node Lists, Sequences Arrays Vectors, Strings and Characters, Top
+ @chapter Lists
+ @cindex list
+ @cindex element (of list)
+ 
+   A @dfn{list} represents a sequence of zero or more elements (which may
+ be any Lisp objects).  The important difference between lists and
+ vectors is that two or more lists can share part of their structure; in
+ addition, you can insert or delete elements in a list without copying
+ the whole list.
+ 
+ @menu
+ * Cons Cells::          How lists are made out of cons cells.
+ * Lists as Boxes::                 Graphical notation to explain lists.
+ * List-related Predicates::        Is this object a list?  Comparing two lists.
+ * List Elements::       Extracting the pieces of a list.
+ * Building Lists::      Creating list structure.
+ * Modifying Lists::     Storing new pieces into an existing list.
+ * Sets And Lists::      A list can represent a finite mathematical set.
+ * Association Lists::   A list can represent a finite relation or mapping.
+ @end menu
+ 
+ @node Cons Cells
+ @section Lists and Cons Cells
+ @cindex lists and cons cells
+ @cindex @code{nil} and lists
+ 
+   Lists in Lisp are not a primitive data type; they are built up from
+ @dfn{cons cells}.  A cons cell is a data object that represents an
+ ordered pair.  It records two Lisp objects, one labeled as the @sc{car},
+ and the other labeled as the @sc{cdr}.  These names are traditional; see
+ @ref{Cons Cell Type}.  @sc{cdr} is pronounced ``could-er.''
+ 
+   A list is a series of cons cells chained together, one cons cell per
+ element of the list.  By convention, the @sc{car}s of the cons cells are
+ the elements of the list, and the @sc{cdr}s are used to chain the list:
+ the @sc{cdr} of each cons cell is the following cons cell.  The @sc{cdr}
+ of the last cons cell is @code{nil}.  This asymmetry between the
+ @sc{car} and the @sc{cdr} is entirely a matter of convention; at the
+ level of cons cells, the @sc{car} and @sc{cdr} slots have the same
+ characteristics.
+ 
+ @cindex list structure
+   Because most cons cells are used as part of lists, the phrase
+ @dfn{list structure} has come to mean any structure made out of cons
+ cells.
+ 
+   The symbol @code{nil} is considered a list as well as a symbol; it is
+ the list with no elements.  For convenience, the symbol @code{nil} is
+ considered to have @code{nil} as its @sc{cdr} (and also as its
+ @sc{car}).
+ 
+   The @sc{cdr} of any nonempty list @var{l} is a list containing all the
+ elements of @var{l} except the first.
+ 
+ @node Lists as Boxes
+ @comment  node-name,  next,  previous,  up
+ @section Lists as Linked Pairs of Boxes
+ @cindex box representation for lists
+ @cindex lists represented as boxes
+ @cindex cons cell as box
+ 
+   A cons cell can be illustrated as a pair of boxes.  The first box
+ represents the @sc{car} and the second box represents the @sc{cdr}.
+ Here is an illustration of the two-element list, @code{(tulip lily)},
+ made from two cons cells:
+ 
+ @example
+ @group
+  ---------------         ---------------
+ | car   | cdr   |       | car   | cdr   |
+ | tulip |   o---------->| lily  |  nil  |
+ |       |       |       |       |       |
+  ---------------         ---------------
+ @end group
+ @end example
+ 
+   Each pair of boxes represents a cons cell.  Each box ``refers to'',
+ ``points to'' or ``contains'' a Lisp object.  (These terms are
+ synonymous.)  The first box, which is the @sc{car} of the first cons
+ cell, contains the symbol @code{tulip}.  The arrow from the @sc{cdr} of
+ the first cons cell to the second cons cell indicates that the @sc{cdr}
+ of the first cons cell points to the second cons cell.
+ 
+   The same list can be illustrated in a different sort of box notation
+ like this:
+ 
+ @example
+ @group
+     ___ ___      ___ ___
+    |___|___|--> |___|___|--> nil
+      |            |
+      |            |
+       --> tulip    --> lily
+ @end group
+ @end example
+ 
+   Here is a more complex illustration, showing the three-element list,
+ @code{((pine needles) oak maple)}, the first element of which is a
+ two-element list:
+ 
+ @example
+ @group
+     ___ ___      ___ ___      ___ ___
+    |___|___|--> |___|___|--> |___|___|--> nil
+      |            |            |
+      |            |            |
+      |             --> oak      --> maple
+      |
+      |     ___ ___      ___ ___
+       --> |___|___|--> |___|___|--> nil
+             |            |
+             |            |
+              --> pine     --> needles
+ @end group
+ @end example
+ 
+   The same list represented in the first box notation looks like this:
+ 
+ @example
+ @group
+  --------------       --------------       --------------
+ | car   | cdr  |     | car   | cdr  |     | car   | cdr  |
+ |   o   |   o------->| oak   |   o------->| maple |  nil |
+ |   |   |      |     |       |      |     |       |      |
+  -- | ---------       --------------       --------------
+     |
+     |
+     |        --------------       ----------------
+     |       | car   | cdr  |     | car     | cdr  |
+      ------>| pine  |   o------->| needles |  nil |
+             |       |      |     |         |      |
+              --------------       ----------------
+ @end group
+ @end example
+ 
+   @xref{Cons Cell Type}, for the read and print syntax of cons cells and
+ lists, and for more ``box and arrow'' illustrations of lists.
+ 
+ @node List-related Predicates
+ @section Predicates on Lists
+ 
+   The following predicates test whether a Lisp object is an atom, is a
+ cons cell or is a list, or whether it is the distinguished object
+ @code{nil}.  (Many of these predicates can be defined in terms of the
+ others, but they are used so often that it is worth having all of them.)
+ 
+ @defun consp object
+ This function returns @code{t} if @var{object} is a cons cell, @code{nil}
+ otherwise.  @code{nil} is not a cons cell, although it @emph{is} a list.
+ @end defun
+ 
+ @defun atom object
+ @cindex atoms
+ This function returns @code{t} if @var{object} is an atom, @code{nil}
+ otherwise.  All objects except cons cells are atoms.  The symbol
+ @code{nil} is an atom and is also a list; it is the only Lisp object
+ that is both.
+ 
+ @example
+ (atom @var{object}) @equiv{} (not (consp @var{object}))
+ @end example
+ @end defun
+ 
+ @defun listp object
+ This function returns @code{t} if @var{object} is a cons cell or
+ @code{nil}.  Otherwise, it returns @code{nil}.
+ 
+ @example
+ @group
+ (listp '(1))
+      @result{} t
+ @end group
+ @group
+ (listp '())
+      @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @defun nlistp object
+ This function is the opposite of @code{listp}: it returns @code{t} if
+ @var{object} is not a list.  Otherwise, it returns @code{nil}.
+ 
+ @example
+ (listp @var{object}) @equiv{} (not (nlistp @var{object}))
+ @end example
+ @end defun
+ 
+ @defun null object
+ This function returns @code{t} if @var{object} is @code{nil}, and
+ returns @code{nil} otherwise.  This function is identical to @code{not},
+ but as a matter of clarity we use @code{null} when @var{object} is
+ considered a list and @code{not} when it is considered a truth value
+ (see @code{not} in @ref{Combining Conditions}).
+ 
+ @example
+ @group
+ (null '(1))
+      @result{} nil
+ @end group
+ @group
+ (null '())
+      @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @need 2000
+ 
+ @node List Elements
+ @section Accessing Elements of Lists
+ @cindex list elements
+ 
+ @defun car cons-cell
+ This function returns the value pointed to by the first pointer of the
+ cons cell @var{cons-cell}.  Expressed another way, this function
+ returns the @sc{car} of @var{cons-cell}.
+ 
+ As a special case, if @var{cons-cell} is @code{nil}, then @code{car}
+ is defined to return @code{nil}; therefore, any list is a valid argument
+ for @code{car}.  An error is signaled if the argument is not a cons cell
+ or @code{nil}.
+ 
+ @example
+ @group
+ (car '(a b c))
+      @result{} a
+ @end group
+ @group
+ (car '())
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun cdr cons-cell
+ This function returns the value pointed to by the second pointer of
+ the cons cell @var{cons-cell}.  Expressed another way, this function
+ returns the @sc{cdr} of @var{cons-cell}.
+ 
+ As a special case, if @var{cons-cell} is @code{nil}, then @code{cdr}
+ is defined to return @code{nil}; therefore, any list is a valid argument
+ for @code{cdr}.  An error is signaled if the argument is not a cons cell
+ or @code{nil}.
+ 
+ @example
+ @group
+ (cdr '(a b c))
+      @result{} (b c)
+ @end group
+ @group
+ (cdr '())
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun car-safe object
+ This function lets you take the @sc{car} of a cons cell while avoiding
+ errors for other data types.  It returns the @sc{car} of @var{object} if
+ @var{object} is a cons cell, @code{nil} otherwise.  This is in contrast
+ to @code{car}, which signals an error if @var{object} is not a list.
+ 
+ @example
+ @group
+ (car-safe @var{object})
+ @equiv{}
+ (let ((x @var{object}))
+   (if (consp x)
+       (car x)
+     nil))
+ @end group
+ @end example
+ @end defun
+ 
+ @defun cdr-safe object
+ This function lets you take the @sc{cdr} of a cons cell while
+ avoiding errors for other data types.  It returns the @sc{cdr} of
+ @var{object} if @var{object} is a cons cell, @code{nil} otherwise.
+ This is in contrast to @code{cdr}, which signals an error if
+ @var{object} is not a list.
+ 
+ @example
+ @group
+ (cdr-safe @var{object})
+ @equiv{}
+ (let ((x @var{object}))
+   (if (consp x)
+       (cdr x)
+     nil))
+ @end group
+ @end example
+ @end defun
+ 
+ @defun nth n list
+ This function returns the @var{n}th element of @var{list}.  Elements
+ are numbered starting with zero, so the @sc{car} of @var{list} is
+ element number zero.  If the length of @var{list} is @var{n} or less,
+ the value is @code{nil}.
+ 
+ If @var{n} is negative, @code{nth} returns the first element of
+ @var{list}.
+ 
+ @example
+ @group
+ (nth 2 '(1 2 3 4))
+      @result{} 3
+ @end group
+ @group
+ (nth 10 '(1 2 3 4))
+      @result{} nil
+ @end group
+ @group
+ (nth -3 '(1 2 3 4))
+      @result{} 1
+ 
+ (nth n x) @equiv{} (car (nthcdr n x))
+ @end group
+ @end example
+ @end defun
+ 
+ @defun nthcdr n list
+ This function returns the @var{n}th @sc{cdr} of @var{list}.  In other
+ words, it removes the first @var{n} links of @var{list} and returns
+ what follows.
+ 
+ If @var{n} is zero or negative, @code{nthcdr} returns all of
+ @var{list}.  If the length of @var{list} is @var{n} or less,
+ @code{nthcdr} returns @code{nil}.
+ 
+ @example
+ @group
+ (nthcdr 1 '(1 2 3 4))
+      @result{} (2 3 4)
+ @end group
+ @group
+ (nthcdr 10 '(1 2 3 4))
+      @result{} nil
+ @end group
+ @group
+ (nthcdr -3 '(1 2 3 4))
+      @result{} (1 2 3 4)
+ @end group
+ @end example
+ @end defun
+ 
+ @node Building Lists
+ @comment  node-name,  next,  previous,  up
+ @section Building Cons Cells and Lists
+ @cindex cons cells
+ @cindex building lists
+ 
+   Many functions build lists, as lists reside at the very heart of Lisp.
+ @code{cons} is the fundamental list-building function; however, it is
+ interesting to note that @code{list} is used more times in the source
+ code for Emacs than @code{cons}.
+ 
+ @defun cons object1 object2
+ This function is the fundamental function used to build new list
+ structure.  It creates a new cons cell, making @var{object1} the
+ @sc{car}, and @var{object2} the @sc{cdr}.  It then returns the new cons
+ cell.  The arguments @var{object1} and @var{object2} may be any Lisp
+ objects, but most often @var{object2} is a list.
+ 
+ @example
+ @group
+ (cons 1 '(2))
+      @result{} (1 2)
+ @end group
+ @group
+ (cons 1 '())
+      @result{} (1)
+ @end group
+ @group
+ (cons 1 2)
+      @result{} (1 . 2)
+ @end group
+ @end example
+ 
+ @cindex consing
+ @code{cons} is often used to add a single element to the front of a
+ list.  This is called @dfn{consing the element onto the list}.  For
+ example:
+ 
+ @example
+ (setq list (cons newelt list))
+ @end example
+ 
+ Note that there is no conflict between the variable named @code{list}
+ used in this example and the function named @code{list} described below;
+ any symbol can serve both purposes.
+ @end defun
+ 
+ @defun list &rest objects
+ This function creates a list with @var{objects} as its elements.  The
+ resulting list is always @code{nil}-terminated.  If no @var{objects}
+ are given, the empty list is returned.
+ 
+ @example
+ @group
+ (list 1 2 3 4 5)
+      @result{} (1 2 3 4 5)
+ @end group
+ @group
+ (list 1 2 '(3 4 5) 'foo)
+      @result{} (1 2 (3 4 5) foo)
+ @end group
+ @group
+ (list)
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun make-list length object
+ This function creates a list of length @var{length}, in which all the
+ elements have the identical value @var{object}.  Compare
+ @code{make-list} with @code{make-string} (@pxref{Creating Strings}).
+ 
+ @example
+ @group
+ (make-list 3 'pigs)
+      @result{} (pigs pigs pigs)
+ @end group
+ @group
+ (make-list 0 'pigs)
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun append &rest sequences
+ @cindex copying lists
+ This function returns a list containing all the elements of
+ @var{sequences}.  The @var{sequences} may be lists, vectors, or strings,
+ but the last one should be a list.  All arguments except the last one
+ are copied, so none of them are altered.
+ 
+ More generally, the final argument to @code{append} may be any Lisp
+ object.  The final argument is not copied or converted; it becomes the
+ @sc{cdr} of the last cons cell in the new list.  If the final argument
+ is itself a list, then its elements become in effect elements of the
+ result list.  If the final element is not a list, the result is a
+ ``dotted list'' since its final @sc{cdr} is not @code{nil} as required
+ in a true list.
+ 
+ See @code{nconc} in @ref{Rearrangement}, for a way to join lists with no
+ copying.
+ 
+ Here is an example of using @code{append}:
+ 
+ @example
+ @group
+ (setq trees '(pine oak))
+      @result{} (pine oak)
+ (setq more-trees (append '(maple birch) trees))
+      @result{} (maple birch pine oak)
+ @end group
+ 
+ @group
+ trees
+      @result{} (pine oak)
+ more-trees
+      @result{} (maple birch pine oak)
+ @end group
+ @group
+ (eq trees (cdr (cdr more-trees)))
+      @result{} t
+ @end group
+ @end example
+ 
+ You can see how @code{append} works by looking at a box diagram.  The
+ variable @code{trees} is set to the list @code{(pine oak)} and then the
+ variable @code{more-trees} is set to the list @code{(maple birch pine
+ oak)}.  However, the variable @code{trees} continues to refer to the
+ original list:
+ 
+ @smallexample
+ @group
+ more-trees                trees
+ |                           |
+ |     ___ ___      ___ ___   -> ___ ___      ___ ___
+  --> |___|___|--> |___|___|--> |___|___|--> |___|___|--> nil
+        |            |            |            |
+        |            |            |            |
+         --> maple    -->birch     --> pine     --> oak
+ @end group
+ @end smallexample
+ 
+ An empty sequence contributes nothing to the value returned by
+ @code{append}.  As a consequence of this, a final @code{nil} argument
+ forces a copy of the previous argument.
+ 
+ @example
+ @group
+ trees
+      @result{} (pine oak)
+ @end group
+ @group
+ (setq wood (append trees ()))
+      @result{} (pine oak)
+ @end group
+ @group
+ wood
+      @result{} (pine oak)
+ @end group
+ @group
+ (eq wood trees)
+      @result{} nil
+ @end group
+ @end example
+ 
+ @noindent
+ This once was the usual way to copy a list, before the function
+ @code{copy-sequence} was invented.  @xref{Sequences Arrays Vectors}.
+ 
+ With the help of @code{apply}, we can append all the lists in a list of
+ lists:
+ 
+ @example
+ @group
+ (apply 'append '((a b c) nil (x y z) nil))
+      @result{} (a b c x y z)
+ @end group
+ @end example
+ 
+ If no @var{sequences} are given, @code{nil} is returned:
+ 
+ @example
+ @group
+ (append)
+      @result{} nil
+ @end group
+ @end example
+ 
+ Here are some examples where the final argument is not a list:
+ 
+ @example
+ (append '(x y) 'z)
+      @result{} (x y . z)
+ (append '(x y) [z])
+      @result{} (x y . [z])
+ @end example
+ 
+ @noindent
+ The second example shows that when the final argument is a sequence but
+ not a list, the sequence's elements do not become elements of the
+ resulting list.  Instead, the sequence becomes the final @sc{cdr}, like
+ any other non-list final argument.
+ 
+ The @code{append} function also allows integers as arguments.  It
+ converts them to strings of digits, making up the decimal print
+ representation of the integer, and then uses the strings instead of the
+ original integers.  @strong{Don't use this feature; we plan to eliminate
+ it.  If you already use this feature, change your programs now!}  The
+ proper way to convert an integer to a decimal number in this way is with
+ @code{format} (@pxref{Formatting Strings}) or @code{number-to-string}
+ (@pxref{String Conversion}).
+ @end defun
+ 
+ @defun reverse list
+ This function creates a new list whose elements are the elements of
+ @var{list}, but in reverse order.  The original argument @var{list} is
+ @emph{not} altered.
+ 
+ @example
+ @group
+ (setq x '(1 2 3 4))
+      @result{} (1 2 3 4)
+ @end group
+ @group
+ (reverse x)
+      @result{} (4 3 2 1)
+ x
+      @result{} (1 2 3 4)
+ @end group
+ @end example
+ @end defun
+ 
+ @node Modifying Lists
+ @section Modifying Existing List Structure
+ 
+   You can modify the @sc{car} and @sc{cdr} contents of a cons cell with the
+ primitives @code{setcar} and @code{setcdr}.
+ 
+ @cindex CL note---@code{rplaca} vrs @code{setcar}
+ @quotation
+ @findex rplaca
+ @findex rplacd
+ @b{Common Lisp note:} Common Lisp uses functions @code{rplaca} and
+ @code{rplacd} to alter list structure; they change structure the same
+ way as @code{setcar} and @code{setcdr}, but the Common Lisp functions
+ return the cons cell while @code{setcar} and @code{setcdr} return the
+ new @sc{car} or @sc{cdr}.
+ @end quotation
+ 
+ @menu
+ * Setcar::          Replacing an element in a list.
+ * Setcdr::          Replacing part of the list backbone.
+                       This can be used to remove or add elements.
+ * Rearrangement::   Reordering the elements in a list; combining lists.
+ @end menu
+ 
+ @node Setcar
+ @subsection Altering List Elements with @code{setcar}
+ 
+   Changing the @sc{car} of a cons cell is done with @code{setcar}.  When
+ used on a list, @code{setcar} replaces one element of a list with a
+ different element.
+ 
+ @defun setcar cons object
+ This function stores @var{object} as the new @sc{car} of @var{cons},
+ replacing its previous @sc{car}.  It returns the value @var{object}.
+ For example:
+ 
+ @example
+ @group
+ (setq x '(1 2))
+      @result{} (1 2)
+ @end group
+ @group
+ (setcar x 4)
+      @result{} 4
+ @end group
+ @group
+ x
+      @result{} (4 2)
+ @end group
+ @end example
+ @end defun
+ 
+   When a cons cell is part of the shared structure of several lists,
+ storing a new @sc{car} into the cons changes one element of each of
+ these lists.  Here is an example:
+ 
+ @example
+ @group
+ ;; @r{Create two lists that are partly shared.}
+ (setq x1 '(a b c))
+      @result{} (a b c)
+ (setq x2 (cons 'z (cdr x1)))
+      @result{} (z b c)
+ @end group
+ 
+ @group
+ ;; @r{Replace the @sc{car} of a shared link.}
+ (setcar (cdr x1) 'foo)
+      @result{} foo
+ x1                           ; @r{Both lists are changed.}
+      @result{} (a foo c)
+ x2
+      @result{} (z foo c)
+ @end group
+ 
+ @group
+ ;; @r{Replace the @sc{car} of a link that is not shared.}
+ (setcar x1 'baz)
+      @result{} baz
+ x1                           ; @r{Only one list is changed.}
+      @result{} (baz foo c)
+ x2
+      @result{} (z foo c)
+ @end group
+ @end example
+ 
+   Here is a graphical depiction of the shared structure of the two lists
+ in the variables @code{x1} and @code{x2}, showing why replacing @code{b}
+ changes them both:
+ 
+ @example
+ @group
+         ___ ___        ___ ___      ___ ___
+ x1---> |___|___|----> |___|___|--> |___|___|--> nil
+          |        -->   |            |
+          |       |      |            |
+           --> a  |       --> b        --> c
+                  |
+        ___ ___   |
+ x2--> |___|___|--
+         |
+         |
+          --> z
+ @end group
+ @end example
+ 
+   Here is an alternative form of box diagram, showing the same relationship:
+ 
+ @example
+ @group
+ x1:
+  --------------       --------------       --------------
+ | car   | cdr  |     | car   | cdr  |     | car   | cdr  |
+ |   a   |   o------->|   b   |   o------->|   c   |  nil |
+ |       |      |  -->|       |      |     |       |      |
+  --------------  |    --------------       --------------
+                  |
+ x2:              |
+  --------------  |
+ | car   | cdr  | |
+ |   z   |   o----
+ |       |      |
+  --------------
+ @end group
+ @end example
+ 
+ @node Setcdr
+ @subsection Altering the CDR of a List
+ 
+   The lowest-level primitive for modifying a @sc{cdr} is @code{setcdr}:
+ 
+ @defun setcdr cons object
+ This function stores @var{object} as the new @sc{cdr} of @var{cons},
+ replacing its previous @sc{cdr}.  It returns the value @var{object}.
+ @end defun
+ 
+   Here is an example of replacing the @sc{cdr} of a list with a
+ different list.  All but the first element of the list are removed in
+ favor of a different sequence of elements.  The first element is
+ unchanged, because it resides in the @sc{car} of the list, and is not
+ reached via the @sc{cdr}.
+ 
+ @example
+ @group
+ (setq x '(1 2 3))
+      @result{} (1 2 3)
+ @end group
+ @group
+ (setcdr x '(4))
+      @result{} (4)
+ @end group
+ @group
+ x
+      @result{} (1 4)
+ @end group
+ @end example
+ 
+   You can delete elements from the middle of a list by altering the
+ @sc{cdr}s of the cons cells in the list.  For example, here we delete
+ the second element, @code{b}, from the list @code{(a b c)}, by changing
+ the @sc{cdr} of the first cell:
+ 
+ @example
+ @group
+ (setq x1 '(a b c))
+      @result{} (a b c)
+ (setcdr x1 (cdr (cdr x1)))
+      @result{} (c)
+ x1
+      @result{} (a c)
+ @end group
+ @end example
+ 
+ @need 4000
+   Here is the result in box notation:
+ 
+ @example
+ @group
+                    --------------------
+                   |                    |
+  --------------   |   --------------   |    --------------
+ | car   | cdr  |  |  | car   | cdr  |   -->| car   | cdr  |
+ |   a   |   o-----   |   b   |   o-------->|   c   |  nil |
+ |       |      |     |       |      |      |       |      |
+  --------------       --------------        --------------
+ @end group
+ @end example
+ 
+ @noindent
+ The second cons cell, which previously held the element @code{b}, still
+ exists and its @sc{car} is still @code{b}, but it no longer forms part
+ of this list.
+ 
+   It is equally easy to insert a new element by changing @sc{cdr}s:
+ 
+ @example
+ @group
+ (setq x1 '(a b c))
+      @result{} (a b c)
+ (setcdr x1 (cons 'd (cdr x1)))
+      @result{} (d b c)
+ x1
+      @result{} (a d b c)
+ @end group
+ @end example
+ 
+   Here is this result in box notation:
+ 
+ @smallexample
+ @group
+  --------------        -------------       -------------
+ | car  | cdr   |      | car  | cdr  |     | car  | cdr  |
+ |   a  |   o   |   -->|   b  |   o------->|   c  |  nil |
+ |      |   |   |  |   |      |      |     |      |      |
+  --------- | --   |    -------------       -------------
+            |      |
+      -----         --------
+     |                      |
+     |    ---------------   |
+     |   | car   | cdr   |  |
+      -->|   d   |   o------
+         |       |       |
+          ---------------
+ @end group
+ @end smallexample
+ 
+ @node Rearrangement
+ @subsection Functions that Rearrange Lists
+ @cindex rearrangement of lists
+ @cindex modification of lists
+ 
+   Here are some functions that rearrange lists ``destructively'' by
+ modifying the @sc{cdr}s of their component cons cells.  We call these
+ functions ``destructive'' because they chew up the original lists passed
+ to them as arguments, to produce a new list that is the returned value.
+ 
+ @ifinfo
+   See @code{delq}, in @ref{Sets And Lists}, for another function
+ that modifies cons cells.
+ @end ifinfo
+ @iftex
+    The function @code{delq} in the following section is another example
+ of destructive list manipulation.
+ @end iftex
+ 
+ @defun nconc &rest lists
+ @cindex concatenating lists
+ @cindex joining lists
+ This function returns a list containing all the elements of @var{lists}.
+ Unlike @code{append} (@pxref{Building Lists}), the @var{lists} are
+ @emph{not} copied.  Instead, the last @sc{cdr} of each of the
+ @var{lists} is changed to refer to the following list.  The last of the
+ @var{lists} is not altered.  For example:
+ 
+ @example
+ @group
+ (setq x '(1 2 3))
+      @result{} (1 2 3)
+ @end group
+ @group
+ (nconc x '(4 5))
+      @result{} (1 2 3 4 5)
+ @end group
+ @group
+ x
+      @result{} (1 2 3 4 5)
+ @end group
+ @end example
+ 
+    Since the last argument of @code{nconc} is not itself modified, it is
+ reasonable to use a constant list, such as @code{'(4 5)}, as in the
+ above example.  For the same reason, the last argument need not be a
+ list:
+ 
+ @example
+ @group
+ (setq x '(1 2 3))
+      @result{} (1 2 3)
+ @end group
+ @group
+ (nconc x 'z)
+      @result{} (1 2 3 . z)
+ @end group
+ @group
+ x
+      @result{} (1 2 3 . z)
+ @end group
+ @end example
+ 
+ A common pitfall is to use a quoted constant list as a non-last
+ argument to @code{nconc}.  If you do this, your program will change
+ each time you run it!  Here is what happens:
+ 
+ @smallexample
+ @group
+ (defun add-foo (x)            ; @r{We want this function to add}
+   (nconc '(foo) x))           ;   @r{@code{foo} to the front of its arg.}
+ @end group
+ 
+ @group
+ (symbol-function 'add-foo)
+      @result{} (lambda (x) (nconc (quote (foo)) x))
+ @end group
+ 
+ @group
+ (setq xx (add-foo '(1 2)))    ; @r{It seems to work.}
+      @result{} (foo 1 2)
+ @end group
+ @group
+ (setq xy (add-foo '(3 4)))    ; @r{What happened?}
+      @result{} (foo 1 2 3 4)
+ @end group
+ @group
+ (eq xx xy)
+      @result{} t
+ @end group
+ 
+ @group
+ (symbol-function 'add-foo)
+      @result{} (lambda (x) (nconc (quote (foo 1 2 3 4) x)))
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun nreverse list
+ @cindex reversing a list
+   This function reverses the order of the elements of @var{list}.
+ Unlike @code{reverse}, @code{nreverse} alters its argument by reversing
+ the @sc{cdr}s in the cons cells forming the list.  The cons cell that
+ used to be the last one in @var{list} becomes the first cell of the
+ value.
+ 
+   For example:
+ 
+ @example
+ @group
+ (setq x '(1 2 3 4))
+      @result{} (1 2 3 4)
+ @end group
+ @group
+ x
+      @result{} (1 2 3 4)
+ (nreverse x)
+      @result{} (4 3 2 1)
+ @end group
+ @group
+ ;; @r{The cell that was first is now last.}
+ x
+      @result{} (1)
+ @end group
+ @end example
+ 
+   To avoid confusion, we usually store the result of @code{nreverse}
+ back in the same variable which held the original list:
+ 
+ @example
+ (setq x (nreverse x))
+ @end example
+ 
+   Here is the @code{nreverse} of our favorite example, @code{(a b c)},
+ presented graphically:
+ 
+ @smallexample
+ @group
+ @r{Original list head:}                       @r{Reversed list:}
+  -------------        -------------        ------------
+ | car  | cdr  |      | car  | cdr  |      | car | cdr  |
+ |   a  |  nil |<--   |   b  |   o  |<--   |   c |   o  |
+ |      |      |   |  |      |   |  |   |  |     |   |  |
+  -------------    |   --------- | -    |   -------- | -
+                   |             |      |            |
+                    -------------        ------------
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun sort list predicate
+ @cindex stable sort
+ @cindex sorting lists
+ This function sorts @var{list} stably, though destructively, and
+ returns the sorted list.  It compares elements using @var{predicate}.  A
+ stable sort is one in which elements with equal sort keys maintain their
+ relative order before and after the sort.  Stability is important when
+ successive sorts are used to order elements according to different
+ criteria.
+ 
+ The argument @var{predicate} must be a function that accepts two
+ arguments.  It is called with two elements of @var{list}.  To get an
+ increasing order sort, the @var{predicate} should return @code{t} if the
+ first element is ``less than'' the second, or @code{nil} if not.
+ 
+ The destructive aspect of @code{sort} is that it rearranges the cons
+ cells forming @var{list} by changing @sc{cdr}s.  A nondestructive sort
+ function would create new cons cells to store the elements in their
+ sorted order.  If you wish to make a sorted copy without destroying the
+ original, copy it first with @code{copy-sequence} and then sort.
+ 
+ Sorting does not change the @sc{car}s of the cons cells in @var{list};
+ the cons cell that originally contained the element @code{a} in
+ @var{list} still has @code{a} in its @sc{car} after sorting, but it now
+ appears in a different position in the list due to the change of
+ @sc{cdr}s.  For example:
+ 
+ @example
+ @group
+ (setq nums '(1 3 2 6 5 4 0))
+      @result{} (1 3 2 6 5 4 0)
+ @end group
+ @group
+ (sort nums '<)
+      @result{} (0 1 2 3 4 5 6)
+ @end group
+ @group
+ nums
+      @result{} (1 2 3 4 5 6)
+ @end group
+ @end example
+ 
+ @noindent
+ Note that the list in @code{nums} no longer contains 0; this is the same
+ cons cell that it was before, but it is no longer the first one in the
+ list.  Don't assume a variable that formerly held the argument now holds
+ the entire sorted list!  Instead, save the result of @code{sort} and use
+ that.  Most often we store the result back into the variable that held
+ the original list:
+ 
+ @example
+ (setq nums (sort nums '<))
+ @end example
+ 
+ @xref{Sorting}, for more functions that perform sorting.
+ See @code{documentation} in @ref{Accessing Documentation}, for a
+ useful example of @code{sort}.
+ @end defun
+ 
+ @node Sets And Lists
+ @section Using Lists as Sets
+ @cindex lists as sets
+ @cindex sets
+ 
+   A list can represent an unordered mathematical set---simply consider a
+ value an element of a set if it appears in the list, and ignore the
+ order of the list.  To form the union of two sets, use @code{append} (as
+ long as you don't mind having duplicate elements).  Other useful
+ functions for sets include @code{memq} and @code{delq}, and their
+ @code{equal} versions, @code{member} and @code{delete}.
+ 
+ @cindex CL note---lack @code{union}, @code{set}
+ @quotation
+ @b{Common Lisp note:} Common Lisp has functions @code{union} (which
+ avoids duplicate elements) and @code{intersection} for set operations,
+ but GNU Emacs Lisp does not have them.  You can write them in Lisp if
+ you wish.
+ @end quotation
+ 
+ @defun memq object list
+ @cindex membership in a list
+ This function tests to see whether @var{object} is a member of
+ @var{list}.  If it is, @code{memq} returns a list starting with the
+ first occurrence of @var{object}.  Otherwise, it returns @code{nil}.
+ The letter @samp{q} in @code{memq} says that it uses @code{eq} to
+ compare @var{object} against the elements of the list.  For example:
+ 
+ @example
+ @group
+ (memq 'b '(a b c b a))
+      @result{} (b c b a)
+ @end group
+ @group
+ (memq '(2) '((1) (2)))    ; @r{@code{(2)} and @code{(2)} are not @code{eq}.}
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun delq object list
+ @cindex deletion of elements
+ This function destructively removes all elements @code{eq} to
+ @var{object} from @var{list}.  The letter @samp{q} in @code{delq} says
+ that it uses @code{eq} to compare @var{object} against the elements of
+ the list, like @code{memq}.
+ @end defun
+ 
+ When @code{delq} deletes elements from the front of the list, it does so
+ simply by advancing down the list and returning a sublist that starts
+ after those elements:
+ 
+ @example
+ @group
+ (delq 'a '(a b c)) @equiv{} (cdr '(a b c))
+ @end group
+ @end example
+ 
+ When an element to be deleted appears in the middle of the list,
+ removing it involves changing the @sc{cdr}s (@pxref{Setcdr}).
+ 
+ @example
+ @group
+ (setq sample-list '(a b c (4)))
+      @result{} (a b c (4))
+ @end group
+ @group
+ (delq 'a sample-list)
+      @result{} (b c (4))
+ @end group
+ @group
+ sample-list
+      @result{} (a b c (4))
+ @end group
+ @group
+ (delq 'c sample-list)
+      @result{} (a b (4))
+ @end group
+ @group
+ sample-list
+      @result{} (a b (4))
+ @end group
+ @end example
+ 
+ Note that @code{(delq 'c sample-list)} modifies @code{sample-list} to
+ splice out the third element, but @code{(delq 'a sample-list)} does not
+ splice anything---it just returns a shorter list.  Don't assume that a
+ variable which formerly held the argument @var{list} now has fewer
+ elements, or that it still holds the original list!  Instead, save the
+ result of @code{delq} and use that.  Most often we store the result back
+ into the variable that held the original list:
+ 
+ @example
+ (setq flowers (delq 'rose flowers))
+ @end example
+ 
+ In the following example, the @code{(4)} that @code{delq} attempts to match
+ and the @code{(4)} in the @code{sample-list} are not @code{eq}:
+ 
+ @example
+ @group
+ (delq '(4) sample-list)
+      @result{} (a c (4))
+ @end group
+ @end example
+ 
+ The following two functions are like @code{memq} and @code{delq} but use
+ @code{equal} rather than @code{eq} to compare elements.  They are new in
+ Emacs 19.
+ 
+ @defun member object list
+ The function @code{member} tests to see whether @var{object} is a member
+ of @var{list}, comparing members with @var{object} using @code{equal}.
+ If @var{object} is a member, @code{member} returns a list starting with
+ its first occurrence in @var{list}.  Otherwise, it returns @code{nil}.
+ 
+ Compare this with @code{memq}:
+ 
+ @example
+ @group
+ (member '(2) '((1) (2)))  ; @r{@code{(2)} and @code{(2)} are @code{equal}.}
+      @result{} ((2))
+ @end group
+ @group
+ (memq '(2) '((1) (2)))    ; @r{@code{(2)} and @code{(2)} are not @code{eq}.}
+      @result{} nil
+ @end group
+ @group
+ ;; @r{Two strings with the same contents are @code{equal}.}
+ (member "foo" '("foo" "bar"))
+      @result{} ("foo" "bar")
+ @end group
+ @end example
+ @end defun
+ 
+ @defun delete object list
+ This function destructively removes all elements @code{equal} to
+ @var{object} from @var{list}.  It is to @code{delq} as @code{member} is
+ to @code{memq}: it uses @code{equal} to compare elements with
+ @var{object}, like @code{member}; when it finds an element that matches,
+ it removes the element just as @code{delq} would.  For example:
+ 
+ @example
+ @group
+ (delete '(2) '((2) (1) (2)))
+      @result{} '((1))
+ @end group
+ @end example
+ @end defun
+ 
+ @quotation
+ @b{Common Lisp note:} The functions @code{member} and @code{delete} in
+ GNU Emacs Lisp are derived from Maclisp, not Common Lisp.  The Common
+ Lisp versions do not use @code{equal} to compare elements.
+ @end quotation
+ 
+   See also the function @code{add-to-list}, in @ref{Setting Variables},
+ for another way to add an element to a list stored in a variable.
+ 
+ @node Association Lists
+ @section Association Lists
+ @cindex association list
+ @cindex alist
+ 
+   An @dfn{association list}, or @dfn{alist} for short, records a mapping
+ from keys to values.  It is a list of cons cells called
+ @dfn{associations}: the @sc{car} of each cell is the @dfn{key}, and the
+ @sc{cdr} is the @dfn{associated value}.@footnote{This usage of ``key''
+ is not related to the term ``key sequence''; it means a value used to
+ look up an item in a table.  In this case, the table is the alist, and
+ the alist associations are the items.}
+ 
+   Here is an example of an alist.  The key @code{pine} is associated with
+ the value @code{cones}; the key @code{oak} is associated with
+ @code{acorns}; and the key @code{maple} is associated with @code{seeds}.
+ 
+ @example
+ @group
+ '((pine . cones)
+   (oak . acorns)
+   (maple . seeds))
+ @end group
+ @end example
+ 
+   The associated values in an alist may be any Lisp objects; so may the
+ keys.  For example, in the following alist, the symbol @code{a} is
+ associated with the number @code{1}, and the string @code{"b"} is
+ associated with the @emph{list} @code{(2 3)}, which is the @sc{cdr} of
+ the alist element:
+ 
+ @example
+ ((a . 1) ("b" 2 3))
+ @end example
+ 
+   Sometimes it is better to design an alist to store the associated
+ value in the @sc{car} of the @sc{cdr} of the element.  Here is an
+ example:
+ 
+ @example
+ '((rose red) (lily white) (buttercup yellow))
+ @end example
+ 
+ @noindent
+ Here we regard @code{red} as the value associated with @code{rose}.  One
+ advantage of this method is that you can store other related
+ information---even a list of other items---in the @sc{cdr} of the
+ @sc{cdr}.  One disadvantage is that you cannot use @code{rassq} (see
+ below) to find the element containing a given value.  When neither of
+ these considerations is important, the choice is a matter of taste, as
+ long as you are consistent about it for any given alist.
+ 
+   Note that the same alist shown above could be regarded as having the
+ associated value in the @sc{cdr} of the element; the value associated
+ with @code{rose} would be the list @code{(red)}.
+ 
+   Association lists are often used to record information that you might
+ otherwise keep on a stack, since new associations may be added easily to
+ the front of the list.  When searching an association list for an
+ association with a given key, the first one found is returned, if there
+ is more than one.
+ 
+   In Emacs Lisp, it is @emph{not} an error if an element of an
+ association list is not a cons cell.  The alist search functions simply
+ ignore such elements.  Many other versions of Lisp signal errors in such
+ cases.
+ 
+   Note that property lists are similar to association lists in several
+ respects.  A property list behaves like an association list in which
+ each key can occur only once.  @xref{Property Lists}, for a comparison
+ of property lists and association lists.
+ 
+ @defun assoc key alist
+ This function returns the first association for @var{key} in
+ @var{alist}.  It compares @var{key} against the alist elements using
+ @code{equal} (@pxref{Equality Predicates}).  It returns @code{nil} if no
+ association in @var{alist} has a @sc{car} @code{equal} to @var{key}.
+ For example:
+ 
+ @smallexample
+ (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
+      @result{} ((pine . cones) (oak . acorns) (maple . seeds))
+ (assoc 'oak trees)
+      @result{} (oak . acorns)
+ (cdr (assoc 'oak trees))
+      @result{} acorns
+ (assoc 'birch trees)
+      @result{} nil
+ @end smallexample
+ 
+ Here is another example, in which the keys and values are not symbols:
+ 
+ @smallexample
+ (setq needles-per-cluster
+       '((2 "Austrian Pine" "Red Pine")
+         (3 "Pitch Pine")
+         (5 "White Pine")))
+ 
+ (cdr (assoc 3 needles-per-cluster))
+      @result{} ("Pitch Pine")
+ (cdr (assoc 2 needles-per-cluster))
+      @result{} ("Austrian Pine" "Red Pine")
+ @end smallexample
+ @end defun
+ 
+ @defun rassoc value alist
+ This function returns the first association with value @var{value} in
+ @var{alist}.  It returns @code{nil} if no association in @var{alist} has
+ a @sc{cdr} @code{equal} to @var{value}.
+ 
+ @code{rassoc} is like @code{assoc} except that it compares the @sc{cdr} of
+ each @var{alist} association instead of the @sc{car}.  You can think of
+ this as ``reverse @code{assoc}'', finding the key for a given value.
+ @end defun
+ 
+ @defun assq key alist
+ This function is like @code{assoc} in that it returns the first
+ association for @var{key} in @var{alist}, but it makes the comparison
+ using @code{eq} instead of @code{equal}.  @code{assq} returns @code{nil}
+ if no association in @var{alist} has a @sc{car} @code{eq} to @var{key}.
+ This function is used more often than @code{assoc}, since @code{eq} is
+ faster than @code{equal} and most alists use symbols as keys.
+ @xref{Equality Predicates}.
+ 
+ @smallexample
+ (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
+      @result{} ((pine . cones) (oak . acorns) (maple . seeds))
+ (assq 'pine trees)
+      @result{} (pine . cones)
+ @end smallexample
+ 
+ On the other hand, @code{assq} is not usually useful in alists where the
+ keys may not be symbols:
+ 
+ @smallexample
+ (setq leaves
+       '(("simple leaves" . oak)
+         ("compound leaves" . horsechestnut)))
+ 
+ (assq "simple leaves" leaves)
+      @result{} nil
+ (assoc "simple leaves" leaves)
+      @result{} ("simple leaves" . oak)
+ @end smallexample
+ @end defun
+ 
+ @defun rassq value alist
+ This function returns the first association with value @var{value} in
+ @var{alist}.  It returns @code{nil} if no association in @var{alist} has
+ a @sc{cdr} @code{eq} to @var{value}.
+ 
+ @code{rassq} is like @code{assq} except that it compares the @sc{cdr} of
+ each @var{alist} association instead of the @sc{car}.  You can think of
+ this as ``reverse @code{assq}'', finding the key for a given value.
+ 
+ For example:
+ 
+ @smallexample
+ (setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
+ 
+ (rassq 'acorns trees)
+      @result{} (oak . acorns)
+ (rassq 'spores trees)
+      @result{} nil
+ @end smallexample
+ 
+ Note that @code{rassq} cannot search for a value stored in the @sc{car}
+ of the @sc{cdr} of an element:
+ 
+ @smallexample
+ (setq colors '((rose red) (lily white) (buttercup yellow)))
+ 
+ (rassq 'white colors)
+      @result{} nil
+ @end smallexample
+ 
+ In this case, the @sc{cdr} of the association @code{(lily white)} is not
+ the symbol @code{white}, but rather the list @code{(white)}.  This
+ becomes clearer if the association is written in dotted pair notation:
+ 
+ @smallexample
+ (lily white) @equiv{} (lily . (white))
+ @end smallexample
+ @end defun
+ 
+ @defun copy-alist alist
+ @cindex copying alists
+ This function returns a two-level deep copy of @var{alist}: it creates a
+ new copy of each association, so that you can alter the associations of
+ the new alist without changing the old one.
+ 
+ @smallexample
+ @group
+ (setq needles-per-cluster
+       '((2 . ("Austrian Pine" "Red Pine"))
+         (3 . ("Pitch Pine"))
+ @end group
+         (5 . ("White Pine"))))
+ @result{}
+ ((2 "Austrian Pine" "Red Pine")
+  (3 "Pitch Pine")
+  (5 "White Pine"))
+ 
+ (setq copy (copy-alist needles-per-cluster))
+ @result{}
+ ((2 "Austrian Pine" "Red Pine")
+  (3 "Pitch Pine")
+  (5 "White Pine"))
+ 
+ (eq needles-per-cluster copy)
+      @result{} nil
+ (equal needles-per-cluster copy)
+      @result{} t
+ (eq (car needles-per-cluster) (car copy))
+      @result{} nil
+ (cdr (car (cdr needles-per-cluster)))
+      @result{} ("Pitch Pine")
+ @group
+ (eq (cdr (car (cdr needles-per-cluster)))
+     (cdr (car (cdr copy))))
+      @result{} t
+ @end group
+ @end smallexample
+ 
+   This example shows how @code{copy-alist} makes it possible to change
+ the associations of one copy without affecting the other:
+ 
+ @smallexample
+ @group
+ (setcdr (assq 3 copy) '("Martian Vacuum Pine"))
+ (cdr (assq 3 needles-per-cluster))
+      @result{} ("Pitch Pine")
+ @end group
+ @end smallexample
+ @end defun
+ 
+ 
Index: emacs/man/elisp-loading.texi
diff -c /dev/null emacs/man/elisp-loading.texi:1.2
*** /dev/null	Fri Aug  2 20:54:51 1996
--- emacs/man/elisp-loading.texi	Thu Aug  1 00:23:01 1996
***************
*** 0 ****
--- 1,651 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/loading
+ @node Loading, Byte Compilation, Macros, Top
+ @chapter Loading
+ @cindex loading
+ @cindex library
+ @cindex Lisp library
+ 
+   Loading a file of Lisp code means bringing its contents into the Lisp
+ environment in the form of Lisp objects.  Emacs finds and opens the
+ file, reads the text, evaluates each form, and then closes the file.
+ 
+   The load functions evaluate all the expressions in a file just
+ as the @code{eval-current-buffer} function evaluates all the
+ expressions in a buffer.  The difference is that the load functions
+ read and evaluate the text in the file as found on disk, not the text
+ in an Emacs buffer.
+ 
+ @cindex top-level form
+   The loaded file must contain Lisp expressions, either as source code
+ or as byte-compiled code.  Each form in the file is called a
+ @dfn{top-level form}.  There is no special format for the forms in a
+ loadable file; any form in a file may equally well be typed directly
+ into a buffer and evaluated there.  (Indeed, most code is tested this
+ way.)  Most often, the forms are function definitions and variable
+ definitions.
+ 
+   A file containing Lisp code is often called a @dfn{library}.  Thus,
+ the ``Rmail library'' is a file containing code for Rmail mode.
+ Similarly, a ``Lisp library directory'' is a directory of files
+ containing Lisp code.
+ 
+ @menu
+ * How Programs Do Loading::     The @code{load} function and others.
+ * Autoload::                    Setting up a function to autoload.
+ * Repeated Loading::            Precautions about loading a file twice.
+ * Named Features::              Loading a library if it isn't already loaded.
+ * Unloading::			How to ``unload'' a library that was loaded.
+ * Hooks for Loading::		Providing code to be run when
+ 				  particular libraries are loaded.
+ @end menu
+ 
+ @node How Programs Do Loading
+ @section How Programs Do Loading
+ 
+   Emacs Lisp has several interfaces for loading.  For example,
+ @code{autoload} creates a placeholder object for a function in a file;
+ trying to call the autoloading function loads the file to get the
+ function's real definition (@pxref{Autoload}).  @code{require} loads a
+ file if it isn't already loaded (@pxref{Named Features}).  Ultimately, all
+ these facilities call the @code{load} function to do the work.
+ 
+ @defun load filename &optional missing-ok nomessage nosuffix
+ This function finds and opens a file of Lisp code, evaluates all the
+ forms in it, and closes the file.
+ 
+ To find the file, @code{load} first looks for a file named
+ @file{@var{filename}.elc}, that is, for a file whose name is
+ @var{filename} with @samp{.elc} appended.  If such a file exists, it is
+ loaded.  If there is no file by that name, then @code{load} looks for a
+ file named @file{@var{filename}.el}.  If that file exists, it is loaded.
+ Finally, if neither of those names is found, @code{load} looks for a
+ file named @var{filename} with nothing appended, and loads it if it
+ exists.  (The @code{load} function is not clever about looking at
+ @var{filename}.  In the perverse case of a file named @file{foo.el.el},
+ evaluation of @code{(load "foo.el")} will indeed find it.)
+ 
+ If the optional argument @var{nosuffix} is non-@code{nil}, then the
+ suffixes @samp{.elc} and @samp{.el} are not tried.  In this case, you
+ must specify the precise file name you want.
+ 
+ If @var{filename} is a relative file name, such as @file{foo} or
+ @file{baz/foo.bar}, @code{load} searches for the file using the variable
+ @code{load-path}.  It appends @var{filename} to each of the directories
+ listed in @code{load-path}, and loads the first file it finds whose name
+ matches.  The current default directory is tried only if it is specified
+ in @code{load-path}, where @code{nil} stands for the default directory.
+ @code{load} tries all three possible suffixes in the first directory in
+ @code{load-path}, then all three suffixes in the second directory, and
+ so on.
+ 
+ If you get a warning that @file{foo.elc} is older than @file{foo.el}, it
+ means you should consider recompiling @file{foo.el}.  @xref{Byte
+ Compilation}.
+ 
+ Messages like @samp{Loading foo...} and @samp{Loading foo...done} appear
+ in the echo area during loading unless @var{nomessage} is
+ non-@code{nil}.
+ 
+ @cindex load errors
+ Any unhandled errors while loading a file terminate loading.  If the
+ load was done for the sake of @code{autoload}, any function definitions
+ made during the loading are undone.
+ 
+ @kindex file-error
+ If @code{load} can't find the file to load, then normally it signals the
+ error @code{file-error} (with @samp{Cannot open load file
+ @var{filename}}).  But if @var{missing-ok} is non-@code{nil}, then
+ @code{load} just returns @code{nil}.
+ 
+ You can use the variable @code{load-read-function} to specify a function
+ for @code{load} to use instead of @code{read} for reading expressions.
+ See below.
+ 
+ @code{load} returns @code{t} if the file loads successfully.
+ @end defun
+ 
+ @ignore
+ @deffn Command load-file filename
+ This function loads the file @var{filename}.  If @var{filename} is an
+ absolute file name, then it is loaded.  If it is relative, then the
+ current default directory is assumed.  @code{load-path} is not used, and
+ suffixes are not appended.  Use this function if you wish to specify
+ the file to be loaded exactly.
+ @end deffn
+ 
+ @deffn Command load-library library
+ This function loads the library named @var{library}.  A library is
+ nothing more than a file that may be loaded as described earlier.  This
+ function is identical to @code{load}, save that it reads a file name
+ interactively with completion.
+ @end deffn
+ @end ignore
+ 
+ @defopt load-path
+ @cindex @code{EMACSLOADPATH} environment variable
+ The value of this variable is a list of directories to search when
+ loading files with @code{load}.  Each element is a string (which must be
+ a directory name) or @code{nil} (which stands for the current working
+ directory).  The value of @code{load-path} is initialized from the
+ environment variable @code{EMACSLOADPATH}, if that exists; otherwise its
+ default value is specified in @file{emacs/src/paths.h} when Emacs is
+ built.
+ 
+ The syntax of @code{EMACSLOADPATH} is the same as used for @code{PATH};
+ @samp{:} (or @samp{;}, according to the operating system) separates
+ directory names, and @samp{.} is used for the current default directory.
+ Here is an example of how to set your @code{EMACSLOADPATH} variable from
+ a @code{csh} @file{.login} file:
+ 
+ @c This overfull hbox is OK.  --rjc 16mar92
+ @smallexample
+ setenv EMACSLOADPATH .:/user/bil/emacs:/usr/lib/emacs/lisp
+ @end smallexample
+ 
+ Here is how to set it using @code{sh}:
+ 
+ @smallexample
+ export EMACSLOADPATH
+ EMACSLOADPATH=.:/user/bil/emacs:/usr/local/lib/emacs/lisp
+ @end smallexample
+ 
+ Here is an example of code you can place in a @file{.emacs} file to add
+ several directories to the front of your default @code{load-path}:
+ 
+ @smallexample
+ @group
+ (setq load-path
+       (append (list nil "/user/bil/emacs"
+                     "/usr/local/lisplib"
+                     "~/emacs")
+               load-path))
+ @end group
+ @end smallexample
+ 
+ @c Wordy to rid us of an overfull hbox.  --rjc 15mar92
+ @noindent
+ In this example, the path searches the current working directory first,
+ followed then by the @file{/user/bil/emacs} directory, the
+ @file{/usr/local/lisplib} directory, and the @file{~/emacs} directory,
+ which are then followed by the standard directories for Lisp code.
+ 
+ The command line options @samp{-l} or @samp{-load} specify a Lisp
+ library to load as part of Emacs startup.  Since this file might be in
+ the current directory, Emacs 18 temporarily adds the current directory
+ to the front of @code{load-path} so the file can be found there.  Newer
+ Emacs versions also find such files in the current directory, but
+ without altering @code{load-path}.
+ 
+ Dumping Emacs uses a special value of @code{load-path}.  If the value of
+ @code{load-path} at the end of dumping is unchanged (that is, still the
+ same special value), the dumped Emacs switches to the ordinary
+ @code{load-path} value when it starts up, as described above.  But if
+ @code{load-path} has any other value at the end of dumping, that value
+ is used for execution of the dumped Emacs also.
+ 
+ Therefore, if you want to change @code{load-path} temporarily for
+ loading a few libraries in @file{site-init.el} or @file{site-load.el},
+ you should bind @code{load-path} locally with @code{let} around the
+ calls to @code{load}.
+ @end defopt
+ 
+ @defvar load-in-progress
+ This variable is non-@code{nil} if Emacs is in the process of loading a
+ file, and it is @code{nil} otherwise.
+ @end defvar
+ 
+ @defvar load-read-function
+ This variable specifies an alternate expression-reading function for
+ @code{load} and @code{eval-region} to use instead of @code{read}.
+ The function should accept one argument, just as @code{read} does.
+ 
+ Normally, the variable's value is @code{nil}, which means those
+ functions should use @code{read}.
+ @end defvar
+ 
+   To learn how @code{load} is used to build Emacs, see @ref{Building Emacs}.
+ 
+ @node Autoload
+ @section Autoload
+ @cindex autoload
+ 
+   The @dfn{autoload} facility allows you to make a function or macro
+ known in Lisp, but put off loading the file that defines it.  The first
+ call to the function automatically reads the proper file to install the
+ real definition and other associated code, then runs the real definition
+ as if it had been loaded all along.
+ 
+   There are two ways to set up an autoloaded function: by calling
+ @code{autoload}, and by writing a special ``magic'' comment in the
+ source before the real definition.  @code{autoload} is the low-level
+ primitive for autoloading; any Lisp program can call @code{autoload} at
+ any time.  Magic comments do nothing on their own; they serve as a guide
+ for the command @code{update-file-autoloads}, which constructs calls to
+ @code{autoload} and arranges to execute them when Emacs is built.  Magic
+ comments are the most convenient way to make a function autoload, but
+ only for packages installed along with Emacs.
+ 
+ @defun autoload function filename &optional docstring interactive type
+ This function defines the function (or macro) named @var{function} so as
+ to load automatically from @var{filename}.  The string @var{filename}
+ specifies the file to load to get the real definition of @var{function}.
+ 
+ The argument @var{docstring} is the documentation string for the
+ function.  Normally, this is the identical to the documentation string
+ in the function definition itself.  Specifying the documentation string
+ in the call to @code{autoload} makes it possible to look at the
+ documentation without loading the function's real definition.
+ 
+ If @var{interactive} is non-@code{nil}, then the function can be called
+ interactively.  This lets completion in @kbd{M-x} work without loading
+ the function's real definition.  The complete interactive specification
+ need not be given here; it's not needed unless the user actually calls
+ @var{function}, and when that happens, it's time to load the real
+ definition.
+ 
+ You can autoload macros and keymaps as well as ordinary functions.
+ Specify @var{type} as @code{macro} if @var{function} is really a macro.
+ Specify @var{type} as @code{keymap} if @var{function} is really a
+ keymap.  Various parts of Emacs need to know this information without
+ loading the real definition.
+ 
+ An autoloaded keymap loads automatically during key lookup when a prefix
+ key's binding is the symbol @var{function}.  Autoloading does not occur
+ for other kinds of access to the keymap.  In particular, it does not
+ happen when a Lisp program gets the keymap from the value of a variable
+ and calls @code{define-key}; not even if the variable name is the same
+ symbol @var{function}.
+ 
+ @cindex function cell in autoload
+ If @var{function} already has a non-void function definition that is not
+ an autoload object, @code{autoload} does nothing and returns @code{nil}.
+ If the function cell of @var{function} is void, or is already an autoload
+ object, then it is defined as an autoload object like this:
+ 
+ @example
+ (autoload @var{filename} @var{docstring} @var{interactive} @var{type})
+ @end example
+ 
+ For example, 
+ 
+ @example
+ @group
+ (symbol-function 'run-prolog)
+      @result{} (autoload "prolog" 169681 t nil)
+ @end group
+ @end example
+ 
+ @noindent
+ In this case, @code{"prolog"} is the name of the file to load, 169681
+ refers to the documentation string in the @file{emacs/etc/DOC} file
+ (@pxref{Documentation Basics}), @code{t} means the function is
+ interactive, and @code{nil} that it is not a macro or a keymap.
+ @end defun
+ 
+ @cindex autoload errors
+   The autoloaded file usually contains other definitions and may require
+ or provide one or more features.  If the file is not completely loaded
+ (due to an error in the evaluation of its contents), any function
+ definitions or @code{provide} calls that occurred during the load are
+ undone.  This is to ensure that the next attempt to call any function
+ autoloading from this file will try again to load the file.  If not for
+ this, then some of the functions in the file might appear defined, but
+ they might fail to work properly for the lack of certain subroutines
+ defined later in the file and not loaded successfully.
+ 
+   If the autoloaded file fails to define the desired Lisp function or
+ macro, then an error is signaled with data @code{"Autoloading failed to
+ define function @var{function-name}"}.
+ 
+ @findex update-file-autoloads
+ @findex update-directory-autoloads
+   A magic autoload comment looks like @samp{;;;###autoload}, on a line
+ by itself, just before the real definition of the function in its
+ autoloadable source file.  The command @kbd{M-x update-file-autoloads}
+ writes a corresponding @code{autoload} call into @file{loaddefs.el}.
+ Building Emacs loads @file{loaddefs.el} and thus calls @code{autoload}.
+ @kbd{M-x update-directory-autoloads} is even more powerful; it updates
+ autoloads for all files in the current directory.
+ 
+   The same magic comment can copy any kind of form into
+ @file{loaddefs.el}.  If the form following the magic comment is not a
+ function definition, it is copied verbatim.  You can also use a magic
+ comment to execute a form at build time @emph{without} executing it when
+ the file itself is loaded.  To do this, write the form @dfn{on the same
+ line} as the magic comment.  Since it is in a comment, it does nothing
+ when you load the source file; but @code{update-file-autoloads} copies
+ it to @file{loaddefs.el}, where it is executed while building Emacs.
+ 
+   The following example shows how @code{doctor} is prepared for
+ autoloading with a magic comment:
+ 
+ @smallexample
+ ;;;###autoload
+ (defun doctor ()
+   "Switch to *doctor* buffer and start giving psychotherapy."
+   (interactive)
+   (switch-to-buffer "*doctor*")
+   (doctor-mode))
+ @end smallexample
+ 
+ @noindent
+ Here's what that produces in @file{loaddefs.el}:
+ 
+ @smallexample
+ (autoload 'doctor "doctor"
+   "\
+ Switch to *doctor* buffer and start giving psychotherapy."
+   t)
+ @end smallexample
+ 
+ @noindent
+ The backslash and newline immediately following the double-quote are a
+ convention used only in the preloaded Lisp files such as
+ @file{loaddefs.el}; they tell @code{make-docfile} to put the
+ documentation string in the @file{etc/DOC} file.  @xref{Building Emacs}.
+ 
+ @node Repeated Loading
+ @section Repeated Loading
+ @cindex repeated loading
+ 
+   You may load one file more than once in an Emacs session.  For
+ example, after you have rewritten and reinstalled a function definition
+ by editing it in a buffer, you may wish to return to the original
+ version; you can do this by reloading the file it came from.
+ 
+   When you load or reload files, bear in mind that the @code{load} and
+ @code{load-library} functions automatically load a byte-compiled file
+ rather than a non-compiled file of similar name.  If you rewrite a file
+ that you intend to save and reinstall, remember to byte-compile it if
+ necessary; otherwise you may find yourself inadvertently reloading the
+ older, byte-compiled file instead of your newer, non-compiled file!
+ 
+   When writing the forms in a Lisp library file, keep in mind that the
+ file might be loaded more than once.  For example, the choice of
+ @code{defvar} vs.@: @code{defconst} for defining a variable depends on
+ whether it is desirable to reinitialize the variable if the library is
+ reloaded: @code{defconst} does so, and @code{defvar} does not.
+ (@xref{Defining Variables}.)
+ 
+   The simplest way to add an element to an alist is like this:
+ 
+ @example
+ (setq minor-mode-alist
+       (cons '(leif-mode " Leif") minor-mode-alist))
+ @end example
+ 
+ @noindent
+ But this would add multiple elements if the library is reloaded.
+ To avoid the problem, write this:
+ 
+ @example
+ (or (assq 'leif-mode minor-mode-alist)
+     (setq minor-mode-alist
+           (cons '(leif-mode " Leif") minor-mode-alist)))
+ @end example
+ 
+   To add an element to a list just once, use @code{add-to-list}
+ (@pxref{Setting Variables}).
+ 
+   Occasionally you will want to test explicitly whether a library has
+ already been loaded.  Here's one way to test, in a library, whether it
+ has been loaded before:
+ 
+ @example
+ (defvar foo-was-loaded)
+ 
+ (if (not (boundp 'foo-was-loaded))
+     @var{execute-first-time-only})
+ 
+ (setq foo-was-loaded t)
+ @end example
+ 
+ @noindent
+ If the library uses @code{provide} to provide a named feature, you can
+ use @code{featurep} to test whether the library has been loaded.
+ @ifinfo
+ @xref{Named Features}.
+ @end ifinfo
+ 
+ @node Named Features
+ @section Features
+ @cindex features
+ @cindex requiring features
+ @cindex providing features
+ 
+   @code{provide} and @code{require} are an alternative to
+ @code{autoload} for loading files automatically.  They work in terms of
+ named @dfn{features}.  Autoloading is triggered by calling a specific
+ function, but a feature is loaded the first time another program asks
+ for it by name.
+ 
+   A feature name is a symbol that stands for a collection of functions,
+ variables, etc.  The file that defines them should @dfn{provide} the
+ feature.  Another program that uses them may ensure they are defined by
+ @dfn{requiring} the feature.  This loads the file of definitions if it
+ hasn't been loaded already.
+ 
+   To require the presence of a feature, call @code{require} with the
+ feature name as argument.  @code{require} looks in the global variable
+ @code{features} to see whether the desired feature has been provided
+ already.  If not, it loads the feature from the appropriate file.  This
+ file should call @code{provide} at the top level to add the feature to
+ @code{features}; if it fails to do so, @code{require} signals an error.
+ @cindex load error with require
+ 
+   Features are normally named after the files that provide them, so that
+ @code{require} need not be given the file name.
+ 
+   For example, in @file{emacs/lisp/prolog.el}, 
+ the definition for @code{run-prolog} includes the following code:
+ 
+ @smallexample
+ (defun run-prolog ()
+   "Run an inferior Prolog process, input and output via buffer *prolog*."
+   (interactive)
+   (require 'comint)
+   (switch-to-buffer (make-comint "prolog" prolog-program-name))
+   (inferior-prolog-mode))
+ @end smallexample
+ 
+ @noindent
+ The expression @code{(require 'comint)} loads the file @file{comint.el}
+ if it has not yet been loaded.  This ensures that @code{make-comint} is
+ defined.
+ 
+ The @file{comint.el} file contains the following top-level expression:
+ 
+ @smallexample
+ (provide 'comint)
+ @end smallexample
+ 
+ @noindent
+ This adds @code{comint} to the global @code{features} list, so that
+ @code{(require 'comint)} will henceforth know that nothing needs to be
+ done.
+ 
+ @cindex byte-compiling @code{require}
+   When @code{require} is used at top level in a file, it takes effect
+ when you byte-compile that file (@pxref{Byte Compilation}) as well as
+ when you load it.  This is in case the required package contains macros
+ that the byte compiler must know about.
+ 
+   Although top-level calls to @code{require} are evaluated during
+ byte compilation, @code{provide} calls are not.  Therefore, you can
+ ensure that a file of definitions is loaded before it is byte-compiled
+ by including a @code{provide} followed by a @code{require} for the same
+ feature, as in the following example.
+ 
+ @smallexample
+ @group
+ (provide 'my-feature)  ; @r{Ignored by byte compiler,}
+                        ;   @r{evaluated by @code{load}.}
+ (require 'my-feature)  ; @r{Evaluated by byte compiler.}
+ @end group
+ @end smallexample
+ 
+ @noindent
+ The compiler ignores the @code{provide}, then processes the
+ @code{require} by loading the file in question.  Loading the file does
+ execute the @code{provide} call, so the subsequent @code{require} call
+ does nothing while loading.
+ 
+ @defun provide feature
+ This function announces that @var{feature} is now loaded, or being
+ loaded, into the current Emacs session.  This means that the facilities
+ associated with @var{feature} are or will be available for other Lisp
+ programs.
+ 
+ The direct effect of calling @code{provide} is to add @var{feature} to
+ the front of the list @code{features} if it is not already in the list.
+ The argument @var{feature} must be a symbol.  @code{provide} returns
+ @var{feature}.
+ 
+ @smallexample
+ features
+      @result{} (bar bish)
+ 
+ (provide 'foo)
+      @result{} foo
+ features
+      @result{} (foo bar bish)
+ @end smallexample
+ 
+ When a file is loaded to satisfy an autoload, and it stops due to an
+ error in the evaluating its contents, any function definitions or
+ @code{provide} calls that occurred during the load are undone.
+ @xref{Autoload}.
+ @end defun
+ 
+ @defun require feature &optional filename
+ This function checks whether @var{feature} is present in the current
+ Emacs session (using @code{(featurep @var{feature})}; see below).  If it
+ is not, then @code{require} loads @var{filename} with @code{load}.  If
+ @var{filename} is not supplied, then the name of the symbol
+ @var{feature} is used as the file name to load.
+ 
+ If loading the file fails to provide @var{feature}, @code{require}
+ signals an error, @samp{Required feature @var{feature} was not
+ provided}.
+ @end defun
+ 
+ @defun featurep feature
+ This function returns @code{t} if @var{feature} has been provided in the
+ current Emacs session (i.e., @var{feature} is a member of
+ @code{features}.)
+ @end defun
+ 
+ @defvar features
+ The value of this variable is a list of symbols that are the features
+ loaded in the current Emacs session.  Each symbol was put in this list
+ with a call to @code{provide}.  The order of the elements in the
+ @code{features} list is not significant.
+ @end defvar
+ 
+ @node Unloading
+ @section Unloading
+ @cindex unloading
+ 
+ @c Emacs 19 feature
+   You can discard the functions and variables loaded by a library to
+ reclaim memory for other Lisp objects.  To do this, use the function
+ @code{unload-feature}:
+ 
+ @deffn Command unload-feature feature &optional force
+ This command unloads the library that provided feature @var{feature}.
+ It undefines all functions, macros, and variables defined in that
+ library with @code{defconst}, @code{defvar}, @code{defun},
+ @code{defmacro}, @code{defsubst} and @code{defalias}.  It then restores
+ any autoloads formerly associated with those symbols.  (Loading
+ saves these in the @code{autoload} property of the symbol.)
+ 
+ Ordinarily, @code{unload-feature} refuses to unload a library on which
+ other loaded libraries depend.  (A library @var{a} depends on library
+ @var{b} if @var{a} contains a @code{require} for @var{b}.)  If the
+ optional argument @var{force} is non-@code{nil}, dependencies are
+ ignored and you can unload any library.
+ @end deffn
+ 
+   The @code{unload-feature} function is written in Lisp; its actions are
+ based on the variable @code{load-history}.
+ 
+ @defvar load-history
+ This variable's value is an alist connecting library names with the
+ names of functions and variables they define, the features they provide,
+ and the features they require.
+ 
+ Each element is a list and describes one library.  The @sc{car} of the
+ list is the name of the library, as a string.  The rest of the list is
+ composed of these kinds of objects:
+ 
+ @itemize @bullet
+ @item
+ Symbols that were defined by this library.
+ @item
+ Lists of the form @code{(require . @var{feature})} indicating
+ features that were required.
+ @item
+ Lists of the form @code{(provide . @var{feature})} indicating
+ features that were provided.
+ @end itemize
+ 
+ The value of @code{load-history} may have one element whose @sc{car} is
+ @code{nil}.  This element describes definitions made with
+ @code{eval-buffer} on a buffer that is not visiting a file.
+ @end defvar
+ 
+   The command @code{eval-region} updates @code{load-history}, but does so
+ by adding the symbols defined to the element for the file being visited,
+ rather than replacing that element.
+ 
+ @node Hooks for Loading
+ @section Hooks for Loading
+ @cindex loading hooks
+ @cindex hooks for loading
+ 
+ You can ask for code to be executed if and when a particular library is
+ loaded, by calling @code{eval-after-load}.
+ 
+ @defun eval-after-load library form
+ This function arranges to evaluate @var{form} at the end of loading the
+ library @var{library}, if and when @var{library} is loaded.  If
+ @var{library} is already loaded, it evaluates @var{form} right away.
+ 
+ The library name @var{library} must exactly match the argument of
+ @code{load}.  To get the proper results when an installed library is
+ found by searching @code{load-path}, you should not include any
+ directory names in @var{library}.
+ 
+ An error in @var{form} does not undo the load, but does prevent
+ execution of the rest of @var{form}.
+ @end defun
+ 
+ In general, well-designed Lisp programs should not use this feature.
+ The clean and modular ways to interact with a Lisp library are (1)
+ examine and set the library's variables (those which are meant for
+ outside use), and (2) call the library's functions.  If you wish to
+ do (1), you can do it immediately---there is no need to wait for when
+ the library is loaded.  To do (2), you must load the library (preferably
+ with @code{require}).
+ 
+ But it is ok to use @code{eval-after-load} in your personal customizations
+ if you don't feel they must meet the design standards of programs to be
+ released.
+ 
+ @defvar after-load-alist
+ An alist of expressions to evaluate if and when particular libraries are
+ loaded.  Each element looks like this:
+ 
+ @example
+ (@var{filename} @var{forms}@dots{})
+ @end example
+ 
+ The function @code{load} checks @code{after-load-alist} in order to
+ implement @code{eval-after-load}.
+ @end defvar
+ 
+ @c Emacs 19 feature
Index: emacs/man/elisp-locals.texi
diff -c /dev/null emacs/man/elisp-locals.texi:1.2
*** /dev/null	Fri Aug  2 20:55:03 1996
--- emacs/man/elisp-locals.texi	Thu Aug  1 00:23:03 1996
***************
*** 0 ****
--- 1,150 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/locals
+ @node Standard Buffer-Local Variables, Standard Keymaps, Standard Errors, Top
+ @appendix Buffer-Local Variables
+ @c The title "Standard Buffer-Local Variables" is too long for
+ @c smallbook. --rjc 30mar92
+ 
+   The table below lists the general-purpose Emacs variables that are
+ automatically local (when set) in each buffer.  Many Lisp packages
+ define such variables for their internal use; we don't list them here.
+ 
+ @table @code
+ @item abbrev-mode
+ @pxref{Abbrevs}
+ 
+ @item auto-fill-function
+ @pxref{Auto Filling}
+ 
+ @item buffer-auto-save-file-name
+ @pxref{Auto-Saving}
+ 
+ @item buffer-backed-up
+ @pxref{Backup Files}
+ 
+ @item buffer-display-table
+ @pxref{Display Tables}
+ 
+ @item buffer-file-format
+ @pxref{Format Conversion}
+ 
+ @item buffer-file-name
+ @pxref{Buffer File Name}
+ 
+ @item buffer-file-number
+ @pxref{Buffer File Name}
+ 
+ @item buffer-file-truename
+ @pxref{Buffer File Name}
+ 
+ @item buffer-file-type
+ @pxref{Files and MS-DOS}
+ 
+ @item buffer-invisibility-spec
+ @pxref{Invisible Text}
+ 
+ @item buffer-offer-save
+ @pxref{Saving Buffers}
+ 
+ @item buffer-read-only
+ @pxref{Read Only Buffers}
+ 
+ @item buffer-saved-size
+ @pxref{Point}
+ 
+ @item buffer-undo-list
+ @pxref{Undo}
+ 
+ @item cache-long-line-scans
+ @pxref{Text Lines}
+ 
+ @item case-fold-search
+ @pxref{Searching and Case}
+ 
+ @item ctl-arrow
+ @pxref{Usual Display}
+ 
+ @item comment-column
+ @pxref{Comments,,, emacs, The GNU Emacs Manual}
+ 
+ @item default-directory
+ @pxref{System Environment}
+ 
+ @item defun-prompt-regexp
+ @pxref{List Motion}
+ 
+ @item fill-column
+ @pxref{Auto Filling}
+ 
+ @item goal-column
+ @pxref{Moving Point,,, emacs, The GNU Emacs Manual}
+ 
+ @item left-margin
+ @pxref{Indentation}
+ 
+ @item local-abbrev-table
+ @pxref{Abbrevs}
+ 
+ @item local-write-file-hooks
+ @pxref{Saving Buffers}
+ 
+ @item major-mode
+ @pxref{Mode Help}
+ 
+ @item mark-active
+ @pxref{The Mark}
+ 
+ @item mark-ring
+ @pxref{The Mark}
+ 
+ @item minor-modes
+ @pxref{Minor Modes}
+ 
+ @item mode-line-buffer-identification
+ @pxref{Mode Line Variables}
+ 
+ @item mode-line-format
+ @pxref{Mode Line Data}
+ 
+ @item mode-line-modified
+ @pxref{Mode Line Variables}
+ 
+ @item mode-line-process
+ @pxref{Mode Line Variables}
+ 
+ @item mode-name
+ @pxref{Mode Line Variables}
+ 
+ @item overwrite-mode
+ @pxref{Insertion}
+ 
+ @item paragraph-separate
+ @pxref{Standard Regexps}
+ 
+ @item paragraph-start
+ @pxref{Standard Regexps}
+ 
+ @item point-before-scroll
+ Used for communication between mouse commands and scroll-bar commands.
+ 
+ @item require-final-newline
+ @pxref{Insertion}
+ 
+ @item selective-display
+ @pxref{Selective Display}
+ 
+ @item selective-display-ellipses
+ @pxref{Selective Display}
+ 
+ @item tab-width
+ @pxref{Usual Display}
+ 
+ @item truncate-lines
+ @pxref{Truncation}
+ 
+ @item vc-mode
+ @pxref{Mode Line Variables}
+ @end table
Index: emacs/man/elisp-macros.texi
diff -c /dev/null emacs/man/elisp-macros.texi:1.2
*** /dev/null	Fri Aug  2 20:55:05 1996
--- emacs/man/elisp-macros.texi	Thu Aug  1 00:23:04 1996
***************
*** 0 ****
--- 1,579 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/macros
+ @node Macros, Loading, Functions, Top
+ @chapter Macros
+ @cindex macros
+ 
+   @dfn{Macros} enable you to define new control constructs and other
+ language features.  A macro is defined much like a function, but instead
+ of telling how to compute a value, it tells how to compute another Lisp
+ expression which will in turn compute the value.  We call this
+ expression the @dfn{expansion} of the macro.
+ 
+   Macros can do this because they operate on the unevaluated expressions
+ for the arguments, not on the argument values as functions do.  They can
+ therefore construct an expansion containing these argument expressions
+ or parts of them.
+ 
+   If you are using a macro to do something an ordinary function could
+ do, just for the sake of speed, consider using an inline function
+ instead.  @xref{Inline Functions}.
+ 
+ @menu
+ * Simple Macro::            A basic example.
+ * Expansion::               How, when and why macros are expanded.
+ * Compiling Macros::        How macros are expanded by the compiler.
+ * Defining Macros::         How to write a macro definition.
+ * Backquote::               Easier construction of list structure.
+ * Problems with Macros::    Don't evaluate the macro arguments too many times.
+                               Don't hide the user's variables.
+ @end menu
+ 
+ @node Simple Macro
+ @section A Simple Example of a Macro
+ 
+   Suppose we would like to define a Lisp construct to increment a
+ variable value, much like the @code{++} operator in C.  We would like to
+ write @code{(inc x)} and have the effect of @code{(setq x (1+ x))}.
+ Here's a macro definition that does the job:
+ 
+ @findex inc
+ @example
+ @group
+ (defmacro inc (var)
+    (list 'setq var (list '1+ var)))
+ @end group
+ @end example
+ 
+   When this is called with @code{(inc x)}, the argument @code{var} has
+ the value @code{x}---@emph{not} the @emph{value} of @code{x}.  The body
+ of the macro uses this to construct the expansion, which is @code{(setq
+ x (1+ x))}.  Once the macro definition returns this expansion, Lisp
+ proceeds to evaluate it, thus incrementing @code{x}.
+ 
+ @node Expansion
+ @section Expansion of a Macro Call
+ @cindex expansion of macros
+ @cindex macro call
+ 
+   A macro call looks just like a function call in that it is a list which
+ starts with the name of the macro.  The rest of the elements of the list
+ are the arguments of the macro.
+ 
+   Evaluation of the macro call begins like evaluation of a function call
+ except for one crucial difference: the macro arguments are the actual
+ expressions appearing in the macro call.  They are not evaluated before
+ they are given to the macro definition.  By contrast, the arguments of a
+ function are results of evaluating the elements of the function call
+ list.
+ 
+   Having obtained the arguments, Lisp invokes the macro definition just
+ as a function is invoked.  The argument variables of the macro are bound
+ to the argument values from the macro call, or to a list of them in the
+ case of a @code{&rest} argument.  And the macro body executes and
+ returns its value just as a function body does.
+ 
+   The second crucial difference between macros and functions is that the
+ value returned by the macro body is not the value of the macro call.
+ Instead, it is an alternate expression for computing that value, also
+ known as the @dfn{expansion} of the macro.  The Lisp interpreter
+ proceeds to evaluate the expansion as soon as it comes back from the
+ macro.
+ 
+   Since the expansion is evaluated in the normal manner, it may contain
+ calls to other macros.  It may even be a call to the same macro, though
+ this is unusual.
+ 
+   You can see the expansion of a given macro call by calling
+ @code{macroexpand}.
+ 
+ @defun macroexpand form &optional environment
+ @cindex macro expansion
+ This function expands @var{form}, if it is a macro call.  If the result
+ is another macro call, it is expanded in turn, until something which is
+ not a macro call results.  That is the value returned by
+ @code{macroexpand}.  If @var{form} is not a macro call to begin with, it
+ is returned as given.
+ 
+ Note that @code{macroexpand} does not look at the subexpressions of
+ @var{form} (although some macro definitions may do so).  Even if they
+ are macro calls themselves, @code{macroexpand} does not expand them.
+ 
+ The function @code{macroexpand} does not expand calls to inline functions.
+ Normally there is no need for that, since a call to an inline function is
+ no harder to understand than a call to an ordinary function.
+ 
+ If @var{environment} is provided, it specifies an alist of macro
+ definitions that shadow the currently defined macros.  Byte compilation
+ uses this feature.
+ 
+ @smallexample
+ @group
+ (defmacro inc (var)
+     (list 'setq var (list '1+ var)))
+      @result{} inc
+ @end group
+ 
+ @group
+ (macroexpand '(inc r))
+      @result{} (setq r (1+ r))
+ @end group
+ 
+ @group
+ (defmacro inc2 (var1 var2)
+     (list 'progn (list 'inc var1) (list 'inc var2)))
+      @result{} inc2
+ @end group
+ 
+ @group
+ (macroexpand '(inc2 r s))
+      @result{} (progn (inc r) (inc s))  ; @r{@code{inc} not expanded here.}
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Compiling Macros
+ @section Macros and Byte Compilation
+ @cindex byte-compiling macros
+ 
+   You might ask why we take the trouble to compute an expansion for a
+ macro and then evaluate the expansion.  Why not have the macro body
+ produce the desired results directly?  The reason has to do with
+ compilation.
+ 
+   When a macro call appears in a Lisp program being compiled, the Lisp
+ compiler calls the macro definition just as the interpreter would, and
+ receives an expansion.  But instead of evaluating this expansion, it
+ compiles the expansion as if it had appeared directly in the program.
+ As a result, the compiled code produces the value and side effects
+ intended for the macro, but executes at full compiled speed.  This would
+ not work if the macro body computed the value and side effects
+ itself---they would be computed at compile time, which is not useful.
+ 
+   In order for compilation of macro calls to work, the macros must be
+ defined in Lisp when the calls to them are compiled.  The compiler has a
+ special feature to help you do this: if a file being compiled contains a
+ @code{defmacro} form, the macro is defined temporarily for the rest of
+ the compilation of that file.  To use this feature, you must define the
+ macro in the same file where it is used and before its first use.
+ 
+   Byte-compiling a file executes any @code{require} calls at top-level
+ in the file.  This is in case the file needs the required packages for
+ proper compilation.  One way to ensure that necessary macro definitions
+ are available during compilation is to require the files that define
+ them (@pxref{Named Features}).  To avoid loading the macro definition files
+ when someone @emph{runs} the compiled program, write
+ @code{eval-when-compile} around the @code{require} calls (@pxref{Eval
+ During Compile}).
+ 
+ @node Defining Macros
+ @section Defining Macros
+ 
+   A Lisp macro is a list whose @sc{car} is @code{macro}.  Its @sc{cdr} should
+ be a function; expansion of the macro works by applying the function
+ (with @code{apply}) to the list of unevaluated argument-expressions
+ from the macro call.
+ 
+   It is possible to use an anonymous Lisp macro just like an anonymous
+ function, but this is never done, because it does not make sense to pass
+ an anonymous macro to functionals such as @code{mapcar}.  In practice,
+ all Lisp macros have names, and they are usually defined with the
+ special form @code{defmacro}.
+ 
+ @defspec defmacro name argument-list body-forms@dots{}
+ @code{defmacro} defines the symbol @var{name} as a macro that looks
+ like this:
+ 
+ @example
+ (macro lambda @var{argument-list} . @var{body-forms})
+ @end example
+ 
+ This macro object is stored in the function cell of @var{name}.  The
+ value returned by evaluating the @code{defmacro} form is @var{name}, but
+ usually we ignore this value.
+ 
+ The shape and meaning of @var{argument-list} is the same as in a
+ function, and the keywords @code{&rest} and @code{&optional} may be used
+ (@pxref{Argument List}).  Macros may have a documentation string, but
+ any @code{interactive} declaration is ignored since macros cannot be
+ called interactively.
+ @end defspec
+ 
+ @node Backquote
+ @section Backquote
+ @cindex backquote (list substitution)
+ @cindex ` (list substitution)
+ @findex `
+ 
+   Macros often need to construct large list structures from a mixture of
+ constants and nonconstant parts.  To make this easier, use the macro
+ @samp{`} (often called @dfn{backquote}).
+ 
+   Backquote allows you to quote a list, but selectively evaluate
+ elements of that list.  In the simplest case, it is identical to the
+ special form @code{quote} (@pxref{Quoting}).  For example, these
+ two forms yield identical results:
+ 
+ @example
+ @group
+ `(a list of (+ 2 3) elements)
+      @result{} (a list of (+ 2 3) elements)
+ @end group
+ @group
+ '(a list of (+ 2 3) elements)
+      @result{} (a list of (+ 2 3) elements)
+ @end group
+ @end example
+ 
+ @findex , @r{(with Backquote)}
+ The special marker @samp{,} inside of the argument to backquote
+ indicates a value that isn't constant.  Backquote evaluates the
+ argument of @samp{,} and puts the value in the list structure:
+ 
+ @example
+ @group
+ (list 'a 'list 'of (+ 2 3) 'elements)
+      @result{} (a list of 5 elements)
+ @end group
+ @group
+ `(a list of ,(+ 2 3) elements)
+      @result{} (a list of 5 elements)
+ @end group
+ @end example
+ 
+ @findex ,@@ @r{(with Backquote)}
+ @cindex splicing (with backquote)
+ You can also @dfn{splice} an evaluated value into the resulting list,
+ using the special marker @samp{,@@}.  The elements of the spliced list
+ become elements at the same level as the other elements of the resulting
+ list.  The equivalent code without using @samp{`} is often unreadable.
+ Here are some examples:
+ 
+ @example
+ @group
+ (setq some-list '(2 3))
+      @result{} (2 3)
+ @end group
+ @group
+ (cons 1 (append some-list '(4) some-list))
+      @result{} (1 2 3 4 2 3)
+ @end group
+ @group
+ `(1 ,@@some-list 4 ,@@some-list)
+      @result{} (1 2 3 4 2 3)
+ @end group
+ 
+ @group
+ (setq list '(hack foo bar))
+      @result{} (hack foo bar)
+ @end group
+ @group
+ (cons 'use
+   (cons 'the
+     (cons 'words (append (cdr list) '(as elements)))))
+      @result{} (use the words foo bar as elements)
+ @end group
+ @group
+ `(use the words ,@@(cdr list) as elements)
+      @result{} (use the words foo bar as elements)
+ @end group
+ @end example
+ 
+ @quotation
+ Before Emacs version 19.29, @samp{`} used a different syntax which
+ required an extra level of parentheses around the entire backquote
+ construct.  Likewise, each @samp{,} or @samp{,@@} substition required an
+ extra level of parentheses surrounding both the @samp{,} or @samp{,@@}
+ and the following expression.  The old syntax required whitespace
+ between the @samp{`}, @samp{,} or @samp{,@@} and the following
+ expression.
+ 
+ This syntax is still accepted, but no longer recommended except for
+ compatibility with old Emacs versions.
+ @end quotation
+ 
+ @node Problems with Macros
+ @section Common Problems Using Macros
+ 
+   The basic facts of macro expansion have counterintuitive consequences.
+ This section describes some important consequences that can lead to
+ trouble, and rules to follow to avoid trouble.
+ 
+ @menu
+ * Argument Evaluation::    The expansion should evaluate each macro arg once.
+ * Surprising Local Vars::  Local variable bindings in the expansion
+                               require special care.
+ * Eval During Expansion::  Don't evaluate them; put them in the expansion.
+ * Repeated Expansion::     Avoid depending on how many times expansion is done.
+ @end menu
+ 
+ @node Argument Evaluation
+ @subsection Evaluating Macro Arguments Repeatedly
+ 
+   When defining a macro you must pay attention to the number of times
+ the arguments will be evaluated when the expansion is executed.  The
+ following macro (used to facilitate iteration) illustrates the problem.
+ This macro allows us to write a simple ``for'' loop such as one might
+ find in Pascal.
+ 
+ @findex for
+ @smallexample
+ @group
+ (defmacro for (var from init to final do &rest body)
+   "Execute a simple \"for\" loop.
+ For example, (for i from 1 to 10 do (print i))."
+   (list 'let (list (list var init))
+         (cons 'while (cons (list '<= var final)
+                            (append body (list (list 'inc var)))))))
+ @end group
+ @result{} for
+ 
+ @group
+ (for i from 1 to 3 do
+    (setq square (* i i))
+    (princ (format "\n%d %d" i square)))
+ @expansion{}
+ @end group
+ @group
+ (let ((i 1))
+   (while (<= i 3)
+     (setq square (* i i))
+     (princ (format "%d      %d" i square))
+     (inc i)))
+ @end group
+ @group
+ 
+      @print{}1       1
+      @print{}2       4
+      @print{}3       9
+ @result{} nil
+ @end group
+ @end smallexample
+ 
+ @noindent
+ (The arguments @code{from}, @code{to}, and @code{do} in this macro are
+ ``syntactic sugar''; they are entirely ignored.  The idea is that you
+ will write noise words (such as @code{from}, @code{to}, and @code{do})
+ in those positions in the macro call.)
+ 
+ Here's an equivalent definition simplified through use of backquote:
+ 
+ @smallexample
+ @group
+ (defmacro for (var from init to final do &rest body)
+   "Execute a simple \"for\" loop.
+ For example, (for i from 1 to 10 do (print i))."
+   `(let ((,var ,init))
+      (while (<= ,var ,final)
+        ,@@body
+        (inc ,var))))
+ @end group
+ @end smallexample
+ 
+ Both forms of this definition (with backquote and without) suffer from
+ the defect that @var{final} is evaluated on every iteration.  If
+ @var{final} is a constant, this is not a problem.  If it is a more
+ complex form, say @code{(long-complex-calculation x)}, this can slow
+ down the execution significantly.  If @var{final} has side effects,
+ executing it more than once is probably incorrect.
+ 
+ @cindex macro argument evaluation
+ A well-designed macro definition takes steps to avoid this problem by
+ producing an expansion that evaluates the argument expressions exactly
+ once unless repeated evaluation is part of the intended purpose of the
+ macro.  Here is a correct expansion for the @code{for} macro:
+ 
+ @smallexample
+ @group
+ (let ((i 1)
+       (max 3))
+   (while (<= i max)
+     (setq square (* i i))
+     (princ (format "%d      %d" i square))
+     (inc i)))
+ @end group
+ @end smallexample
+ 
+ Here is a macro definition that creates this expansion: 
+ 
+ @smallexample
+ @group
+ (defmacro for (var from init to final do &rest body)
+   "Execute a simple for loop: (for i from 1 to 10 do (print i))."
+   `(let ((,var ,init)
+          (max ,final))
+      (while (<= ,var max)
+        ,@@body
+        (inc ,var))))
+ @end group
+ @end smallexample
+ 
+   Unfortunately, this introduces another problem.
+ @ifinfo
+ Proceed to the following node.
+ @end ifinfo
+ 
+ @node Surprising Local Vars
+ @subsection Local Variables in Macro Expansions
+ 
+ @ifinfo
+   In the previous section, the definition of @code{for} was fixed as
+ follows to make the expansion evaluate the macro arguments the proper
+ number of times:
+ 
+ @smallexample
+ @group
+ (defmacro for (var from init to final do &rest body)
+   "Execute a simple for loop: (for i from 1 to 10 do (print i))."
+ @end group
+ @group
+   `(let ((,var ,init)
+          (max ,final))
+      (while (<= ,var max)
+        ,@@body
+        (inc ,var))))
+ @end group
+ @end smallexample
+ @end ifinfo
+ 
+   The new definition of @code{for} has a new problem: it introduces a
+ local variable named @code{max} which the user does not expect.  This
+ causes trouble in examples such as the following:
+ 
+ @smallexample
+ @group
+ (let ((max 0))
+   (for x from 0 to 10 do
+     (let ((this (frob x)))
+       (if (< max this)
+           (setq max this)))))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ The references to @code{max} inside the body of the @code{for}, which
+ are supposed to refer to the user's binding of @code{max}, really access
+ the binding made by @code{for}.
+ 
+ The way to correct this is to use an uninterned symbol instead of
+ @code{max} (@pxref{Creating Symbols}).  The uninterned symbol can be
+ bound and referred to just like any other symbol, but since it is
+ created by @code{for}, we know that it cannot already appear in the
+ user's program.  Since it is not interned, there is no way the user can
+ put it into the program later.  It will never appear anywhere except
+ where put by @code{for}.  Here is a definition of @code{for} that works
+ this way:
+ 
+ @smallexample
+ @group
+ (defmacro for (var from init to final do &rest body)
+   "Execute a simple for loop: (for i from 1 to 10 do (print i))."
+   (let ((tempvar (make-symbol "max")))
+     `(let ((,var ,init)
+            (,tempvar ,final))
+        (while (<= ,var ,tempvar)
+          ,@@body
+          (inc ,var)))))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ This creates an uninterned symbol named @code{max} and puts it in the
+ expansion instead of the usual interned symbol @code{max} that appears
+ in expressions ordinarily.
+ 
+ @node Eval During Expansion
+ @subsection Evaluating Macro Arguments in Expansion
+ 
+   Another problem can happen if you evaluate any of the macro argument
+ expressions during the computation of the expansion, such as by calling
+ @code{eval} (@pxref{Eval}).  If the argument is supposed to refer to the
+ user's variables, you may have trouble if the user happens to use a
+ variable with the same name as one of the macro arguments.  Inside the
+ macro body, the macro argument binding is the most local binding of this
+ variable, so any references inside the form being evaluated do refer
+ to it.  Here is an example:
+ 
+ @example
+ @group
+ (defmacro foo (a)
+   (list 'setq (eval a) t))
+      @result{} foo
+ @end group
+ @group
+ (setq x 'b)
+ (foo x) @expansion{} (setq b t)
+      @result{} t                  ; @r{and @code{b} has been set.}
+ ;; @r{but}
+ (setq a 'c)
+ (foo a) @expansion{} (setq a t)
+      @result{} t                  ; @r{but this set @code{a}, not @code{c}.}
+ 
+ @end group
+ @end example
+ 
+   It makes a difference whether the user's variable is named @code{a} or
+ @code{x}, because @code{a} conflicts with the macro argument variable
+ @code{a}.
+ 
+   Another reason not to call @code{eval} in a macro definition is that
+ it probably won't do what you intend in a compiled program.  The
+ byte-compiler runs macro definitions while compiling the program, when
+ the program's own computations (which you might have wished to access
+ with @code{eval}) don't occur and its local variable bindings don't
+ exist.
+ 
+   The safe way to work with the run-time value of an expression is to
+ put the expression into the macro expansion, so that its value is
+ computed as part of executing the expansion.
+ 
+ @node Repeated Expansion
+ @subsection How Many Times is the Macro Expanded?
+ 
+   Occasionally problems result from the fact that a macro call is
+ expanded each time it is evaluated in an interpreted function, but is
+ expanded only once (during compilation) for a compiled function.  If the
+ macro definition has side effects, they will work differently depending
+ on how many times the macro is expanded.
+ 
+   In particular, constructing objects is a kind of side effect.  If the
+ macro is called once, then the objects are constructed only once.  In
+ other words, the same structure of objects is used each time the macro
+ call is executed.  In interpreted operation, the macro is reexpanded
+ each time, producing a fresh collection of objects each time.  Usually
+ this does not matter---the objects have the same contents whether they
+ are shared or not.  But if the surrounding program does side effects
+ on the objects, it makes a difference whether they are shared.  Here is
+ an example:
+ 
+ @lisp
+ @group
+ (defmacro empty-object ()
+   (list 'quote (cons nil nil)))
+ @end group
+ 
+ @group
+ (defun initialize (condition)
+   (let ((object (empty-object)))
+     (if condition
+         (setcar object condition))
+     object))
+ @end group
+ @end lisp
+ 
+ @noindent
+ If @code{initialize} is interpreted, a new list @code{(nil)} is
+ constructed each time @code{initialize} is called.  Thus, no side effect
+ survives between calls.  If @code{initialize} is compiled, then the
+ macro @code{empty-object} is expanded during compilation, producing a
+ single ``constant'' @code{(nil)} that is reused and altered each time
+ @code{initialize} is called.
+ 
+ One way to avoid pathological cases like this is to think of
+ @code{empty-object} as a funny kind of constant, not as a memory
+ allocation construct.  You wouldn't use @code{setcar} on a constant such
+ as @code{'(nil)}, so naturally you won't use it on @code{(empty-object)}
+ either.
Index: emacs/man/elisp-maps.texi
diff -c /dev/null emacs/man/elisp-maps.texi:1.2
*** /dev/null	Fri Aug  2 20:55:16 1996
--- emacs/man/elisp-maps.texi	Thu Aug  1 00:23:06 1996
***************
*** 0 ****
--- 1,190 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/maps
+ @node Standard Keymaps, Standard Hooks, Standard Buffer-Local Variables, Top
+ @appendix Standard Keymaps
+ 
+ The following symbols are used as the names for various keymaps.
+ Some of these exist when Emacs is first started, others are
+ loaded only when their respective mode is used.  This is not
+ an exhaustive list.
+ 
+ Almost all of these maps are used as local maps.  Indeed, of the modes
+ that presently exist, only Vip mode and Terminal mode ever change the
+ global keymap.
+ 
+ @table @code
+ @item Buffer-menu-mode-map
+ @vindex Buffer-menu-mode-map
+ A full keymap used by Buffer Menu mode.
+ 
+ @item c-mode-map
+ @vindex c-mode-map
+ A sparse keymap used by C mode.
+ 
+ @item command-history-map
+ @vindex command-history-map
+ A full keymap used by Command History mode.
+ 
+ @item ctl-x-4-map
+ @vindex ctl-x-4-map
+ A sparse keymap for subcommands of the prefix @kbd{C-x 4}.
+ 
+ @item ctl-x-5-map
+ @vindex ctl-x-5-map
+ A sparse keymap for subcommands of the prefix @kbd{C-x 5}.
+ 
+ @item ctl-x-map
+ @vindex ctl-x-map
+ A full keymap for @kbd{C-x} commands.
+ 
+ @item debugger-mode-map
+ @vindex debugger-mode-map
+ A full keymap used by Debugger mode.
+ 
+ @item dired-mode-map
+ @vindex dired-mode-map
+ A full keymap for @code{dired-mode} buffers.
+ 
+ @item edit-abbrevs-map
+ @vindex edit-abbrevs-map
+ A sparse keymap used in @code{edit-abbrevs}.
+ 
+ @item edit-tab-stops-map
+ @vindex edit-tab-stops-map
+ A sparse keymap used in @code{edit-tab-stops}.
+ 
+ @item electric-buffer-menu-mode-map
+ @vindex electric-buffer-menu-mode-map
+ A full keymap used by Electric Buffer Menu mode.
+ 
+ @item electric-history-map
+ @vindex electric-history-map
+ A full keymap used by Electric Command History mode.
+ 
+ @item emacs-lisp-mode-map
+ @vindex emacs-lisp-mode-map
+ A sparse keymap used by Emacs Lisp mode.
+ 
+ @item facemenu-menu
+ @vindex facemenu-menu
+ The keymap that displays the Text Properties menu.
+ 
+ @item facemenu-background-menu
+ @vindex facemenu-background-menu
+ The keymap that displays the Background Color submenu of the Text
+ Properties menu.
+ 
+ @item facemenu-face-menu
+ @vindex facemenu-face-menu
+ The keymap that displays the Face submenu of the Text Properties menu.
+ 
+ @item facemenu-foreground-menu
+ @vindex facemenu-foreground-menu
+ The keymap that displays the Foreground Color submenu of the Text
+ Properties menu.
+ 
+ @item facemenu-indentation-menu
+ @vindex facemenu-indentation-menu
+ The keymap that displays the Indentation submenu of the Text Properties menu.
+ 
+ @item facemenu-justification-menu
+ @vindex facemenu-justification-menu
+ The keymap that displays the Justification submenu of the Text
+ Properties menu.
+ 
+ @item facemenu-special-menu
+ @vindex facemenu-special-menu
+ The keymap that displays the Special Props submenu of the Text
+ Properties menu.
+ 
+ @item function-key-map
+ @vindex function-key-map
+ The keymap for translating keypad and function keys.@*
+ If there are none, then it contains an empty sparse keymap.
+ 
+ @item fundamental-mode-map
+ @vindex fundamental-mode-map
+ The local keymap for Fundamental mode.@*
+ It is empty and should not be changed.
+ 
+ @item Helper-help-map
+ @vindex Helper-help-map
+ A full keymap used by the help utility package.@*
+ It has the same keymap in its value cell and in its function
+ cell.
+ 
+ @item Info-edit-map
+ @vindex Info-edit-map
+ A sparse keymap used by the @kbd{e} command of Info.
+ 
+ @item Info-mode-map
+ @vindex Info-mode-map
+ A sparse keymap containing Info commands.
+ 
+ @item isearch-mode-map
+ @vindex isearch-mode-map
+ A keymap that defines the characters you can type within incremental
+ search.
+ 
+ @item key-translation-map
+ @vindex key-translation-map
+ A keymap for translating keys.  This one overrides ordinary key
+ bindings, unlike @code{function-key-map}.
+ 
+ @item lisp-interaction-mode-map
+ @vindex lisp-interaction-mode-map
+ A sparse keymap used by Lisp mode.
+ 
+ @item lisp-mode-map
+ @vindex lisp-mode-map
+ A sparse keymap used by Lisp mode.
+ 
+ @item menu-bar-edit-menu
+ @vindex menu-bar-edit-menu
+ The keymap which displays the Edit menu in the menu bar.
+ 
+ @item menu-bar-files-menu
+ @vindex menu-bar-files-menu
+ The keymap which displays the Files menu in the menu bar.
+ 
+ @item menu-bar-help-menu
+ @vindex menu-bar-help-menu
+ The keymap which displays the Help menu in the menu bar.
+ 
+ @item menu-bar-search-menu
+ @vindex menu-bar-search-menu
+ The keymap which displays the Search menu in the menu bar.
+ 
+ @item menu-bar-tools-menu
+ @vindex menu-bar-tools-menu
+ The keymap which displays the Tools menu in the menu bar.
+ 
+ @item mode-specific-map
+ @vindex mode-specific-map
+ The keymap for characters following @kbd{C-c}.  Note, this is in the
+ global map.  This map is not actually mode specific: its name was chosen
+ to be informative for the user in @kbd{C-h b} (@code{display-bindings}),
+ where it describes the main use of the @kbd{C-c} prefix key.
+ 
+ @item occur-mode-map
+ @vindex occur-mode-map
+ A local keymap used by Occur mode.
+ 
+ @item query-replace-map
+ @vindex query-replace-map
+ A local keymap used for responses in @code{query-replace} and related
+ commands; also for @code{y-or-n-p} and @code{map-y-or-n-p}.  The functions
+ that use this map do not support prefix keys; they look up one event at a
+ time.
+ 
+ @item text-mode-map
+ @vindex text-mode-map
+ A sparse keymap used by Text mode.
+ 
+ @item view-mode-map
+ @vindex view-mode-map
+ A full keymap used by View mode.
+ @end table
Index: emacs/man/elisp-markers.texi
diff -c /dev/null emacs/man/elisp-markers.texi:1.2
*** /dev/null	Fri Aug  2 20:55:20 1996
--- emacs/man/elisp-markers.texi	Thu Aug  1 00:23:07 1996
***************
*** 0 ****
--- 1,579 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/markers
+ @node Markers, Text, Positions, Top
+ @chapter Markers
+ @cindex markers
+ 
+   A @dfn{marker} is a Lisp object used to specify a position in a buffer
+ relative to the surrounding text.  A marker changes its offset from the
+ beginning of the buffer automatically whenever text is inserted or
+ deleted, so that it stays with the two characters on either side of it.
+ 
+ @menu
+ * Overview of Markers::      The components of a marker, and how it relocates.
+ * Predicates on Markers::    Testing whether an object is a marker.
+ * Creating Markers::         Making empty markers or markers at certain places.
+ * Information from Markers:: Finding the marker's buffer or character position.
+ * Changing Markers::         Moving the marker to a new buffer or position.
+ * The Mark::                 How ``the mark'' is implemented with a marker.
+ * The Region::               How to access ``the region''.
+ @end menu
+ 
+ @node Overview of Markers
+ @section Overview of Markers
+ 
+   A marker specifies a buffer and a position in that buffer.  The marker
+ can be used to represent a position in the functions that require one,
+ just as an integer could be used.  @xref{Positions}, for a complete
+ description of positions.
+ 
+   A marker has two attributes: the marker position, and the marker
+ buffer.  The marker position is an integer that is equivalent (at a
+ given time) to the marker as a position in that buffer.  But the
+ marker's position value can change often during the life of the marker.
+ Insertion and deletion of text in the buffer relocate the marker.  The
+ idea is that a marker positioned between two characters remains between
+ those two characters despite insertion and deletion elsewhere in the
+ buffer.  Relocation changes the integer equivalent of the marker.
+ 
+ @cindex marker relocation
+   Deleting text around a marker's position leaves the marker between the
+ characters immediately before and after the deleted text.  Inserting
+ text at the position of a marker normally leaves the marker in front of
+ the new text---unless it is inserted with @code{insert-before-markers}
+ (@pxref{Insertion}).
+ 
+ @cindex marker garbage collection
+   Insertion and deletion in a buffer must check all the markers and
+ relocate them if necessary.  This slows processing in a buffer with a
+ large number of markers.  For this reason, it is a good idea to make a
+ marker point nowhere if you are sure you don't need it any more.
+ Unreferenced markers are garbage collected eventually, but until then
+ will continue to use time if they do point somewhere.
+ 
+ @cindex markers as numbers
+   Because it is common to perform arithmetic operations on a marker
+ position, most of the arithmetic operations (including @code{+} and
+ @code{-}) accept markers as arguments.  In such cases, the marker
+ stands for its current position.
+ 
+ Here are examples of creating markers, setting markers, and moving point
+ to markers:
+ 
+ @example
+ @group
+ ;; @r{Make a new marker that initially does not point anywhere:}
+ (setq m1 (make-marker))
+      @result{} #<marker in no buffer>
+ @end group
+ 
+ @group
+ ;; @r{Set @code{m1} to point between the 99th and 100th characters}
+ ;;   @r{in the current buffer:}
+ (set-marker m1 100)
+      @result{} #<marker at 100 in markers.texi>
+ @end group
+ 
+ @group
+ ;; @r{Now insert one character at the beginning of the buffer:}
+ (goto-char (point-min))
+      @result{} 1
+ (insert "Q")
+      @result{} nil
+ @end group
+ 
+ @group
+ ;; @r{@code{m1} is updated appropriately.}
+ m1
+      @result{} #<marker at 101 in markers.texi>
+ @end group
+ 
+ @group
+ ;; @r{Two markers that point to the same position}
+ ;;   @r{are not @code{eq}, but they are @code{equal}.}
+ (setq m2 (copy-marker m1))
+      @result{} #<marker at 101 in markers.texi>
+ (eq m1 m2)
+      @result{} nil
+ (equal m1 m2)
+      @result{} t
+ @end group
+ 
+ @group
+ ;; @r{When you are finished using a marker, make it point nowhere.}
+ (set-marker m1 nil)
+      @result{} #<marker in no buffer>
+ @end group
+ @end example
+ 
+ @node Predicates on Markers
+ @section Predicates on Markers
+ 
+   You can test an object to see whether it is a marker, or whether it is
+ either an integer or a marker.  The latter test is useful in connection
+ with the arithmetic functions that work with both markers and integers.
+ 
+ @defun markerp object
+ This function returns @code{t} if @var{object} is a marker, @code{nil}
+ otherwise.  Note that integers are not markers, even though many
+ functions will accept either a marker or an integer.
+ @end defun
+ 
+ @defun integer-or-marker-p object
+ This function returns @code{t} if @var{object} is an integer or a marker,
+ @code{nil} otherwise.
+ @end defun
+ 
+ @defun number-or-marker-p object
+ This function returns @code{t} if @var{object} is a number (either kind)
+ or a marker, @code{nil} otherwise.
+ @end defun
+ 
+ @node Creating Markers
+ @section Functions That Create Markers
+ 
+   When you create a new marker, you can make it point nowhere, or point
+ to the present position of point, or to the beginning or end of the
+ accessible portion of the buffer, or to the same place as another given
+ marker.
+ 
+ @defun make-marker
+ This functions returns a newly created marker that does not point
+ anywhere.
+ 
+ @example
+ @group
+ (make-marker)
+      @result{} #<marker in no buffer>
+ @end group
+ @end example
+ @end defun
+ 
+ @defun point-marker
+ This function returns a new marker that points to the present position
+ of point in the current buffer.  @xref{Point}.  For an example, see
+ @code{copy-marker}, below.
+ @end defun
+ 
+ @defun point-min-marker
+ This function returns a new marker that points to the beginning of the
+ accessible portion of the buffer.  This will be the beginning of the
+ buffer unless narrowing is in effect.  @xref{Narrowing}.
+ @end defun
+ 
+ @defun point-max-marker
+ @cindex end of buffer marker
+ This function returns a new marker that points to the end of the
+ accessible portion of the buffer.  This will be the end of the buffer
+ unless narrowing is in effect.  @xref{Narrowing}.
+ 
+ Here are examples of this function and @code{point-min-marker}, shown in
+ a buffer containing a version of the source file for the text of this
+ chapter.
+ 
+ @example
+ @group
+ (point-min-marker)
+      @result{} #<marker at 1 in markers.texi>
+ (point-max-marker)
+      @result{} #<marker at 15573 in markers.texi>
+ @end group
+ 
+ @group
+ (narrow-to-region 100 200)
+      @result{} nil
+ @end group
+ @group
+ (point-min-marker)
+      @result{} #<marker at 100 in markers.texi>
+ @end group
+ @group
+ (point-max-marker)
+      @result{} #<marker at 200 in markers.texi>
+ @end group
+ @end example
+ @end defun
+ 
+ @defun copy-marker marker-or-integer
+ If passed a marker as its argument, @code{copy-marker} returns a
+ new marker that points to the same place and the same buffer as does
+ @var{marker-or-integer}.  If passed an integer as its argument,
+ @code{copy-marker} returns a new marker that points to position
+ @var{marker-or-integer} in the current buffer.
+ 
+ If passed an integer argument less than 1, @code{copy-marker} returns a
+ new marker that points to the beginning of the current buffer.  If
+ passed an integer argument greater than the length of the buffer,
+ @code{copy-marker} returns a new marker that points to the end of the
+ buffer.
+ 
+ An error is signaled if @var{marker} is neither a marker nor an
+ integer.
+ 
+ @example
+ @group
+ (setq p (point-marker))
+      @result{} #<marker at 2139 in markers.texi>
+ @end group
+ 
+ @group
+ (setq q (copy-marker p))
+      @result{} #<marker at 2139 in markers.texi>
+ @end group
+ 
+ @group
+ (eq p q)
+      @result{} nil
+ @end group
+ 
+ @group
+ (equal p q)
+      @result{} t
+ @end group
+ 
+ @group
+ (copy-marker 0)
+      @result{} #<marker at 1 in markers.texi>
+ @end group
+ 
+ @group
+ (copy-marker 20000)
+      @result{} #<marker at 7572 in markers.texi>
+ @end group
+ @end example
+ @end defun
+ 
+ @node Information from Markers
+ @section Information from Markers
+ 
+   This section describes the functions for accessing the components of a
+ marker object.
+ 
+ @defun marker-position marker
+ This function returns the position that @var{marker} points to, or
+ @code{nil} if it points nowhere.
+ @end defun
+ 
+ @defun marker-buffer marker
+ This function returns the buffer that @var{marker} points into, or
+ @code{nil} if it points nowhere.
+ 
+ @example
+ @group
+ (setq m (make-marker))
+      @result{} #<marker in no buffer>
+ @end group
+ @group
+ (marker-position m)
+      @result{} nil
+ @end group
+ @group
+ (marker-buffer m)
+      @result{} nil
+ @end group
+ 
+ @group
+ (set-marker m 3770 (current-buffer))
+      @result{} #<marker at 3770 in markers.texi>
+ @end group
+ @group
+ (marker-buffer m)
+      @result{} #<buffer markers.texi>
+ @end group
+ @group
+ (marker-position m)
+      @result{} 3770
+ @end group
+ @end example
+ @end defun
+ 
+   Two distinct markers are considered @code{equal} (even though not
+ @code{eq}) to each other if they have the same position and buffer, or
+ if they both point nowhere.
+ 
+ @node Changing Markers
+ @section Changing Marker Positions
+ 
+   This section describes how to change the position of an existing
+ marker.  When you do this, be sure you know whether the marker is used
+ outside of your program, and, if so, what effects will result from
+ moving it---otherwise, confusing things may happen in other parts of
+ Emacs.
+ 
+ @defun set-marker marker position &optional buffer
+ This function moves @var{marker} to @var{position}
+ in @var{buffer}.  If @var{buffer} is not provided, it defaults to
+ the current buffer.
+ 
+ If @var{position} is less than 1, @code{set-marker} moves @var{marker}
+ to the beginning of the buffer.  If @var{position} is greater than the
+ size of the buffer, @code{set-marker} moves marker to the end of the
+ buffer.  If @var{position} is @code{nil} or a marker that points
+ nowhere, then @var{marker} is set to point nowhere.
+ 
+ The value returned is @var{marker}.
+ 
+ @example
+ @group
+ (setq m (point-marker))
+      @result{} #<marker at 4714 in markers.texi>
+ @end group
+ @group
+ (set-marker m 55)
+      @result{} #<marker at 55 in markers.texi>
+ @end group
+ @group
+ (setq b (get-buffer "foo"))
+      @result{} #<buffer foo>
+ @end group
+ @group
+ (set-marker m 0 b)
+      @result{} #<marker at 1 in foo>
+ @end group
+ @end example
+ @end defun
+ 
+ @defun move-marker marker position &optional buffer
+ This is another name for @code{set-marker}.
+ @end defun
+ 
+ @node The Mark
+ @section The Mark
+ @cindex mark, the
+ @cindex mark ring
+ 
+   One special marker in each buffer is designated @dfn{the mark}.  It
+ records a position for the user for the sake of commands such as
+ @kbd{C-w} and @kbd{C-x @key{TAB}}.  Lisp programs should set the mark
+ only to values that have a potential use to the user, and never for
+ their own internal purposes.  For example, the @code{replace-regexp}
+ command sets the mark to the value of point before doing any
+ replacements, because this enables the user to move back there
+ conveniently after the replace is finished.
+ 
+   Many commands are designed so that when called interactively they
+ operate on the text between point and the mark.  If you are writing such
+ a command, don't examine the mark directly; instead, use
+ @code{interactive} with the @samp{r} specification.  This provides the
+ values of point and the mark as arguments to the command in an
+ interactive call, but permits other Lisp programs to specify arguments
+ explicitly.  @xref{Interactive Codes}.
+ 
+   Each buffer has its own value of the mark that is independent of the
+ value of the mark in other buffers.  When a buffer is created, the mark
+ exists but does not point anywhere.  We consider this state as ``the
+ absence of a mark in that buffer.''
+ 
+   Once the mark ``exists'' in a buffer, it normally never ceases to
+ exist.  However, it may become @dfn{inactive}, if Transient Mark mode is
+ enabled.  The variable @code{mark-active}, which is always local in all
+ buffers, indicates whether the mark is active: non-@code{nil} means yes.
+ A command can request deactivation of the mark upon return to the editor
+ command loop by setting @code{deactivate-mark} to a non-@code{nil} value
+ (but this causes deactivation only if Transient Mark mode is enabled).
+ 
+   The main motivation for using Transient Mark mode is that this mode
+ also enables highlighting of the region when the mark is active.
+ @xref{Display}.
+ 
+   In addition to the mark, each buffer has a @dfn{mark ring} which is a
+ list of markers containing previous values of the mark.  When editing
+ commands change the mark, they should normally save the old value of the
+ mark on the mark ring.  The variable @code{mark-ring-max} specifies the
+ maximum number of entries in the mark ring; once the list becomes this
+ long, adding a new element deletes the last element.
+ 
+ @defun mark &optional force
+ @cindex current buffer mark
+ This function returns the current buffer's mark position as an integer.
+ 
+ If the mark is inactive, @code{mark} normally signals an error.
+ However, if @var{force} is non-@code{nil}, then @code{mark} returns the
+ mark position anyway---or @code{nil}, if the mark is not yet set for
+ this buffer.
+ @end defun
+ 
+ @defun mark-marker
+ This function returns the current buffer's mark.  This is the very marker
+ that records the mark location inside Emacs, not a copy.  Therefore,
+ changing this marker's position will directly affect the position of the mark.
+ Don't do it unless that is the effect you want.
+ 
+ @example
+ @group
+ (setq m (mark-marker))
+      @result{} #<marker at 3420 in markers.texi>
+ @end group
+ @group
+ (set-marker m 100)
+      @result{} #<marker at 100 in markers.texi>
+ @end group
+ @group
+ (mark-marker)
+      @result{} #<marker at 100 in markers.texi>
+ @end group
+ @end example
+ 
+ Like any marker, this marker can be set to point at any buffer you like.
+ We don't recommend that you make it point at any buffer other than the
+ one of which it is the mark.  If you do, it will yield perfectly
+ consistent, but rather odd, results.
+ @end defun
+ 
+ @ignore
+ @deffn Command set-mark-command jump
+ If @var{jump} is @code{nil}, this command sets the mark to the value
+ of point and pushes the previous value of the mark on the mark ring.  The
+ message @samp{Mark set} is also displayed in the echo area.
+ 
+ If @var{jump} is not @code{nil}, this command sets point to the value
+ of the mark, and sets the mark to the previous saved mark value, which
+ is popped off the mark ring.
+ 
+ This function is @emph{only} intended for interactive use.
+ @end deffn
+ @end ignore
+ 
+ @defun set-mark position
+ This function sets the mark to @var{position}, and activates the mark.
+ The old value of the mark is @emph{not} pushed onto the mark ring.
+ 
+ @strong{Please note:} Use this function only if you want the user to
+ see that the mark has moved, and you want the previous mark position to
+ be lost.  Normally, when a new mark is set, the old one should go on the
+ @code{mark-ring}.  For this reason, most applications should use
+ @code{push-mark} and @code{pop-mark}, not @code{set-mark}.
+ 
+ Novice Emacs Lisp programmers often try to use the mark for the wrong
+ purposes.  The mark saves a location for the user's convenience.  An
+ editing command should not alter the mark unless altering the mark is
+ part of the user-level functionality of the command.  (And, in that
+ case, this effect should be documented.)  To remember a location for
+ internal use in the Lisp program, store it in a Lisp variable.  For
+ example:
+ 
+ @example
+ @group
+ (let ((beg (point)))
+   (forward-line 1)
+   (delete-region beg (point))).
+ @end group
+ @end example
+ @end defun
+ 
+ @c for interactive use only
+ @ignore
+ @deffn Command exchange-point-and-mark
+ This function exchanges the positions of point and the mark.
+ It is intended for interactive use.
+ @end deffn
+ @end ignore
+ 
+ @defun push-mark &optional position nomsg activate
+ This function sets the current buffer's mark to @var{position}, and
+ pushes a copy of the previous mark onto @code{mark-ring}.  If
+ @var{position} is @code{nil}, then the value of point is used.
+ @code{push-mark} returns @code{nil}.
+ 
+ The function @code{push-mark} normally @emph{does not} activate the
+ mark.  To do that, specify @code{t} for the argument @var{activate}.
+ 
+ A @samp{Mark set} message is displayed unless @var{nomsg} is
+ non-@code{nil}.
+ @end defun
+ 
+ @defun pop-mark
+ This function pops off the top element of @code{mark-ring} and makes
+ that mark become the buffer's actual mark.  This does not move point in
+ the buffer, and it does nothing if @code{mark-ring} is empty.  It
+ deactivates the mark.
+ 
+ The return value is not meaningful.
+ @end defun
+ 
+ @defopt transient-mark-mode
+ @cindex Transient Mark mode
+ This variable if non-@code{nil} enables Transient Mark mode, in which
+ every buffer-modifying primitive sets @code{deactivate-mark}.  The
+ consequence of this is that commands that modify the buffer normally
+ make the mark inactive.
+ @end defopt
+ 
+ @defvar deactivate-mark
+ If an editor command sets this variable non-@code{nil}, then the editor
+ command loop deactivates the mark after the command returns, but only if
+ Transient Mark mode is enabled.
+ @end defvar
+ 
+ @defun deactivate-mark
+ This function deactivates the mark, but only if Transient Mark mode
+ is enabled.
+ @end defun
+ 
+ @defvar mark-active
+ The mark is active when this variable is non-@code{nil}.  This variable
+ is always local in each buffer.
+ @end defvar
+ 
+ @defvar activate-mark-hook
+ @defvarx deactivate-mark-hook
+ These normal hooks are run, respectively, when the mark becomes active
+ and when it becomes inactive.  The hook @code{activate-mark-hook} is also
+ run at the end of a command if the mark is active and the region may
+ have changed.
+ @end defvar
+ 
+ @defvar mark-ring
+ The value of this buffer-local variable is the list of saved former
+ marks of the current buffer, most recent first.
+ 
+ @example
+ @group
+ mark-ring
+ @result{} (#<marker at 11050 in markers.texi> 
+     #<marker at 10832 in markers.texi>
+     @dots{})
+ @end group
+ @end example
+ @end defvar
+ 
+ @defopt mark-ring-max
+ The value of this variable is the maximum size of @code{mark-ring}.  If
+ more marks than this are pushed onto the @code{mark-ring},
+ @code{push-mark} discards an old mark when it adds a new one.
+ @end defopt
+ 
+ @node The Region
+ @section The Region
+ @cindex region, the
+ 
+   The text between point and the mark is known as @dfn{the region}.
+ Various functions operate on text delimited by point and the mark, but
+ only those functions specifically related to the region itself are
+ described here.
+ 
+ @defun region-beginning
+ This function returns the position of the beginning of the region (as
+ an integer).  This is the position of either point or the mark,
+ whichever is smaller.
+ 
+ If the mark does not point anywhere, an error is signaled.
+ @end defun
+ 
+ @defun region-end
+ This function returns the position of the end of the region (as an
+ integer).  This is the position of either point or the mark, whichever is
+ larger.
+ 
+ If the mark does not point anywhere, an error is signaled.
+ @end defun
+ 
+   Few programs need to use the @code{region-beginning} and
+ @code{region-end} functions.  A command designed to operate on a region
+ should normally use @code{interactive} with the @samp{r} specification
+ to find the beginning and end of the region.  This lets other Lisp
+ programs specify the bounds explicitly as arguments.  (@xref{Interactive
+ Codes}.)
Index: emacs/man/elisp-minibuf.texi
diff -c /dev/null emacs/man/elisp-minibuf.texi:1.2
*** /dev/null	Fri Aug  2 20:55:27 1996
--- emacs/man/elisp-minibuf.texi	Thu Aug  1 00:23:10 1996
***************
*** 0 ****
--- 1,1440 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/minibuf
+ @node Minibuffers, Command Loop, Read and Print, Top
+ @chapter Minibuffers
+ @cindex arguments, reading
+ @cindex complex arguments
+ @cindex minibuffer
+ 
+   A @dfn{minibuffer} is a special buffer that Emacs commands use to read
+ arguments more complicated than the single numeric prefix argument.
+ These arguments include file names, buffer names, and command names (as
+ in @kbd{M-x}).  The minibuffer is displayed on the bottom line of the
+ screen, in the same place as the echo area, but only while it is in
+ use for reading an argument.
+ 
+ @menu
+ * Intro to Minibuffers::      Basic information about minibuffers.
+ * Text from Minibuffer::      How to read a straight text string.
+ * Object from Minibuffer::    How to read a Lisp object or expression.
+ * Minibuffer History::	      Recording previous minibuffer inputs
+ 				so the user can reuse them.
+ * Completion::                How to invoke and customize completion.
+ * Yes-or-No Queries::         Asking a question with a simple answer.
+ * Multiple Queries::	      Asking a series of similar questions.
+ * Minibuffer Misc::           Various customization hooks and variables.
+ @end menu
+ 
+ @node Intro to Minibuffers
+ @section Introduction to Minibuffers
+ 
+   In most ways, a minibuffer is a normal Emacs buffer.  Most operations
+ @emph{within} a buffer, such as editing commands, work normally in a
+ minibuffer.  However, many operations for managing buffers do not apply
+ to minibuffers.  The name of a minibuffer always has the form @w{@samp{
+ *Minibuf-@var{number}}}, and it cannot be changed.  Minibuffers are
+ displayed only in special windows used only for minibuffers; these
+ windows always appear at the bottom of a frame.  (Sometime frames have
+ no minibuffer window, and sometimes a special kind of frame contains
+ nothing but a minibuffer window; see @ref{Minibuffers and Frames}.)
+ 
+   The minibuffer's window is normally a single line.  You can resize it
+ temporarily with the window sizing commands; it reverts to its normal
+ size when the minibuffer is exited.  You can resize it permanently by
+ using the window sizing commands in the frame's other window, when the
+ minibuffer is not active.  If the frame contains just a minibuffer, you
+ can change the minibuffer's size by changing the frame's size.
+ 
+   If a command uses a minibuffer while there is an active minibuffer,
+ this is called a @dfn{recursive minibuffer}.  The first minibuffer is
+ named @w{@samp{ *Minibuf-0*}}.  Recursive minibuffers are named by
+ incrementing the number at the end of the name.  (The names begin with a
+ space so that they won't show up in normal buffer lists.)  Of several
+ recursive minibuffers, the innermost (or most recently entered) is the
+ active minibuffer.  We usually call this ``the'' minibuffer.  You can
+ permit or forbid recursive minibuffers by setting the variable
+ @code{enable-recursive-minibuffers} or by putting properties of that
+ name on command symbols (@pxref{Minibuffer Misc}).
+ 
+   Like other buffers, a minibuffer may use any of several local keymaps
+ (@pxref{Keymaps}); these contain various exit commands and in some cases
+ completion commands (@pxref{Completion}).
+ 
+ @itemize @bullet
+ @item
+ @code{minibuffer-local-map} is for ordinary input (no completion).
+ 
+ @item
+ @code{minibuffer-local-ns-map} is similar, except that @key{SPC} exits
+ just like @key{RET}.  This is used mainly for Mocklisp compatibility.
+ 
+ @item
+ @code{minibuffer-local-completion-map} is for permissive completion.
+ 
+ @item
+ @code{minibuffer-local-must-match-map} is for strict completion and
+ for cautious completion.
+ @end itemize
+ 
+ @node Text from Minibuffer
+ @section Reading Text Strings with the Minibuffer
+ 
+   Most often, the minibuffer is used to read text as a string.  It can
+ also be used to read a Lisp object in textual form.  The most basic
+ primitive for minibuffer input is @code{read-from-minibuffer}; it can do
+ either one.
+ 
+   In most cases, you should not call minibuffer input functions in the
+ middle of a Lisp function.  Instead, do all minibuffer input as part of
+ reading the arguments for a command, in the @code{interactive} spec.
+ @xref{Defining Commands}.
+ 
+ @defun read-from-minibuffer prompt-string &optional initial-contents keymap read hist
+ This function is the most general way to get input through the
+ minibuffer.  By default, it accepts arbitrary text and returns it as a
+ string; however, if @var{read} is non-@code{nil}, then it uses
+ @code{read} to convert the text into a Lisp object (@pxref{Input
+ Functions}).
+ 
+ The first thing this function does is to activate a minibuffer and 
+ display it with @var{prompt-string} as the prompt.  This value must be a
+ string.
+ 
+ Then, if @var{initial-contents} is a string, @code{read-from-minibuffer}
+ inserts it into the minibuffer, leaving point at the end.  The
+ minibuffer appears with this text as its contents.
+ 
+ @c Emacs 19 feature
+ The value of @var{initial-contents} may also be a cons cell of the form
+ @code{(@var{string} . @var{position})}.  This means to insert
+ @var{string} in the minibuffer but put point @var{position} characters
+ from the beginning, rather than at the end.
+ 
+ If @var{keymap} is non-@code{nil}, that keymap is the local keymap to
+ use in the minibuffer.  If @var{keymap} is omitted or @code{nil}, the
+ value of @code{minibuffer-local-map} is used as the keymap.  Specifying
+ a keymap is the most important way to customize the minibuffer for
+ various applications such as completion.
+ 
+ The argument @var{hist} specifies which history list variable to use
+ for saving the input and for history commands used in the minibuffer.
+ It defaults to @code{minibuffer-history}.  @xref{Minibuffer History}.
+ 
+ When the user types a command to exit the minibuffer,
+ @code{read-from-minibuffer} uses the text in the minibuffer to produce
+ its return value.  Normally it simply makes a string containing that
+ text.  However, if @var{read} is non-@code{nil},
+ @code{read-from-minibuffer} reads the text and returns the resulting
+ Lisp object, unevaluated.  (@xref{Input Functions}, for information
+ about reading.)
+ @end defun
+ 
+ @defun read-string prompt &optional initial
+ This function reads a string from the minibuffer and returns it.  The
+ arguments @var{prompt} and @var{initial} are used as in
+ @code{read-from-minibuffer}.  The keymap used is
+ @code{minibuffer-local-map}.
+ 
+ This is a simplified interface to the
+ @code{read-from-minibuffer} function:
+ 
+ @smallexample
+ @group
+ (read-string @var{prompt} @var{initial})
+ @equiv{}
+ (read-from-minibuffer @var{prompt} @var{initial} nil nil nil)
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defvar minibuffer-local-map
+ This is the default local keymap for reading from the minibuffer.  By
+ default, it makes the following bindings:
+ 
+ @table @asis
+ @item @key{LFD}
+ @code{exit-minibuffer}
+ 
+ @item @key{RET}
+ @code{exit-minibuffer}
+ 
+ @item @kbd{C-g}
+ @code{abort-recursive-edit}
+ 
+ @item @kbd{M-n}
+ @code{next-history-element}
+ 
+ @item @kbd{M-p}
+ @code{previous-history-element}
+ 
+ @item @kbd{M-r}
+ @code{next-matching-history-element}
+ 
+ @item @kbd{M-s}
+ @code{previous-matching-history-element}
+ @end table
+ @end defvar
+ 
+ @c In version 18, initial is required
+ @c Emacs 19 feature
+ @defun read-no-blanks-input prompt &optional initial
+ This function reads a string from the minibuffer, but does not allow
+ whitespace characters as part of the input: instead, those characters
+ terminate the input.  The arguments @var{prompt} and @var{initial} are
+ used as in @code{read-from-minibuffer}.
+ 
+ This is a simplified interface to the @code{read-from-minibuffer}
+ function, and passes the value of the @code{minibuffer-local-ns-map}
+ keymap as the @var{keymap} argument for that function.  Since the keymap
+ @code{minibuffer-local-ns-map} does not rebind @kbd{C-q}, it @emph{is}
+ possible to put a space into the string, by quoting it.
+ 
+ @smallexample
+ @group
+ (read-no-blanks-input @var{prompt} @var{initial})
+ @equiv{}
+ (read-from-minibuffer @var{prompt} @var{initial} minibuffer-local-ns-map)
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defvar minibuffer-local-ns-map
+ This built-in variable is the keymap used as the minibuffer local keymap
+ in the function @code{read-no-blanks-input}.  By default, it makes the
+ following bindings, in addition to those of @code{minibuffer-local-map}:
+ 
+ @table @asis
+ @item @key{SPC}
+ @cindex @key{SPC} in minibuffer
+ @code{exit-minibuffer}
+ 
+ @item @key{TAB}
+ @cindex @key{TAB} in minibuffer
+ @code{exit-minibuffer}
+ 
+ @item @kbd{?}
+ @cindex @kbd{?} in minibuffer
+ @code{self-insert-and-exit}
+ @end table
+ @end defvar
+ 
+ @node Object from Minibuffer
+ @section Reading Lisp Objects with the Minibuffer
+ 
+   This section describes functions for reading Lisp objects with the
+ minibuffer.
+ 
+ @defun read-minibuffer prompt &optional initial
+ This function reads a Lisp object in the minibuffer and returns it,
+ without evaluating it.  The arguments @var{prompt} and @var{initial} are
+ used as in @code{read-from-minibuffer}.
+ 
+ This is a simplified interface to the
+ @code{read-from-minibuffer} function:
+ 
+ @smallexample
+ @group
+ (read-minibuffer @var{prompt} @var{initial})
+ @equiv{}
+ (read-from-minibuffer @var{prompt} @var{initial} nil t)
+ @end group
+ @end smallexample
+ 
+ Here is an example in which we supply the string @code{"(testing)"} as
+ initial input:
+ 
+ @smallexample
+ @group
+ (read-minibuffer
+  "Enter an expression: " (format "%s" '(testing)))
+ 
+ ;; @r{Here is how the minibuffer is displayed:}
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ----------
+ Enter an expression: (testing)@point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end smallexample
+ 
+ @noindent
+ The user can type @key{RET} immediately to use the initial input as a
+ default, or can edit the input.
+ @end defun
+ 
+ @defun eval-minibuffer prompt &optional initial
+ This function reads a Lisp expression in the minibuffer, evaluates it,
+ then returns the result.  The arguments @var{prompt} and @var{initial}
+ are used as in @code{read-from-minibuffer}.
+ 
+ This function simply evaluates the result of a call to
+ @code{read-minibuffer}:
+ 
+ @smallexample
+ @group
+ (eval-minibuffer @var{prompt} @var{initial})
+ @equiv{}
+ (eval (read-minibuffer @var{prompt} @var{initial}))
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun edit-and-eval-command prompt form
+ This function reads a Lisp expression in the minibuffer, and then
+ evaluates it.  The difference between this command and
+ @code{eval-minibuffer} is that here the initial @var{form} is not
+ optional and it is treated as a Lisp object to be converted to printed
+ representation rather than as a string of text.  It is printed with
+ @code{prin1}, so if it is a string, double-quote characters (@samp{"})
+ appear in the initial text.  @xref{Output Functions}.
+ 
+ The first thing @code{edit-and-eval-command} does is to activate the
+ minibuffer with @var{prompt} as the prompt.  Then it inserts the printed
+ representation of @var{form} in the minibuffer, and lets the user edit.
+ When the user exits the minibuffer, the edited text is read with
+ @code{read} and then evaluated.  The resulting value becomes the value
+ of @code{edit-and-eval-command}.
+ 
+ In the following example, we offer the user an expression with initial
+ text which is a valid form already:
+ 
+ @smallexample
+ @group
+ (edit-and-eval-command "Please edit: " '(forward-word 1))
+ 
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following appears in the minibuffer:}
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ----------
+ Please edit: (forward-word 1)@point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end smallexample
+ 
+ @noindent
+ Typing @key{RET} right away would exit the minibuffer and evaluate the
+ expression, thus moving point forward one word.
+ @code{edit-and-eval-command} returns @code{nil} in this example.
+ @end defun
+ 
+ @node Minibuffer History
+ @section Minibuffer History
+ @cindex minibuffer history
+ @cindex history list
+ 
+ A @dfn{minibuffer history list} records previous minibuffer inputs so
+ the user can reuse them conveniently.  A history list is actually a
+ symbol, not a list; it is a variable whose value is a list of strings
+ (previous inputs), most recent first.
+ 
+ There are many separate history lists, used for different kinds of
+ inputs.  It's the Lisp programmer's job to specify the right history
+ list for each use of the minibuffer.
+ 
+ The basic minibuffer input functions @code{read-from-minibuffer} and
+ @code{completing-read} both accept an optional argument named @var{hist}
+ which is how you specify the history list.  Here are the possible
+ values:
+ 
+ @table @asis
+ @item @var{variable}
+ Use @var{variable} (a symbol) as the history list.
+ 
+ @item (@var{variable} . @var{startpos})
+ Use @var{variable} (a symbol) as the history list, and assume that the
+ initial history position is @var{startpos} (an integer, counting from
+ zero which specifies the most recent element of the history).
+ 
+ If you specify @var{startpos}, then you should also specify that element
+ of the history as the initial minibuffer contents, for consistency.
+ @end table
+ 
+ If you don't specify @var{hist}, then the default history list
+ @code{minibuffer-history} is used.  For other standard history lists,
+ see below.  You can also create your own history list variable; just
+ initialize it to @code{nil} before the first use.
+ 
+ Both @code{read-from-minibuffer} and @code{completing-read} add new
+ elements to the history list automatically, and provide commands to
+ allow the user to reuse items on the list.  The only thing your program
+ needs to do to use a history list is to initialize it and to pass its
+ name to the input functions when you wish.  But it is safe to modify the
+ list by hand when the minibuffer input functions are not using it.
+ 
+ @defvar minibuffer-history
+ The default history list for minibuffer history input.
+ @end defvar
+ 
+ @defvar query-replace-history
+ A history list for arguments to @code{query-replace} (and similar
+ arguments to other commands).
+ @end defvar
+ 
+ @defvar file-name-history
+ A history list for file name arguments.
+ @end defvar
+ 
+ @defvar regexp-history
+ A history list for regular expression arguments.
+ @end defvar
+ 
+ @defvar extended-command-history
+ A history list for arguments that are names of extended commands.
+ @end defvar
+ 
+ @defvar shell-command-history
+ A history list for arguments that are shell commands.
+ @end defvar
+ 
+ @defvar read-expression-history
+ A history list for arguments that are Lisp expressions to evaluate.
+ @end defvar
+ 
+ @node Completion
+ @section Completion
+ @cindex completion
+ 
+   @dfn{Completion} is a feature that fills in the rest of a name
+ starting from an abbreviation for it.  Completion works by comparing the
+ user's input against a list of valid names and determining how much of
+ the name is determined uniquely by what the user has typed.  For
+ example, when you type @kbd{C-x b} (@code{switch-to-buffer}) and then
+ type the first few letters of the name of the buffer to which you wish
+ to switch, and then type @key{TAB} (@code{minibuffer-complete}), Emacs
+ extends the name as far as it can.
+ 
+   Standard Emacs commands offer completion for names of symbols, files,
+ buffers, and processes; with the functions in this section, you can
+ implement completion for other kinds of names.
+ 
+   The @code{try-completion} function is the basic primitive for
+ completion: it returns the longest determined completion of a given
+ initial string, with a given set of strings to match against.
+ 
+   The function @code{completing-read} provides a higher-level interface
+ for completion.  A call to @code{completing-read} specifies how to
+ determine the list of valid names.  The function then activates the
+ minibuffer with a local keymap that binds a few keys to commands useful
+ for completion.  Other functions provide convenient simple interfaces
+ for reading certain kinds of names with completion.
+ 
+ @menu
+ * Basic Completion::       Low-level functions for completing strings.
+                              (These are too low level to use the minibuffer.)
+ * Minibuffer Completion::  Invoking the minibuffer with completion.
+ * Completion Commands::    Minibuffer commands that do completion.
+ * High-Level Completion::  Convenient special cases of completion
+                              (reading buffer name, file name, etc.)
+ * Reading File Names::     Using completion to read file names.
+ * Programmed Completion::  Finding the completions for a given file name.
+ @end menu
+ 
+ @node Basic Completion
+ @subsection Basic Completion Functions
+ 
+   The two functions @code{try-completion} and @code{all-completions}
+ have nothing in themselves to do with minibuffers.  We describe them in
+ this chapter so as to keep them near the higher-level completion
+ features that do use the minibuffer.
+ 
+ @defun try-completion string collection &optional predicate
+ This function returns the longest common substring of all possible
+ completions of @var{string} in @var{collection}.  The value of
+ @var{collection} must be an alist, an obarray, or a function that
+ implements a virtual set of strings (see below).
+ 
+ Completion compares @var{string} against each of the permissible
+ completions specified by @var{collection}; if the beginning of the
+ permissible completion equals @var{string}, it matches.  If no permissible
+ completions match, @code{try-completion} returns @code{nil}.  If only
+ one permissible completion matches, and the match is exact, then
+ @code{try-completion} returns @code{t}.  Otherwise, the value is the
+ longest initial sequence common to all the permissible completions that
+ match.
+ 
+ If @var{collection} is an alist (@pxref{Association Lists}), the
+ @sc{car}s of the alist elements form the set of permissible completions.
+ 
+ @cindex obarray in completion
+ If @var{collection} is an obarray (@pxref{Creating Symbols}), the names
+ of all symbols in the obarray form the set of permissible completions.  The
+ global variable @code{obarray} holds an obarray containing the names of
+ all interned Lisp symbols.
+ 
+ Note that the only valid way to make a new obarray is to create it
+ empty and then add symbols to it one by one using @code{intern}.
+ Also, you cannot intern a given symbol in more than one obarray.
+ 
+ If the argument @var{predicate} is non-@code{nil}, then it must be a
+ function of one argument.  It is used to test each possible match, and
+ the match is accepted only if @var{predicate} returns non-@code{nil}.
+ The argument given to @var{predicate} is either a cons cell from the alist
+ (the @sc{car} of which is a string) or else it is a symbol (@emph{not} a
+ symbol name) from the obarray.
+ 
+ You can also use a symbol that is a function as @var{collection}.  Then
+ the function is solely responsible for performing completion;
+ @code{try-completion} returns whatever this function returns.  The
+ function is called with three arguments: @var{string}, @var{predicate}
+ and @code{nil}.  (The reason for the third argument is so that the same
+ function can be used in @code{all-completions} and do the appropriate
+ thing in either case.)  @xref{Programmed Completion}.
+ 
+ In the first of the following examples, the string @samp{foo} is
+ matched by three of the alist @sc{car}s.  All of the matches begin with
+ the characters @samp{fooba}, so that is the result.  In the second
+ example, there is only one possible match, and it is exact, so the value
+ is @code{t}.
+ 
+ @smallexample
+ @group
+ (try-completion 
+  "foo"
+  '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
+      @result{} "fooba"
+ @end group
+ 
+ @group
+ (try-completion "foo" '(("barfoo" 2) ("foo" 3)))
+      @result{} t
+ @end group
+ @end smallexample
+ 
+ In the following example, numerous symbols begin with the characters
+ @samp{forw}, and all of them begin with the word @samp{forward}.  In
+ most of the symbols, this is followed with a @samp{-}, but not in all,
+ so no more than @samp{forward} can be completed.
+ 
+ @smallexample
+ @group
+ (try-completion "forw" obarray)
+      @result{} "forward"
+ @end group
+ @end smallexample
+ 
+ Finally, in the following example, only two of the three possible
+ matches pass the predicate @code{test} (the string @samp{foobaz} is
+ too short).  Both of those begin with the string @samp{foobar}.
+ 
+ @smallexample
+ @group
+ (defun test (s) 
+   (> (length (car s)) 6))
+      @result{} test
+ @end group
+ @group
+ (try-completion 
+  "foo"
+  '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)) 
+  'test)
+      @result{} "foobar"
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun all-completions string collection &optional predicate nospace
+ This function returns a list of all possible completions of
+ @var{string}.  The parameters to this function are the same as to
+ @code{try-completion}.
+ 
+ If @var{collection} is a function, it is called with three arguments:
+ @var{string}, @var{predicate} and @code{t}; then @code{all-completions}
+ returns whatever the function returns.  @xref{Programmed Completion}.
+ 
+ If @var{nospace} is non-@code{nil}, completions that start with a space
+ are ignored unless @var{string} also starts with a space.
+ 
+ Here is an example, using the function @code{test} shown in the
+ example for @code{try-completion}:
+ 
+ @smallexample
+ @group
+ (defun test (s) 
+   (> (length (car s)) 6))
+      @result{} test
+ @end group
+ 
+ @group
+ (all-completions  
+  "foo"
+  '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
+  'test)
+      @result{} ("foobar1" "foobar2")
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defvar completion-ignore-case
+ If the value of this variable is 
+ non-@code{nil}, Emacs does not consider case significant in completion.
+ @end defvar
+ 
+ @node Minibuffer Completion
+ @subsection Completion and the Minibuffer
+ 
+   This section describes the basic interface for reading from the
+ minibuffer with completion.
+ 
+ @defun completing-read prompt collection &optional predicate require-match initial hist
+ This function reads a string in the minibuffer, assisting the user by
+ providing completion.  It activates the minibuffer with prompt
+ @var{prompt}, which must be a string.  If @var{initial} is
+ non-@code{nil}, @code{completing-read} inserts it into the minibuffer as
+ part of the input.  Then it allows the user to edit the input, providing
+ several commands to attempt completion.
+ 
+ The actual completion is done by passing @var{collection} and
+ @var{predicate} to the function @code{try-completion}.  This happens in
+ certain commands bound in the local keymaps used for completion.
+ 
+ If @var{require-match} is @code{t}, the usual minibuffer exit commands
+ won't exit unless the input completes to an element of @var{collection}.
+ If @var{require-match} is neither @code{nil} nor @code{t}, then the exit
+ commands won't exit unless the input typed is itself an element of
+ @var{collection}.  If @var{require-match} is @code{nil}, the exit
+ commands work regardless of the input in the minibuffer.
+ 
+ The user can exit with null input by typing @key{RET} with an empty
+ minibuffer.  Then @code{completing-read} returns @code{nil}.  This is
+ how the user requests whatever default the command uses for the value
+ being read.  The user can return using @key{RET} in this way regardless
+ of the value of @var{require-match}.
+ 
+ The function @code{completing-read} works by calling
+ @code{read-minibuffer}.  It uses @code{minibuffer-local-completion-map}
+ as the keymap if @var{require-match} is @code{nil}, and uses
+ @code{minibuffer-local-must-match-map} if @var{require-match} is
+ non-@code{nil}.  @xref{Completion Commands}.
+ 
+ The argument @var{hist} specifies which history list variable to use for
+ saving the input and for minibuffer history commands.  It defaults to
+ @code{minibuffer-history}.  @xref{Minibuffer History}.
+ 
+ Completion ignores case when comparing the input against the possible
+ matches, if the built-in variable @code{completion-ignore-case} is
+ non-@code{nil}.  @xref{Basic Completion}.
+ 
+ Here's an example of using @code{completing-read}:
+ 
+ @smallexample
+ @group
+ (completing-read
+  "Complete a foo: "
+  '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
+  nil t "fo")
+ @end group
+ 
+ @group
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following appears in the minibuffer:}
+ 
+ ---------- Buffer: Minibuffer ----------
+ Complete a foo: fo@point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end smallexample
+ 
+ @noindent
+ If the user then types @kbd{@key{DEL} @key{DEL} b @key{RET}},
+ @code{completing-read} returns @code{barfoo}.
+ 
+ The @code{completing-read} function binds three variables to pass
+ information to the commands that actually do completion.  These
+ variables are @code{minibuffer-completion-table},
+ @code{minibuffer-completion-predicate} and
+ @code{minibuffer-completion-confirm}.  For more information about them,
+ see @ref{Completion Commands}.
+ @end defun
+ 
+ @node Completion Commands
+ @subsection Minibuffer Commands That Do Completion
+ 
+   This section describes the keymaps, commands and user options used in
+ the minibuffer to do completion.
+ 
+ @defvar minibuffer-local-completion-map
+ @code{completing-read} uses this value as the local keymap when an
+ exact match of one of the completions is not required.  By default, this
+ keymap makes the following bindings:
+ 
+ @table @asis
+ @item @kbd{?}
+ @code{minibuffer-completion-help}
+ 
+ @item @key{SPC}
+ @code{minibuffer-complete-word}
+ 
+ @item @key{TAB}
+ @code{minibuffer-complete}
+ @end table
+ 
+ @noindent
+ with other characters bound as in @code{minibuffer-local-map}
+ (@pxref{Text from Minibuffer}).
+ @end defvar
+ 
+ @defvar minibuffer-local-must-match-map
+ @code{completing-read} uses this value as the local keymap when an
+ exact match of one of the completions is required.  Therefore, no keys
+ are bound to @code{exit-minibuffer}, the command that exits the
+ minibuffer unconditionally.  By default, this keymap makes the following
+ bindings:
+ 
+ @table @asis
+ @item @kbd{?}
+ @code{minibuffer-completion-help}
+ 
+ @item @key{SPC}
+ @code{minibuffer-complete-word}
+ 
+ @item @key{TAB}
+ @code{minibuffer-complete}
+ 
+ @item @key{LFD}
+ @code{minibuffer-complete-and-exit}
+ 
+ @item @key{RET}
+ @code{minibuffer-complete-and-exit}
+ @end table
+ 
+ @noindent
+ with other characters bound as in @code{minibuffer-local-map}.
+ @end defvar
+ 
+ @defvar minibuffer-completion-table
+ The value of this variable is the alist or obarray used for completion
+ in the minibuffer.  This is the global variable that contains what
+ @code{completing-read} passes to @code{try-completion}.  It is used by
+ minibuffer completion commands such as @code{minibuffer-complete-word}.
+ @end defvar
+ 
+ @defvar minibuffer-completion-predicate
+ This variable's value is the predicate that @code{completing-read}
+ passes to @code{try-completion}.  The variable is also used by the other
+ minibuffer completion functions.
+ @end defvar
+ 
+ @deffn Command minibuffer-complete-word
+ This function completes the minibuffer contents by at most a single
+ word.  Even if the minibuffer contents have only one completion,
+ @code{minibuffer-complete-word} does not add any characters beyond the
+ first character that is not a word constituent.  @xref{Syntax Tables}.
+ @end deffn
+ 
+ @deffn Command minibuffer-complete
+ This function completes the minibuffer contents as far as possible.
+ @end deffn
+ 
+ @deffn Command minibuffer-complete-and-exit
+ This function completes the minibuffer contents, and exits if
+ confirmation is not required, i.e., if
+ @code{minibuffer-completion-confirm} is non-@code{nil}.  If confirmation
+ @emph{is} required, it is given by repeating this command
+ immediately---the command is programmed to work without confirmation
+ when run twice in succession.
+ @end deffn
+ 
+ @defvar minibuffer-completion-confirm
+ When the value of this variable is non-@code{nil}, Emacs asks for
+ confirmation of a completion before exiting the minibuffer.  The
+ function @code{minibuffer-complete-and-exit} checks the value of this
+ variable before it exits.
+ @end defvar
+ 
+ @deffn Command minibuffer-completion-help
+ This function creates a list of the possible completions of the
+ current minibuffer contents.  It works by calling @code{all-completions}
+ using the value of the variable @code{minibuffer-completion-table} as
+ the @var{collection} argument, and the value of
+ @code{minibuffer-completion-predicate} as the @var{predicate} argument.
+ The list of completions is displayed as text in a buffer named
+ @samp{*Completions*}.
+ @end deffn
+ 
+ @defun display-completion-list completions
+ This function displays @var{completions} to the stream in
+ @code{standard-output}, usually a buffer.  (@xref{Read and Print}, for more
+ information about streams.)  The argument @var{completions} is normally
+ a list of completions just returned by @code{all-completions}, but it
+ does not have to be.  Each element may be a symbol or a string, either
+ of which is simply printed, or a list of two strings, which is printed
+ as if the strings were concatenated.
+ 
+ This function is called by @code{minibuffer-completion-help}.  The
+ most common way to use it is together with
+ @code{with-output-to-temp-buffer}, like this:
+ 
+ @example
+ (with-output-to-temp-buffer "*Completions*"
+   (display-completion-list
+     (all-completions (buffer-string) my-alist)))
+ @end example
+ @end defun
+ 
+ @defopt completion-auto-help
+ If this variable is non-@code{nil}, the completion commands
+ automatically display a list of possible completions whenever nothing
+ can be completed because the next character is not uniquely determined.
+ @end defopt
+ 
+ @node High-Level Completion
+ @subsection High-Level Completion  Functions
+ 
+   This section describes the higher-level convenient functions for
+ reading certain sorts of names with completion.
+ 
+   In most cases, you should not call these functions in the middle of a
+ Lisp function.  When possible, do all minibuffer input as part of
+ reading the arguments for a command, in the @code{interactive} spec.
+ @xref{Defining Commands}.
+ 
+ @defun read-buffer prompt &optional default existing
+ This function reads the name of a buffer and returns it as a string.
+ The argument @var{default} is the default name to use, the value to
+ return if the user exits with an empty minibuffer.  If non-@code{nil},
+ it should be a string or a buffer.  It is mentioned in the prompt, but
+ is not inserted in the minibuffer as initial input.
+ 
+ If @var{existing} is non-@code{nil}, then the name specified must be
+ that of an existing buffer.  The usual commands to exit the minibuffer
+ do not exit if the text is not valid, and @key{RET} does completion to
+ attempt to find a valid name.  (However, @var{default} is not checked
+ for validity; it is returned, whatever it is, if the user exits with the
+ minibuffer empty.)
+ 
+ In the following example, the user enters @samp{minibuffer.t}, and
+ then types @key{RET}.  The argument @var{existing} is @code{t}, and the
+ only buffer name starting with the given input is
+ @samp{minibuffer.texi}, so that name is the value.
+ 
+ @example
+ (read-buffer "Buffer name? " "foo" t)
+ @group
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following prompt appears,}
+ ;;   @r{with an empty minibuffer:}
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ----------
+ Buffer name? (default foo) @point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ 
+ @group
+ ;; @r{The user types @kbd{minibuffer.t @key{RET}}.}
+      @result{} "minibuffer.texi"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun read-command prompt
+ This function reads the name of a command and returns it as a Lisp
+ symbol.  The argument @var{prompt} is used as in
+ @code{read-from-minibuffer}.  Recall that a command is anything for
+ which @code{commandp} returns @code{t}, and a command name is a symbol
+ for which @code{commandp} returns @code{t}.  @xref{Interactive Call}.
+ 
+ @example
+ (read-command "Command name? ")
+ 
+ @group
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following prompt appears with an empty minibuffer:}
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ---------- 
+ Command name?  
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end example
+ 
+ @noindent
+ If the user types @kbd{forward-c @key{RET}}, then this function returns
+ @code{forward-char}.
+ 
+ The @code{read-command} function is a simplified interface to the
+ function @code{completing-read}.  It uses the variable @code{obarray} so
+ as to complete in the set of extant Lisp symbols, and it uses the
+ @code{commandp} predicate so as to accept only command names:
+ 
+ @cindex @code{commandp} example
+ @example
+ @group
+ (read-command @var{prompt})
+ @equiv{}
+ (intern (completing-read @var{prompt} obarray 
+                          'commandp t nil))
+ @end group
+ @end example
+ @end defun
+ 
+ @defun read-variable prompt
+ This function reads the name of a user variable and returns it as a
+ symbol.
+ 
+ @example
+ @group
+ (read-variable "Variable name? ")
+ 
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following prompt appears,} 
+ ;;   @r{with an empty minibuffer:}
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ----------
+ Variable name? @point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end example
+ 
+ @noindent
+ If the user then types @kbd{fill-p @key{RET}}, @code{read-variable}
+ returns @code{fill-prefix}.
+ 
+ This function is similar to @code{read-command}, but uses the
+ predicate @code{user-variable-p} instead of @code{commandp}:
+ 
+ @cindex @code{user-variable-p} example
+ @example
+ @group
+ (read-variable @var{prompt})
+ @equiv{}
+ (intern
+  (completing-read @var{prompt} obarray
+                   'user-variable-p t nil))
+ @end group
+ @end example
+ @end defun
+ 
+ @node Reading File Names
+ @subsection Reading File Names
+ 
+   Here is another high-level completion function, designed for reading a
+ file name.  It provides special features including automatic insertion
+ of the default directory.
+ 
+ @defun read-file-name prompt &optional directory default existing initial
+ This function reads a file name in the minibuffer, prompting with
+ @var{prompt} and providing completion.  If @var{default} is
+ non-@code{nil}, then the function returns @var{default} if the user just
+ types @key{RET}.  @var{default} is not checked for validity; it is
+ returned, whatever it is, if the user exits with the minibuffer empty.
+ 
+ If @var{existing} is non-@code{nil}, then the user must specify the name
+ of an existing file; @key{RET} performs completion to make the name
+ valid if possible, and then refuses to exit if it is not valid.  If the
+ value of @var{existing} is neither @code{nil} nor @code{t}, then
+ @key{RET} also requires confirmation after completion.  If
+ @var{existing} is @code{nil}, then the name of a nonexistent file is
+ acceptable.
+ 
+ The argument @var{directory} specifies the directory to use for
+ completion of relative file names.  If @code{insert-default-directory}
+ is non-@code{nil}, @var{directory} is also inserted in the minibuffer as
+ initial input.  It defaults to the current buffer's value of
+ @code{default-directory}.
+ 
+ @c Emacs 19 feature
+ If you specify @var{initial}, that is an initial file name to insert in
+ the buffer (after with @var{directory}, if that is inserted).  In this
+ case, point goes at the beginning of @var{initial}.  The default for
+ @var{initial} is @code{nil}---don't insert any file name.  To see what
+ @var{initial} does, try the command @kbd{C-x C-v}.
+ 
+ Here is an example: 
+ 
+ @example
+ @group
+ (read-file-name "The file is ")
+ 
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following appears in the minibuffer:}
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ----------
+ The file is /gp/gnu/elisp/@point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end example
+ 
+ @noindent
+ Typing @kbd{manual @key{TAB}} results in the following:
+ 
+ @example
+ @group
+ ---------- Buffer: Minibuffer ----------
+ The file is /gp/gnu/elisp/manual.texi@point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end example
+ 
+ @c Wordy to avoid overfull hbox in smallbook mode.
+ @noindent
+ If the user types @key{RET}, @code{read-file-name} returns the file name
+ as the string @code{"/gp/gnu/elisp/manual.texi"}.
+ @end defun
+ 
+ @defopt insert-default-directory
+ This variable is used by @code{read-file-name}.  Its value controls
+ whether @code{read-file-name} starts by placing the name of the default
+ directory in the minibuffer, plus the initial file name if any.  If the
+ value of this variable is @code{nil}, then @code{read-file-name} does
+ not place any initial input in the minibuffer (unless you specify
+ initial input with the @var{initial} argument).  In that case, the
+ default directory is still used for completion of relative file names,
+ but is not displayed.
+ 
+ For example:
+ 
+ @example
+ @group
+ ;; @r{Here the minibuffer starts out with the default directory.}
+ (let ((insert-default-directory t))
+   (read-file-name "The file is "))
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ----------
+ The file is ~lewis/manual/@point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ 
+ @group
+ ;; @r{Here the minibuffer is empty and only the prompt}
+ ;;   @r{appears on its line.}
+ (let ((insert-default-directory nil))
+   (read-file-name "The file is "))
+ @end group
+ 
+ @group
+ ---------- Buffer: Minibuffer ----------
+ The file is @point{}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end example
+ @end defopt
+ 
+ @node Programmed Completion
+ @subsection Programmed Completion
+ @cindex programmed completion
+ 
+   Sometimes it is not possible to create an alist or an obarray
+ containing all the intended possible completions.  In such a case, you
+ can supply your own function to compute the completion of a given string.
+ This is called @dfn{programmed completion}.
+ 
+   To use this feature, pass a symbol with a function definition as the
+ @var{collection} argument to @code{completing-read}.  The function
+ @code{completing-read} arranges to pass your completion function along
+ to @code{try-completion} and @code{all-completions}, which will then let
+ your function do all the work.
+ 
+   The completion function should accept three arguments:
+ 
+ @itemize @bullet
+ @item
+ The string to be completed.
+ 
+ @item
+ The predicate function to filter possible matches, or @code{nil} if
+ none.  Your function should call the predicate for each possible match,
+ and ignore the possible match if the predicate returns @code{nil}.
+ 
+ @item
+ A flag specifying the type of operation.
+ @end itemize
+ 
+   There are three flag values for three operations:
+ 
+ @itemize @bullet
+ @item
+ @code{nil} specifies @code{try-completion}.  The completion function
+ should return the completion of the specified string, or @code{t} if the
+ string is an exact match already, or @code{nil} if the string matches no
+ possibility.
+ 
+ @item
+ @code{t} specifies @code{all-completions}.  The completion function
+ should return a list of all possible completions of the specified
+ string.
+ 
+ @item
+ @code{lambda} specifies a test for an exact match.  The completion
+ function should return @code{t} if the specified string is an exact
+ match for some possibility; @code{nil} otherwise.
+ @end itemize
+ 
+   It would be consistent and clean for completion functions to allow
+ lambda expressions (lists that are functions) as well as function
+ symbols as @var{collection}, but this is impossible.  Lists as
+ completion tables are already assigned another meaning---as alists.  It
+ would be unreliable to fail to handle an alist normally because it is
+ also a possible function.  So you must arrange for any function you wish
+ to use for completion to be encapsulated in a symbol.
+ 
+   Emacs uses programmed completion when completing file names.
+ @xref{File Name Completion}.
+ 
+ @node Yes-or-No Queries
+ @section Yes-or-No Queries
+ @cindex asking the user questions
+ @cindex querying the user
+ @cindex yes-or-no questions
+ 
+   This section describes functions used to ask the user a yes-or-no
+ question.  The function @code{y-or-n-p} can be answered with a single
+ character; it is useful for questions where an inadvertent wrong answer
+ will not have serious consequences.  @code{yes-or-no-p} is suitable for
+ more momentous questions, since it requires three or four characters to
+ answer.
+ 
+    If either of these functions is called in a command that was invoked
+ using the mouse---more precisely, if @code{last-nonmenu-event}
+ (@pxref{Command Loop Info}) is either @code{nil} or a list---then it
+ uses a dialog box or pop-up menu to ask the question.  Otherwise, it
+ uses keyboard input.  You can force use of the mouse or use of keyboard
+ input by binding @code{last-nonmenu-event} to a suitable value around
+ the call.
+ 
+   Strictly speaking, @code{yes-or-no-p} uses the minibuffer and
+ @code{y-or-n-p} does not; but it seems best to describe them together.
+ 
+ @defun y-or-n-p prompt
+ This function asks the user a question, expecting input in the echo
+ area.  It returns @code{t} if the user types @kbd{y}, @code{nil} if the
+ user types @kbd{n}.  This function also accepts @key{SPC} to mean yes
+ and @key{DEL} to mean no.  It accepts @kbd{C-]} to mean ``quit'', like
+ @kbd{C-g}, because the question might look like a minibuffer and for
+ that reason the user might try to use @kbd{C-]} to get out.  The answer
+ is a single character, with no @key{RET} needed to terminate it.  Upper
+ and lower case are equivalent.
+ 
+ ``Asking the question'' means printing @var{prompt} in the echo area,
+ followed by the string @w{@samp{(y or n) }}.  If the input is not one of
+ the expected answers (@kbd{y}, @kbd{n}, @kbd{@key{SPC}},
+ @kbd{@key{DEL}}, or something that quits), the function responds
+ @samp{Please answer y or n.}, and repeats the request.
+ 
+ This function does not actually use the minibuffer, since it does not
+ allow editing of the answer.  It actually uses the echo area (@pxref{The
+ Echo Area}), which uses the same screen space as the minibuffer.  The
+ cursor moves to the echo area while the question is being asked.
+ 
+ The answers and their meanings, even @samp{y} and @samp{n}, are not
+ hardwired.  The keymap @code{query-replace-map} specifies them.
+ @xref{Search and Replace}.
+ 
+ In the following example, the user first types @kbd{q}, which is
+ invalid.  At the next prompt the user types @kbd{y}.
+ 
+ @smallexample
+ @group
+ (y-or-n-p "Do you need a lift? ")
+ 
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following prompt appears in the echo area:}
+ @end group
+ 
+ @group
+ ---------- Echo area ----------
+ Do you need a lift? (y or n) 
+ ---------- Echo area ----------
+ @end group
+ 
+ ;; @r{If the user then types @kbd{q}, the following appears:}
+ 
+ @group
+ ---------- Echo area ----------
+ Please answer y or n.  Do you need a lift? (y or n) 
+ ---------- Echo area ----------
+ @end group
+ 
+ ;; @r{When the user types a valid answer,}
+ ;;   @r{it is displayed after the question:}
+ 
+ @group
+ ---------- Echo area ----------
+ Do you need a lift? (y or n) y
+ ---------- Echo area ----------
+ @end group
+ @end smallexample
+ 
+ @noindent
+ We show successive lines of echo area messages, but only one actually
+ appears on the screen at a time.
+ @end defun
+ 
+ @defun yes-or-no-p prompt
+ This function asks the user a question, expecting input in the
+ minibuffer.  It returns @code{t} if the user enters @samp{yes},
+ @code{nil} if the user types @samp{no}.  The user must type @key{RET} to
+ finalize the response.  Upper and lower case are equivalent.
+ 
+ @code{yes-or-no-p} starts by displaying @var{prompt} in the echo area,
+ followed by @w{@samp{(yes or no) }}.  The user must type one of the
+ expected responses; otherwise, the function responds @samp{Please answer
+ yes or no.}, waits about two seconds and repeats the request.
+ 
+ @code{yes-or-no-p} requires more work from the user than
+ @code{y-or-n-p} and is appropriate for more crucial decisions.
+ 
+ Here is an example:
+ 
+ @smallexample
+ @group
+ (yes-or-no-p "Do you really want to remove everything? ")
+ 
+ ;; @r{After evaluation of the preceding expression,} 
+ ;;   @r{the following prompt appears,} 
+ ;;   @r{with an empty minibuffer:}
+ @end group
+ 
+ @group
+ ---------- Buffer: minibuffer ----------
+ Do you really want to remove everything? (yes or no) 
+ ---------- Buffer: minibuffer ----------
+ @end group
+ @end smallexample
+ 
+ @noindent
+ If the user first types @kbd{y @key{RET}}, which is invalid because this
+ function demands the entire word @samp{yes}, it responds by displaying
+ these prompts, with a brief pause between them:
+ 
+ @smallexample
+ @group
+ ---------- Buffer: minibuffer ----------
+ Please answer yes or no.
+ Do you really want to remove everything? (yes or no)
+ ---------- Buffer: minibuffer ----------
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Multiple Queries
+ @section Asking Multiple Y-or-N Questions
+ 
+   When you have a series of similar questions to ask, such as ``Do you
+ want to save this buffer'' for each buffer in turn, you should use
+ @code{map-y-or-n-p} to ask the collection of questions, rather than
+ asking each question individually.  This gives the user certain
+ convenient facilities such as the ability to answer the whole series at
+ once.
+ 
+ @defun map-y-or-n-p prompter actor list &optional help action-alist
+ This function, new in Emacs 19, asks the user a series of questions,
+ reading a single-character answer in the echo area for each one.
+ 
+ The value of @var{list} specifies the objects to ask questions about.
+ It should be either a list of objects or a generator function.  If it is
+ a function, it should expect no arguments, and should return either the
+ next object to ask about, or @code{nil} meaning stop asking questions.
+ 
+ The argument @var{prompter} specifies how to ask each question.  If
+ @var{prompter} is a string, the question text is computed like this:
+ 
+ @example
+ (format @var{prompter} @var{object})
+ @end example
+ 
+ @noindent
+ where @var{object} is the next object to ask about (as obtained from
+ @var{list}).
+ 
+ If not a string, @var{prompter} should be a function of one argument
+ (the next object to ask about) and should return the question text.  If
+ the value is a string, that is the question to ask the user.  The
+ function can also return @code{t} meaning do act on this object (and
+ don't ask the user), or @code{nil} meaning ignore this object (and don't
+ ask the user).
+ 
+ The argument @var{actor} says how to act on the answers that the user
+ gives.  It should be a function of one argument, and it is called with
+ each object that the user says yes for.  Its argument is always an
+ object obtained from @var{list}.
+ 
+ If the argument @var{help} is given, it should be a list of this form:
+ 
+ @example
+ (@var{singular} @var{plural} @var{action})
+ @end example
+ 
+ @noindent
+ where @var{singular} is a string containing a singular noun that
+ describes the objects conceptually being acted on, @var{plural} is the
+ corresponding plural noun, and @var{action} is a transitive verb
+ describing what @var{actor} does.
+ 
+ If you don't specify @var{help}, the default is @code{("object"
+ "objects" "act on")}.
+ 
+ Each time a question is asked, the user may enter @kbd{y}, @kbd{Y}, or
+ @key{SPC} to act on that object; @kbd{n}, @kbd{N}, or @key{DEL} to skip
+ that object; @kbd{!} to act on all following objects; @key{ESC} or
+ @kbd{q} to exit (skip all following objects); @kbd{.} (period) to act on
+ the current object and then exit; or @kbd{C-h} to get help.  These are
+ the same answers that @code{query-replace} accepts.  The keymap
+ @code{query-replace-map} defines their meaning for @code{map-y-or-n-p}
+ as well as for @code{query-replace}; see @ref{Search and Replace}.
+ 
+ You can use @var{action-alist} to specify additional possible answers
+ and what they mean.  It is an alist of elements of the form
+ @code{(@var{char} @var{function} @var{help})}, each of which defines one
+ additional answer.  In this element, @var{char} is a character (the
+ answer); @var{function} is a function of one argument (an object from
+ @var{list}); @var{help} is a string.
+ 
+ When the user responds with @var{char}, @code{map-y-or-n-p} calls
+ @var{function}.  If it returns non-@code{nil}, the object is considered
+ ``acted upon'', and @code{map-y-or-n-p} advances to the next object in
+ @var{list}.  If it returns @code{nil}, the prompt is repeated for the
+ same object.
+ 
+ If @code{map-y-or-n-p} is called in a command that was invoked using the
+ mouse---more precisely, if @code{last-nonmenu-event} (@pxref{Command
+ Loop Info}) is either @code{nil} or a list---then it uses a dialog box
+ or pop-up menu to ask the question.  In this case, it does not use
+ keyboard input or the echo area.  You can force use of the mouse or use
+ of keyboard input by binding @code{last-nonmenu-event} to a suitable
+ value around the call.
+ 
+ The return value of @code{map-y-or-n-p} is the number of objects acted on.
+ @end defun
+ 
+ @node Minibuffer Misc
+ @comment  node-name,  next,  previous,  up
+ @section Minibuffer Miscellany
+ 
+   This section describes some basic functions and variables related to
+ minibuffers.
+ 
+ @deffn Command exit-minibuffer
+ This command exits the active minibuffer.  It is normally bound to
+ keys in minibuffer local keymaps.
+ @end deffn
+ 
+ @deffn Command self-insert-and-exit
+ This command exits the active minibuffer after inserting the last
+ character typed on the keyboard (found in @code{last-command-char};
+ @pxref{Command Loop Info}).
+ @end deffn
+ 
+ @deffn Command previous-history-element n
+ This command replaces the minibuffer contents with the value of the
+ @var{n}th previous (older) history element.
+ @end deffn
+ 
+ @deffn Command next-history-element n
+ This command replaces the minibuffer contents with the value of the
+ @var{n}th more recent history element.
+ @end deffn
+ 
+ @deffn Command previous-matching-history-element pattern
+ This command replaces the minibuffer contents with the value of the
+ previous (older) history element that matches @var{pattern} (a regular
+ expression).
+ @end deffn
+ 
+ @deffn Command next-matching-history-element pattern
+ This command replaces the minibuffer contents with the value of the next
+ (newer) history element that matches @var{pattern} (a regular
+ expression).
+ @end deffn
+ 
+ @defun minibuffer-prompt
+ This function returns the prompt string of the currently active
+ minibuffer.  If no minibuffer is active, it returns @code{nil}.
+ @end defun
+ 
+ @defun minibuffer-prompt-width
+ This function returns the display width of the prompt string of the
+ currently active minibuffer.  If no minibuffer is active, it returns 0.
+ @end defun
+ 
+ @defvar minibuffer-setup-hook
+ This is a normal hook that is run whenever the minibuffer is entered.
+ @xref{Hooks}.
+ @end defvar
+ 
+ @defvar minibuffer-exit-hook
+ This is a normal hook that is run whenever the minibuffer is exited.
+ @xref{Hooks}.
+ @end defvar
+ 
+ @defvar minibuffer-help-form
+ The current value of this variable is used to rebind @code{help-form}
+ locally inside the minibuffer (@pxref{Help Functions}).
+ @end defvar
+ 
+ @defun active-minibuffer-window
+ This function returns the currently active minibuffer window, or
+ @code{nil} if none is currently active.
+ @end defun
+ 
+ @defun minibuffer-window &optional frame
+ This function returns the minibuffer window used for frame @var{frame}.
+ If @var{frame} is @code{nil}, that stands for the current frame.  Note
+ that the minibuffer window used by a frame need not be part of that
+ frame---a frame that has no minibuffer of its own necessarily uses some
+ other frame's minibuffer window.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun window-minibuffer-p window
+ This function returns non-@code{nil} if @var{window} is a minibuffer window.
+ @end defun
+ 
+ It is not correct to determine whether a given window is a minibuffer by
+ comparing it with the result of @code{(minibuffer-window)}, because
+ there can be more than one minibuffer window if there is more than one
+ frame.
+ 
+ @defun minibuffer-window-active-p window
+ This function returns non-@code{nil} if @var{window}, assumed to be
+ a minibuffer window, is currently active.
+ @end defun
+ 
+ @defvar minibuffer-scroll-window
+ If the value of this variable is non-@code{nil}, it should be a window
+ object.  When the function @code{scroll-other-window} is called in the
+ minibuffer, it scrolls this window.
+ @end defvar
+ 
+ Finally, some functions and variables deal with recursive minibuffers
+ (@pxref{Recursive Editing}):
+ 
+ @defun minibuffer-depth
+ This function returns the current depth of activations of the
+ minibuffer, a nonnegative integer.  If no minibuffers are active, it
+ returns zero.
+ @end defun
+ 
+ @defopt enable-recursive-minibuffers
+ If this variable is non-@code{nil}, you can invoke commands (such as
+ @code{find-file}) that use minibuffers even while in the minibuffer
+ window.  Such invocation produces a recursive editing level for a new
+ minibuffer.  The outer-level minibuffer is invisible while you are
+ editing the inner one.
+ 
+ This variable only affects invoking the minibuffer while the
+ minibuffer window is selected.   If you switch windows while in the 
+ minibuffer, you can always invoke minibuffer commands while some other
+ window is selected.
+ @end defopt
+ 
+ @c Emacs 19 feature
+ If a command name has a property @code{enable-recursive-minibuffers}
+ that is non-@code{nil}, then the command can use the minibuffer to read
+ arguments even if it is invoked from the minibuffer.  The minibuffer
+ command @code{next-matching-history-element} (normally @kbd{M-s} in the
+ minibuffer) uses this feature.
Index: emacs/man/elisp-modes.texi
diff -c /dev/null emacs/man/elisp-modes.texi:1.2
*** /dev/null	Fri Aug  2 20:55:53 1996
--- emacs/man/elisp-modes.texi	Thu Aug  1 00:23:12 1996
***************
*** 0 ****
--- 1,1395 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/modes
+ @node Modes, Documentation,  Keymaps, Top
+ @chapter Major and Minor Modes
+ @cindex mode
+ 
+   A @dfn{mode} is a set of definitions that customize Emacs and can be
+ turned on and off while you edit.  There are two varieties of modes:
+ @dfn{major modes}, which are mutually exclusive and used for editing
+ particular kinds of text, and @dfn{minor modes}, which provide features
+ that users can enable individually.
+ 
+   This chapter describes how to write both major and minor modes, how to
+ indicate them in the mode line, and how they run hooks supplied by the
+ user.  For related topics such as keymaps and syntax tables, see
+ @ref{Keymaps}, and @ref{Syntax Tables}.
+ 
+ @menu
+ * Major Modes::        Defining major modes.
+ * Minor Modes::        Defining minor modes.
+ * Mode Line Format::   Customizing the text that appears in the mode line.
+ * Hooks::              How to use hooks; how to write code that provides hooks.
+ @end menu
+ 
+ @node Major Modes
+ @section Major Modes
+ @cindex major mode
+ @cindex Fundamental mode
+ 
+   Major modes specialize Emacs for editing particular kinds of text.
+ Each buffer has only one major mode at a time.
+ 
+   The least specialized major mode is called @dfn{Fundamental mode}.
+ This mode has no mode-specific definitions or variable settings, so each
+ Emacs command behaves in its default manner, and each option is in its
+ default state.  All other major modes redefine various keys and options.
+ For example, Lisp Interaction mode provides special key bindings for
+ @key{LFD} (@code{eval-print-last-sexp}), @key{TAB}
+ (@code{lisp-indent-line}), and other keys.
+ 
+   When you need to write several editing commands to help you perform a
+ specialized editing task, creating a new major mode is usually a good
+ idea.  In practice, writing a major mode is easy (in contrast to
+ writing a minor mode, which is often difficult).
+ 
+   If the new mode is similar to an old one, it is often unwise to modify
+ the old one to serve two purposes, since it may become harder to use and
+ maintain.  Instead, copy and rename an existing major mode definition
+ and alter the copy---or define a @dfn{derived mode} (@pxref{Derived
+ Modes}).  For example, Rmail Edit mode, which is in
+ @file{emacs/lisp/rmailedit.el}, is a major mode that is very similar to
+ Text mode except that it provides three additional commands.  Its
+ definition is distinct from that of Text mode, but was derived from it.
+ 
+   Rmail Edit mode is an example of a case where one piece of text is put
+ temporarily into a different major mode so it can be edited in a
+ different way (with ordinary Emacs commands rather than Rmail).  In such
+ cases, the temporary major mode usually has a command to switch back to
+ the buffer's usual mode (Rmail mode, in this case).  You might be
+ tempted to present the temporary redefinitions inside a recursive edit
+ and restore the usual ones when the user exits; but this is a bad idea
+ because it constrains the user's options when it is done in more than
+ one buffer: recursive edits must be exited most-recently-entered first.
+ Using alternative major modes avoids this limitation.  @xref{Recursive
+ Editing}.
+ 
+   The standard GNU Emacs Lisp library directory contains the code for
+ several major modes, in files including @file{text-mode.el},
+ @file{texinfo.el}, @file{lisp-mode.el}, @file{c-mode.el}, and
+ @file{rmail.el}.  You can look at these libraries to see how modes are
+ written.  Text mode is perhaps the simplest major mode aside from
+ Fundamental mode.  Rmail mode is a complicated and specialized mode.
+ 
+ @menu
+ * Major Mode Conventions::  Coding conventions for keymaps, etc.
+ * Example Major Modes::     Text mode and Lisp modes.
+ * Auto Major Mode::         How Emacs chooses the major mode automatically.
+ * Mode Help::               Finding out how to use a mode.
+ * Derived Modes::           Defining a new major mode based on another major 
+                               mode.
+ @end menu
+ 
+ @node Major Mode Conventions
+ @subsection Major Mode Conventions
+ 
+   The code for existing major modes follows various coding conventions,
+ including conventions for local keymap and syntax table initialization,
+ global names, and hooks.  Please follow these conventions when you
+ define a new major mode:
+ 
+ @itemize @bullet
+ @item
+ Define a command whose name ends in @samp{-mode}, with no arguments,
+ that switches to the new mode in the current buffer.  This command
+ should set up the keymap, syntax table, and local variables in an
+ existing buffer without changing the buffer's text.
+ 
+ @item
+ Write a documentation string for this command that describes the
+ special commands available in this mode.  @kbd{C-h m}
+ (@code{describe-mode}) in your mode will display this string.
+ 
+ The documentation string may include the special documentation
+ substrings, @samp{\[@var{command}]}, @samp{\@{@var{keymap}@}}, and
+ @samp{\<@var{keymap}>}, that enable the documentation to adapt
+ automatically to the user's own key bindings.  @xref{Keys in
+ Documentation}.
+ 
+ @item
+ The major mode command should start by calling
+ @code{kill-all-local-variables}.  This is what gets rid of the local
+ variables of the major mode previously in effect.
+ 
+ @item
+ The major mode command should set the variable @code{major-mode} to the
+ major mode command symbol.  This is how @code{describe-mode} discovers
+ which documentation to print.
+ 
+ @item
+ The major mode command should set the variable @code{mode-name} to the
+ ``pretty'' name of the mode, as a string.  This appears in the mode
+ line.
+ 
+ @item
+ @cindex functions in modes
+ Since all global names are in the same name space, all the global
+ variables, constants, and functions that are part of the mode should
+ have names that start with the major mode name (or with an abbreviation
+ of it if the name is long).  @xref{Style Tips}.
+ 
+ @item
+ @cindex keymaps in modes
+ The major mode should usually have its own keymap, which is used as the
+ local keymap in all buffers in that mode.  The major mode function
+ should call @code{use-local-map} to install this local map.
+ @xref{Active Keymaps}, for more information.
+ 
+ This keymap should be kept in a global variable named
+ @code{@var{modename}-mode-map}.  Normally the library that defines the
+ mode sets this variable.
+ 
+ @item
+ @cindex syntax tables in modes
+ The mode may have its own syntax table or may share one with other
+ related modes.  If it has its own syntax table, it should store this in
+ a variable named @code{@var{modename}-mode-syntax-table}.  @xref{Syntax
+ Tables}.
+ 
+ @item
+ @cindex abbrev tables in modes
+ The mode may have its own abbrev table or may share one with other
+ related modes.  If it has its own abbrev table, it should store this in
+ a variable named @code{@var{modename}-mode-abbrev-table}.  @xref{Abbrev
+ Tables}.
+ 
+ @item
+ Use @code{defvar} to set mode-related variables, so that they are not
+ reinitialized if they already have a value.  (Such reinitialization
+ could discard customizations made by the user.)
+ 
+ @item
+ @cindex buffer-local variables in modes
+ To make a buffer-local binding for an Emacs customization variable, use
+ @code{make-local-variable} in the major mode command, not
+ @code{make-variable-buffer-local}.  The latter function would make the
+ variable local to every buffer in which it is subsequently set, which
+ would affect buffers that do not use this mode.  It is undesirable for a
+ mode to have such global effects.  @xref{Buffer-Local Variables}.
+ 
+ It's ok to use @code{make-variable-buffer-local}, if you wish, for a
+ variable used only within a single Lisp package.
+ 
+ @item
+ @cindex mode hook
+ @cindex major mode hook
+ Each major mode should have a @dfn{mode hook} named
+ @code{@var{modename}-mode-hook}.  The major mode command should run that
+ hook, with @code{run-hooks}, as the very last thing it
+ does. @xref{Hooks}.
+ 
+ @item
+ The major mode command may also run the hooks of some more basic modes.
+ For example, @code{indented-text-mode} runs @code{text-mode-hook} as
+ well as @code{indented-text-mode-hook}.  It may run these other hooks
+ immediately before the mode's own hook (that is, after everything else),
+ or it may run them earlier.
+ 
+ @item
+ If something special should be done if the user switches a buffer from
+ this mode to any other major mode, the mode can set a local value for
+ @code{change-major-mode-hook}.
+ 
+ @item
+ If this mode is appropriate only for specially-prepared text, then the
+ major mode command symbol should have a property named @code{mode-class}
+ with value @code{special}, put on as follows:
+ 
+ @cindex @code{mode-class} property
+ @cindex @code{special}
+ @example
+ (put 'funny-mode 'mode-class 'special)
+ @end example
+ 
+ @noindent
+ This tells Emacs that new buffers created while the current buffer has
+ Funny mode should not inherit Funny mode.  Modes such as Dired, Rmail,
+ and Buffer List use this feature.
+ 
+ @item
+ If you want to make the new mode the default for files with certain
+ recognizable names, add an element to @code{auto-mode-alist} to select
+ the mode for those file names.  If you define the mode command to
+ autoload, you should add this element in the same file that calls
+ @code{autoload}.  Otherwise, it is sufficient to add the element in the
+ file that contains the mode definition.  @xref{Auto Major Mode}.
+ 
+ @item
+ @cindex @file{.emacs} customization
+ In the documentation, you should provide a sample @code{autoload} form
+ and an example of how to add to @code{auto-mode-alist}, that users can
+ include in their @file{.emacs} files.
+ 
+ @item
+ @cindex mode loading
+ The top-level forms in the file defining the mode should be written so
+ that they may be evaluated more than once without adverse consequences.
+ Even if you never load the file more than once, someone else will.
+ @end itemize
+ 
+ @defvar change-major-mode-hook
+ This normal hook is run by @code{kill-all-local-variables} before it
+ does anything else.  This gives major modes a way to arrange for
+ something special to be done if the user switches to a different major
+ mode.  For best results, make this variable buffer-local, so that it
+ will disappear after doing its job and will not interfere with the
+ subsequent major mode.  @xref{Hooks}.
+ @end defvar
+ 
+ @node Example Major Modes
+ @subsection Major Mode Examples
+ 
+   Text mode is perhaps the simplest mode besides Fundamental mode.
+ Here are excerpts from  @file{text-mode.el} that illustrate many of
+ the conventions listed above:
+ 
+ @smallexample
+ @group
+ ;; @r{Create mode-specific tables.}
+ (defvar text-mode-syntax-table nil 
+   "Syntax table used while in text mode.")
+ @end group
+ 
+ @group
+ (if text-mode-syntax-table
+     ()              ; @r{Do not change the table if it is already set up.}
+   (setq text-mode-syntax-table (make-syntax-table))
+   (modify-syntax-entry ?\" ".   " text-mode-syntax-table)
+   (modify-syntax-entry ?\\ ".   " text-mode-syntax-table)
+   (modify-syntax-entry ?' "w   " text-mode-syntax-table))
+ @end group
+ 
+ @group
+ (defvar text-mode-abbrev-table nil
+   "Abbrev table used while in text mode.")
+ (define-abbrev-table 'text-mode-abbrev-table ())
+ @end group
+ 
+ @group
+ (defvar text-mode-map nil)   ; @r{Create a mode-specific keymap.}
+ 
+ (if text-mode-map
+     ()              ; @r{Do not change the keymap if it is already set up.}
+   (setq text-mode-map (make-sparse-keymap))
+   (define-key text-mode-map "\t" 'tab-to-tab-stop)
+   (define-key text-mode-map "\es" 'center-line)
+   (define-key text-mode-map "\eS" 'center-paragraph))
+ @end group
+ @end smallexample
+ 
+   Here is the complete major mode function definition for Text mode:
+ 
+ @smallexample
+ @group
+ (defun text-mode ()
+   "Major mode for editing text intended for humans to read. 
+  Special commands: \\@{text-mode-map@}
+ @end group
+ @group
+ Turning on text-mode runs the hook `text-mode-hook'."
+   (interactive)
+   (kill-all-local-variables)
+ @end group
+ @group
+   (use-local-map text-mode-map)     ; @r{This provides the local keymap.}
+   (setq mode-name "Text")           ; @r{This name goes into the mode line.}
+   (setq major-mode 'text-mode)      ; @r{This is how @code{describe-mode}}
+                                     ;   @r{finds the doc string to print.}
+   (setq local-abbrev-table text-mode-abbrev-table)
+   (set-syntax-table text-mode-syntax-table)
+   (run-hooks 'text-mode-hook))      ; @r{Finally, this permits the user to}
+                                     ;   @r{customize the mode with a hook.}
+ @end group
+ @end smallexample
+ 
+ @cindex @file{lisp-mode.el}
+   The three Lisp modes (Lisp mode, Emacs Lisp mode, and Lisp
+ Interaction mode) have more features than Text mode and the code is
+ correspondingly more complicated.  Here are excerpts from
+ @file{lisp-mode.el} that illustrate how these modes are written.
+ 
+ @cindex syntax table example
+ @smallexample
+ @group
+ ;; @r{Create mode-specific table variables.}
+ (defvar lisp-mode-syntax-table nil "")  
+ (defvar emacs-lisp-mode-syntax-table nil "")
+ (defvar lisp-mode-abbrev-table nil "")
+ @end group
+ 
+ @group
+ (if (not emacs-lisp-mode-syntax-table) ; @r{Do not change the table}
+                                        ;   @r{if it is already set.}
+     (let ((i 0))
+       (setq emacs-lisp-mode-syntax-table (make-syntax-table))
+ @end group
+ 
+ @group
+       ;; @r{Set syntax of chars up to 0 to class of chars that are}
+       ;;   @r{part of symbol names but not words.}
+       ;;   @r{(The number 0 is @code{48} in the @sc{ASCII} character set.)}
+       (while (< i ?0) 
+         (modify-syntax-entry i "_   " emacs-lisp-mode-syntax-table)
+         (setq i (1+ i)))
+       @dots{}
+ @end group
+ @group
+       ;; @r{Set the syntax for other characters.}
+       (modify-syntax-entry ?  "    " emacs-lisp-mode-syntax-table)
+       (modify-syntax-entry ?\t "    " emacs-lisp-mode-syntax-table)
+       @dots{}
+ @end group
+ @group
+       (modify-syntax-entry ?\( "()  " emacs-lisp-mode-syntax-table)
+       (modify-syntax-entry ?\) ")(  " emacs-lisp-mode-syntax-table)
+       @dots{}))
+ ;; @r{Create an abbrev table for lisp-mode.}
+ (define-abbrev-table 'lisp-mode-abbrev-table ())
+ @end group
+ @end smallexample
+ 
+   Much code is shared among the three Lisp modes.  The following
+ function sets various variables; it is called by each of the major Lisp
+ mode functions:
+ 
+ @smallexample
+ @group
+ (defun lisp-mode-variables (lisp-syntax)
+   ;; @r{The @code{lisp-syntax} argument is @code{nil} in Emacs Lisp mode,}
+   ;;   @r{and @code{t} in the other two Lisp modes.}
+   (cond (lisp-syntax
+          (if (not lisp-mode-syntax-table)
+              ;; @r{The Emacs Lisp mode syntax table always exists, but}
+              ;;   @r{the Lisp Mode syntax table is created the first time a}
+              ;;   @r{mode that needs it is called.  This is to save space.}
+ @end group
+ @group
+              (progn (setq lisp-mode-syntax-table
+                        (copy-syntax-table emacs-lisp-mode-syntax-table))
+                     ;; @r{Change some entries for Lisp mode.}
+                     (modify-syntax-entry ?\| "\"   "
+                                          lisp-mode-syntax-table)
+                     (modify-syntax-entry ?\[ "_   "
+                                          lisp-mode-syntax-table)
+                     (modify-syntax-entry ?\] "_   "
+                                          lisp-mode-syntax-table)))
+ @end group
+ @group
+           (set-syntax-table lisp-mode-syntax-table)))
+   (setq local-abbrev-table lisp-mode-abbrev-table)
+   @dots{})
+ @end group
+ @end smallexample
+ 
+   Functions such as @code{forward-paragraph} use the value of the
+ @code{paragraph-start} variable.  Since Lisp code is different from
+ ordinary text, the @code{paragraph-start} variable needs to be set
+ specially to handle Lisp.  Also, comments are indented in a special
+ fashion in Lisp and the Lisp modes need their own mode-specific
+ @code{comment-indent-function}.  The code to set these variables is the
+ rest of @code{lisp-mode-variables}.
+ 
+ @smallexample
+ @group
+   (make-local-variable 'paragraph-start)
+   ;; @r{Having @samp{^} is not clean, but @code{page-delimiter}}
+   ;; @r{has them too, and removing those is a pain.}
+   (setq paragraph-start (concat "^$\\|" page-delimiter))
+   @dots{}
+ @end group
+ @group
+   (make-local-variable 'comment-indent-function)
+   (setq comment-indent-function 'lisp-comment-indent))
+ @end group
+ @end smallexample
+ 
+   Each of the different Lisp modes has a slightly different keymap.  For
+ example, Lisp mode binds @kbd{C-c C-l} to @code{run-lisp}, but the other
+ Lisp modes do not.  However, all Lisp modes have some commands in
+ common.  The following function adds these common commands to a given
+ keymap.
+ 
+ @smallexample
+ @group
+ (defun lisp-mode-commands (map)
+   (define-key map "\e\C-q" 'indent-sexp)
+   (define-key map "\177" 'backward-delete-char-untabify)
+   (define-key map "\t" 'lisp-indent-line))
+ @end group
+ @end smallexample
+ 
+   Here is an example of using @code{lisp-mode-commands} to initialize a
+ keymap, as part of the code for Emacs Lisp mode.  First we declare a
+ variable with @code{defvar} to hold the mode-specific keymap.  When this
+ @code{defvar} executes, it sets the variable to @code{nil} if it was
+ void.  Then we set up the keymap if the variable is @code{nil}.
+ 
+   This code avoids changing the keymap or the variable if it is already
+ set up.  This lets the user customize the keymap.
+ 
+ @smallexample
+ @group
+ (defvar emacs-lisp-mode-map () "") 
+ (if emacs-lisp-mode-map
+     ()
+   (setq emacs-lisp-mode-map (make-sparse-keymap))
+   (define-key emacs-lisp-mode-map "\e\C-x" 'eval-defun)
+   (lisp-mode-commands emacs-lisp-mode-map))
+ @end group
+ @end smallexample
+ 
+   Finally, here is the complete major mode function definition for
+ Emacs Lisp mode.  
+ 
+ @smallexample
+ @group
+ (defun emacs-lisp-mode ()
+   "Major mode for editing Lisp code to run in Emacs.
+ Commands:
+ Delete converts tabs to spaces as it moves back.
+ Blank lines separate paragraphs.  Semicolons start comments.
+ \\@{emacs-lisp-mode-map@}
+ @end group
+ @group
+ Entry to this mode runs the hook `emacs-lisp-mode-hook'."
+   (interactive)
+   (kill-all-local-variables)
+   (use-local-map emacs-lisp-mode-map)    ; @r{This provides the local keymap.}
+   (set-syntax-table emacs-lisp-mode-syntax-table)
+ @end group
+ @group
+   (setq major-mode 'emacs-lisp-mode)     ; @r{This is how @code{describe-mode}}
+                                          ;   @r{finds out what to describe.}
+   (setq mode-name "Emacs-Lisp")          ; @r{This goes into the mode line.}
+   (lisp-mode-variables nil)              ; @r{This defines various variables.}
+   (run-hooks 'emacs-lisp-mode-hook))     ; @r{This permits the user to use a}
+                                          ;   @r{hook to customize the mode.}
+ @end group
+ @end smallexample
+ 
+ @node Auto Major Mode
+ @subsection How Emacs Chooses a Major Mode
+ 
+   Based on information in the file name or in the file itself, Emacs
+ automatically selects a major mode for the new buffer when a file is
+ visited.
+ 
+ @deffn Command fundamental-mode
+   Fundamental mode is a major mode that is not specialized for anything
+ in particular.  Other major modes are defined in effect by comparison
+ with this one---their definitions say what to change, starting from
+ Fundamental mode.  The @code{fundamental-mode} function does @emph{not}
+ run any hooks; you're not supposed to customize it.  (If you want Emacs
+ to behave differently in Fundamental mode, change the @emph{global}
+ state of Emacs.)
+ @end deffn
+ 
+ @deffn Command normal-mode &optional find-file
+ This function establishes the proper major mode and local variable
+ bindings for the current buffer.  First it calls @code{set-auto-mode},
+ then it runs @code{hack-local-variables} to parse, and bind or
+ evaluate as appropriate, any local variables.
+ 
+ If the @var{find-file} argument to @code{normal-mode} is
+ non-@code{nil}, @code{normal-mode} assumes that the @code{find-file}
+ function is calling it.  In this case, it may process a local variables
+ list at the end of the file and in the @samp{-*-} line.  The variable
+ @code{enable-local-variables} controls whether to do so.
+ 
+ If you run @code{normal-mode} interactively, the argument
+ @var{find-file} is normally @code{nil}.  In this case,
+ @code{normal-mode} unconditionally processes any local variables list.
+ @xref{File variables, , Local Variables in Files, emacs, The GNU Emacs
+ Manual}, for the syntax of the local variables section of a file.
+ 
+ @cindex file mode specification error
+ @code{normal-mode} uses @code{condition-case} around the call to the
+ major mode function, so errors are caught and reported as a @samp{File
+ mode specification error},  followed by the original error message.
+ @end deffn
+ 
+ @defopt enable-local-variables
+ This variable controls processing of local variables lists in files
+ being visited.  A value of @code{t} means process the local variables
+ lists unconditionally; @code{nil} means ignore them; anything else means
+ ask the user what to do for each file.  The default value is @code{t}.
+ @end defopt
+ 
+ @defvar ignored-local-variables
+ This variable holds a list of variables that should not be
+ set by a local variables list.  Any value specified
+ for one of these variables is ignored.
+ @end defvar
+ 
+ In addition to this list, any variable whose name has a non-@code{nil}
+ @code{risky-local-variable} property is also ignored.
+ 
+ @defopt enable-local-eval
+ This variable controls processing of @samp{Eval:} in local variables
+ lists in files being visited.  A value of @code{t} means process them
+ unconditionally; @code{nil} means ignore them; anything else means ask
+ the user what to do for each file.  The default value is @code{maybe}.
+ @end defopt
+ 
+ @defun set-auto-mode
+ @cindex visited file mode
+   This function selects the major mode that is appropriate for the
+ current buffer.  It may base its decision on the value of the @w{@samp{-*-}}
+ line, on the visited file name (using @code{auto-mode-alist}), or on the
+ value of a local variable.  However, this function does not look for
+ the @samp{mode:} local variable near the end of a file; the
+ @code{hack-local-variables} function does that.  @xref{Choosing Modes, ,
+ How Major Modes are Chosen, emacs, The GNU Emacs Manual}.
+ @end defun
+ 
+ @defopt default-major-mode 
+   This variable holds the default major mode for new buffers.  The
+ standard value is @code{fundamental-mode}.
+ 
+   If the value of @code{default-major-mode} is @code{nil}, Emacs uses
+ the (previously) current buffer's major mode for the major mode of a new
+ buffer.  However, if the major mode symbol has a @code{mode-class}
+ property with value @code{special}, then it is not used for new buffers;
+ Fundamental mode is used instead.  The modes that have this property are
+ those such as Dired and Rmail that are useful only with text that has
+ been specially prepared.
+ @end defopt
+ 
+ @defun set-buffer-major-mode buffer
+ This function sets the major mode of @var{buffer} to the value of
+ @code{default-major-mode}.  If that variable is @code{nil}, it uses
+ the current buffer's major mode (if that is suitable).
+ 
+ The low-level primitives for creating buffers do not use this function,
+ but medium-level commands such as @code{switch-to-buffer} and
+ @code{find-file-noselect} use it whenever they create buffers.
+ @end defun
+ 
+ @defvar initial-major-mode
+ @cindex @samp{*scratch*}
+ The value of this variable determines the major mode of the initial
+ @samp{*scratch*} buffer.  The value should be a symbol that is a major
+ mode command name.  The default value is @code{lisp-interaction-mode}.
+ @end defvar
+ 
+ @defvar auto-mode-alist
+ This variable contains an association list of file name patterns
+ (regular expressions; @pxref{Regular Expressions}) and corresponding
+ major mode functions.  Usually, the file name patterns test for
+ suffixes, such as @samp{.el} and @samp{.c}, but this need not be the
+ case.  An ordinary element of the alist looks like @code{(@var{regexp} .
+ @var{mode-function})}.
+ 
+ For example,
+ 
+ @smallexample
+ @group
+ (("^/tmp/fol/" . text-mode)
+  ("\\.texinfo\\'" . texinfo-mode)
+  ("\\.texi\\'" . texinfo-mode)
+ @end group
+ @group
+  ("\\.el\\'" . emacs-lisp-mode)
+  ("\\.c\\'" . c-mode) 
+  ("\\.h\\'" . c-mode)
+  @dots{})
+ @end group
+ @end smallexample
+ 
+ When you visit a file whose expanded file name (@pxref{File Name
+ Expansion}) matches a @var{regexp}, @code{set-auto-mode} calls the
+ corresponding @var{mode-function}.  This feature enables Emacs to select
+ the proper major mode for most files.
+ 
+ If an element of @code{auto-mode-alist} has the form @code{(@var{regexp}
+ @var{function} t)}, then after calling @var{function}, Emacs searches
+ @code{auto-mode-alist} again for a match against the portion of the file
+ name that did not match before.
+ 
+ This match-again feature is useful for uncompression packages: an entry
+ of the form @code{("\\.gz\\'" . @var{function})} can uncompress the file
+ and then put the uncompressed file in the proper mode according to the
+ name sans @samp{.gz}.
+ 
+ Here is an example of how to prepend several pattern pairs to
+ @code{auto-mode-alist}.  (You might use this sort of expression in your
+ @file{.emacs} file.)
+ 
+ @smallexample
+ @group
+ (setq auto-mode-alist
+   (append 
+    ;; @r{File name starts with a dot.}
+    '(("/\\.[^/]*\\'" . fundamental-mode)  
+      ;; @r{File name has no dot.}
+      ("[^\\./]*\\'" . fundamental-mode)   
+      ;; @r{File name ends in @samp{.C}.}
+      ("\\.C\\'" . c++-mode))
+    auto-mode-alist))
+ @end group
+ @end smallexample
+ @end defvar
+ 
+ @defvar interpreter-mode-alist
+ This variable specifes major modes to use for scripts that specify a
+ command interpreter in an @samp{!#} line.  Its value is a list of
+ elements of the form @code{(@var{interpreter} . @var{mode})}; for
+ example, @code{("perl" . perl-mode)} is one element present by default.
+ The element says to use mode @var{mode} if the file specifies
+ @var{interpreter}.
+ 
+ This variable is applicable only when the @code{auto-mode-alist} does
+ not indicate which major mode to use.
+ @end defvar
+ 
+ @defun hack-local-variables &optional force
+   This function parses, and binds or evaluates as appropriate, any local
+ variables for the current buffer.
+ 
+   The handling of @code{enable-local-variables} documented for
+ @code{normal-mode} actually takes place here.  The argument @var{force}
+ usually comes from the argument @var{find-file} given to
+ @code{normal-mode}.
+ @end defun
+ 
+ @node Mode Help
+ @subsection Getting Help about a Major Mode
+ @cindex mode help
+ @cindex help for major mode
+ @cindex documentation for major mode
+ 
+   The @code{describe-mode} function is used to provide information
+ about major modes.  It is normally called with @kbd{C-h m}.  The
+ @code{describe-mode} function uses the value of @code{major-mode},
+ which is why every major mode function needs to set the
+ @code{major-mode} variable.
+ 
+ @deffn Command describe-mode
+ This function displays the documentation of the current major mode.
+ 
+ The @code{describe-mode} function calls the @code{documentation}
+ function using the value of @code{major-mode} as an argument.  Thus, it
+ displays the documentation string of the major mode function.
+ (@xref{Accessing Documentation}.)
+ @end deffn
+ 
+ @defvar major-mode
+ This variable holds the symbol for the current buffer's major mode.
+ This symbol should have a function definition that is the command to
+ switch to that major mode.  The @code{describe-mode} function uses the
+ documentation string of the function as the documentation of the major
+ mode.
+ @end defvar
+ 
+ @node Derived Modes
+ @subsection Defining Derived Modes
+ 
+   It's often useful to define a new major mode in terms of an existing
+ one.  An easy way to do this is to use @code{define-derived-mode}.
+ 
+ @defmac define-derived-mode variant parent name docstring body@dots{}
+ This construct defines @var{variant} as a major mode command, using
+ @var{name} as the string form of the mode name.
+ 
+ The new command @var{variant} is defined to call the function
+ @var{parent}, then override certain aspects of that parent mode:
+ 
+ @itemize @bullet 
+ @item
+ The new mode has its own keymap, named @code{@var{variant}-map}.
+ @code{define-derived-mode} initializes this map to inherit from
+ @code{@var{parent}-map}, if it is not already set.
+ 
+ @item
+ The new mode has its own syntax table, kept in the variable
+ @code{@var{variant}-syntax-table}.
+ @code{define-derived-mode} initializes this variable by copying 
+ @code{@var{parent}-syntax-table}, if it is not already set.
+ 
+ @item
+ The new mode has its own abbrev table, kept in the variable
+ @code{@var{variant}-abbrev-table}.
+ @code{define-derived-mode} initializes this variable by copying 
+ @code{@var{parent}-abbrev-table}, if it is not already set.
+ 
+ @item
+ The new mode has its own mode hook, @code{@var{variant}-hook},
+ which it runs in standard fashion as the very last thing that it does.
+ (The new mode also runs the mode hook of @var{parent} as part 
+ of calling @var{parent}.)
+ @end itemize
+ 
+ In addition, you can specify how to override other aspects of
+ @var{parent} with @var{body}.  The command @var{variant}
+ evaluates the forms in @var{body} after setting up all its usual 
+ overrides, just before running @code{@var{variant}-hook}.
+ 
+ The argument @var{docstring} specifies the documentation string for the
+ new mode.  If you omit @var{docstring}, @code{define-derived-mode}
+ generates a documentation string.
+ 
+ Here is a hypothetical example:
+ 
+ @example
+ (define-derived-mode hypertext-mode
+   text-mode "Hypertext"
+   "Major mode for hypertext.
+ \\@{hypertext-mode-map@}"
+   (setq case-fold-search nil))
+ 
+ (define-key hypertext-mode-map
+   [down-mouse-3] 'do-hyper-link)
+ @end example
+ @end defmac
+ 
+ @node Minor Modes
+ @section Minor Modes
+ @cindex minor mode
+ 
+   A @dfn{minor mode} provides features that users may enable or disable
+ independently of the choice of major mode.  Minor modes can be enabled
+ individually or in combination.  Minor modes would be better named
+ ``Generally available, optional feature modes'' except that such a name is
+ unwieldy.
+ 
+   A minor mode is not usually a modification of single major mode.  For
+ example, Auto Fill mode may be used in any major mode that permits text
+ insertion.  To be general, a minor mode must be effectively independent
+ of the things major modes do.
+ 
+   A minor mode is often much more difficult to implement than a major
+ mode.  One reason is that you should be able to activate and deactivate
+ minor modes in any order.  A minor mode should be able to have its
+ desired effect regardless of the major mode and regardless of the other
+ minor modes in effect.
+ 
+   Often the biggest problem in implementing a minor mode is finding a
+ way to insert the necessary hook into the rest of Emacs.  Minor mode
+ keymaps make this easier than it used to be.
+ 
+ @menu
+ * Minor Mode Conventions::      Tips for writing a minor mode.
+ * Keymaps and Minor Modes::     How a minor mode can have its own keymap.
+ @end menu
+ 
+ @node Minor Mode Conventions
+ @subsection Conventions for Writing Minor Modes
+ @cindex minor mode conventions
+ @cindex conventions for writing minor modes
+ 
+   There are conventions for writing minor modes just as there are for
+ major modes.  Several of the major mode conventions apply to minor
+ modes as well: those regarding the name of the mode initialization
+ function, the names of global symbols, and the use of keymaps and
+ other tables.
+ 
+   In addition, there are several conventions that are specific to
+ minor modes.
+ 
+ @itemize @bullet
+ @item
+ @cindex mode variable
+ Make a variable whose name ends in @samp{-mode} to represent the minor
+ mode.  Its value should enable or disable the mode (@code{nil} to
+ disable; anything else to enable.)  We call this the @dfn{mode
+ variable}.
+ 
+ This variable is used in conjunction with the @code{minor-mode-alist} to
+ display the minor mode name in the mode line.  It can also enable
+ or disable a minor mode keymap.  Individual commands or hooks can also
+ check the variable's value.
+ 
+ If you want the minor mode to be enabled separately in each buffer,
+ make the variable buffer-local.
+ 
+ @item
+ Define a command whose name is the same as the mode variable.
+ Its job is to enable and disable the mode by setting the variable.
+ 
+ The command should accept one optional argument.  If the argument is
+ @code{nil}, it should toggle the mode (turn it on if it is off, and off
+ if it is on).  Otherwise, it should turn the mode on if the argument is
+ a positive integer, a symbol other than @code{nil} or @code{-}, or a
+ list whose @sc{car} is such an integer or symbol; it should turn the
+ mode off otherwise.
+ 
+ Here is an example taken from the definition of @code{transient-mark-mode}.
+ It shows the use of @code{transient-mark-mode} as a variable that enables or
+ disables the mode's behavior, and also shows the proper way to toggle,
+ enable or disable the minor mode based on the raw prefix argument value.
+ 
+ @smallexample
+ @group
+ (setq transient-mark-mode
+       (if (null arg) (not transient-mark-mode)
+         (> (prefix-numeric-value arg) 0)))
+ @end group
+ @end smallexample
+ 
+ @item
+ Add an element to @code{minor-mode-alist} for each minor mode
+ (@pxref{Mode Line Variables}).  This element should be a list of the
+ following form:
+ 
+ @smallexample
+ (@var{mode-variable} @var{string})
+ @end smallexample
+ 
+ Here @var{mode-variable} is the variable that controls enabling of the
+ minor mode, and @var{string} is a short string, starting with a space,
+ to represent the mode in the mode line.  These strings must be short so
+ that there is room for several of them at once.
+ 
+ When you add an element to @code{minor-mode-alist}, use @code{assq} to
+ check for an existing element, to avoid duplication.  For example:
+ 
+ @smallexample
+ @group
+ (or (assq 'leif-mode minor-mode-alist)
+     (setq minor-mode-alist
+           (cons '(leif-mode " Leif") minor-mode-alist)))
+ @end group
+ @end smallexample
+ @end itemize
+ 
+ @node Keymaps and Minor Modes
+ @subsection Keymaps and Minor Modes
+ 
+   Each minor mode can have its own keymap, which is active when the mode
+ is enabled.  To set up a keymap for a minor mode, add an element to the
+ alist @code{minor-mode-map-alist}.  @xref{Active Keymaps}.
+ 
+ @cindex @code{self-insert-command}, minor modes
+ One use of minor mode keymaps is to modify the behavior of certain
+ self-inserting characters so that they do something else as well as
+ self-insert.  In general, this is the only way to do that, since the
+ facilities for customizing @code{self-insert-command} are limited to
+ special cases (designed for abbrevs and Auto Fill mode).  (Do not try
+ substituting your own definition of @code{self-insert-command} for the
+ standard one.  The editor command loop handles this function specially.)
+ 
+ @node Mode Line Format
+ @section Mode Line Format
+ @cindex mode line
+ 
+   Each Emacs window (aside from minibuffer windows) includes a mode line,
+ which displays status information about the buffer displayed in the
+ window.  The mode line contains information about the buffer, such as its
+ name, associated file, depth of recursive editing, and the major and
+ minor modes.
+ 
+   This section describes how the contents of the mode line are
+ controlled.  It is in the chapter on modes because much of the
+ information displayed in the mode line relates to the enabled major and
+ minor modes.
+ 
+   @code{mode-line-format} is a buffer-local variable that holds a
+ template used to display the mode line of the current buffer.  All
+ windows for the same buffer use the same @code{mode-line-format} and
+ their mode lines appear the same (except for scrolling percentages and
+ line numbers).
+ 
+   The mode line of a window is normally updated whenever a different
+ buffer is shown in the window, or when the buffer's modified-status
+ changes from @code{nil} to @code{t} or vice-versa.  If you modify any of
+ the variables referenced by @code{mode-line-format} (@pxref{Mode Line
+ Variables}), you may want to force an update of the mode line so as to
+ display the new information.
+ 
+ @c Emacs 19 feature
+ @defun force-mode-line-update
+ Force redisplay of the current buffer's mode line.
+ @end defun
+ 
+   The mode line is usually displayed in inverse video; see
+ @code{mode-line-inverse-video} in @ref{Inverse Video}.
+ 
+ @menu
+ * Mode Line Data::        The data structure that controls the mode line.
+ * Mode Line Variables::   Variables used in that data structure.
+ * %-Constructs::          Putting information into a mode line.
+ @end menu
+ 
+ @node Mode Line Data
+ @subsection The Data Structure of the Mode Line
+ @cindex mode line construct
+ 
+   The mode line contents are controlled by a data structure of lists,
+ strings, symbols, and numbers kept in the buffer-local variable
+ @code{mode-line-format}.  The data structure is called a @dfn{mode line
+ construct}, and it is built in recursive fashion out of simpler mode line
+ constructs.  The same data structure is used for constructing
+ frame titles (@pxref{Frame Titles}).
+ 
+ @defvar mode-line-format
+ The value of this variable is a mode line construct with overall
+ responsibility for the mode line format.  The value of this variable
+ controls which other variables are used to form the mode line text, and
+ where they appear.
+ @end defvar
+ 
+   A mode line construct may be as simple as a fixed string of text, but
+ it usually specifies how to use other variables to construct the text.
+ Many of these variables are themselves defined to have mode line
+ constructs as their values.
+ 
+   The default value of @code{mode-line-format} incorporates the values
+ of variables such as @code{mode-name} and @code{minor-mode-alist}.
+ Because of this, very few modes need to alter @code{mode-line-format}.
+ For most purposes, it is sufficient to alter the variables referenced by
+ @code{mode-line-format}.
+ 
+   A mode line construct may be a list, a symbol, or a string.  If the
+ value is a list, each element may be a list, a symbol, or a string.
+ 
+ @table @code
+ @cindex percent symbol in mode line
+ @item @var{string}
+ A string as a mode line construct is displayed verbatim in the mode line
+ except for @dfn{@code{%}-constructs}.  Decimal digits after the @samp{%}
+ specify the field width for space filling on the right (i.e., the data
+ is left justified).  @xref{%-Constructs}.
+ 
+ @item @var{symbol}
+ A symbol as a mode line construct stands for its value.  The value of
+ @var{symbol} is used as a mode line construct, in place of @var{symbol}.
+ However, the symbols @code{t} and @code{nil} are ignored; so is any
+ symbol whose value is void.
+ 
+ There is one exception: if the value of @var{symbol} is a string, it is
+ displayed verbatim: the @code{%}-constructs are not recognized.
+ 
+ @item (@var{string} @var{rest}@dots{}) @r{or} (@var{list} @var{rest}@dots{})
+ A list whose first element is a string or list means to process all the
+ elements recursively and concatenate the results.  This is the most
+ common form of mode line construct.
+ 
+ @item (@var{symbol} @var{then} @var{else})
+ A list whose first element is a symbol is a conditional.  Its meaning
+ depends on the value of @var{symbol}.  If the value is non-@code{nil},
+ the second element, @var{then}, is processed recursively as a mode line
+ element.  But if the value of @var{symbol} is @code{nil}, the third
+ element, @var{else}, is processed recursively.  You may omit @var{else};
+ then the mode line element displays nothing if the value of @var{symbol}
+ is @code{nil}.
+ 
+ @item (@var{width} @var{rest}@dots{})
+ A list whose first element is an integer specifies truncation or
+ padding of the results of @var{rest}.  The remaining elements
+ @var{rest} are processed recursively as mode line constructs and
+ concatenated together.  Then the result is space filled (if
+ @var{width} is positive) or truncated (to @minus{}@var{width} columns,
+ if @var{width} is negative) on the right.
+ 
+ For example, the usual way to show what percentage of a buffer is above
+ the top of the window is to use a list like this: @code{(-3 "%p")}.
+ @end table
+ 
+   If you do alter @code{mode-line-format} itself, the new value should
+ use the same variables that appear in the default value (@pxref{Mode
+ Line Variables}), rather than duplicating their contents or displaying
+ the information in another fashion.  This way, customizations made by
+ the user or by Lisp programs (such as @code{display-time} and major
+ modes) via changes to those variables remain effective.
+ 
+ @cindex Shell mode @code{mode-line-format}
+   Here is an example of a @code{mode-line-format} that might be
+ useful for @code{shell-mode}, since it contains the hostname and default
+ directory.
+ 
+ @example
+ @group
+ (setq mode-line-format
+   (list ""
+    'mode-line-modified
+    "%b--" 
+ @end group
+    (getenv "HOST")      ; @r{One element is not constant.}
+    ":" 
+    'default-directory
+    "   "
+    'global-mode-string
+    "   %[("
+    'mode-name 
+    'mode-line-process  
+    'minor-mode-alist 
+    "%n" 
+    ")%]----"
+ @group
+    '(line-number-mode "L%l--")
+    '(-3 . "%p")
+    "-%-"))
+ @end group
+ @end example
+ 
+ @node Mode Line Variables
+ @subsection Variables Used in the Mode Line
+ 
+   This section describes variables incorporated by the
+ standard value of @code{mode-line-format} into the text of the mode
+ line.  There is nothing inherently special about these variables; any
+ other variables could have the same effects on the mode line if
+ @code{mode-line-format} were changed to use them.
+ 
+ @defvar mode-line-modified
+ This variable holds the value of the mode-line construct that displays
+ whether the current buffer is modified.
+ 
+ The default value of @code{mode-line-modified} is @code{("--%1*%1+-")}.
+ This means that the mode line displays @samp{--**-} if the buffer is
+ modified, @samp{-----} if the buffer is not modified, @samp{--%%-} if
+ the buffer is read only, and @samp{--%*--} if the buffer is read only
+ and modified.
+ 
+ Changing this variable does not force an update of the mode line.
+ @end defvar
+ 
+ @defvar mode-line-buffer-identification
+ This variable identifies the buffer being displayed in the window.  Its
+ default value is @code{("%F: %17b")}, which means that it usually
+ displays @samp{Emacs:} followed by seventeen characters of the buffer
+ name.  (In a terminal frame, it displays the frame name instead of
+ @samp{Emacs}; this has the effect of showing the frame number.)  You may
+ want to change this in modes such as Rmail that do not behave like a
+ ``normal'' Emacs.
+ @end defvar
+ 
+ @defvar global-mode-string
+ This variable holds a mode line spec that appears in the mode line by
+ default, just after the buffer name.  The command @code{display-time}
+ sets @code{global-mode-string} to refer to the variable
+ @code{display-time-string}, which holds a string containing the time and
+ load information.
+ 
+ The @samp{%M} construct substitutes the value of
+ @code{global-mode-string}, but this is obsolete, since the variable is
+ included directly in the mode line.
+ @end defvar
+ 
+ @defvar mode-name
+ This buffer-local variable holds the ``pretty'' name of the current
+ buffer's major mode.  Each major mode should set this variable so that the
+ mode name will appear in the mode line.
+ @end defvar
+ 
+ @defvar minor-mode-alist
+ This variable holds an association list whose elements specify how the
+ mode line should indicate that a minor mode is active.  Each element of
+ the @code{minor-mode-alist} should be a two-element list:
+ 
+ @example
+ (@var{minor-mode-variable} @var{mode-line-string})
+ @end example
+ 
+ More generally, @var{mode-line-string} can be any mode line spec.  It
+ appears in the mode line when the value of @var{minor-mode-variable} is
+ non-@code{nil}, and not otherwise.  These strings should begin with
+ spaces so that they don't run together.  Conventionally, the
+ @var{minor-mode-variable} for a specific mode is set to a non-@code{nil}
+ value when that minor mode is activated.
+ 
+ The default value of @code{minor-mode-alist} is:
+ 
+ @example
+ @group
+ minor-mode-alist
+ @result{} ((vc-mode vc-mode)
+     (abbrev-mode " Abbrev") 
+     (overwrite-mode overwrite-mode) 
+     (auto-fill-function " Fill")         
+     (defining-kbd-macro " Def")
+     (isearch-mode isearch-mode))
+ @end group
+ @end example
+ 
+ @code{minor-mode-alist} is not buffer-local.  The variables mentioned
+ in the alist should be buffer-local if the minor mode can be enabled
+ separately in each buffer.
+ @end defvar
+ 
+ @defvar mode-line-process
+ This buffer-local variable contains the mode line information on process
+ status in modes used for communicating with subprocesses.  It is
+ displayed immediately following the major mode name, with no intervening
+ space.  For example, its value in the @samp{*shell*} buffer is
+ @code{(":@: %s")}, which allows the shell to display its status along
+ with the major mode as: @samp{(Shell:@: run)}.  Normally this variable
+ is @code{nil}.
+ @end defvar
+ 
+ @defvar default-mode-line-format
+ This variable holds the default @code{mode-line-format} for buffers
+ that do not override it.  This is the same as @code{(default-value
+ 'mode-line-format)}.
+ 
+ The default value of @code{default-mode-line-format} is:
+ 
+ @example
+ @group
+ (""
+  mode-line-modified
+  mode-line-buffer-identification
+  "   "
+  global-mode-string
+  "   %[("
+  mode-name 
+ @end group
+ @group
+  mode-line-process
+  minor-mode-alist 
+  "%n" 
+  ")%]----"
+  (line-number-mode "L%l--")
+  (-3 . "%p")
+  "-%-")
+ @end group
+ @end example
+ @end defvar
+ 
+ @defvar vc-mode
+ The variable @code{vc-mode}, local in each buffer, records whether the
+ buffer's visited file is maintained with version control, and, if so,
+ which kind.  Its value is @code{nil} for no version control, or a string
+ that appears in the mode line.
+ @end defvar
+ 
+ @node %-Constructs
+ @subsection @code{%}-Constructs in the Mode Line
+ 
+   The following table lists the recognized @code{%}-constructs and what
+ they mean.  In any construct except @samp{%%}, you can add a decimal
+ integer after the @samp{%} to specify how many characters to display.
+ 
+ @table @code
+ @item %b
+ The current buffer name, obtained with the @code{buffer-name} function.
+ @xref{Buffer Names}.
+ 
+ @item %f
+ The visited file name, obtained with the @code{buffer-file-name}
+ function.  @xref{Buffer File Name}.
+ 
+ @item %F
+ The name of the selected frame.
+ 
+ @item %c
+ The current column number of point.
+ 
+ @item %l
+ The current line number of point.
+ 
+ @item %*
+ @samp{%} if the buffer is read only (see @code{buffer-read-only}); @*
+ @samp{*} if the buffer is modified (see @code{buffer-modified-p}); @*
+ @samp{-} otherwise.  @xref{Buffer Modification}.
+ 
+ @item %+
+ @samp{*} if the buffer is modified (see @code{buffer-modified-p}); @*
+ @samp{%} if the buffer is read only (see @code{buffer-read-only}); @*
+ @samp{-} otherwise.  This differs from @samp{%*} only for a modified
+ read-only buffer.  @xref{Buffer Modification}.
+ 
+ @item %&
+ @samp{*} if the buffer is modified, and @samp{-} otherwise.
+ 
+ @item %s
+ The status of the subprocess belonging to the current buffer, obtained with
+ @code{process-status}.  @xref{Process Information}.
+ 
+ @item %t
+ Whether the visited file is a text file or a binary file.  (This is a
+ meaningful distinction only on certain operating systems.)
+ 
+ @item %p
+ The percentage of the buffer text above the @strong{top} of window, or
+ @samp{Top}, @samp{Bottom} or @samp{All}.
+ 
+ @item %P
+ The percentage of the buffer text that is above the @strong{bottom} of
+ the window (which includes the text visible in the window, as well as
+ the text above the top), plus @samp{Top} if the top of the buffer is
+ visible on screen; or @samp{Bottom} or @samp{All}.
+ 
+ @item %n
+ @samp{Narrow} when narrowing is in effect; nothing otherwise (see
+ @code{narrow-to-region} in @ref{Narrowing}).
+ 
+ @item %[
+ An indication of the depth of recursive editing levels (not counting
+ minibuffer levels): one @samp{[} for each editing level.
+ @xref{Recursive Editing}.
+ 
+ @item %]
+ One @samp{]} for each recursive editing level (not counting minibuffer
+ levels).
+ 
+ @item %%
+ The character @samp{%}---this is how to include a literal @samp{%} in a
+ string in which @code{%}-constructs are allowed.
+ 
+ @item %-
+ Dashes sufficient to fill the remainder of the mode line.
+ @end table
+ 
+ The following two @code{%}-constructs are still supported, but they are
+ obsolete, since you can get the same results with the variables
+ @code{mode-name} and @code{global-mode-string}.
+ 
+ @table @code
+ @item %m
+ The value of @code{mode-name}.
+ 
+ @item %M
+ The value of @code{global-mode-string}.  Currently, only
+ @code{display-time} modifies the value of @code{global-mode-string}.
+ @end table
+ 
+ @node Hooks
+ @section Hooks
+ @cindex hooks
+ 
+   A @dfn{hook} is a variable where you can store a function or functions
+ to be called on a particular occasion by an existing program.  Emacs
+ provides hooks for the sake of customization.  Most often, hooks are set
+ up in the @file{.emacs} file, but Lisp programs can set them also.
+ @xref{Standard Hooks}, for a list of standard hook variables.
+ 
+   Most of the hooks in Emacs are @dfn{normal hooks}.  These variables
+ contain lists of functions to be called with no arguments.  The reason
+ most hooks are normal hooks is so that you can use them in a uniform
+ way.  You can always tell when a hook is a normal hook, because its 
+ name ends in @samp{-hook}.
+ 
+   The recommended way to add a hook function to a normal hook is by
+ calling @code{add-hook} (see below).  The hook functions may be any of
+ the valid kinds of functions that @code{funcall} accepts (@pxref{What Is
+ a Function}).  Most normal hook variables are initially void;
+ @code{add-hook} knows how to deal with this.
+ 
+   As for abnormal hooks, those whose names end in @samp{-function} have
+ a value that is a single function.  Those whose names end in
+ @samp{-hooks} have a value that is a list of functions.  Any hook that
+ is abnormal is abnormal because a normal hook won't do the job; either
+ the functions are called with arguments, or their values are meaningful.
+ The name shows you that the hook is abnormal and that you should look at
+ its documentation string to see how to use it properly.
+ 
+   Major mode functions are supposed to run a hook called the @dfn{mode
+ hook} as the last step of initialization.  This makes it easy for a user
+ to customize the behavior of the mode, by overriding the local variable
+ assignments already made by the mode.  But hooks are used in other
+ contexts too.  For example, the hook @code{suspend-hook} runs just
+ before Emacs suspends itself (@pxref{Suspending Emacs}).
+ 
+   Here's an expression that uses a mode hook to turn on Auto Fill mode
+ when in Lisp Interaction mode:
+ 
+ @example
+ (add-hook 'lisp-interaction-mode-hook 'turn-on-auto-fill)
+ @end example
+ 
+   The next example shows how to use a hook to customize the way Emacs
+ formats C code.  (People often have strong personal preferences for one
+ format or another.)  Here the hook function is an anonymous lambda
+ expression.
+ 
+ @cindex lambda expression in hook
+ @example
+ @group
+ (add-hook 'c-mode-hook 
+   (function (lambda ()
+               (setq c-indent-level 4
+                     c-argdecl-indent 0
+                     c-label-offset -4
+ @end group
+ @group
+                     c-continued-statement-indent 0
+                     c-brace-offset 0
+                     comment-column 40))))
+ 
+ (setq c++-mode-hook c-mode-hook)
+ @end group
+ @end example
+ 
+   At the appropriate time, Emacs uses the @code{run-hooks} function to
+ run particular hooks.  This function calls the hook functions that have
+ been added with @code{add-hook}.
+ 
+ @defun run-hooks &rest hookvar
+ This function takes one or more hook variable names as arguments, and
+ runs each hook in turn.  Each @var{hookvar} argument should be a symbol
+ that is a hook variable.  These arguments are processed in the order
+ specified.
+ 
+ If a hook variable has a non-@code{nil} value, that value may be a
+ function or a list of functions.  If the value is a function (either a
+ lambda expression or a symbol with a function definition), it is
+ called.  If it is a list, the elements are called, in order.
+ The hook functions are called with no arguments.
+ 
+ For example, here's how @code{emacs-lisp-mode} runs its mode hook:
+ 
+ @example
+ (run-hooks 'emacs-lisp-mode-hook)
+ @end example
+ @end defun
+ 
+ @defun add-hook hook function &optional append local
+ This function is the handy way to add function @var{function} to hook
+ variable @var{hook}.  The argument @var{function} may be any valid Lisp
+ function with the proper number of arguments.  For example,
+ 
+ @example
+ (add-hook 'text-mode-hook 'my-text-hook-function)
+ @end example
+ 
+ @noindent
+ adds @code{my-text-hook-function} to the hook called @code{text-mode-hook}.
+ 
+ You can use @code{add-hook} for abnormal hooks as well as for normal
+ hooks.
+ 
+ It is best to design your hook functions so that the order in which they
+ are executed does not matter.  Any dependence on the order is ``asking
+ for trouble.''  However, the order is predictable: normally,
+ @var{function} goes at the front of the hook list, so it will be
+ executed first (barring another @code{add-hook} call).
+ 
+ If the optional argument @var{append} is non-@code{nil}, the new hook
+ function goes at the end of the hook list and will be executed last.
+ 
+ If @var{local} is non-@code{nil}, that says to make the new hook
+ function local to the current buffer.  Before you can do this, you must
+ make the hook itself buffer-local by calling @code{make-local-hook}
+ (@strong{not} @code{make-local-variable}).  If the hook itself is not
+ buffer-local, then the value of @var{local} makes no difference---the
+ hook function is always global.
+ @end defun
+ 
+ @defun remove-hook hook function &optional local
+ This function removes @var{function} from the hook variable @var{hook}.
+ 
+ If @var{local} is non-@code{nil}, that says to remove @var{function}
+ from the local hook list instead of from the global hook list.  If the
+ hook itself is not buffer-local, then the value of @var{local} makes no
+ difference.
+ @end defun
+ 
+ @defun make-local-hook hook
+ This function makes the hook variable @code{hook} local to the current
+ buffer.  When a hook variable is local, it can have local and global
+ hook functions, and @code{run-hooks} runs all of them.
+ 
+ This function works by making @code{t} an element of the buffer-local
+ value.  That serves as a flag to use the hook functions in the default
+ value of the hook variable as well as those in the local value.  Since
+ @code{run-hooks} understands this flag, @code{make-local-hook} works
+ with all normal hooks.  It works for only some non-normal hooks---those
+ whose callers have been updated to understand this meaning of @code{t}.
+ 
+ Do not use @code{make-local-variable} directly for hook variables; it is
+ not sufficient.
+ @end defun
Index: emacs/man/elisp-numbers.texi
diff -c /dev/null emacs/man/elisp-numbers.texi:1.2
*** /dev/null	Fri Aug  2 20:56:19 1996
--- emacs/man/elisp-numbers.texi	Thu Aug  1 00:23:15 1996
***************
*** 0 ****
--- 1,1034 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/numbers
+ @node Numbers, Strings and Characters, Lisp Data Types, Top
+ @chapter Numbers
+ @cindex integers
+ @cindex numbers
+ 
+   GNU Emacs supports two numeric data types: @dfn{integers} and
+ @dfn{floating point numbers}.  Integers are whole numbers such as
+ @minus{}3, 0, 7, 13, and 511.  Their values are exact.  Floating point
+ numbers are numbers with fractional parts, such as @minus{}4.5, 0.0, or
+ 2.71828.  They can also be expressed in exponential notation:
+ 1.5e2 equals 150; in this example, @samp{e2} stands for ten to the
+ second power, and is multiplied by 1.5.  Floating point values are not
+ exact; they have a fixed, limited amount of precision.
+ 
+   Support for floating point numbers is a new feature in Emacs 19, and it
+ is controlled by a separate compilation option, so you may encounter a site
+ where Emacs does not support them.
+ 
+ @menu
+ * Integer Basics::            Representation and range of integers.
+ * Float Basics::	      Representation and range of floating point.
+ * Predicates on Numbers::     Testing for numbers.
+ * Comparison of Numbers::     Equality and inequality predicates.
+ * Numeric Conversions::	      Converting float to integer and vice versa.
+ * Arithmetic Operations::     How to add, subtract, multiply and divide.
+ * Rounding Operations::       Explicitly rounding floating point numbers.
+ * Bitwise Operations::        Logical and, or, not, shifting.
+ * Math Functions::            Trig, exponential and logarithmic functions.
+ * Random Numbers::            Obtaining random integers, predictable or not.
+ @end menu
+ 
+ @node Integer Basics
+ @comment  node-name,  next,  previous,  up
+ @section Integer Basics
+ 
+   The range of values for an integer depends on the machine.  The
+ minimum range is @minus{}134217728 to 134217727 (28 bits; i.e.,
+ @ifinfo 
+ -2**27
+ @end ifinfo
+ @tex 
+ $-2^{27}$
+ @end tex
+ to 
+ @ifinfo 
+ 2**27 - 1),
+ @end ifinfo
+ @tex 
+ $2^{27}-1$),
+ @end tex
+ but some machines may provide a wider range.  Many examples in this
+ chapter assume an integer has 28 bits.
+ @cindex overflow
+ 
+   The Lisp reader reads an integer as a sequence of digits with optional
+ initial sign and optional final period.
+ 
+ @example
+  1               ; @r{The integer 1.}
+  1.              ; @r{The integer 1.}
+ +1               ; @r{Also the integer 1.}
+ -1               ; @r{The integer @minus{}1.}
+  268435457       ; @r{Also the integer 1, due to overflow.}
+  0               ; @r{The integer 0.}
+ -0               ; @r{The integer 0.}
+ @end example
+ 
+   To understand how various functions work on integers, especially the
+ bitwise operators (@pxref{Bitwise Operations}), it is often helpful to
+ view the numbers in their binary form.
+ 
+   In 28-bit binary, the decimal integer 5 looks like this:
+ 
+ @example
+ 0000  0000 0000  0000 0000  0000 0101
+ @end example
+ 
+ @noindent
+ (We have inserted spaces between groups of 4 bits, and two spaces
+ between groups of 8 bits, to make the binary integer easier to read.)
+ 
+   The integer @minus{}1 looks like this:
+ 
+ @example
+ 1111  1111 1111  1111 1111  1111 1111
+ @end example
+ 
+ @noindent
+ @cindex two's complement
+ @minus{}1 is represented as 28 ones.  (This is called @dfn{two's
+ complement} notation.)
+ 
+   The negative integer, @minus{}5, is creating by subtracting 4 from
+ @minus{}1.  In binary, the decimal integer 4 is 100.  Consequently,
+ @minus{}5 looks like this:
+ 
+ @example
+ 1111  1111 1111  1111 1111  1111 1011
+ @end example
+ 
+   In this implementation, the largest 28-bit binary integer is the
+ decimal integer 134,217,727.  In binary, it looks like this:
+ 
+ @example
+ 0111  1111 1111  1111 1111  1111 1111
+ @end example
+ 
+   Since the arithmetic functions do not check whether integers go
+ outside their range, when you add 1 to 134,217,727, the value is the
+ negative integer @minus{}134,217,728:
+ 
+ @example
+ (+ 1 134217727)
+      @result{} -134217728
+      @result{} 1000  0000 0000  0000 0000  0000 0000
+ @end example
+ 
+   Many of the following functions accept markers for arguments as well
+ as integers.  (@xref{Markers}.)  More precisely, the actual arguments to
+ such functions may be either integers or markers, which is why we often
+ give these arguments the name @var{int-or-marker}.  When the argument
+ value is a marker, its position value is used and its buffer is ignored.
+ 
+ @ignore
+   In version 19, except where @emph{integer} is specified as an
+ argument, all of the functions for markers and integers also work for
+ floating point numbers.
+ @end ignore
+ 
+ @node Float Basics
+ @section Floating Point Basics
+ 
+ @cindex @code{LISP_FLOAT_TYPE} configuration macro
+   Emacs version 19 supports floating point numbers, if compiled with the
+ macro @code{LISP_FLOAT_TYPE} defined.  The precise range of floating
+ point numbers is machine-specific; it is the same as the range of the C
+ data type @code{double} on the machine in question.
+ 
+   The printed representation for floating point numbers requires either
+ a decimal point (with at least one digit following), an exponent, or
+ both.  For example, @samp{1500.0}, @samp{15e2}, @samp{15.0e2},
+ @samp{1.5e3}, and @samp{.15e4} are five ways of writing a floating point
+ number whose value is 1500.  They are all equivalent.  You can also use
+ a minus sign to write negative floating point numbers, as in
+ @samp{-1.0}.
+ 
+ @cindex IEEE floating point
+ @cindex positive infinity
+ @cindex negative infinity
+ @cindex infinity
+ @cindex NaN
+    Most modern computers support the IEEE floating point standard, which
+ provides for positive infinity and negative infinity as floating point
+ values.  It also provides for a class of values called NaN or
+ ``not-a-number''; numerical functions return such values in cases where
+ there is no correct answer.  For example, @code{(sqrt -1.0)} returns a
+ NaN.  For practical purposes, there's no significant difference between
+ different NaN values in Emacs Lisp, and there's no rule for precisely
+ which NaN value should be used in a particular case, so this manual
+ doesn't try to distinguish them.  Emacs Lisp has no read syntax for NaNs
+ or infinities; perhaps we should create a syntax in the future.
+ 
+   You can use @code{logb} to extract the binary exponent of a floating
+ point number (or estimate the logarithm of an integer):
+ 
+ @defun logb number
+ This function returns the binary exponent of @var{number}.  More
+ precisely, the value is the logarithm of @var{number} base 2, rounded
+ down to an integer.
+ @end defun
+ 
+ @node Predicates on Numbers
+ @section Type Predicates for Numbers
+ 
+   The functions in this section test whether the argument is a number or
+ whether it is a certain sort of number.  The functions @code{integerp}
+ and @code{floatp} can take any type of Lisp object as argument (the
+ predicates would not be of much use otherwise); but the @code{zerop}
+ predicate requires a number as its argument.  See also
+ @code{integer-or-marker-p} and @code{number-or-marker-p}, in
+ @ref{Predicates on Markers}.
+ 
+ @defun floatp object
+ This predicate tests whether its argument is a floating point
+ number and returns @code{t} if so, @code{nil} otherwise.
+ 
+ @code{floatp} does not exist in Emacs versions 18 and earlier.
+ @end defun
+ 
+ @defun integerp object
+ This predicate tests whether its argument is an integer, and returns
+ @code{t} if so, @code{nil} otherwise.
+ @end defun
+ 
+ @defun numberp object
+ This predicate tests whether its argument is a number (either integer or
+ floating point), and returns @code{t} if so, @code{nil} otherwise.
+ @end defun
+ 
+ @defun wholenump object
+ @cindex natural numbers
+ The @code{wholenump} predicate (whose name comes from the phrase
+ ``whole-number-p'') tests to see whether its argument is a nonnegative
+ integer, and returns @code{t} if so, @code{nil} otherwise.  0 is
+ considered non-negative.
+ 
+ @findex natnump
+ @code{natnump} is an obsolete synonym for @code{wholenump}.
+ @end defun
+ 
+ @defun zerop number
+ This predicate tests whether its argument is zero, and returns @code{t}
+ if so, @code{nil} otherwise.  The argument must be a number.
+ 
+ These two forms are equivalent: @code{(zerop x)} @equiv{} @code{(= x 0)}.
+ @end defun
+ 
+ @node Comparison of Numbers
+ @section Comparison of Numbers
+ @cindex number equality
+ 
+   To test numbers for numerical equality, you should normally use
+ @code{=}, not @code{eq}.  There can be many distinct floating point
+ number objects with the same numeric value.  If you use @code{eq} to
+ compare them, then you test whether two values are the same
+ @emph{object}.  By contrast, @code{=} compares only the numeric values
+ of the objects.
+ 
+   At present, each integer value has a unique Lisp object in Emacs Lisp.
+ Therefore, @code{eq} is equivalent @code{=} where integers are
+ concerned.  It is sometimes convenient to use @code{eq} for comparing an
+ unknown value with an integer, because @code{eq} does not report an
+ error if the unknown value is not a number---it accepts arguments of any
+ type.  By contrast, @code{=} signals an error if the arguments are not
+ numbers or markers.  However, it is a good idea to use @code{=} if you
+ can, even for comparing integers, just in case we change the
+ representation of integers in a future Emacs version.
+ 
+   There is another wrinkle: because floating point arithmetic is not
+ exact, it is often a bad idea to check for equality of two floating
+ point values.  Usually it is better to test for approximate equality.
+ Here's a function to do this:
+ 
+ @example
+ (defvar fuzz-factor 1.0e-6)
+ (defun approx-equal (x y)
+   (or (and (= x 0) (= y 0))
+       (< (/ (abs (- x y))
+             (max (abs x) (abs y)))
+          fuzz-factor)))
+ @end example
+ 
+ @cindex CL note---integers vrs @code{eq}
+ @quotation
+ @b{Common Lisp note:} Comparing numbers in Common Lisp always requires
+ @code{=} because Common Lisp implements multi-word integers, and two
+ distinct integer objects can have the same numeric value.  Emacs Lisp
+ can have just one integer object for any given value because it has a
+ limited range of integer values.
+ @end quotation
+ 
+ @defun = number-or-marker1 number-or-marker2
+ This function tests whether its arguments are numerically equal, and
+ returns @code{t} if so, @code{nil} otherwise.
+ @end defun
+ 
+ @defun /= number-or-marker1 number-or-marker2
+ This function tests whether its arguments are numerically equal, and
+ returns @code{t} if they are not, and @code{nil} if they are.
+ @end defun
+ 
+ @defun <  number-or-marker1 number-or-marker2
+ This function tests whether its first argument is strictly less than
+ its second argument.  It returns @code{t} if so, @code{nil} otherwise.
+ @end defun
+ 
+ @defun <=  number-or-marker1 number-or-marker2
+ This function tests whether its first argument is less than or equal
+ to its second argument.  It returns @code{t} if so, @code{nil}
+ otherwise.
+ @end defun
+ 
+ @defun >  number-or-marker1 number-or-marker2
+ This function tests whether its first argument is strictly greater
+ than its second argument.  It returns @code{t} if so, @code{nil}
+ otherwise.
+ @end defun
+ 
+ @defun >=  number-or-marker1 number-or-marker2
+ This function tests whether its first argument is greater than or
+ equal to its second argument.  It returns @code{t} if so, @code{nil}
+ otherwise.
+ @end defun
+ 
+ @defun max number-or-marker &rest numbers-or-markers
+ This function returns the largest of its arguments.
+ 
+ @example
+ (max 20)
+      @result{} 20
+ (max 1 2.5)
+      @result{} 2.5
+ (max 1 3 2.5)
+      @result{} 3
+ @end example
+ @end defun
+ 
+ @defun min number-or-marker &rest numbers-or-markers
+ This function returns the smallest of its arguments.
+ 
+ @example
+ (min -4 1)
+      @result{} -4
+ @end example
+ @end defun
+ 
+ @node Numeric Conversions
+ @section Numeric Conversions
+ @cindex rounding in conversions
+ 
+ To convert an integer to floating point, use the function @code{float}.
+ 
+ @defun float number
+ This returns @var{number} converted to floating point.
+ If @var{number} is already a floating point number, @code{float} returns
+ it unchanged.
+ @end defun
+ 
+ There are four functions to convert floating point numbers to integers;
+ they differ in how they round.  These functions accept integer arguments
+ also, and return such arguments unchanged.
+ 
+ @defun truncate number
+ This returns @var{number}, converted to an integer by rounding towards
+ zero.
+ @end defun
+ 
+ @defun floor number &optional divisor
+ This returns @var{number}, converted to an integer by rounding downward
+ (towards negative infinity).
+ 
+ If @var{divisor} is specified, @var{number} is divided by @var{divisor}
+ before the floor is taken; this is the division operation that
+ corresponds to @code{mod}.  An @code{arith-error} results if
+ @var{divisor} is 0.
+ @end defun
+ 
+ @defun ceiling number
+ This returns @var{number}, converted to an integer by rounding upward
+ (towards positive infinity).
+ @end defun
+ 
+ @defun round number
+ This returns @var{number}, converted to an integer by rounding towards the
+ nearest integer.  Rounding a value equidistant between two integers
+ may choose the integer closer to zero, or it may prefer an even integer,
+ depending on your machine.
+ @end defun
+ 
+ @node Arithmetic Operations
+ @section Arithmetic Operations
+ 
+   Emacs Lisp provides the traditional four arithmetic operations:
+ addition, subtraction, multiplication, and division.  Remainder and modulus
+ functions supplement the division functions.  The functions to
+ add or subtract 1 are provided because they are traditional in Lisp and
+ commonly used.
+ 
+   All of these functions except @code{%} return a floating point value
+ if any argument is floating.
+ 
+   It is important to note that in GNU Emacs Lisp, arithmetic functions
+ do not check for overflow.  Thus @code{(1+ 134217727)} may evaluate to
+ @minus{}134217728, depending on your hardware.
+ 
+ @defun 1+ number-or-marker
+ This function returns @var{number-or-marker} plus 1.
+ For example,
+ 
+ @example
+ (setq foo 4)
+      @result{} 4
+ (1+ foo)
+      @result{} 5
+ @end example
+ 
+ This function is not analogous to the C operator @code{++}---it does not
+ increment a variable.  It just computes a sum.  Thus, if we continue,
+ 
+ @example
+ foo
+      @result{} 4
+ @end example
+ 
+ If you want to increment the variable, you must use @code{setq},
+ like this:
+ 
+ @example
+ (setq foo (1+ foo))
+      @result{} 5
+ @end example
+ @end defun
+ 
+ @defun 1- number-or-marker
+ This function returns @var{number-or-marker} minus 1.
+ @end defun
+ 
+ @defun abs number
+ This returns the absolute value of @var{number}.
+ @end defun
+ 
+ @defun + &rest numbers-or-markers
+ This function adds its arguments together.  When given no arguments,
+ @code{+} returns 0.
+ 
+ @example
+ (+)
+      @result{} 0
+ (+ 1)
+      @result{} 1
+ (+ 1 2 3 4)
+      @result{} 10
+ @end example
+ @end defun
+ 
+ @defun - &optional number-or-marker &rest other-numbers-or-markers
+ The @code{-} function serves two purposes: negation and subtraction.
+ When @code{-} has a single argument, the value is the negative of the
+ argument.  When there are multiple arguments, @code{-} subtracts each of
+ the @var{other-numbers-or-markers} from @var{number-or-marker},
+ cumulatively.  If there are no arguments, the result is 0.
+ 
+ @example
+ (- 10 1 2 3 4)
+      @result{} 0
+ (- 10)
+      @result{} -10
+ (-)
+      @result{} 0
+ @end example
+ @end defun
+ 
+ @defun * &rest numbers-or-markers
+ This function multiplies its arguments together, and returns the
+ product.  When given no arguments, @code{*} returns 1.
+ 
+ @example
+ (*)
+      @result{} 1
+ (* 1)
+      @result{} 1
+ (* 1 2 3 4)
+      @result{} 24
+ @end example
+ @end defun
+ 
+ @defun / dividend divisor &rest divisors
+ This function divides @var{dividend} by @var{divisor} and returns the
+ quotient.  If there are additional arguments @var{divisors}, then it
+ divides @var{dividend} by each divisor in turn.  Each argument may be a
+ number or a marker.
+ 
+ If all the arguments are integers, then the result is an integer too.
+ This means the result has to be rounded.  On most machines, the result
+ is rounded towards zero after each division, but some machines may round
+ differently with negative arguments.  This is because the Lisp function
+ @code{/} is implemented using the C division operator, which also
+ permits machine-dependent rounding.  As a practical matter, all known
+ machines round in the standard fashion.
+ 
+ @cindex @code{arith-error} in division
+ If you divide by 0, an @code{arith-error} error is signaled.
+ (@xref{Errors}.)
+ 
+ @example
+ @group
+ (/ 6 2)
+      @result{} 3
+ @end group
+ (/ 5 2)
+      @result{} 2
+ (/ 25 3 2)
+      @result{} 4
+ (/ -17 6)
+      @result{} -2
+ @end example
+ 
+ The result of @code{(/ -17 6)} could in principle be -3 on some
+ machines.
+ @end defun
+ 
+ @defun % dividend divisor
+ @cindex remainder
+ This function returns the integer remainder after division of @var{dividend}
+ by @var{divisor}.  The arguments must be integers or markers.
+ 
+ For negative arguments, the remainder is in principle machine-dependent
+ since the quotient is; but in practice, all known machines behave alike.
+ 
+ An @code{arith-error} results if @var{divisor} is 0.
+ 
+ @example
+ (% 9 4)
+      @result{} 1
+ (% -9 4)
+      @result{} -1
+ (% 9 -4)
+      @result{} 1
+ (% -9 -4)
+      @result{} -1
+ @end example
+ 
+ For any two integers @var{dividend} and @var{divisor},
+ 
+ @example
+ @group
+ (+ (% @var{dividend} @var{divisor})
+    (* (/ @var{dividend} @var{divisor}) @var{divisor}))
+ @end group
+ @end example
+ 
+ @noindent
+ always equals @var{dividend}.
+ @end defun
+ 
+ @defun mod dividend divisor
+ @cindex modulus
+ This function returns the value of @var{dividend} modulo @var{divisor};
+ in other words, the remainder after division of @var{dividend}
+ by @var{divisor}, but with the same sign as @var{divisor}.
+ The arguments must be numbers or markers.
+ 
+ Unlike @code{%}, @code{mod} returns a well-defined result for negative
+ arguments.  It also permits floating point arguments; it rounds the
+ quotient downward (towards minus infinity) to an integer, and uses that
+ quotient to compute the remainder.
+ 
+ An @code{arith-error} results if @var{divisor} is 0.
+ 
+ @example
+ @group
+ (mod 9 4)
+      @result{} 1
+ @end group
+ @group
+ (mod -9 4)
+      @result{} 3
+ @end group
+ @group
+ (mod 9 -4)
+      @result{} -3
+ @end group
+ @group
+ (mod -9 -4)
+      @result{} -1
+ @end group
+ @group
+ (mod 5.5 2.5)
+      @result{} .5
+ @end group
+ @end example
+ 
+ For any two numbers @var{dividend} and @var{divisor},
+ 
+ @example
+ @group
+ (+ (mod @var{dividend} @var{divisor})
+    (* (floor @var{dividend} @var{divisor}) @var{divisor}))
+ @end group
+ @end example
+ 
+ @noindent
+ always equals @var{dividend}, subject to rounding error if either
+ argument is floating point.  For @code{floor}, see @ref{Numeric
+ Conversions}.
+ @end defun
+ 
+ @node Rounding Operations
+ @section Rounding Operations
+ @cindex rounding without conversion
+ 
+ The functions @code{ffloor}, @code{fceiling}, @code{fround} and
+ @code{ftruncate} take a floating point argument and return a floating
+ point result whose value is a nearby integer.  @code{ffloor} returns the
+ nearest integer below; @code{fceiling}, the nearest integer above;
+ @code{ftruncate}, the nearest integer in the direction towards zero;
+ @code{fround}, the nearest integer.
+ 
+ @defun ffloor float
+ This function rounds @var{float} to the next lower integral value, and
+ returns that value as a floating point number.
+ @end defun
+ 
+ @defun fceiling float
+ This function rounds @var{float} to the next higher integral value, and
+ returns that value as a floating point number.
+ @end defun
+ 
+ @defun ftruncate float
+ This function rounds @var{float} towards zero to an integral value, and
+ returns that value as a floating point number.
+ @end defun
+ 
+ @defun fround float
+ This function rounds @var{float} to the nearest integral value,
+ and returns that value as a floating point number.
+ @end defun
+ 
+ @node Bitwise Operations
+ @section Bitwise Operations on Integers
+ 
+   In a computer, an integer is represented as a binary number, a
+ sequence of @dfn{bits} (digits which are either zero or one).  A bitwise
+ operation acts on the individual bits of such a sequence.  For example,
+ @dfn{shifting} moves the whole sequence left or right one or more places,
+ reproducing the same pattern ``moved over''.
+ 
+   The bitwise operations in Emacs Lisp apply only to integers.
+ 
+ @defun lsh integer1 count
+ @cindex logical shift
+ @code{lsh}, which is an abbreviation for @dfn{logical shift}, shifts the
+ bits in @var{integer1} to the left @var{count} places, or to the right
+ if @var{count} is negative, bringing zeros into the vacated bits.  If
+ @var{count} is negative, @code{lsh} shifts zeros into the leftmost
+ (most-significant) bit, producing a positive result even if
+ @var{integer1} is negative.  Contrast this with @code{ash}, below.
+ 
+ Here are two examples of @code{lsh}, shifting a pattern of bits one
+ place to the left.  We show only the low-order eight bits of the binary
+ pattern; the rest are all zero.
+ 
+ @example
+ @group
+ (lsh 5 1)
+      @result{} 10
+ ;; @r{Decimal 5 becomes decimal 10.}
+ 00000101 @result{} 00001010
+ 
+ (lsh 7 1)
+      @result{} 14
+ ;; @r{Decimal 7 becomes decimal 14.}
+ 00000111 @result{} 00001110
+ @end group
+ @end example
+ 
+ @noindent
+ As the examples illustrate, shifting the pattern of bits one place to
+ the left produces a number that is twice the value of the previous
+ number.
+ 
+ Shifting a pattern of bits two places to the left produces results
+ like this (with 8-bit binary numbers):
+ 
+ @example
+ @group
+ (lsh 3 2)
+      @result{} 12
+ ;; @r{Decimal 3 becomes decimal 12.}
+ 00000011 @result{} 00001100       
+ @end group
+ @end example
+ 
+ On the other hand, shifting one place to the right looks like this:
+ 
+ @example
+ @group
+ (lsh 6 -1)
+      @result{} 3
+ ;; @r{Decimal 6 becomes decimal 3.}
+ 00000110 @result{} 00000011       
+ @end group
+ 
+ @group
+ (lsh 5 -1)
+      @result{} 2
+ ;; @r{Decimal 5 becomes decimal 2.}
+ 00000101 @result{} 00000010       
+ @end group
+ @end example
+ 
+ @noindent
+ As the example illustrates, shifting one place to the right divides the
+ value of a positive integer by two, rounding downward.
+ 
+ The function @code{lsh}, like all Emacs Lisp arithmetic functions, does
+ not check for overflow, so shifting left can discard significant bits
+ and change the sign of the number.  For example, left shifting
+ 134,217,727 produces @minus{}2 on a 28-bit machine:
+ 
+ @example
+ (lsh 134217727 1)          ; @r{left shift}
+      @result{} -2
+ @end example
+ 
+ In binary, in the 28-bit implementation, the argument looks like this:
+ 
+ @example
+ @group
+ ;; @r{Decimal 134,217,727}
+ 0111  1111 1111  1111 1111  1111 1111         
+ @end group
+ @end example
+ 
+ @noindent
+ which becomes the following when left shifted:
+ 
+ @example
+ @group
+ ;; @r{Decimal @minus{}2}
+ 1111  1111 1111  1111 1111  1111 1110         
+ @end group
+ @end example
+ @end defun
+ 
+ @defun ash integer1 count
+ @cindex arithmetic shift
+ @code{ash} (@dfn{arithmetic shift}) shifts the bits in @var{integer1}
+ to the left @var{count} places, or to the right if @var{count}
+ is negative.
+ 
+ @code{ash} gives the same results as @code{lsh} except when
+ @var{integer1} and @var{count} are both negative.  In that case,
+ @code{ash} puts ones in the empty bit positions on the left, while
+ @code{lsh} puts zeros in those bit positions.
+ 
+ Thus, with @code{ash}, shifting the pattern of bits one place to the right
+ looks like this:
+ 
+ @example
+ @group
+ (ash -6 -1) @result{} -3            
+ ;; @r{Decimal @minus{}6 becomes decimal @minus{}3.}
+ 1111  1111 1111  1111 1111  1111 1010
+      @result{} 
+ 1111  1111 1111  1111 1111  1111 1101
+ @end group
+ @end example
+ 
+ In contrast, shifting the pattern of bits one place to the right with
+ @code{lsh} looks like this:
+ 
+ @example
+ @group
+ (lsh -6 -1) @result{} 134217725
+ ;; @r{Decimal @minus{}6 becomes decimal 134,217,725.}
+ 1111  1111 1111  1111 1111  1111 1010
+      @result{} 
+ 0111  1111 1111  1111 1111  1111 1101
+ @end group
+ @end example
+ 
+ Here are other examples:
+ 
+ @c !!! Check if lined up in smallbook format!  XDVI shows problem
+ @c     with smallbook but not with regular book! --rjc 16mar92
+ @smallexample
+ @group
+                    ;  @r{             28-bit binary values}
+ 
+ (lsh 5 2)          ;   5  =  @r{0000  0000 0000  0000 0000  0000 0101}
+      @result{} 20         ;      =  @r{0000  0000 0000  0000 0000  0001 0100}
+ @end group
+ @group
+ (ash 5 2)
+      @result{} 20
+ (lsh -5 2)         ;  -5  =  @r{1111  1111 1111  1111 1111  1111 1011}
+      @result{} -20        ;      =  @r{1111  1111 1111  1111 1111  1110 1100}
+ (ash -5 2)
+      @result{} -20
+ @end group
+ @group
+ (lsh 5 -2)         ;   5  =  @r{0000  0000 0000  0000 0000  0000 0101}
+      @result{} 1          ;      =  @r{0000  0000 0000  0000 0000  0000 0001}
+ @end group
+ @group
+ (ash 5 -2)
+      @result{} 1
+ @end group
+ @group
+ (lsh -5 -2)        ;  -5  =  @r{1111  1111 1111  1111 1111  1111 1011}
+      @result{} 4194302    ;      =  @r{0011  1111 1111  1111 1111  1111 1110}
+ @end group
+ @group
+ (ash -5 -2)        ;  -5  =  @r{1111  1111 1111  1111 1111  1111 1011}
+      @result{} -2         ;      =  @r{1111  1111 1111  1111 1111  1111 1110}
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun logand &rest ints-or-markers
+ @cindex logical and
+ @cindex bitwise and
+ This function returns the ``logical and'' of the arguments: the
+ @var{n}th bit is set in the result if, and only if, the @var{n}th bit is
+ set in all the arguments.  (``Set'' means that the value of the bit is 1
+ rather than 0.)
+ 
+ For example, using 4-bit binary numbers, the ``logical and'' of 13 and
+ 12 is 12: 1101 combined with 1100 produces 1100.
+ In both the binary numbers, the leftmost two bits are set (i.e., they
+ are 1's), so the leftmost two bits of the returned value are set.
+ However, for the rightmost two bits, each is zero in at least one of
+ the arguments, so the rightmost two bits of the returned value are 0's.
+ 
+ @noindent
+ Therefore,
+ 
+ @example
+ @group
+ (logand 13 12)
+      @result{} 12
+ @end group
+ @end example
+ 
+ If @code{logand} is not passed any argument, it returns a value of
+ @minus{}1.  This number is an identity element for @code{logand}
+ because its binary representation consists entirely of ones.  If
+ @code{logand} is passed just one argument, it returns that argument.
+ 
+ @smallexample
+ @group
+                    ; @r{               28-bit binary values}
+ 
+ (logand 14 13)     ; 14  =  @r{0000  0000 0000  0000 0000  0000 1110}
+                    ; 13  =  @r{0000  0000 0000  0000 0000  0000 1101}
+      @result{} 12         ; 12  =  @r{0000  0000 0000  0000 0000  0000 1100}
+ @end group
+ 
+ @group
+ (logand 14 13 4)   ; 14  =  @r{0000  0000 0000  0000 0000  0000 1110}
+                    ; 13  =  @r{0000  0000 0000  0000 0000  0000 1101}
+                    ;  4  =  @r{0000  0000 0000  0000 0000  0000 0100}
+      @result{} 4          ;  4  =  @r{0000  0000 0000  0000 0000  0000 0100}
+ @end group
+ 
+ @group
+ (logand)
+      @result{} -1         ; -1  =  @r{1111  1111 1111  1111 1111  1111 1111}
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun logior &rest ints-or-markers
+ @cindex logical inclusive or
+ @cindex bitwise or
+ This function returns the ``inclusive or'' of its arguments: the @var{n}th bit
+ is set in the result if, and only if, the @var{n}th bit is set in at least
+ one of the arguments.  If there are no arguments, the result is zero,
+ which is an identity element for this operation.  If @code{logior} is
+ passed just one argument, it returns that argument.
+ 
+ @smallexample
+ @group
+                    ; @r{              28-bit binary values}
+ 
+ (logior 12 5)      ; 12  =  @r{0000  0000 0000  0000 0000  0000 1100}
+                    ;  5  =  @r{0000  0000 0000  0000 0000  0000 0101}
+      @result{} 13         ; 13  =  @r{0000  0000 0000  0000 0000  0000 1101}
+ @end group
+ 
+ @group
+ (logior 12 5 7)    ; 12  =  @r{0000  0000 0000  0000 0000  0000 1100}
+                    ;  5  =  @r{0000  0000 0000  0000 0000  0000 0101}
+                    ;  7  =  @r{0000  0000 0000  0000 0000  0000 0111}
+      @result{} 15         ; 15  =  @r{0000  0000 0000  0000 0000  0000 1111}
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun logxor &rest ints-or-markers
+ @cindex bitwise exclusive or
+ @cindex logical exclusive or
+ This function returns the ``exclusive or'' of its arguments: the
+ @var{n}th bit is set in the result if, and only if, the @var{n}th bit is
+ set in an odd number of the arguments.  If there are no arguments, the
+ result is 0, which is an identity element for this operation.  If
+ @code{logxor} is passed just one argument, it returns that argument.
+ 
+ @smallexample
+ @group
+                    ; @r{              28-bit binary values}
+ 
+ (logxor 12 5)      ; 12  =  @r{0000  0000 0000  0000 0000  0000 1100}
+                    ;  5  =  @r{0000  0000 0000  0000 0000  0000 0101}
+      @result{} 9          ;  9  =  @r{0000  0000 0000  0000 0000  0000 1001}
+ @end group
+ 
+ @group
+ (logxor 12 5 7)    ; 12  =  @r{0000  0000 0000  0000 0000  0000 1100}
+                    ;  5  =  @r{0000  0000 0000  0000 0000  0000 0101}
+                    ;  7  =  @r{0000  0000 0000  0000 0000  0000 0111}
+      @result{} 14         ; 14  =  @r{0000  0000 0000  0000 0000  0000 1110}
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun lognot integer
+ @cindex logical not
+ @cindex bitwise not
+ This function returns the logical complement of its argument: the @var{n}th
+ bit is one in the result if, and only if, the @var{n}th bit is zero in
+ @var{integer}, and vice-versa.
+ 
+ @example
+ (lognot 5)             
+      @result{} -6
+ ;;  5  =  @r{0000  0000 0000  0000 0000  0000 0101}
+ ;; @r{becomes}
+ ;; -6  =  @r{1111  1111 1111  1111 1111  1111 1010}
+ @end example
+ @end defun
+ 
+ @node Math Functions
+ @section Standard Mathematical Functions
+ @cindex transcendental functions
+ @cindex mathematical functions
+ 
+ These mathematical functions are available if floating point is
+ supported.  They allow integers as well as floating point numbers
+ as arguments.
+ 
+ @defun sin arg
+ @defunx cos arg
+ @defunx tan arg
+ These are the ordinary trigonometric functions, with argument measured
+ in radians.
+ @end defun
+ 
+ @defun asin arg
+ The value of @code{(asin @var{arg})} is a number between @minus{}pi/2
+ and pi/2 (inclusive) whose sine is @var{arg}; if, however, @var{arg}
+ is out of range (outside [-1, 1]), then the result is a NaN.
+ @end defun
+ 
+ @defun acos arg
+ The value of @code{(acos @var{arg})} is a number between 0 and pi
+ (inclusive) whose cosine is @var{arg}; if, however, @var{arg}
+ is out of range (outside [-1, 1]), then the result is a NaN.
+ @end defun
+ 
+ @defun atan arg
+ The value of @code{(atan @var{arg})} is a number between @minus{}pi/2
+ and pi/2 (exclusive) whose tangent is @var{arg}.
+ @end defun
+ 
+ @defun exp arg
+ This is the exponential function; it returns @i{e} to the power
+ @var{arg}.  @i{e} is a fundamental mathematical constant also called the
+ base of natural logarithms.
+ @end defun
+ 
+ @defun log arg &optional base
+ This function returns the logarithm of @var{arg}, with base @var{base}.
+ If you don't specify @var{base}, the base @var{e} is used.  If @var{arg}
+ is negative, the result is a NaN.
+ @end defun
+ 
+ @ignore
+ @defun expm1 arg
+ This function returns @code{(1- (exp @var{arg}))}, but it is more
+ accurate than that when @var{arg} is negative and @code{(exp @var{arg})}
+ is close to 1.
+ @end defun
+ 
+ @defun log1p arg
+ This function returns @code{(log (1+ @var{arg}))}, but it is more
+ accurate than that when @var{arg} is so small that adding 1 to it would
+ lose accuracy.
+ @end defun
+ @end ignore
+ 
+ @defun log10 arg
+ This function returns the logarithm of @var{arg}, with base 10.  If
+ @var{arg} is negative, the result is a NaN.  @code{(log10 @var{x})}
+ @equiv{} @code{(log @var{x} 10)}, at least approximately.
+ @end defun
+ 
+ @defun expt x y
+ This function returns @var{x} raised to power @var{y}.  If both
+ arguments are integers and @var{y} is positive, the result is an
+ integer; in this case, it is truncated to fit the range of possible
+ integer values.
+ @end defun
+ 
+ @defun sqrt arg
+ This returns the square root of @var{arg}.  If @var{arg} is negative,
+ the value is a NaN.
+ @end defun
+ 
+ @node Random Numbers
+ @section Random Numbers
+ @cindex random numbers
+ 
+ A deterministic computer program cannot generate true random numbers.
+ For most purposes, @dfn{pseudo-random numbers} suffice.  A series of
+ pseudo-random numbers is generated in a deterministic fashion.  The
+ numbers are not truly random, but they have certain properties that
+ mimic a random series.  For example, all possible values occur equally
+ often in a pseudo-random series.
+ 
+ In Emacs, pseudo-random numbers are generated from a ``seed'' number.
+ Starting from any given seed, the @code{random} function always
+ generates the same sequence of numbers.  Emacs always starts with the
+ same seed value, so the sequence of values of @code{random} is actually
+ the same in each Emacs run!  For example, in one operating system, the
+ first call to @code{(random)} after you start Emacs always returns
+ -1457731, and the second one always returns -7692030.  This
+ repeatability is helpful for debugging.
+ 
+ If you want truly unpredictable random numbers, execute @code{(random
+ t)}.  This chooses a new seed based on the current time of day and on
+ Emacs's process @sc{id} number.
+ 
+ @defun random &optional limit
+ This function returns a pseudo-random integer.  Repeated calls return a
+ series of pseudo-random integers.
+ 
+ If @var{limit} is a positive integer, the value is chosen to be
+ nonnegative and less than @var{limit}.
+ 
+ If @var{limit} is @code{t}, it means to choose a new seed based on the
+ current time of day and on Emacs's process @sc{id} number.
+ @c "Emacs'" is incorrect usage!
+ 
+ On some machines, any integer representable in Lisp may be the result
+ of @code{random}.  On other machines, the result can never be larger
+ than a certain maximum or less than a certain (negative) minimum.
+ @end defun
Index: emacs/man/elisp-objects.texi
diff -c /dev/null emacs/man/elisp-objects.texi:1.2
*** /dev/null	Fri Aug  2 20:56:35 1996
--- emacs/man/elisp-objects.texi	Thu Aug  1 00:23:17 1996
***************
*** 0 ****
--- 1,1591 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/objects
+ @node Lisp Data Types, Numbers, Introduction, Top
+ @chapter Lisp Data Types
+ @cindex object
+ @cindex Lisp object
+ @cindex type
+ @cindex data type
+ 
+   A Lisp @dfn{object} is a piece of data used and manipulated by Lisp
+ programs.  For our purposes, a @dfn{type} or @dfn{data type} is a set of
+ possible objects.
+ 
+   Every object belongs to at least one type.  Objects of the same type
+ have similar structures and may usually be used in the same contexts.
+ Types can overlap, and objects can belong to two or more types.
+ Consequently, we can ask whether an object belongs to a particular type,
+ but not for ``the'' type of an object.
+ 
+ @cindex primitive type
+   A few fundamental object types are built into Emacs.  These, from
+ which all other types are constructed, are called @dfn{primitive
+ types}.  Each object belongs to one and only one primitive type.  These
+ types include @dfn{integer}, @dfn{float}, @dfn{cons}, @dfn{symbol},
+ @dfn{string}, @dfn{vector}, @dfn{subr}, @dfn{byte-code function}, and
+ several special types, such as @dfn{buffer}, that are related to
+ editing.  (@xref{Editing Types}.)
+ 
+   Each primitive type has a corresponding Lisp function that checks
+ whether an object is a member of that type.
+ 
+   Note that Lisp is unlike many other languages in that Lisp objects are
+ @dfn{self-typing}: the primitive type of the object is implicit in the
+ object itself.  For example, if an object is a vector, nothing can treat
+ it as a number; Lisp knows it is a vector, not a number.
+ 
+   In most languages, the programmer must declare the data type of each
+ variable, and the type is known by the compiler but not represented in
+ the data.  Such type declarations do not exist in Emacs Lisp.  A Lisp
+ variable can have any type of value, and it remembers whatever value
+ you store in it, type and all.
+ 
+   This chapter describes the purpose, printed representation, and read
+ syntax of each of the standard types in GNU Emacs Lisp.  Details on how
+ to use these types can be found in later chapters.
+ 
+ @menu
+ * Printed Representation::      How Lisp objects are represented as text.
+ * Comments::                    Comments and their formatting conventions.
+ * Programming Types::           Types found in all Lisp systems.
+ * Editing Types::               Types specific to Emacs.
+ * Type Predicates::             Tests related to types.
+ * Equality Predicates::         Tests of equality between any two objects.
+ @end menu
+ 
+ @node Printed Representation
+ @comment  node-name,  next,  previous,  up
+ @section Printed Representation and Read Syntax
+ @cindex printed representation
+ @cindex read syntax
+ 
+   The @dfn{printed representation} of an object is the format of the
+ output generated by the Lisp printer (the function @code{prin1}) for
+ that object.  The @dfn{read syntax} of an object is the format of the
+ input accepted by the Lisp reader (the function @code{read}) for that
+ object.  Most objects have more than one possible read syntax.  Some
+ types of object have no read syntax; except for these cases, the printed
+ representation of an object is also a read syntax for it.
+ 
+   In other languages, an expression is text; it has no other form.  In
+ Lisp, an expression is primarily a Lisp object and only secondarily the
+ text that is the object's read syntax.  Often there is no need to
+ emphasize this distinction, but you must keep it in the back of your
+ mind, or you will occasionally be very confused.
+ 
+ @cindex hash notation
+   Every type has a printed representation.  Some types have no read
+ syntax, since it may not make sense to enter objects of these types
+ directly in a Lisp program.  For example, the buffer type does not have
+ a read syntax.  Objects of these types are printed in @dfn{hash
+ notation}: the characters @samp{#<} followed by a descriptive string
+ (typically the type name followed by the name of the object), and closed
+ with a matching @samp{>}.  Hash notation cannot be read at all, so the
+ Lisp reader signals the error @code{invalid-read-syntax} whenever it
+ encounters @samp{#<}.
+ @kindex invalid-read-syntax
+ 
+ @example
+ (current-buffer)
+      @result{} #<buffer objects.texi>
+ @end example
+ 
+   When you evaluate an expression interactively, the Lisp interpreter
+ first reads the textual representation of it, producing a Lisp object,
+ and then evaluates that object (@pxref{Evaluation}).  However,
+ evaluation and reading are separate activities.  Reading returns the
+ Lisp object represented by the text that is read; the object may or may
+ not be evaluated later.  @xref{Input Functions}, for a description of
+ @code{read}, the basic function for reading objects.
+ 
+ @node Comments
+ @comment  node-name,  next,  previous,  up
+ @section Comments
+ @cindex comments
+ @cindex @samp{;} in comment
+ 
+   A @dfn{comment} is text that is written in a program only for the sake
+ of humans that read the program, and that has no effect on the meaning
+ of the program.  In Lisp, a semicolon (@samp{;}) starts a comment if it
+ is not within a string or character constant.  The comment continues to
+ the end of line.  The Lisp reader discards comments; they do not become
+ part of the Lisp objects which represent the program within the Lisp
+ system.
+ 
+   The @samp{#@@@var{count}} construct, which skips the next @var{count}
+ characters, is useful for program-generated comments containing binary
+ data.  The Emacs Lisp byte compiler uses this in its output files
+ (@pxref{Byte Compilation}).  It isn't meant for source files, however.
+ 
+   @xref{Comment Tips}, for conventions for formatting comments.
+ 
+ @node Programming Types
+ @section Programming Types
+ @cindex programming types
+ 
+   There are two general categories of types in Emacs Lisp: those having
+ to do with Lisp programming, and those having to do with editing.  The
+ former exist in many Lisp implementations, in one form or another.  The
+ latter are unique to Emacs Lisp.
+ 
+ @menu
+ * Integer Type::        Numbers without fractional parts.
+ * Floating Point Type:: Numbers with fractional parts and with a large range.
+ * Character Type::      The representation of letters, numbers and
+                         control characters.
+ * Symbol Type::         A multi-use object that refers to a function,
+                         variable, or property list, and has a unique identity.
+ * Sequence Type::       Both lists and arrays are classified as sequences.
+ * Cons Cell Type::      Cons cells, and lists (which are made from cons cells).
+ * Array Type::          Arrays include strings and vectors.
+ * String Type::         An (efficient) array of characters.
+ * Vector Type::         One-dimensional arrays.
+ * Function Type::       A piece of executable code you can call from elsewhere.
+ * Macro Type::          A method of expanding an expression into another
+                           expression, more fundamental but less pretty.
+ * Primitive Function Type::     A function written in C, callable from Lisp.
+ * Byte-Code Type::      A function written in Lisp, then compiled.
+ * Autoload Type::       A type used for automatically loading seldom-used
+                         functions.
+ @end menu
+ 
+ @node Integer Type
+ @subsection Integer Type
+ 
+   The range of values for integers in Emacs Lisp is @minus{}134217728 to
+ 134217727 (28 bits; i.e.,
+ @ifinfo
+ -2**27
+ @end ifinfo
+ @tex
+ $-2^{27}$
+ @end tex
+ to
+ @ifinfo
+ 2**27 - 1)
+ @end ifinfo
+ @tex
+ $2^{28}-1$)
+ @end tex
+ on most machines.  (Some machines may provide a wider range.)  It is
+ important to note that the Emacs Lisp arithmetic functions do not check
+ for overflow.  Thus @code{(1+ 134217727)} is @minus{}134217728 on most
+ machines.
+ 
+   The read syntax for integers is a sequence of (base ten) digits with an
+ optional sign at the beginning and an optional period at the end.  The
+ printed representation produced by the Lisp interpreter never has a
+ leading @samp{+} or a final @samp{.}.
+ 
+ @example
+ @group
+ -1               ; @r{The integer -1.}
+ 1                ; @r{The integer 1.}
+ 1.               ; @r{Also The integer 1.}
+ +1               ; @r{Also the integer 1.}
+ 268435457        ; @r{Also the integer 1!} 
+                  ; @r{  (on a 28-bit implementation)}
+ @end group
+ @end example
+ 
+   @xref{Numbers}, for more information.
+ 
+ @node Floating Point Type
+ @subsection Floating Point Type
+ 
+   Emacs version 19 supports floating point numbers (though there is a
+ compilation option to disable them).  The precise range of floating
+ point numbers is machine-specific.
+ 
+   The printed representation for floating point numbers requires either
+ a decimal point (with at least one digit following), an exponent, or
+ both.  For example, @samp{1500.0}, @samp{15e2}, @samp{15.0e2},
+ @samp{1.5e3}, and @samp{.15e4} are five ways of writing a floating point
+ number whose value is 1500.  They are all equivalent.
+ 
+   @xref{Numbers}, for more information.
+ 
+ @node Character Type
+ @subsection Character Type
+ @cindex @sc{ASCII} character codes
+ 
+   A @dfn{character} in Emacs Lisp is nothing more than an integer.  In
+ other words, characters are represented by their character codes.  For
+ example, the character @kbd{A} is represented as the @w{integer 65}.
+ 
+   Individual characters are not often used in programs.  It is far more
+ common to work with @emph{strings}, which are sequences composed of
+ characters.  @xref{String Type}.
+ 
+   Characters in strings, buffers, and files are currently limited to the
+ range of 0 to 255---eight bits.  If you store a larger integer into a
+ string, buffer or file, it is truncated to that range.  Characters that
+ represent keyboard input have a much wider range.
+ 
+ @cindex read syntax for characters
+ @cindex printed representation for characters
+ @cindex syntax for characters
+   Since characters are really integers, the printed representation of a
+ character is a decimal number.  This is also a possible read syntax for
+ a character, but writing characters that way in Lisp programs is a very
+ bad idea.  You should @emph{always} use the special read syntax formats
+ that Emacs Lisp provides for characters.  These syntax formats start
+ with a question mark.
+ 
+   The usual read syntax for alphanumeric characters is a question mark
+ followed by the character; thus, @samp{?A} for the character
+ @kbd{A}, @samp{?B} for the character @kbd{B}, and @samp{?a} for the
+ character @kbd{a}.  
+ 
+   For example:
+ 
+ @example
+ ?Q @result{} 81     ?q @result{} 113
+ @end example
+ 
+   You can use the same syntax for punctuation characters, but it is
+ often a good idea to add a @samp{\} so that the Emacs commands for
+ editing Lisp code don't get confused.  For example, @samp{?\ } is the
+ way to write the space character.  If the character is @samp{\}, you
+ @emph{must} use a second @samp{\} to quote it: @samp{?\\}.
+ 
+ @cindex whitespace
+ @cindex bell character
+ @cindex @samp{\a}
+ @cindex backspace
+ @cindex @samp{\b}
+ @cindex tab
+ @cindex @samp{\t}
+ @cindex vertical tab
+ @cindex @samp{\v}
+ @cindex formfeed
+ @cindex @samp{\f}
+ @cindex newline
+ @cindex @samp{\n}
+ @cindex return
+ @cindex @samp{\r}
+ @cindex escape
+ @cindex @samp{\e}
+   You can express the characters Control-g, backspace, tab, newline,
+ vertical tab, formfeed, return, and escape as @samp{?\a}, @samp{?\b},
+ @samp{?\t}, @samp{?\n}, @samp{?\v}, @samp{?\f}, @samp{?\r}, @samp{?\e},
+ respectively.  Those values are 7, 8, 9, 10, 11, 12, 13, and 27 in
+ decimal.  Thus,
+ 
+ @example
+ ?\a @result{} 7                 ; @r{@kbd{C-g}}
+ ?\b @result{} 8                 ; @r{backspace, @key{BS}, @kbd{C-h}}
+ ?\t @result{} 9                 ; @r{tab, @key{TAB}, @kbd{C-i}}
+ ?\n @result{} 10                ; @r{newline, @key{LFD}, @kbd{C-j}}
+ ?\v @result{} 11                ; @r{vertical tab, @kbd{C-k}}
+ ?\f @result{} 12                ; @r{formfeed character, @kbd{C-l}}
+ ?\r @result{} 13                ; @r{carriage return, @key{RET}, @kbd{C-m}}
+ ?\e @result{} 27                ; @r{escape character, @key{ESC}, @kbd{C-[}}
+ ?\\ @result{} 92                ; @r{backslash character, @kbd{\}}
+ @end example
+ 
+ @cindex escape sequence
+   These sequences which start with backslash are also known as
+ @dfn{escape sequences}, because backslash plays the role of an escape
+ character; this usage has nothing to do with the character @key{ESC}.
+ 
+ @cindex control characters
+   Control characters may be represented using yet another read syntax.
+ This consists of a question mark followed by a backslash, caret, and the
+ corresponding non-control character, in either upper or lower case.  For
+ example, both @samp{?\^I} and @samp{?\^i} are valid read syntax for the
+ character @kbd{C-i}, the character whose value is 9.
+ 
+   Instead of the @samp{^}, you can use @samp{C-}; thus, @samp{?\C-i} is
+ equivalent to @samp{?\^I} and to @samp{?\^i}:
+ 
+ @example
+ ?\^I @result{} 9     ?\C-I @result{} 9
+ @end example
+ 
+   For use in strings and buffers, you are limited to the control
+ characters that exist in @sc{ASCII}, but for keyboard input purposes,
+ you can turn any character into a control character with @samp{C-}.  The
+ character codes for these non-@sc{ASCII} control characters include the
+ @iftex
+ $2^{26}$
+ @end iftex
+ @ifinfo
+ 2**26
+ @end ifinfo
+ bit as well as the code for the corresponding non-control
+ character.  Ordinary terminals have no way of generating non-@sc{ASCII}
+ control characters, but you can generate them straightforwardly using an
+ X terminal.
+ 
+   For historical reasons, Emacs treats the @key{DEL} character as
+ the control equivalent of @kbd{?}:
+ 
+ @example
+ ?\^? @result{} 127     ?\C-? @result{} 127
+ @end example
+ 
+ @noindent
+ As a result, it is currently not possible to represent the character
+ @kbd{Control-?}, which is a meaningful input character under X.  It is
+ not easy to change this as various Lisp files refer to @key{DEL} in this
+ way.
+ 
+   For representing control characters to be found in files or strings,
+ we recommend the @samp{^} syntax; for control characters in keyboard
+ input, we prefer the @samp{C-} syntax.  This does not affect the meaning
+ of the program, but may guide the understanding of people who read it.
+ 
+ @cindex meta characters
+   A @dfn{meta character} is a character typed with the @key{META}
+ modifier key.  The integer that represents such a character has the
+ @iftex
+ $2^{27}$
+ @end iftex
+ @ifinfo
+ 2**27
+ @end ifinfo
+ bit set (which on most machines makes it a negative number).  We
+ use high bits for this and other modifiers to make possible a wide range
+ of basic character codes.
+ 
+   In a string, the
+ @iftex
+ $2^{7}$
+ @end iftex
+ @ifinfo
+ 2**7
+ @end ifinfo
+ bit indicates a meta character, so the meta
+ characters that can fit in a string have codes in the range from 128 to
+ 255, and are the meta versions of the ordinary @sc{ASCII} characters.
+ (In Emacs versions 18 and older, this convention was used for characters
+ outside of strings as well.)
+ 
+   The read syntax for meta characters uses @samp{\M-}.  For example,
+ @samp{?\M-A} stands for @kbd{M-A}.  You can use @samp{\M-} together with
+ octal character codes (see below), with @samp{\C-}, or with any other
+ syntax for a character.  Thus, you can write @kbd{M-A} as @samp{?\M-A},
+ or as @samp{?\M-\101}.  Likewise, you can write @kbd{C-M-b} as
+ @samp{?\M-\C-b}, @samp{?\C-\M-b}, or @samp{?\M-\002}.
+ 
+   The case of an ordinary letter is indicated by its character code as
+ part of @sc{ASCII}, but @sc{ASCII} has no way to represent whether a
+ control character is upper case or lower case.  Emacs uses the
+ @iftex
+ $2^{25}$
+ @end iftex
+ @ifinfo
+ 2**25
+ @end ifinfo
+ bit to indicate that the shift key was used for typing a control
+ character.  This distinction is possible only when you use X terminals
+ or other special terminals; ordinary terminals do not indicate the
+ distinction to the computer in any way.
+ 
+ @cindex hyper characters
+ @cindex super characters
+ @cindex alt characters
+   The X Window System defines three other modifier bits that can be set
+ in a character: @dfn{hyper}, @dfn{super} and @dfn{alt}.  The syntaxes
+ for these bits are @samp{\H-}, @samp{\s-} and @samp{\A-}.  Thus,
+ @samp{?\H-\M-\A-x} represents @kbd{Alt-Hyper-Meta-x}.
+ @iftex
+ Numerically, the
+ bit values are $2^{22}$ for alt, $2^{23}$ for super and $2^{24}$ for hyper.
+ @end iftex
+ @ifinfo
+ Numerically, the
+ bit values are 2**22 for alt, 2**23 for super and 2**24 for hyper.
+ @end ifinfo
+ 
+ @cindex @samp{?} in character constant
+ @cindex question mark in character constant
+ @cindex @samp{\} in character constant
+ @cindex backslash in character constant
+ @cindex octal character code
+   Finally, the most general read syntax consists of a question mark
+ followed by a backslash and the character code in octal (up to three
+ octal digits); thus, @samp{?\101} for the character @kbd{A},
+ @samp{?\001} for the character @kbd{C-a}, and @code{?\002} for the
+ character @kbd{C-b}.  Although this syntax can represent any @sc{ASCII}
+ character, it is preferred only when the precise octal value is more
+ important than the @sc{ASCII} representation.
+ 
+ @example
+ @group
+ ?\012 @result{} 10         ?\n @result{} 10         ?\C-j @result{} 10
+ ?\101 @result{} 65         ?A @result{} 65
+ @end group
+ @end example
+ 
+   A backslash is allowed, and harmless, preceding any character without
+ a special escape meaning; thus, @samp{?\+} is equivalent to @samp{?+}.
+ There is no reason to add a backslash before most characters.  However,
+ you should add a backslash before any of the characters
+ @samp{()\|;'`"#.,} to avoid confusing the Emacs commands for editing
+ Lisp code.  Also add a backslash before whitespace characters such as
+ space, tab, newline and formfeed.  However, it is cleaner to use one of
+ the easily readable escape sequences, such as @samp{\t}, instead of an
+ actual whitespace character such as a tab.
+ 
+ @node Symbol Type
+ @subsection Symbol Type
+ 
+   A @dfn{symbol} in GNU Emacs Lisp is an object with a name.  The symbol
+ name serves as the printed representation of the symbol.  In ordinary
+ use, the name is unique---no two symbols have the same name.
+ 
+   A symbol can serve as a variable, as a function name, or to hold a
+ property list.  Or it may serve only to be distinct from all other Lisp
+ objects, so that its presence in a data structure may be recognized
+ reliably.  In a given context, usually only one of these uses is
+ intended.  But you can use one symbol in all of these ways,
+ independently.
+ 
+ @cindex @samp{\} in symbols
+ @cindex backslash in symbols
+   A symbol name can contain any characters whatever.  Most symbol names
+ are written with letters, digits, and the punctuation characters
+ @samp{-+=*/}.  Such names require no special punctuation; the characters
+ of the name suffice as long as the name does not look like a number.
+ (If it does, write a @samp{\} at the beginning of the name to force
+ interpretation as a symbol.)  The characters @samp{_~!@@$%^&:<>@{@}} are
+ less often used but also require no special punctuation.  Any other
+ characters may be included in a symbol's name by escaping them with a
+ backslash.  In contrast to its use in strings, however, a backslash in
+ the name of a symbol simply quotes the single character that follows the
+ backslash.  For example, in a string, @samp{\t} represents a tab
+ character; in the name of a symbol, however, @samp{\t} merely quotes the
+ letter @kbd{t}.  To have a symbol with a tab character in its name, you
+ must actually use a tab (preceded with a backslash).  But it's rare to
+ do such a thing.
+ 
+ @cindex CL note---case of letters
+ @quotation
+ @b{Common Lisp note:} In Common Lisp, lower case letters are always
+ ``folded'' to upper case, unless they are explicitly escaped.  In Emacs
+ Lisp, upper case and lower case letters are distinct.
+ @end quotation
+ 
+   Here are several examples of symbol names.  Note that the @samp{+} in
+ the fifth example is escaped to prevent it from being read as a number.
+ This is not necessary in the sixth example because the rest of the name
+ makes it invalid as a number.
+ 
+ @example
+ @group
+ foo                 ; @r{A symbol named @samp{foo}.}
+ FOO                 ; @r{A symbol named @samp{FOO}, different from @samp{foo}.}
+ char-to-string      ; @r{A symbol named @samp{char-to-string}.}
+ @end group
+ @group
+ 1+                  ; @r{A symbol named @samp{1+}}
+                     ;   @r{(not @samp{+1}, which is an integer).}
+ @end group
+ @group
+ \+1                 ; @r{A symbol named @samp{+1}}
+                     ;   @r{(not a very readable name).}
+ @end group
+ @group
+ \(*\ 1\ 2\)         ; @r{A symbol named @samp{(* 1 2)} (a worse name).}
+ @c the @'s in this next line use up three characters, hence the
+ @c apparent misalignment of the comment.
+ +-*/_~!@@$%^&=:<>@{@}  ; @r{A symbol named @samp{+-*/_~!@@$%^&=:<>@{@}}.}
+                     ;   @r{These characters need not be escaped.}
+ @end group
+ @end example
+ 
+ @node Sequence Type
+ @subsection Sequence Types
+ 
+   A @dfn{sequence} is a Lisp object that represents an ordered set of
+ elements.  There are two kinds of sequence in Emacs Lisp, lists and
+ arrays.  Thus, an object of type list or of type array is also
+ considered a sequence.
+ 
+   Arrays are further subdivided into strings and vectors.  Vectors can
+ hold elements of any type, but string elements must be characters in the
+ range from 0 to 255.  However, the characters in a string can have text
+ properties like characters in a buffer (@pxref{Text Properties});
+ vectors do not support text properties even when their elements happen
+ to be characters.
+ 
+   Lists, strings and vectors are different, but they have important
+ similarities.  For example, all have a length @var{l}, and all have
+ elements which can be indexed from zero to @var{l} minus one.  Also,
+ several functions, called sequence functions, accept any kind of
+ sequence.  For example, the function @code{elt} can be used to extract
+ an element of a sequence, given its index.  @xref{Sequences Arrays
+ Vectors}.
+ 
+   It is impossible to read the same sequence twice, since sequences are
+ always created anew upon reading.  If you read the read syntax for a
+ sequence twice, you get two sequences with equal contents.  There is one
+ exception: the empty list @code{()} always stands for the same object,
+ @code{nil}.
+ 
+ @node Cons Cell Type
+ @subsection Cons Cell and List Types
+ @cindex address field of register
+ @cindex decrement field of register
+ 
+   A @dfn{cons cell} is an object comprising two pointers named the
+ @sc{car} and the @sc{cdr}.  Each of them can point to any Lisp object.
+ 
+   A @dfn{list} is a series of cons cells, linked together so that the
+ @sc{cdr} of each cons cell points either to another cons cell or to the
+ empty list.  @xref{Lists}, for functions that work on lists.  Because
+ most cons cells are used as part of lists, the phrase @dfn{list
+ structure} has come to refer to any structure made out of cons cells.
+ 
+   The names @sc{car} and @sc{cdr} have only historical meaning now.  The
+ original Lisp implementation ran on an @w{IBM 704} computer which
+ divided words into two parts, called the ``address'' part and the
+ ``decrement''; @sc{car} was an instruction to extract the contents of
+ the address part of a register, and @sc{cdr} an instruction to extract
+ the contents of the decrement.  By contrast, ``cons cells'' are named
+ for the function @code{cons} that creates them, which in turn is named
+ for its purpose, the construction of cells.
+ 
+ @cindex atom
+   Because cons cells are so central to Lisp, we also have a word for
+ ``an object which is not a cons cell''.  These objects are called
+ @dfn{atoms}.
+ 
+ @cindex parenthesis
+   The read syntax and printed representation for lists are identical, and
+ consist of a left parenthesis, an arbitrary number of elements, and a
+ right parenthesis.
+ 
+    Upon reading, each object inside the parentheses becomes an element
+ of the list.  That is, a cons cell is made for each element.  The
+ @sc{car} of the cons cell points to the element, and its @sc{cdr} points
+ to the next cons cell of the list, which holds the next element in the
+ list.  The @sc{cdr} of the last cons cell is set to point to @code{nil}.
+ 
+ @cindex box diagrams, for lists
+ @cindex diagrams, boxed, for lists
+   A list can be illustrated by a diagram in which the cons cells are
+ shown as pairs of boxes.  (The Lisp reader cannot read such an
+ illustration; unlike the textual notation, which can be understood by
+ both humans and computers, the box illustrations can be understood only
+ by humans.)  The following represents the three-element list @code{(rose
+ violet buttercup)}:
+ 
+ @example
+ @group
+     ___ ___      ___ ___      ___ ___
+    |___|___|--> |___|___|--> |___|___|--> nil
+      |            |            |
+      |            |            |
+       --> rose     --> violet   --> buttercup
+ @end group
+ @end example
+ 
+   In this diagram, each box represents a slot that can refer to any Lisp
+ object.  Each pair of boxes represents a cons cell.  Each arrow is a
+ reference to a Lisp object, either an atom or another cons cell.
+ 
+   In this example, the first box, the @sc{car} of the first cons cell,
+ refers to or ``contains'' @code{rose} (a symbol).  The second box, the
+ @sc{cdr} of the first cons cell, refers to the next pair of boxes, the
+ second cons cell.  The @sc{car} of the second cons cell refers to
+ @code{violet} and the @sc{cdr} refers to the third cons cell.  The
+ @sc{cdr} of the third (and last) cons cell refers to @code{nil}.
+ 
+ Here is another diagram of the same list, @code{(rose violet
+ buttercup)}, sketched in a different manner:
+ 
+ @smallexample
+ @group
+  ---------------       ----------------       -------------------
+ | car   | cdr   |     | car    | cdr   |     | car       | cdr   |
+ | rose  |   o-------->| violet |   o-------->| buttercup |  nil  |
+ |       |       |     |        |       |     |           |       |
+  ---------------       ----------------       -------------------
+ @end group
+ @end smallexample
+ 
+ @cindex @samp{(@dots{})} in lists
+ @cindex @code{nil} in lists
+ @cindex empty list
+   A list with no elements in it is the @dfn{empty list}; it is identical
+ to the symbol @code{nil}.  In other words, @code{nil} is both a symbol
+ and a list.
+ 
+   Here are examples of lists written in Lisp syntax:
+ 
+ @example
+ (A 2 "A")            ; @r{A list of three elements.}
+ ()                   ; @r{A list of no elements (the empty list).}
+ nil                  ; @r{A list of no elements (the empty list).}
+ ("A ()")             ; @r{A list of one element: the string @code{"A ()"}.}
+ (A ())               ; @r{A list of two elements: @code{A} and the empty list.}
+ (A nil)              ; @r{Equivalent to the previous.}
+ ((A B C))            ; @r{A list of one element}
+                      ;   @r{(which is a list of three elements).}
+ @end example
+ 
+   Here is the list @code{(A ())}, or equivalently @code{(A nil)},
+ depicted with boxes and arrows:
+ 
+ @example
+ @group
+     ___ ___      ___ ___
+    |___|___|--> |___|___|--> nil
+      |            |
+      |            |
+       --> A        --> nil
+ @end group
+ @end example
+ 
+ @menu
+ * Dotted Pair Notation::        An alternative syntax for lists.
+ * Association List Type::       A specially constructed list.
+ @end menu
+ 
+ @node Dotted Pair Notation
+ @comment  node-name,  next,  previous,  up
+ @subsubsection Dotted Pair Notation
+ @cindex dotted pair notation
+ @cindex @samp{.} in lists
+ 
+   @dfn{Dotted pair notation} is an alternative syntax for cons cells
+ that represents the @sc{car} and @sc{cdr} explicitly.  In this syntax,
+ @code{(@var{a} .@: @var{b})} stands for a cons cell whose @sc{car} is
+ the object @var{a}, and whose @sc{cdr} is the object @var{b}.  Dotted
+ pair notation is therefore more general than list syntax.  In the dotted
+ pair notation, the list @samp{(1 2 3)} is written as @samp{(1 .  (2 . (3
+ . nil)))}.  For @code{nil}-terminated lists, the two notations produce
+ the same result, but list notation is usually clearer and more
+ convenient when it is applicable.  When printing a list, the dotted pair
+ notation is only used if the @sc{cdr} of a cell is not a list.
+ 
+   Here's how box notation can illustrate dotted pairs.  This example
+ shows the pair @code{(rose . violet)}:
+ 
+ @example
+ @group
+     ___ ___
+    |___|___|--> violet
+      |
+      |
+       --> rose
+ @end group
+ @end example
+ 
+   Dotted pair notation can be combined with list notation to represent a
+ chain of cons cells with a non-@code{nil} final @sc{cdr}.  For example,
+ @code{(rose violet . buttercup)} is equivalent to @code{(rose . (violet
+ . buttercup))}.  The object looks like this:
+ 
+ @example
+ @group
+     ___ ___      ___ ___
+    |___|___|--> |___|___|--> buttercup
+      |            |
+      |            |
+       --> rose     --> violet
+ @end group
+ @end example
+ 
+   These diagrams make it evident why @w{@code{(rose .@: violet .@:
+ buttercup)}} is invalid syntax; it would require a cons cell that has
+ three parts rather than two.
+ 
+   The list @code{(rose violet)} is equivalent to @code{(rose . (violet))}
+ and looks like this:
+ 
+ @example
+ @group
+     ___ ___      ___ ___
+    |___|___|--> |___|___|--> nil
+      |            |
+      |            |
+       --> rose     --> violet
+ @end group
+ @end example
+ 
+   Similarly, the three-element list @code{(rose violet buttercup)}
+ is equivalent to @code{(rose . (violet . (buttercup)))}.
+ @ifinfo
+ It looks like this:
+ 
+ @example
+ @group
+     ___ ___      ___ ___      ___ ___
+    |___|___|--> |___|___|--> |___|___|--> nil
+      |            |            |
+      |            |            |
+       --> rose     --> violet   --> buttercup
+ @end group
+ @end example
+ @end ifinfo
+ 
+ @node Association List Type
+ @comment  node-name,  next,  previous,  up
+ @subsubsection Association List Type
+ 
+   An @dfn{association list} or @dfn{alist} is a specially-constructed
+ list whose elements are cons cells.  In each element, the @sc{car} is
+ considered a @dfn{key}, and the @sc{cdr} is considered an
+ @dfn{associated value}.  (In some cases, the associated value is stored
+ in the @sc{car} of the @sc{cdr}.)  Association lists are often used as
+ stacks, since it is easy to add or remove associations at the front of
+ the list.
+ 
+   For example,
+ 
+ @example
+ (setq alist-of-colors
+       '((rose . red) (lily . white)  (buttercup . yellow)))
+ @end example
+ 
+ @noindent
+ sets the variable @code{alist-of-colors} to an alist of three elements.  In the
+ first element, @code{rose} is the key and @code{red} is the value.
+ 
+   @xref{Association Lists}, for a further explanation of alists and for
+ functions that work on alists.
+ 
+ @node Array Type
+ @subsection Array Type
+ 
+   An @dfn{array} is composed of an arbitrary number of slots for
+ referring to other Lisp objects, arranged in a contiguous block of
+ memory.  Accessing any element of an array takes the same amount of
+ time.  In contrast, accessing an element of a list requires time
+ proportional to the position of the element in the list.  (Elements at
+ the end of a list take longer to access than elements at the beginning
+ of a list.)
+ 
+   Emacs defines two types of array, strings and vectors.  A string is an
+ array of characters and a vector is an array of arbitrary objects.  Both
+ are one-dimensional.  (Most other programming languages support
+ multidimensional arrays, but they are not essential; you can get the
+ same effect with an array of arrays.)  Each type of array has its own
+ read syntax; see @ref{String Type}, and @ref{Vector Type}.
+ 
+   An array may have any length up to the largest integer; but once
+ created, it has a fixed size.  The first element of an array has index
+ zero, the second element has index 1, and so on.  This is called
+ @dfn{zero-origin} indexing.  For example, an array of four elements has
+ indices 0, 1, 2, @w{and 3}.
+ 
+   The array type is contained in the sequence type and contains both the
+ string type and the vector type.
+ 
+ @node String Type
+ @subsection String Type
+ 
+   A @dfn{string} is an array of characters.  Strings are used for many
+ purposes in Emacs, as can be expected in a text editor; for example, as
+ the names of Lisp symbols, as messages for the user, and to represent
+ text extracted from buffers.  Strings in Lisp are constants: evaluation
+ of a string returns the same string.
+ 
+ @cindex @samp{"} in strings
+ @cindex double-quote in strings
+ @cindex @samp{\} in strings
+ @cindex backslash in strings
+   The read syntax for strings is a double-quote, an arbitrary number of
+ characters, and another double-quote, @code{"like this"}.  The Lisp
+ reader accepts the same formats for reading the characters of a string
+ as it does for reading single characters (without the question mark that
+ begins a character literal).  You can enter a nonprinting character such
+ as tab, @kbd{C-a} or @kbd{M-C-A} using the convenient escape sequences,
+ like this: @code{"\t, \C-a, \M-\C-a"}.  You can include a double-quote
+ in a string by preceding it with a backslash; thus, @code{"\""} is a
+ string containing just a single double-quote character.
+ (@xref{Character Type}, for a description of the read syntax for
+ characters.)
+ 
+   If you use the @samp{\M-} syntax to indicate a meta character in a
+ string constant, this sets the
+ @iftex
+ $2^{7}$
+ @end iftex
+ @ifinfo
+ 2**7
+ @end ifinfo
+ bit of the character in the string.
+ This is not the same representation that the meta modifier has in a
+ character on its own (not inside a string).  @xref{Character Type}.
+ 
+   Strings cannot hold characters that have the hyper, super, or alt
+ modifiers; they can hold @sc{ASCII} control characters, but no others.
+ They do not distinguish case in @sc{ASCII} control characters.
+ 
+   The printed representation of a string consists of a double-quote, the
+ characters it contains, and another double-quote.  However, you must
+ escape any backslash or double-quote characters in the string with a
+ backslash, like this: @code{"this \" is an embedded quote"}.
+ 
+   The newline character is not special in the read syntax for strings;
+ if you write a new line between the double-quotes, it becomes a
+ character in the string.  But an escaped newline---one that is preceded
+ by @samp{\}---does not become part of the string; i.e., the Lisp reader
+ ignores an escaped newline while reading a string.
+ @cindex newline in strings
+ 
+ @example
+ "It is useful to include newlines
+ in documentation strings,
+ but the newline is \
+ ignored if escaped."
+      @result{} "It is useful to include newlines 
+ in documentation strings, 
+ but the newline is ignored if escaped."
+ @end example
+ 
+   A string can hold properties of the text it contains, in addition to
+ the characters themselves.  This enables programs that copy text between
+ strings and buffers to preserve the properties with no special effort.
+ @xref{Text Properties}.  Strings with text properties have a special
+ read and print syntax:
+ 
+ @example
+ #("@var{characters}" @var{property-data}...)
+ @end example
+ 
+ @noindent
+ where @var{property-data} consists of zero or more elements, in groups
+ of three as follows:
+ 
+ @example
+ @var{beg} @var{end} @var{plist}
+ @end example
+ 
+ @noindent
+ The elements @var{beg} and @var{end} are integers, and together specify
+ a range of indices in the string; @var{plist} is the property list for
+ that range.
+ 
+   @xref{Strings and Characters}, for functions that work on strings.
+ 
+ @node Vector Type
+ @subsection Vector Type
+ 
+   A @dfn{vector} is a one-dimensional array of elements of any type.  It
+ takes a constant amount of time to access any element of a vector.  (In
+ a list, the access time of an element is proportional to the distance of
+ the element from the beginning of the list.)
+ 
+   The printed representation of a vector consists of a left square
+ bracket, the elements, and a right square bracket.  This is also the
+ read syntax.  Like numbers and strings, vectors are considered constants
+ for evaluation.
+ 
+ @example
+ [1 "two" (three)]      ; @r{A vector of three elements.}
+      @result{} [1 "two" (three)]
+ @end example
+ 
+   @xref{Vectors}, for functions that work with vectors.
+ 
+ @node Function Type
+ @subsection Function Type
+ 
+   Just as functions in other programming languages are executable,
+ @dfn{Lisp function} objects are pieces of executable code.  However,
+ functions in Lisp are primarily Lisp objects, and only secondarily the
+ text which represents them.  These Lisp objects are lambda expressions:
+ lists whose first element is the symbol @code{lambda} (@pxref{Lambda
+ Expressions}).
+ 
+   In most programming languages, it is impossible to have a function
+ without a name.  In Lisp, a function has no intrinsic name.  A lambda
+ expression is also called an @dfn{anonymous function} (@pxref{Anonymous
+ Functions}).  A named function in Lisp is actually a symbol with a valid
+ function in its function cell (@pxref{Defining Functions}).
+ 
+   Most of the time, functions are called when their names are written in
+ Lisp expressions in Lisp programs.  However, you can construct or obtain
+ a function object at run time and then call it with the primitive
+ functions @code{funcall} and @code{apply}.  @xref{Calling Functions}.
+ 
+ @node Macro Type
+ @subsection Macro Type
+ 
+   A @dfn{Lisp macro} is a user-defined construct that extends the Lisp
+ language.  It is represented as an object much like a function, but with
+ different parameter-passing semantics.  A Lisp macro has the form of a
+ list whose first element is the symbol @code{macro} and whose @sc{cdr}
+ is a Lisp function object, including the @code{lambda} symbol.
+ 
+   Lisp macro objects are usually defined with the built-in
+ @code{defmacro} function, but any list that begins with @code{macro} is
+ a macro as far as Emacs is concerned.  @xref{Macros}, for an explanation
+ of how to write a macro.
+ 
+ @node Primitive Function Type
+ @subsection Primitive Function Type
+ @cindex special forms
+ 
+   A @dfn{primitive function} is a function callable from Lisp but
+ written in the C programming language.  Primitive functions are also
+ called @dfn{subrs} or @dfn{built-in functions}.  (The word ``subr'' is
+ derived from ``subroutine''.)  Most primitive functions evaluate all
+ their arguments when they are called.  A primitive function that does
+ not evaluate all its arguments is called a @dfn{special form}
+ (@pxref{Special Forms}).@refill
+ 
+   It does not matter to the caller of a function whether the function is
+ primitive.  However, this does matter if you try to substitute a
+ function written in Lisp for a primitive of the same name.  The reason
+ is that the primitive function may be called directly from C code.
+ Calls to the redefined function from Lisp will use the new definition,
+ but calls from C code may still use the built-in definition.
+ 
+   The term @dfn{function} refers to all Emacs functions, whether written
+ in Lisp or C.  @xref{Function Type}, for information about the
+ functions written in Lisp.
+ 
+   Primitive functions have no read syntax and print in hash notation
+ with the name of the subroutine.
+ 
+ @example
+ @group
+ (symbol-function 'car)          ; @r{Access the function cell}
+                                 ;   @r{of the symbol.}
+      @result{} #<subr car>
+ (subrp (symbol-function 'car))  ; @r{Is this a primitive function?}
+      @result{} t                       ; @r{Yes.}
+ @end group
+ @end example
+ 
+ @node Byte-Code Type
+ @subsection Byte-Code Function Type
+ 
+ The byte compiler produces @dfn{byte-code function objects}.
+ Internally, a byte-code function object is much like a vector; however,
+ the evaluator handles this data type specially when it appears as a
+ function to be called.  @xref{Byte Compilation}, for information about
+ the byte compiler.
+ 
+ The printed representation and read syntax for a byte-code function
+ object is like that for a vector, with an additional @samp{#} before the
+ opening @samp{[}.
+ 
+ @node Autoload Type
+ @subsection Autoload Type
+ 
+   An @dfn{autoload object} is a list whose first element is the symbol
+ @code{autoload}.  It is stored as the function definition of a symbol as
+ a placeholder for the real definition; it says that the real definition
+ is found in a file of Lisp code that should be loaded when necessary.
+ The autoload object contains the name of the file, plus some other
+ information about the real definition.
+ 
+   After the file has been loaded, the symbol should have a new function
+ definition that is not an autoload object.  The new definition is then
+ called as if it had been there to begin with.  From the user's point of
+ view, the function call works as expected, using the function definition
+ in the loaded file.
+ 
+   An autoload object is usually created with the function
+ @code{autoload}, which stores the object in the function cell of a
+ symbol.  @xref{Autoload}, for more details.
+ 
+ @node Editing Types
+ @section Editing Types
+ @cindex editing types
+ 
+   The types in the previous section are common to many Lisp dialects.
+ Emacs Lisp provides several additional data types for purposes connected
+ with editing.
+ 
+ @menu
+ * Buffer Type::         The basic object of editing.
+ * Marker Type::         A position in a buffer.
+ * Window Type::         Buffers are displayed in windows.
+ * Frame Type::		Windows subdivide frames.
+ * Window Configuration Type::   Recording the way a frame is subdivided.
+ * Process Type::        A process running on the underlying OS.
+ * Stream Type::         Receive or send characters.
+ * Keymap Type::         What function a keystroke invokes.
+ * Syntax Table Type::   What a character means.
+ * Display Table Type::  How display tables are represented.
+ * Overlay Type::        How an overlay is represented.
+ @end menu
+ 
+ @node Buffer Type
+ @subsection Buffer Type
+ 
+   A @dfn{buffer} is an object that holds text that can be edited
+ (@pxref{Buffers}).  Most buffers hold the contents of a disk file
+ (@pxref{Files}) so they can be edited, but some are used for other
+ purposes.  Most buffers are also meant to be seen by the user, and
+ therefore displayed, at some time, in a window (@pxref{Windows}).  But a
+ buffer need not be displayed in any window.
+ 
+   The contents of a buffer are much like a string, but buffers are not
+ used like strings in Emacs Lisp, and the available operations are
+ different.  For example, insertion of text into a buffer is very
+ efficient, whereas ``inserting'' text into a string requires
+ concatenating substrings, and the result is an entirely new string
+ object.
+ 
+   Each buffer has a designated position called @dfn{point}
+ (@pxref{Positions}).  At any time, one buffer is the @dfn{current
+ buffer}.  Most editing commands act on the contents of the current
+ buffer in the neighborhood of point.  Many of the standard Emacs
+ functions manipulate or test the characters in the current buffer; a
+ whole chapter in this manual is devoted to describing these functions
+ (@pxref{Text}).
+ 
+   Several other data structures are associated with each buffer:
+ 
+ @itemize @bullet
+ @item
+ a local syntax table (@pxref{Syntax Tables});
+ 
+ @item
+ a local keymap (@pxref{Keymaps}); and,
+ 
+ @item
+ a local variable binding list (@pxref{Buffer-Local Variables}).
+ 
+ @item
+ a list of overlays (@pxref{Overlays}).
+ 
+ @item
+ text properties for the text in the buffer (@pxref{Text Properties}).
+ @end itemize
+ 
+ @noindent
+ The local keymap and variable list contain entries that individually
+ override global bindings or values.  These are used to customize the
+ behavior of programs in different buffers, without actually changing the
+ programs.
+ 
+   A buffer may be @dfn{indirect}, which means it shares the text
+ of another buffer.  @xref{Indirect Buffers}.
+ 
+   Buffers have no read syntax.  They print in hash notation, showing the
+ buffer name.
+ 
+ @example
+ @group
+ (current-buffer)
+      @result{} #<buffer objects.texi>
+ @end group
+ @end example
+ 
+ @node Marker Type
+ @subsection Marker Type
+ 
+   A @dfn{marker} denotes a position in a specific buffer.  Markers
+ therefore have two components: one for the buffer, and one for the
+ position.  Changes in the buffer's text automatically relocate the
+ position value as necessary to ensure that the marker always points
+ between the same two characters in the buffer.
+ 
+   Markers have no read syntax.  They print in hash notation, giving the
+ current character position and the name of the buffer.
+ 
+ @example
+ @group
+ (point-marker)
+      @result{} #<marker at 10779 in objects.texi>
+ @end group
+ @end example
+ 
+ @xref{Markers}, for information on how to test, create, copy, and move
+ markers.
+ 
+ @node Window Type
+ @subsection Window Type
+ 
+   A @dfn{window} describes the portion of the terminal screen that Emacs
+ uses to display a buffer.  Every window has one associated buffer, whose
+ contents appear in the window.  By contrast, a given buffer may appear
+ in one window, no window, or several windows.
+ 
+   Though many windows may exist simultaneously, at any time one window
+ is designated the @dfn{selected window}.  This is the window where the
+ cursor is (usually) displayed when Emacs is ready for a command.  The
+ selected window usually displays the current buffer, but this is not
+ necessarily the case.
+ 
+   Windows are grouped on the screen into frames; each window belongs to
+ one and only one frame.  @xref{Frame Type}.
+ 
+   Windows have no read syntax.  They print in hash notation, giving the
+ window number and the name of the buffer being displayed.  The window
+ numbers exist to identify windows uniquely, since the buffer displayed
+ in any given window can change frequently.
+ 
+ @example
+ @group
+ (selected-window)
+      @result{} #<window 1 on objects.texi>
+ @end group
+ @end example
+ 
+   @xref{Windows}, for a description of the functions that work on windows.
+ 
+ @node Frame Type
+ @subsection Frame Type
+ 
+   A @var{frame} is a rectangle on the screen that contains one or more
+ Emacs windows.  A frame initially contains a single main window (plus
+ perhaps a minibuffer window) which you can subdivide vertically or
+ horizontally into smaller windows.
+ 
+   Frames have no read syntax.  They print in hash notation, giving the
+ frame's title, plus its address in core (useful to identify the frame
+ uniquely).
+ 
+ @example
+ @group
+ (selected-frame)
+      @result{} #<frame xemacs@@mole.gnu.ai.mit.edu 0xdac80>
+ @end group
+ @end example
+ 
+   @xref{Frames}, for a description of the functions that work on frames.
+ 
+ @node Window Configuration Type
+ @subsection Window Configuration Type
+ @cindex screen layout
+ 
+   A @dfn{window configuration} stores information about the positions,
+ sizes, and contents of the windows in a frame, so you can recreate the
+ same arrangement of windows later.
+ 
+   Window configurations do not have a read syntax.  They print as
+ @samp{#<window-configuration>}.  @xref{Window Configurations}, for a
+ description of several functions related to window configurations.
+ 
+ @node Process Type
+ @subsection Process Type
+ 
+   The word @dfn{process} usually means a running program.  Emacs itself
+ runs in a process of this sort.  However, in Emacs Lisp, a process is a
+ Lisp object that designates a subprocess created by the Emacs process.
+ Programs such as shells, GDB, ftp, and compilers, running in
+ subprocesses of Emacs, extend the capabilities of Emacs.
+ 
+   An Emacs subprocess takes textual input from Emacs and returns textual
+ output to Emacs for further manipulation.  Emacs can also send signals
+ to the subprocess.
+ 
+   Process objects have no read syntax.  They print in hash notation,
+ giving the name of the process:
+ 
+ @example
+ @group
+ (process-list)
+      @result{} (#<process shell>)
+ @end group
+ @end example
+ 
+ @xref{Processes}, for information about functions that create, delete,
+ return information about, send input or signals to, and receive output
+ from processes.
+ 
+ @node Stream Type
+ @subsection Stream Type
+ 
+   A @dfn{stream} is an object that can be used as a source or sink for
+ characters---either to supply characters for input or to accept them as
+ output.  Many different types can be used this way: markers, buffers,
+ strings, and functions.  Most often, input streams (character sources)
+ obtain characters from the keyboard, a buffer, or a file, and output
+ streams (character sinks) send characters to a buffer, such as a
+ @file{*Help*} buffer, or to the echo area.
+ 
+   The object @code{nil}, in addition to its other meanings, may be used
+ as a stream.  It stands for the value of the variable
+ @code{standard-input} or @code{standard-output}.  Also, the object
+ @code{t} as a stream specifies input using the minibuffer
+ (@pxref{Minibuffers}) or output in the echo area (@pxref{The Echo
+ Area}).
+ 
+   Streams have no special printed representation or read syntax, and
+ print as whatever primitive type they are.
+ 
+   @xref{Read and Print}, for a description of functions
+ related to streams, including parsing and printing functions.
+ 
+ @node Keymap Type
+ @subsection Keymap Type
+ 
+   A @dfn{keymap} maps keys typed by the user to commands.  This mapping
+ controls how the user's command input is executed.  A keymap is actually
+ a list whose @sc{car} is the symbol @code{keymap}.
+ 
+   @xref{Keymaps}, for information about creating keymaps, handling prefix
+ keys, local as well as global keymaps, and changing key bindings.
+ 
+ @node Syntax Table Type
+ @subsection Syntax Table Type
+ 
+   A @dfn{syntax table} is a vector of 256 integers.  Each element of the
+ vector defines how one character is interpreted when it appears in a
+ buffer.  For example, in C mode (@pxref{Major Modes}), the @samp{+}
+ character is punctuation, but in Lisp mode it is a valid character in a
+ symbol.  These modes specify different interpretations by changing the
+ syntax table entry for @samp{+}, at index 43 in the syntax table.
+ 
+   Syntax tables are used only for scanning text in buffers, not for
+ reading Lisp expressions.  The table the Lisp interpreter uses to read
+ expressions is built into the Emacs source code and cannot be changed;
+ thus, to change the list delimiters to be @samp{@{} and @samp{@}}
+ instead of @samp{(} and @samp{)} would be impossible.
+ 
+   @xref{Syntax Tables}, for details about syntax classes and how to make
+ and modify syntax tables.
+ 
+ @node Display Table Type
+ @subsection Display Table Type
+ 
+   A @dfn{display table} specifies how to display each character code.
+ Each buffer and each window can have its own display table.  A display
+ table is actually a vector of length 262.  @xref{Display Tables}.
+ 
+ @node Overlay Type
+ @subsection Overlay Type
+ 
+   An @dfn{overlay} specifies temporary alteration of the display
+ appearance of a part of a buffer.  It contains markers delimiting a
+ range of the buffer, plus a property list (a list whose elements are
+ alternating property names and values).  Overlays are used to present
+ parts of the buffer temporarily in a different display style.  They have
+ no read syntax, and print in hash notation, giving the buffer name and
+ range of positions.
+ 
+   @xref{Overlays}, for how to create and use overlays.
+ 
+ @node Type Predicates
+ @section Type Predicates
+ @cindex predicates
+ @cindex type checking
+ @kindex wrong-type-argument
+ 
+   The Emacs Lisp interpreter itself does not perform type checking on
+ the actual arguments passed to functions when they are called.  It could
+ not do so, since function arguments in Lisp do not have declared data
+ types, as they do in other programming languages.  It is therefore up to
+ the individual function to test whether each actual argument belongs to
+ a type that the function can use.
+ 
+   All built-in functions do check the types of their actual arguments
+ when appropriate, and signal a @code{wrong-type-argument} error if an
+ argument is of the wrong type.  For example, here is what happens if you
+ pass an argument to @code{+} that it cannot handle:
+ 
+ @example
+ @group
+ (+ 2 'a)
+      @error{} Wrong type argument: integer-or-marker-p, a
+ @end group
+ @end example
+ 
+ @cindex type predicates
+ @cindex testing types
+   If you want your program to handle different types differently, you
+ must do explicit type checking.  The most common way to check the type
+ of an object is to call a @dfn{type predicate} function.  Emacs has a
+ type predicate for each type, as well as some predicates for
+ combinations of types.
+ 
+   A type predicate function takes one argument; it returns @code{t} if
+ the argument belongs to the appropriate type, and @code{nil} otherwise.
+ Following a general Lisp convention for predicate functions, most type
+ predicates' names end with @samp{p}.
+ 
+   Here is an example which uses the predicates @code{listp} to check for
+ a list and @code{symbolp} to check for a symbol.
+ 
+ @example
+ (defun add-on (x)
+   (cond ((symbolp x)
+          ;; If X is a symbol, put it on LIST.
+          (setq list (cons x list)))
+         ((listp x)
+          ;; If X is a list, add its elements to LIST.
+          (setq list (append x list)))
+ @need 3000
+         (t
+          ;; We only handle symbols and lists.
+          (error "Invalid argument %s in add-on" x))))
+ @end example
+ 
+   Here is a table of predefined type predicates, in alphabetical order,
+ with references to further information.
+ 
+ @table @code
+ @item atom
+ @xref{List-related Predicates, atom}.
+ 
+ @item arrayp
+ @xref{Array Functions, arrayp}.
+ 
+ @item bufferp
+ @xref{Buffer Basics, bufferp}.
+ 
+ @item byte-code-function-p
+ @xref{Byte-Code Type, byte-code-function-p}.
+ 
+ @item case-table-p
+ @xref{Case Table, case-table-p}.
+ 
+ @item char-or-string-p
+ @xref{Predicates for Strings, char-or-string-p}.
+ 
+ @item commandp
+ @xref{Interactive Call, commandp}.
+ 
+ @item consp
+ @xref{List-related Predicates, consp}.
+ 
+ @item floatp
+ @xref{Predicates on Numbers, floatp}.
+ 
+ @item frame-live-p
+ @xref{Deleting Frames, frame-live-p}.
+ 
+ @item framep
+ @xref{Frames, framep}.
+ 
+ @item integer-or-marker-p
+ @xref{Predicates on Markers, integer-or-marker-p}.
+ 
+ @item integerp
+ @xref{Predicates on Numbers, integerp}.
+ 
+ @item keymapp
+ @xref{Creating Keymaps, keymapp}.
+ 
+ @item listp
+ @xref{List-related Predicates, listp}.
+ 
+ @item markerp
+ @xref{Predicates on Markers, markerp}.
+ 
+ @item wholenump
+ @xref{Predicates on Numbers, wholenump}.
+ 
+ @item nlistp
+ @xref{List-related Predicates, nlistp}.
+ 
+ @item numberp
+ @xref{Predicates on Numbers, numberp}.
+ 
+ @item number-or-marker-p
+ @xref{Predicates on Markers, number-or-marker-p}.
+ 
+ @item overlayp
+ @xref{Overlays, overlayp}.
+ 
+ @item processp
+ @xref{Processes, processp}.
+ 
+ @item sequencep
+ @xref{Sequence Functions, sequencep}.
+ 
+ @item stringp
+ @xref{Predicates for Strings, stringp}.
+ 
+ @item subrp
+ @xref{Function Cells, subrp}.
+ 
+ @item symbolp
+ @xref{Symbols, symbolp}.
+ 
+ @item syntax-table-p
+ @xref{Syntax Tables, syntax-table-p}.
+ 
+ @item user-variable-p
+ @xref{Defining Variables, user-variable-p}.
+ 
+ @item vectorp
+ @xref{Vectors, vectorp}.
+ 
+ @item window-configuration-p
+ @xref{Window Configurations, window-configuration-p}.
+ 
+ @item window-live-p
+ @xref{Deleting Windows, window-live-p}.
+ 
+ @item windowp
+ @xref{Basic Windows, windowp}.
+ @end table
+ 
+   The most general way to check the type of an object is to call the
+ function @code{type-of}.  Recall that each object belongs to one and
+ only one primitive type; @code{type-of} tells you which one (@pxref{Lisp
+ Data Types}).  But @code{type-of} knows nothing about non-primitive
+ types.  In most cases, it is more convenient to use type predicates than
+ @code{type-of}.
+ 
+ @defun type-of object
+ This function returns a symbol naming the primitive type of
+ @var{object}.  The value is one of @code{symbol}, @code{integer},
+ @code{float}, @code{string}, @code{cons}, @code{vector}, @code{marker},
+ @code{overlay}, @code{window}, @code{buffer}, @code{subr},
+ @code{compiled-function}, @code{window-configuration}, or
+ @code{process}.
+ 
+ @example
+ (type-of 1)
+      @result{} integer
+ (type-of 'nil)
+      @result{} symbol
+ (type-of '())    ; @r{@code{()} is @code{nil}.}
+      @result{} symbol
+ (type-of '(x))
+      @result{} cons
+ @end example
+ @end defun
+ 
+ @node Equality Predicates
+ @section Equality Predicates
+ @cindex equality
+ 
+   Here we describe two functions that test for equality between any two
+ objects.  Other functions test equality between objects of specific
+ types, e.g., strings.  For these predicates, see the appropriate chapter
+ describing the data type.
+ 
+ @defun eq object1 object2
+ This function returns @code{t} if @var{object1} and @var{object2} are
+ the same object, @code{nil} otherwise.  The ``same object'' means that a
+ change in one will be reflected by the same change in the other.
+ 
+ @code{eq} returns @code{t} if @var{object1} and @var{object2} are
+ integers with the same value.  Also, since symbol names are normally
+ unique, if the arguments are symbols with the same name, they are
+ @code{eq}.  For other types (e.g., lists, vectors, strings), two
+ arguments with the same contents or elements are not necessarily
+ @code{eq} to each other: they are @code{eq} only if they are the same
+ object.
+ 
+ (The @code{make-symbol} function returns an uninterned symbol that is
+ not interned in the standard @code{obarray}.  When uninterned symbols
+ are in use, symbol names are no longer unique.  Distinct symbols with
+ the same name are not @code{eq}.  @xref{Creating Symbols}.)
+ 
+ @example
+ @group
+ (eq 'foo 'foo)
+      @result{} t
+ @end group
+ 
+ @group
+ (eq 456 456)
+      @result{} t
+ @end group
+ 
+ @group
+ (eq "asdf" "asdf")
+      @result{} nil
+ @end group
+ 
+ @group
+ (eq '(1 (2 (3))) '(1 (2 (3))))
+      @result{} nil
+ @end group
+ 
+ @group
+ (setq foo '(1 (2 (3))))
+      @result{} (1 (2 (3)))
+ (eq foo foo)
+      @result{} t
+ (eq foo '(1 (2 (3))))
+      @result{} nil
+ @end group
+ 
+ @group
+ (eq [(1 2) 3] [(1 2) 3])
+      @result{} nil
+ @end group
+ 
+ @group
+ (eq (point-marker) (point-marker))
+      @result{} nil
+ @end group
+ @end example
+ 
+ @end defun
+ 
+ @defun equal object1 object2
+ This function returns @code{t} if @var{object1} and @var{object2} have
+ equal components, @code{nil} otherwise.  Whereas @code{eq} tests if its
+ arguments are the same object, @code{equal} looks inside nonidentical
+ arguments to see if their elements are the same.  So, if two objects are
+ @code{eq}, they are @code{equal}, but the converse is not always true.
+ 
+ @example
+ @group
+ (equal 'foo 'foo)
+      @result{} t
+ @end group
+ 
+ @group
+ (equal 456 456)
+      @result{} t
+ @end group
+ 
+ @group
+ (equal "asdf" "asdf")
+      @result{} t
+ @end group
+ @group
+ (eq "asdf" "asdf")
+      @result{} nil
+ @end group
+ 
+ @group
+ (equal '(1 (2 (3))) '(1 (2 (3))))
+      @result{} t
+ @end group
+ @group
+ (eq '(1 (2 (3))) '(1 (2 (3))))
+      @result{} nil
+ @end group
+ 
+ @group
+ (equal [(1 2) 3] [(1 2) 3])
+      @result{} t
+ @end group
+ @group
+ (eq [(1 2) 3] [(1 2) 3])
+      @result{} nil
+ @end group
+ 
+ @group
+ (equal (point-marker) (point-marker))
+      @result{} t
+ @end group
+ 
+ @group
+ (eq (point-marker) (point-marker))
+      @result{} nil
+ @end group
+ @end example
+ 
+ Comparison of strings is case-sensitive and takes account of text
+ properties as well as the characters in the strings.  To compare
+ two strings' characters without comparing their text properties,
+ use @code{string=} (@pxref{Text Comparison}).
+ 
+ @example
+ @group
+ (equal "asdf" "ASDF")
+      @result{} nil
+ @end group
+ @end example
+ 
+ Two distinct buffers are never @code{equal}, even if their contents
+ are the same.
+ @end defun
+ 
+   The test for equality is implemented recursively, and circular lists may
+ therefore cause infinite recursion (leading to an error).
Index: emacs/man/elisp-os.texi
diff -c /dev/null emacs/man/elisp-os.texi:1.2
*** /dev/null	Fri Aug  2 20:56:56 1996
--- emacs/man/elisp-os.texi	Thu Aug  1 00:23:19 1996
***************
*** 0 ****
--- 1,1595 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/os
+ @node System Interface, Display, Processes, Top
+ @chapter Operating System Interface
+ 
+   This chapter is about starting and getting out of Emacs, access to
+ values in the operating system environment, and terminal input, output,
+ and flow control.
+ 
+   @xref{Building Emacs}, for related information.  See also
+ @ref{Display}, for additional operating system status information
+ pertaining to the terminal and the screen.
+ 
+ @menu
+ * Starting Up::         Customizing Emacs start-up processing.
+ * Getting Out::         How exiting works (permanent or temporary).
+ * System Environment::  Distinguish the name and kind of system.
+ * User Identification:: Finding the name and user id of the user.
+ * Time of Day::		Getting the current time.
+ * Time Conversion::     Converting a time from numeric form to a string, or
+                           to calendrical data (or vice versa).
+ * Timers::		Setting a timer to call a function at a certain time.
+ * Terminal Input::      Recording terminal input for debugging.
+ * Terminal Output::     Recording terminal output for debugging.
+ * Special Keysyms::     Defining system-specific key symbols for X windows.
+ * Flow Control::        How to turn output flow control on or off.
+ * Batch Mode::          Running Emacs without terminal interaction.
+ @end menu
+ 
+ @node Starting Up
+ @section Starting Up Emacs
+ 
+   This section describes what Emacs does when it is started, and how you
+ can customize these actions.
+ 
+ @menu
+ * Start-up Summary::        Sequence of actions Emacs performs at start-up.
+ * Init File::               Details on reading the init file (@file{.emacs}).
+ * Terminal-Specific::       How the terminal-specific Lisp file is read.
+ * Command Line Arguments::  How command line arguments are processed,
+                               and how you can customize them.
+ @end menu
+ 
+ @node Start-up Summary
+ @subsection Summary: Sequence of Actions at Start Up
+ @cindex initialization
+ @cindex start up of Emacs
+ @cindex @file{startup.el}
+ 
+    The order of operations performed (in @file{startup.el}) by Emacs when
+ it is started up is as follows:
+ 
+ @enumerate
+ @item
+ It loads the initialization library for the window system, if you are
+ using a window system.  This library's name is
+ @file{term/@var{windowsystem}-win.el}.
+ 
+ @item
+ It processes the initial options.  (Some of them are handled
+ even earlier than this.)
+ 
+ @item
+ It initializes the X window frame and faces, if appropriate.
+ 
+ @item
+ It runs the normal hook @code{before-init-hook}.
+ 
+ @item
+ It loads the library @file{site-start}, unless the option
+ @samp{-no-site-file} was specified.  The library's file name is usually
+ @file{site-start.el}.
+ @cindex @file{site-start.el}
+ 
+ @item 
+ It loads the file @file{~/.emacs} unless @samp{-q} was specified on
+ the command line.  (This is not done in @samp{-batch} mode.)  The @samp{-u}
+ option can specify the user name whose home directory should be used
+ instead of @file{~}.
+ 
+ @item 
+ It loads the library @file{default} unless @code{inhibit-default-init}
+ is non-@code{nil}.  (This is not done in @samp{-batch} mode or if
+ @samp{-q} was specified on the command line.)  The library's file name
+ is usually @file{default.el}.
+ @cindex @file{default.el}
+ 
+ @item
+ It runs the normal hook @code{after-init-hook}.
+ 
+ @item
+ It sets the major mode according to @code{initial-major-mode}, provided
+ the buffer @samp{*scratch*} is still current and still in Fundamental
+ mode.
+ 
+ @item 
+ It loads the terminal-specific Lisp file, if any, except when in batch
+ mode or using a window system.
+ 
+ @item
+ It displays the initial echo area message, unless you have suppressed
+ that with @code{inhibit-startup-echo-area-message}.
+ 
+ @item 
+ It processes the action arguments from the command line.
+ 
+ @item 
+ It runs @code{term-setup-hook}.
+ 
+ @item
+ It calls @code{frame-notice-user-settings}, which modifies the
+ parameters of the selected frame according to whatever the init files
+ specify.
+ 
+ @item 
+ It runs @code{window-setup-hook}.  @xref{Window Systems}.
+ 
+ @item 
+ It displays copyleft, nonwarranty, and basic use information, provided
+ there were no remaining command line arguments (a few steps above) and
+ the value of @code{inhibit-startup-message} is @code{nil}.
+ @end enumerate
+ 
+ @defopt inhibit-startup-message
+ This variable inhibits the initial startup messages (the nonwarranty,
+ etc.).  If it is non-@code{nil}, then the messages are not printed.
+ 
+ This variable exists so you can set it in your personal init file, once
+ you are familiar with the contents of the startup message.  Do not set
+ this variable in the init file of a new user, or in a way that affects
+ more than one user, because that would prevent new users from receiving
+ the information they are supposed to see.
+ @end defopt
+ 
+ @defopt inhibit-startup-echo-area-message
+ This variable controls the display of the startup echo area message.
+ You can suppress the startup echo area message by adding text with this
+ form to your @file{.emacs} file:
+ 
+ @example
+ (setq inhibit-startup-echo-area-message
+       "@var{your-login-name}")
+ @end example
+ 
+ Simply setting @code{inhibit-startup-echo-area-message} to your login
+ name is not sufficient to inhibit the message; Emacs explicitly checks
+ whether @file{.emacs} contains an expression as shown above.  Your login
+ name must appear in the expression as a Lisp string constant.
+ 
+ This way, you can easily inhibit the message for yourself if you wish,
+ but thoughtless copying of your @file{.emacs} file will not inhibit the
+ message for someone else.
+ @end defopt
+ 
+ @node Init File
+ @subsection The Init File: @file{.emacs}
+ @cindex init file
+ @cindex @file{.emacs}
+ 
+   When you start Emacs, it normally attempts to load the file
+ @file{.emacs} from your home directory.  This file, if it exists, must
+ contain Lisp code.  It is called your @dfn{init file}.  The command line
+ switches @samp{-q} and @samp{-u} affect the use of the init file;
+ @samp{-q} says not to load an init file, and @samp{-u} says to load a
+ specified user's init file instead of yours.  @xref{Entering Emacs,,,
+ emacs, The GNU Emacs Manual}.
+ 
+ @cindex default init file
+   A site may have a @dfn{default init file}, which is the library named
+ @file{default.el}.  Emacs finds the @file{default.el} file through the
+ standard search path for libraries (@pxref{How Programs Do Loading}).
+ The Emacs distribution does not come with this file; sites may provide
+ one for local customizations.  If the default init file exists, it is
+ loaded whenever you start Emacs, except in batch mode or if @samp{-q} is
+ specified.  But your own personal init file, if any, is loaded first; if
+ it sets @code{inhibit-default-init} to a non-@code{nil} value, then
+ Emacs does not subsequently load the @file{default.el} file.
+ 
+   Another file for site-customization is @file{site-start.el}.  Emacs
+ loads this @emph{before} the user's init file.  You can inhibit the
+ loading of this file with the option @samp{-no-site-file}.
+ 
+ @defvar site-run-file
+ This variable specifies the site-customization file to load
+ before the user's init file.  Its normal value is @code{"site-start"}.
+ @end defvar
+ 
+   If there is a great deal of code in your @file{.emacs} file, you
+ should move it into another file named @file{@var{something}.el},
+ byte-compile it (@pxref{Byte Compilation}), and make your @file{.emacs}
+ file load the other file using @code{load} (@pxref{Loading}).
+ 
+   @xref{Init File Examples,,, emacs, The GNU Emacs Manual}, for
+ examples of how to make various commonly desired customizations in your
+ @file{.emacs} file.
+ 
+ @defopt inhibit-default-init
+ This variable prevents Emacs from loading the default initialization
+ library file for your session of Emacs.  If its value is non-@code{nil},
+ then the default library is not loaded.  The default value is
+ @code{nil}.
+ @end defopt
+ 
+ @defvar before-init-hook
+ @defvarx after-init-hook
+ These two normal hooks are run just before, and just after, loading of
+ the user's init file, @file{default.el}, and/or @file{site-start.el}.
+ @end defvar
+ 
+ @node Terminal-Specific
+ @subsection Terminal-Specific Initialization
+ @cindex terminal-specific initialization
+ 
+   Each terminal type can have its own Lisp library that Emacs loads when
+ run on that type of terminal.  For a terminal type named @var{termtype},
+ the library is called @file{term/@var{termtype}}.  Emacs finds the file
+ by searching the @code{load-path} directories as it does for other
+ files, and trying the @samp{.elc} and @samp{.el} suffixes.  Normally,
+ terminal-specific Lisp library is located in @file{emacs/lisp/term}, a
+ subdirectory of the @file{emacs/lisp} directory in which most Emacs Lisp
+ libraries are kept.@refill
+ 
+   The library's name is constructed by concatenating the value of the
+ variable @code{term-file-prefix} and the terminal type.  Normally,
+ @code{term-file-prefix} has the value @code{"term/"}; changing this
+ is not recommended.
+ 
+   The usual function of a terminal-specific library is to enable special
+ keys to send sequences that Emacs can recognize.  It may also need to
+ set or add to @code{function-key-map} if the Termcap entry does not
+ specify all the terminal's function keys.  @xref{Terminal Input}.
+ 
+ @cindex Termcap
+   When the name of the terminal type contains a hyphen, only the part of
+ the name before the first hyphen is significant in choosing the library
+ name.  Thus, terminal types @samp{aaa-48} and @samp{aaa-30-rv} both use
+ the @file{term/aaa} library.  If necessary, the library can evaluate
+ @code{(getenv "TERM")} to find the full name of the terminal
+ type.@refill
+ 
+   Your @file{.emacs} file can prevent the loading of the
+ terminal-specific library by setting the variable
+ @code{term-file-prefix} to @code{nil}.  This feature is useful when
+ experimenting with your own peculiar customizations.
+ 
+   You can also arrange to override some of the actions of the
+ terminal-specific library by setting the variable
+ @code{term-setup-hook}.  This is a normal hook which Emacs runs using
+ @code{run-hooks} at the end of Emacs initialization, after loading both
+ your @file{.emacs} file and any terminal-specific libraries.  You can
+ use this variable to define initializations for terminals that do not
+ have their own libraries.  @xref{Hooks}.
+ 
+ @defvar term-file-prefix
+ @cindex @code{TERM} environment variable
+ If the @code{term-file-prefix} variable is non-@code{nil}, Emacs loads
+ a terminal-specific initialization file as follows:
+ 
+ @example
+ (load (concat term-file-prefix (getenv "TERM")))
+ @end example
+ 
+ @noindent
+ You may set the @code{term-file-prefix} variable to @code{nil} in your
+ @file{.emacs} file if you do not wish to load the
+ terminal-initialization file.  To do this, put the following in
+ your @file{.emacs} file: @code{(setq term-file-prefix nil)}.
+ @end defvar
+ 
+ @defvar term-setup-hook 
+ This variable is a normal hook that Emacs runs after loading your
+ @file{.emacs} file, the default initialization file (if any) and the
+ terminal-specific Lisp file.
+ 
+ You can use @code{term-setup-hook} to override the definitions made by a
+ terminal-specific file.
+ @end defvar
+ 
+   See @code{window-setup-hook} in @ref{Window Systems}, for a related
+ feature.
+ 
+ @node Command Line Arguments
+ @subsection Command Line Arguments
+ @cindex command line arguments
+ 
+   You can use command line arguments to request various actions when you
+ start Emacs.  Since you do not need to start Emacs more than once per
+ day, and will often leave your Emacs session running longer than that,
+ command line arguments are hardly ever used.  As a practical matter, it
+ is best to avoid making the habit of using them, since this habit would
+ encourage you to kill and restart Emacs unnecessarily often.  These
+ options exist for two reasons: to be compatible with other editors (for
+ invocation by other programs) and to enable shell scripts to run
+ specific Lisp programs.
+ 
+   This section describes how Emacs processes command line arguments,
+ and how you can customize them.
+ 
+ @ignore
+   (Note that some other editors require you to start afresh each time
+ you want to edit a file.  With this kind of editor, you will probably
+ specify the file as a command line argument.  The recommended way to
+ use GNU Emacs is to start it only once, just after you log in, and do
+ all your editing in the same Emacs process.  Each time you want to edit
+ a different file, you visit it with the existing Emacs, which eventually
+ comes to have many files in it ready for editing.  Usually you do not
+ kill the Emacs until you are about to log out.)
+ @end ignore
+ 
+ @defun command-line
+ This function parses the command line that Emacs was called with,
+ processes it, loads the user's @file{.emacs} file and displays the
+ startup messages.
+ @end defun
+ 
+ @defvar command-line-processed
+ The value of this variable is @code{t} once the command line has been
+ processed.
+ 
+ If you redump Emacs by calling @code{dump-emacs}, you may wish to set
+ this variable to @code{nil} first in order to cause the new dumped Emacs
+ to process its new command line arguments.
+ @end defvar
+ 
+ @defvar command-switch-alist
+ @cindex switches on command line
+ @cindex options on command line
+ @cindex command line options
+ The value of this variable is an alist of user-defined command-line
+ options and associated handler functions.  This variable exists so you
+ can add elements to it.
+ 
+ A @dfn{command line option} is an argument on the command line of the
+ form:
+ 
+ @example
+ -@var{option}
+ @end example
+ 
+ The elements of the @code{command-switch-alist} look like this: 
+ 
+ @example
+ (@var{option} . @var{handler-function})
+ @end example
+ 
+ The @var{handler-function} is called to handle @var{option} and receives
+ the option name as its sole argument.
+ 
+ In some cases, the option is followed in the command line by an
+ argument.  In these cases, the @var{handler-function} can find all the
+ remaining command-line arguments in the variable
+ @code{command-line-args-left}.  (The entire list of command-line
+ arguments is in @code{command-line-args}.)
+ 
+ The command line arguments are parsed by the @code{command-line-1}
+ function in the @file{startup.el} file.  See also @ref{Command
+ Switches, , Command Line Switches and Arguments, emacs, The GNU Emacs
+ Manual}.
+ @end defvar
+ 
+ @defvar command-line-args
+ The value of this variable is the list of command line arguments passed
+ to Emacs.
+ @end defvar
+ 
+ @defvar command-line-functions
+ This variable's value is a list of functions for handling an
+ unrecognized command-line argument.  Each time the next argument to be
+ processed has no special meaning, the functions in this list are called,
+ in order of appearance, until one of them returns a non-@code{nil}
+ value.
+ 
+ These functions are called with no arguments.  They can access the
+ command-line argument under consideration through the variable
+ @code{argi}.  The remaining arguments (not including the current one)
+ are in the variable @code{command-line-args-left}.
+ 
+ When a function recognizes and processes the argument in @code{argi}, it
+ should return a non-@code{nil} value to say it has dealt with that
+ argument.  If it has also dealt with some of the following arguments, it
+ can indicate that by deleting them from @code{command-line-args-left}.
+ 
+ If all of these functions return @code{nil}, then the argument is used
+ as a file name to visit.
+ @end defvar
+ 
+ @node Getting Out
+ @section Getting Out of Emacs
+ @cindex exiting Emacs
+ 
+   There are two ways to get out of Emacs: you can kill the Emacs job,
+ which exits permanently, or you can suspend it, which permits you to
+ reenter the Emacs process later.  As a practical matter, you seldom kill
+ Emacs---only when you are about to log out.  Suspending is much more
+ common.
+ 
+ @menu
+ * Killing Emacs::        Exiting Emacs irreversibly.
+ * Suspending Emacs::     Exiting Emacs reversibly.
+ @end menu
+ 
+ @node Killing Emacs
+ @comment  node-name,  next,  previous,  up
+ @subsection Killing Emacs
+ @cindex killing Emacs
+ 
+   Killing Emacs means ending the execution of the Emacs process.  The
+ parent process normally resumes control.  The low-level primitive for
+ killing Emacs is @code{kill-emacs}.
+ 
+ @defun kill-emacs &optional exit-data
+ This function exits the Emacs process and kills it.
+ 
+ If @var{exit-data} is an integer, then it is used as the exit status
+ of the Emacs process.  (This is useful primarily in batch operation; see
+ @ref{Batch Mode}.)
+ 
+ If @var{exit-data} is a string, its contents are stuffed into the
+ terminal input buffer so that the shell (or whatever program next reads
+ input) can read them.
+ @end defun
+ 
+   All the information in the Emacs process, aside from files that have
+ been saved, is lost when the Emacs is killed.  Because killing Emacs
+ inadvertently can lose a lot of work, Emacs queries for confirmation
+ before actually terminating if you have buffers that need saving or
+ subprocesses that are running.  This is done in the function
+ @code{save-buffers-kill-emacs}.
+ 
+ @defvar kill-emacs-query-functions
+ After asking the standard questions, @code{save-buffers-kill-emacs}
+ calls the functions in the list @code{kill-buffer-query-functions}, in
+ order of appearance, with no arguments.  These functions can ask for
+ additional confirmation from the user.  If any of them returns
+ non-@code{nil}, Emacs is not killed.
+ @end defvar
+ 
+ @defvar kill-emacs-hook
+ This variable is a normal hook; once @code{save-buffers-kill-emacs} is
+ finished with all file saving and confirmation, it runs the functions in
+ this hook.
+ @end defvar
+ 
+ @node Suspending Emacs
+ @subsection Suspending Emacs
+ @cindex suspending Emacs
+ 
+   @dfn{Suspending Emacs} means stopping Emacs temporarily and returning
+ control to its superior process, which is usually the shell.  This
+ allows you to resume editing later in the same Emacs process, with the
+ same buffers, the same kill ring, the same undo history, and so on.  To
+ resume Emacs, use the appropriate command in the parent shell---most
+ likely @code{fg}.
+ 
+   Some operating systems do not support suspension of jobs; on these
+ systems, ``suspension'' actually creates a new shell temporarily as a
+ subprocess of Emacs.  Then you would exit the shell to return to Emacs.
+ 
+   Suspension is not useful with window systems such as X, because the
+ Emacs job may not have a parent that can resume it again, and in any
+ case you can give input to some other job such as a shell merely by
+ moving to a different window.  Therefore, suspending is not allowed
+ when Emacs is an X client.
+ 
+ @defun suspend-emacs string
+ This function stops Emacs and returns control to the superior process.
+ If and when the superior process resumes Emacs, @code{suspend-emacs}
+ returns @code{nil} to its caller in Lisp.
+ 
+ If @var{string} is non-@code{nil}, its characters are sent to be read
+ as terminal input by Emacs's superior shell.  The characters in
+ @var{string} are not echoed by the superior shell; only the results
+ appear.
+ 
+ Before suspending, @code{suspend-emacs} runs the normal hook
+ @code{suspend-hook}.  In Emacs version 18, @code{suspend-hook} was not a
+ normal hook; its value was a single function, and if its value was
+ non-@code{nil}, then @code{suspend-emacs} returned immediately without
+ actually suspending anything.
+ 
+ After the user resumes Emacs, @code{suspend-emacs} runs the normal hook
+ @code{suspend-resume-hook}.  @xref{Hooks}.
+ 
+ The next redisplay after resumption will redraw the entire screen,
+ unless the variable @code{no-redraw-on-reenter} is non-@code{nil}
+ (@pxref{Refresh Screen}).
+ 
+ In the following example, note that @samp{pwd} is not echoed after
+ Emacs is suspended.  But it is read and executed by the shell.
+ 
+ @smallexample
+ @group
+ (suspend-emacs)
+      @result{} nil
+ @end group
+ 
+ @group
+ (add-hook 'suspend-hook
+           (function (lambda ()
+                       (or (y-or-n-p
+                             "Really suspend? ")
+                           (error "Suspend cancelled")))))
+      @result{} (lambda nil
+           (or (y-or-n-p "Really suspend? ")
+               (error "Suspend cancelled")))
+ @end group
+ @group
+ (add-hook 'suspend-resume-hook
+           (function (lambda () (message "Resumed!"))))
+      @result{} (lambda nil (message "Resumed!"))
+ @end group
+ @group
+ (suspend-emacs "pwd")
+      @result{} nil
+ @end group
+ @group
+ ---------- Buffer: Minibuffer ----------
+ Really suspend? @kbd{y}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ 
+ @group
+ ---------- Parent Shell ----------
+ lewis@@slug[23] % /user/lewis/manual
+ lewis@@slug[24] % fg
+ @end group
+ 
+ @group
+ ---------- Echo Area ----------
+ Resumed!
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defvar suspend-hook
+ This variable is a normal hook run before suspending.
+ @end defvar
+ 
+ @defvar suspend-resume-hook
+ This variable is a normal hook run after suspending.
+ @end defvar
+ 
+ @node System Environment
+ @section Operating System Environment
+ @cindex operating system environment
+ 
+   Emacs provides access to variables in the operating system environment
+ through various functions.  These variables include the name of the
+ system, the user's @sc{uid}, and so on.
+ 
+ @defvar system-type
+ The value of this variable is a symbol indicating the type of operating
+ system Emacs is operating on.  Here is a table of the possible values:
+ 
+ @table @code
+ @item aix-v3
+ AIX.
+ 
+ @item berkeley-unix
+ Berkeley BSD.
+ 
+ @item dgux
+ Data General DGUX operating system.
+ 
+ @item gnu
+ A GNU system using the GNU HURD and Mach.
+ 
+ @item hpux
+ Hewlett-Packard HPUX operating system.
+ 
+ @item irix
+ Silicon Graphics Irix system.
+ 
+ @item linux
+ A GNU system using the Linux kernel.
+ 
+ @item ms-dos
+ Microsoft MS-DOS ``operating system.''
+ 
+ @item next-mach
+ NeXT Mach-based system.
+ 
+ @item rtu
+ Masscomp RTU, UCB universe.
+ 
+ @item unisoft-unix
+ UniSoft UniPlus.
+ 
+ @item usg-unix-v
+ AT&T System V.
+ 
+ @item vax-vms
+ VAX VMS.
+ 
+ @item windows-nt
+ Microsoft windows NT.
+ 
+ @item xenix
+ SCO Xenix 386.
+ @end table
+ 
+ We do not wish to add new symbols to make finer distinctions unless it
+ is absolutely necessary!  In fact, we hope to eliminate some of these
+ alternatives in the future.  We recommend using
+ @code{system-configuration} to distinguish between different operating
+ systems.
+ @end defvar
+ 
+ @defvar system-configuration
+ This variable holds the three-part configuration name for the
+ hardware/software configuration of your system, as a string.  The
+ convenient way to test parts of this string is with @code{string-match}.
+ @end defvar
+ 
+ @defun system-name
+ This function returns the name of the machine you are running on.
+ @example
+ (system-name)
+      @result{} "prep.ai.mit.edu"
+ @end example
+ @end defun
+ 
+ @vindex system-name
+   The symbol @code{system-name} is a variable as well as a function.  In
+ fact, the function returns whatever value the variable
+ @code{system-name} currently holds.  Thus, you can set the variable
+ @code{system-name} in case Emacs is confused about the name of your
+ system.  The variable is also useful for constructing frame titles
+ (@pxref{Frame Titles}).
+ 
+ @defvar mail-host-address
+ If this variable is non-@code{nil}, it is used instead of
+ @code{system-name} for purposes of generating email addresses.  For
+ example, it is used when constructing the default value of
+ @code{user-mail-address}.  @xref{User Identification}.  (Since this is
+ done when Emacs starts up, the value actually used is the one saved when
+ Emacs was dumped.  @xref{Building Emacs}.)
+ @end defvar
+ 
+ @defun getenv var
+ @cindex environment variable access
+ This function returns the value of the environment variable @var{var},
+ as a string.  Within Emacs, the environment variable values are kept in
+ the Lisp variable @code{process-environment}.
+ 
+ @example
+ @group
+ (getenv "USER")
+      @result{} "lewis"
+ @end group
+ 
+ @group
+ lewis@@slug[10] % printenv
+ PATH=.:/user/lewis/bin:/usr/bin:/usr/local/bin
+ USER=lewis
+ @end group
+ @group
+ TERM=ibmapa16
+ SHELL=/bin/csh
+ HOME=/user/lewis
+ @end group
+ @end example
+ @end defun
+ 
+ @c Emacs 19 feature
+ @deffn Command setenv variable value
+ This command sets the value of the environment variable named
+ @var{variable} to @var{value}.  Both arguments should be strings.  This
+ function works by modifying @code{process-environment}; binding that
+ variable with @code{let} is also reasonable practice.
+ @end deffn
+ 
+ @defvar process-environment
+ This variable is a list of strings, each describing one environment
+ variable.  The functions @code{getenv} and @code{setenv} work by means
+ of this variable.
+ 
+ @smallexample
+ @group
+ process-environment
+ @result{} ("l=/usr/stanford/lib/gnuemacs/lisp"
+     "PATH=.:/user/lewis/bin:/usr/class:/nfsusr/local/bin"
+     "USER=lewis" 
+ @end group
+ @group
+     "TERM=ibmapa16" 
+     "SHELL=/bin/csh"
+     "HOME=/user/lewis")
+ @end group
+ @end smallexample
+ @end defvar
+ 
+ @defvar path-separator
+ This variable holds a string which says which character separates
+ directories in a search path (as found in an environment variable).  Its
+ value is @code{":"} for Unix and GNU systems, and @code{";"} for MS-DOS
+ and Windows NT.
+ @end defvar
+ 
+ @defvar invocation-name
+ This variable holds the program name under which Emacs was invoked.  The
+ value is a string, and does not include a directory name.
+ @end defvar
+ 
+ @defvar invocation-directory
+ This variable holds the directory from which the Emacs executable was
+ invoked, or perhaps @code{nil} if that directory cannot be determined.
+ @end defvar
+ 
+ @defvar installation-directory
+ If non-@code{nil}, this is a directory within which to look for the
+ @file{lib-src} and @file{etc} subdirectories.  This is non-@code{nil}
+ when Emacs can't find those directories in their standard installed
+ locations, but can find them in a directory related somehow to the one
+ containing the Emacs executable.
+ @end defvar
+ 
+ @defun load-average
+ This function returns the current 1-minute, 5-minute and 15-minute
+ load averages in a list.  The values are integers that are 100 times
+ the system load averages.  (The load averages indicate the number of
+ processes trying to run.)
+ 
+ @example
+ @group
+ (load-average)
+      @result{} (169 48 36)
+ @end group
+ 
+ @group
+ lewis@@rocky[5] % uptime
+  11:55am  up 1 day, 19:37,  3 users,
+  load average: 1.69, 0.48, 0.36
+ @end group
+ @end example
+ @end defun
+ 
+ @defun emacs-pid
+ This function returns the process @sc{id} of the Emacs process.
+ @end defun
+ 
+ @defun setprv privilege-name &optional setp getprv
+ This function sets or resets a VMS privilege.  (It does not exist on
+ Unix.)  The first arg is the privilege name, as a string.  The second
+ argument, @var{setp}, is @code{t} or @code{nil}, indicating whether the
+ privilege is to be turned on or off.  Its default is @code{nil}.  The
+ function returns @code{t} if successful, @code{nil} otherwise.
+ 
+   If the third argument, @var{getprv}, is non-@code{nil}, @code{setprv}
+ does not change the privilege, but returns @code{t} or @code{nil}
+ indicating whether the privilege is currently enabled.
+ @end defun
+ 
+ @node User Identification
+ @section User Identification
+ 
+ @defvar user-mail-address
+ This holds the nominal email address of the user who is using Emacs.
+ When Emacs starts up, it computes a default value that is usually right,
+ but users often set this themselves when the default value is not right.
+ @end defvar
+ 
+ @defun user-login-name &optional uid
+ If you don't specify @var{uid}, this function returns the name under
+ which the user is logged in.  If the environment variable @code{LOGNAME}
+ is set, that value is used.  Otherwise, if the environment variable
+ @code{USER} is set, that value is used.  Otherwise, the value is based
+ on the effective @sc{uid}, not the real @sc{uid}.
+ 
+ If you specify @var{uid}, the value is the user name that corresponds
+ to @var{uid} (which should be an integer).
+ 
+ @example
+ @group
+ (user-login-name)
+      @result{} "lewis"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun user-real-login-name
+ This function returns the user name corresponding to Emacs's real
+ @sc{uid}.  This ignores the effective @sc{uid} and ignores the
+ environment variables @code{LOGNAME} and @code{USER}.
+ @end defun
+ 
+ @defun user-full-name
+ This function returns the full name of the user.
+ 
+ @example
+ @group
+ (user-full-name)
+      @result{} "Bil Lewis"
+ @end group
+ @end example
+ @end defun
+ 
+ @vindex user-full-name
+ @vindex user-real-login-name
+ @vindex user-login-name
+   The symbols @code{user-login-name}, @code{user-real-login-name} and
+ @code{user-full-name} are variables as well as functions.  The functions
+ return the same values that the variables hold.  These variables allow
+ you to ``fake out'' Emacs by telling the functions what to return.  The
+ variables are also useful for constructing frame titles (@pxref{Frame
+ Titles}).
+ 
+ @defun user-real-uid
+ This function returns the real @sc{uid} of the user.
+ 
+ @example
+ @group
+ (user-real-uid)
+      @result{} 19
+ @end group
+ @end example
+ @end defun
+ 
+ @defun user-uid
+ This function returns the effective @sc{uid} of the user.  
+ @end defun
+ 
+ @node Time of Day
+ @section Time of Day
+ 
+   This section explains how to determine the current time and the time
+ zone.
+ 
+ @defun current-time-string &optional time-value
+ This function returns the current time and date as a humanly-readable
+ string.  The format of the string is unvarying; the number of characters
+ used for each part is always the same, so you can reliably use
+ @code{substring} to extract pieces of it.  It is wise to count the
+ characters from the beginning of the string rather than from the end, as
+ additional information may be added at the end.
+ 
+ @c Emacs 19 feature
+ The argument @var{time-value}, if given, specifies a time to format
+ instead of the current time.  The argument should be a list whose first
+ two elements are integers.  Thus, you can use times obtained from
+ @code{current-time} (see below) and from @code{file-attributes}
+ (@pxref{File Attributes}).
+ 
+ @example
+ @group
+ (current-time-string)
+      @result{} "Wed Oct 14 22:21:05 1987"
+ @end group
+ @end example
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun current-time
+ This function returns the system's time value as a list of three
+ integers: @code{(@var{high} @var{low} @var{microsec})}.  The integers
+ @var{high} and @var{low} combine to give the number of seconds since
+ 0:00 January 1, 1970, which is
+ @ifinfo
+ @var{high} * 2**16 + @var{low}.
+ @end ifinfo
+ @tex
+ $high*2^{16}+low$.
+ @end tex
+ 
+ The third element, @var{microsec}, gives the microseconds since the
+ start of the current second (or 0 for systems that return time only on
+ the resolution of a second).
+ 
+ The first two elements can be compared with file time values such as you
+ get with the function @code{file-attributes}.  @xref{File Attributes}.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun current-time-zone &optional time-value
+ This function returns a list describing the time zone that the user is
+ in.
+ 
+ The value has the form @code{(@var{offset} @var{name})}.  Here
+ @var{offset} is an integer giving the number of seconds ahead of UTC
+ (east of Greenwich).  A negative value means west of Greenwich.  The
+ second element, @var{name} is a string giving the name of the time
+ zone.  Both elements change when daylight savings time begins or ends;
+ if the user has specified a time zone that does not use a seasonal time
+ adjustment, then the value is constant through time.
+ 
+ If the operating system doesn't supply all the information necessary to
+ compute the value, both elements of the list are @code{nil}.
+ 
+ The argument @var{time-value}, if given, specifies a time to analyze
+ instead of the current time.  The argument should be a cons cell
+ containing two integers, or a list whose first two elements are
+ integers.  Thus, you can use times obtained from @code{current-time}
+ (see above) and from @code{file-attributes} (@pxref{File Attributes}).
+ @end defun
+ 
+ @node Time Conversion
+ @section Time Conversion
+ 
+   These functions convert time values (lists of two or three integers)
+ to strings or to calendrical information.  There is also a function to
+ convert calendrical information to a time value.  You can get time
+ values from the functions @code{current-time} (@pxref{Time of Day}) and
+ @code{file-attributes} (@pxref{File Attributes}).
+ 
+ @defun format-time-string format-string time
+ This function converts @var{time} to a string according to
+ @var{format-string}.  The argument @var{format-string} may contain
+ @samp{%}-sequences which say to substitute parts of the time.  Here is a
+ table of what the @samp{%}-sequences mean:
+ 
+ @table @samp
+ @item %a
+ This stands for the abbreviated name of the day of week.
+ @item %A
+ This stands for the full name of the day of week.
+ @item %b
+ This stands for the abbreviated name of the month.
+ @item %B
+ This stands for the full name of the month.
+ @item %c
+ This is a synonym for @samp{%x %X}.
+ @item %C
+ This has a locale-specific meaning.  In the default locale (named C), it
+ is equivalent to @samp{%A, %B %e, %Y}.
+ @item %d
+ This stands for the day of month, zero-padded.
+ @item %D
+ This is a synonym for @samp{%m/%d/%y}.
+ @item %e
+ This stands for the day of month, blank-padded.
+ @item %h
+ This is a synonym for @samp{%b}.
+ @item %H
+ This stands for the hour (00-23).
+ @item %I
+ This stands for the hour (00-12).
+ @item %j
+ This stands for the day of the year (001-366).
+ @item %k
+ This stands for the hour (0-23), blank padded.
+ @item %l
+ This stands for the hour (1-12), blank padded.
+ @item %m
+ This stands for the month (01-12).
+ @item %M
+ This stands for the minute (00-59).
+ @item %n
+ This stands for a newline.
+ @item %p
+ This stands for @samp{AM} or @samp{PM}, as appropriate.
+ @item %r
+ This is a synonym for @samp{%I:%M:%S %p}.
+ @item %R
+ This is a synonym for @samp{%H:%M}.
+ @item %S
+ This stands for the seconds (00-60).
+ @item %t
+ This stands for a tab character.
+ @item %T
+ This is a synonym for @samp{%H:%M:%S}.
+ @item %U
+ This stands for the week of the year (01-52), assuming that weeks
+ start on Sunday.
+ @item %w
+ This stands for the numeric day of week (0-6).  Sunday is day 0.
+ @item %W
+ This stands for the week of the year (01-52), assuming that weeks
+ start on Monday.
+ @item %x
+ This has a locale-specific meaning.  In the default locale (named C), it
+ is equivalent to @samp{%D}.
+ @item %X
+ This has a locale-specific meaning.  In the default locale (named C), it
+ is equivalent to @samp{%T}.
+ @item %y
+ This stands for the year without century (00-99).
+ @item %Y
+ This stands for the year with century.
+ @item %Z
+ This stands for the time zone abbreviation.
+ @end table
+ @end defun
+ 
+ @defun decode-time time
+ This function converts a time value into calendrical information.  The
+ return value is a list of nine elements, as follows:
+ 
+ @example
+ (@var{seconds} @var{minutes} @var{hour} @var{day} @var{month} @var{year} @var{dow} @var{dst} @var{zone})
+ @end example
+ 
+ Here is what the elements mean:
+ 
+ @table @var
+ @item sec
+ The number of seconds past the minute, as an integer between 0 and 59.
+ @item minute
+ The number of minutes past the hour, as an integer between 0 and 59.
+ @item hour
+ The hour of the day, as an integer between 0 and 23.
+ @item day
+ The day of the month, as an integer between 1 and 31.
+ @item month
+ The month of the year, as an integer between 1 and 12.
+ @item year
+ The year, an integer typically greater than 1900.
+ @item dow
+ The day of week, as an integer between 0 and 6, where 0 stands for
+ Sunday.
+ @item dst
+ @code{t} if daylight savings time is effect, otherwise @code{nil}.
+ @item zone
+ An integer indicating the time zone, as the number of seconds east of
+ Greenwich.
+ @end table
+ 
+ Note that Common Lisp has different meanings for @var{dow} and
+ @var{zone}.
+ @end defun
+ 
+ @defun encode-time seconds minutes hour day month year &optional zone
+ This function is the inverse of @code{decode-time}.  It converts seven
+ items of calendrical data into a time value.  For the meanings of the
+ arguments, see the table above under @code{decode-time}.
+ 
+ Year numbers less than 100 are treated just like other year numbers.  If
+ you want them to stand for years above 1900, you must alter them yourself
+ before you call @code{encode-time}.
+ 
+ The optional argument @var{zone} defaults to the current time zone and
+ its daylight savings time rules.  If specified, it can be either a list
+ (as you would get from @code{current-time-zone}) or an integer (as you
+ would get from @code{decode-time}).  The specified zone is used without
+ any further alteration for daylight savings time.
+ @end defun
+ 
+ @node Timers
+ @section Timers for Delayed Execution
+ 
+ You can set up a timer to call a function at a specified future time.
+ 
+ @defun run-at-time time repeat function &rest args
+ This function arranges to call @var{function} with arguments @var{args}
+ at time @var{time}.  The argument @var{function} is a function to call
+ later, and @var{args} are the arguments to give it when it is called.
+ The time @var{time} is specified as a string.
+ 
+ Absolute times may be specified in a wide variety of formats; The form
+ @samp{@var{hour}:@var{min}:@var{sec} @var{timezone}
+ @var{month}/@var{day}/@var{year}}, where all fields are numbers, works;
+ the format that @code{current-time-string} returns is also allowed.
+ 
+ To specify a relative time, use numbers followed by units.
+ For example:
+ 
+ @table @samp
+ @item 1 min
+ denotes 1 minute from now.
+ @item 1 min 5 sec
+ denotes 65 seconds from now.
+ @item 1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year
+ denotes exactly 103 months, 123 days, and 10862 seconds from now.
+ @end table
+ 
+ If @var{time} is an integer, that specifies a relative time measured in
+ seconds.
+ 
+ The argument @var{repeat} specifies how often to repeat the call.  If
+ @var{repeat} is @code{nil}, there are no repetitions; @var{function} is
+ called just once, at @var{time}.  If @var{repeat} is an integer, it
+ specifies a repetition period measured in seconds.  In any case, @var{repeat}
+ has no effect on when @emph{first} call takes place---@var{time} specifies
+ that.
+ 
+ The function @code{run-at-time} returns a timer value that identifies
+ the particular scheduled future action.  You can use this value to call
+ @code{cancel-timer}. 
+ @end defun
+ 
+ @defun cancel-timer timer
+ Cancel the requested action for @var{timer}, which should be a value
+ previously returned by @code{run-at-time}.  This cancels the effect of
+ that call to @code{run-at-time}; the arrival of the specified time will
+ not cause anything special to happen.
+ @end defun
+ 
+ @node Terminal Input
+ @section Terminal Input
+ @cindex terminal input
+ 
+   This section describes functions and variables for recording or
+ manipulating terminal input.  See @ref{Display}, for related
+ functions.
+ 
+ @menu
+ * Input Modes::		Options for how input is processed.
+ * Translating Input::   Low level conversion of some characters or events
+ 			  into others.
+ * Recording Input::	Saving histories of recent or all input events.
+ @end menu
+ 
+ @node Input Modes
+ @subsection Input Modes
+ @cindex input modes
+ @cindex terminal input modes
+ 
+ @defun set-input-mode interrupt flow meta quit-char
+ This function sets the mode for reading keyboard input.  If
+ @var{interrupt} is non-null, then Emacs uses input interrupts.  If it is
+ @code{nil}, then it uses @sc{cbreak} mode.  When Emacs communicates
+ directly with X, it ignores this argument and uses interrupts if that is
+ the way it knows how to communicate.
+ 
+ If @var{flow} is non-@code{nil}, then Emacs uses @sc{xon/xoff} (@kbd{C-q},
+ @kbd{C-s}) flow control for output to the terminal.  This has no effect except
+ in @sc{cbreak} mode.  @xref{Flow Control}.
+ 
+ The default setting is system dependent.  Some systems always use
+ @sc{cbreak} mode regardless of what is specified.
+ 
+ @c Emacs 19 feature
+ The argument @var{meta} controls support for input character codes
+ above 127.  If @var{meta} is @code{t}, Emacs converts characters with
+ the 8th bit set into Meta characters.  If @var{meta} is @code{nil},
+ Emacs disregards the 8th bit; this is necessary when the terminal uses
+ it as a parity bit.  If @var{meta} is neither @code{t} nor @code{nil},
+ Emacs uses all 8 bits of input unchanged.  This is good for terminals
+ using European 8-bit character sets.
+ 
+ @c Emacs 19 feature
+ If @var{quit-char} is non-@code{nil}, it specifies the character to
+ use for quitting.  Normally this character is @kbd{C-g}.
+ @xref{Quitting}.
+ @end defun
+ 
+ The @code{current-input-mode} function returns the input mode settings
+ Emacs is currently using.
+ 
+ @c Emacs 19 feature
+ @defun current-input-mode
+ This function returns current mode for reading keyboard input.  It
+ returns a list, corresponding to the arguments of @code{set-input-mode},
+ of the form @code{(@var{interrupt} @var{flow} @var{meta} @var{quit})} in
+ which:
+ @table @var
+ @item interrupt
+ is non-@code{nil} when Emacs is using interrupt-driven input.  If
+ @code{nil}, Emacs is using @sc{cbreak} mode.
+ @item flow
+ is non-@code{nil} if Emacs uses @sc{xon/xoff} (@kbd{C-q}, @kbd{C-s})
+ flow control for output to the terminal.  This value has no effect
+ unless @var{interrupt} is non-@code{nil}.
+ @item meta
+ is @code{t} if Emacs treats the eighth bit of input characters as
+ the meta bit; @code{nil} means Emacs clears the eighth bit of every
+ input character; any other value means Emacs uses all eight bits as the
+ basic character code.
+ @item quit
+ is the character Emacs currently uses for quitting, usually @kbd{C-g}.
+ @end table
+ @end defun
+ 
+ @node Translating Input
+ @subsection Translating Input Events
+ @cindex translating input events
+ 
+   This section describes features for translating input events into other
+ input events before they become part of key sequences.
+ 
+ @c Emacs 19 feature
+ @defvar extra-keyboard-modifiers
+ This variable lets Lisp programs ``press'' the modifier keys on the
+ keyboard.  The value is a bit mask:
+ 
+ @table @asis
+ @item 1
+ The @key{SHIFT} key.
+ @item 2
+ The @key{LOCK} key.
+ @item 4
+ The @key{CTL} key.
+ @item 8
+ The @key{META} key.
+ @end table
+ 
+ Each time the user types a keyboard key, it is altered as if the
+ modifier keys specified in the bit mask were held down.
+ 
+ When using X windows, the program can ``press'' any of the modifier
+ keys in this way.  Otherwise, only the @key{CTL} and @key{META} keys can
+ be virtually pressed.
+ @end defvar
+ 
+ @defvar keyboard-translate-table
+ This variable is the translate table for keyboard characters.  It lets
+ you reshuffle the keys on the keyboard without changing any command
+ bindings.  Its value must be a string or @code{nil}.
+ 
+ If @code{keyboard-translate-table} is a string, then each character read
+ from the keyboard is looked up in this string and the character in the
+ string is used instead.  If the string is of length @var{n}, character codes
+ @var{n} and up are untranslated.
+ 
+ In the example below, we set @code{keyboard-translate-table} to a
+ string of 128 characters.  Then we fill it in to swap the characters
+ @kbd{C-s} and @kbd{C-\} and the characters @kbd{C-q} and @kbd{C-^}.
+ Subsequently, typing @kbd{C-\} has all the usual effects of typing
+ @kbd{C-s}, and vice versa.  (@xref{Flow Control} for more information on
+ this subject.)
+ 
+ @cindex flow control example
+ @example
+ @group
+ (defun evade-flow-control ()
+   "Replace C-s with C-\ and C-q with C-^."
+   (interactive)
+ @end group
+ @group
+   (let ((the-table (make-string 128 0)))
+     (let ((i 0))
+       (while (< i 128)
+         (aset the-table i i)
+         (setq i (1+ i))))
+ @end group
+     ;; @r{Swap @kbd{C-s} and @kbd{C-\}.}
+     (aset the-table ?\034 ?\^s)
+     (aset the-table ?\^s ?\034)
+ @group
+     ;; @r{Swap @kbd{C-q} and @kbd{C-^}.}
+     (aset the-table ?\036 ?\^q)
+     (aset the-table ?\^q ?\036)
+     (setq keyboard-translate-table the-table)))
+ @end group
+ @end example
+ 
+ Note that this translation is the first thing that happens to a
+ character after it is read from the terminal.  Record-keeping features
+ such as @code{recent-keys} and dribble files record the characters after
+ translation.
+ @end defvar
+ 
+ @defun keyboard-translate from to
+ This function modifies @code{keyboard-translate-table} to translate
+ character code @var{from} into character code @var{to}.  It creates
+ or enlarges the translate table if necessary.
+ @end defun
+ 
+ @defvar function-key-map
+ This variable holds a keymap that describes the character sequences
+ sent by function keys on an ordinary character terminal.  This keymap
+ uses the same data structure as other keymaps, but is used differently: it
+ specifies translations to make while reading events.
+ 
+ If @code{function-key-map} ``binds'' a key sequence @var{k} to a vector
+ @var{v}, then when @var{k} appears as a subsequence @emph{anywhere} in a
+ key sequence, it is replaced with the events in @var{v}.
+ 
+ For example, VT100 terminals send @kbd{@key{ESC} O P} when the
+ keypad PF1 key is pressed.  Therefore, we want Emacs to translate
+ that sequence of events into the single event @code{pf1}.  We accomplish
+ this by ``binding'' @kbd{@key{ESC} O P} to @code{[pf1]} in
+ @code{function-key-map}, when using a VT100.
+ 
+ Thus, typing @kbd{C-c @key{PF1}} sends the character sequence @kbd{C-c
+ @key{ESC} O P}; later the function @code{read-key-sequence} translates
+ this back into @kbd{C-c @key{PF1}}, which it returns as the vector
+ @code{[?\C-c pf1]}.
+ 
+ Entries in @code{function-key-map} are ignored if they conflict with
+ bindings made in the minor mode, local, or global keymaps.  The intent
+ is that the character sequences that function keys send should not have
+ command bindings in their own right.
+ 
+ The value of @code{function-key-map} is usually set up automatically
+ according to the terminal's Terminfo or Termcap entry, but sometimes
+ those need help from terminal-specific Lisp files.  Emacs comes with
+ terminal-specific files for many common terminals; their main purpose is
+ to make entries in @code{function-key-map} beyond those that can be
+ deduced from Termcap and Terminfo.  @xref{Terminal-Specific}.
+ 
+ Emacs versions 18 and earlier used totally different means of detecting
+ the character sequences that represent function keys.
+ @end defvar
+ 
+ @defvar key-translation-map
+ This variable is another keymap used just like @code{function-key-map}
+ to translate input events into other events.  It differs from
+ @code{function-key-map} in two ways:
+ 
+ @itemize @bullet
+ @item
+ @code{key-translation-map} goes to work after @code{function-key-map} is
+ finished; it receives the results of translation by
+ @code{function-key-map}.
+ 
+ @item
+ @code{key-translation-map} overrides actual key bindings.
+ @end itemize
+ 
+ The intent of @code{key-translation-map} is for users to map one
+ character set to another, including ordinary characters normally bound
+ to @code{self-insert-command}.
+ @end defvar
+ 
+ @cindex key translation function
+ You can use @code{function-key-map} or @code{key-translation-map} for
+ more than simple aliases, by using a function, instead of a key
+ sequence, as the ``translation'' of a key.  Then this function is called
+ to compute the translation of that key.
+ 
+ The key translation function receives one argument, which is the prompt
+ that was specified in @code{read-key-sequence}---or @code{nil} if the
+ key sequence is being read by the editor command loop.  In most cases
+ you can ignore the prompt value.
+ 
+ If the function reads input itself, it can have the effect of altering
+ the event that follows.  For example, here's how to define @kbd{C-c h}
+ to turn the character that follows into a Hyper character:
+ 
+ @example
+ @group
+ (defun hyperify (prompt)
+   (let ((e (read-event)))
+     (vector (if (numberp e)
+                 (logior (lsh 1 20) e)
+               (if (memq 'hyper (event-modifiers e))
+                   e
+                 (add-event-modifier "H-" e))))))
+ 
+ (defun add-event-modifier (string e)
+   (let ((symbol (if (symbolp e) e (car e))))
+     (setq symbol (intern (concat string
+                                  (symbol-name symbol))))
+ @end group
+ @group
+     (if (symbolp e)
+         symbol
+       (cons symbol (cdr e)))))
+ 
+ (define-key function-key-map "\C-ch" 'hyperify)
+ @end group
+ @end example
+ 
+ @pindex iso-transl
+ @cindex Latin-1 character set (input)
+ @cindex ISO Latin-1 characters (input)
+ The @file{iso-transl} library uses this feature to provide a way of
+ inputting non-ASCII Latin-1 characters.
+ 
+ @node Recording Input
+ @subsection Recording Input
+ 
+ @defun recent-keys
+ This function returns a vector containing the last 100 input events
+ from the keyboard or mouse.  All input events are included, whether or
+ not they were used as parts of key sequences.  Thus, you always get the
+ last 100 inputs, not counting keyboard macros.  (Events from keyboard
+ macros are excluded because they are less interesting for debugging; it
+ should be enough to see the events that invoked the macros.)
+ @end defun
+ 
+ @deffn Command open-dribble-file  filename
+ @cindex dribble file
+ This function opens a @dfn{dribble file} named @var{filename}.  When a
+ dribble file is open, each input event from the keyboard or mouse (but
+ not those from keyboard macros) is written in that file.  A
+ non-character event is expressed using its printed representation
+ surrounded by @samp{<@dots{}>}.
+ 
+ You close the dribble file by calling this function with an argument
+ of @code{nil}.
+ 
+ This function is normally used to record the input necessary to
+ trigger an Emacs bug, for the sake of a bug report.
+ 
+ @example
+ @group
+ (open-dribble-file "~/dribble")
+      @result{} nil
+ @end group
+ @end example
+ @end deffn
+ 
+   See also the @code{open-termscript} function (@pxref{Terminal Output}).
+ 
+ @node Terminal Output
+ @section Terminal Output
+ @cindex terminal output
+ 
+   The terminal output functions send output to the terminal or keep
+ track of output sent to the terminal.  The variable @code{baud-rate}
+ tells you what Emacs thinks is the output speed of the terminal.
+ 
+ @defvar baud-rate
+ This variable's value is the output speed of the terminal, as far as
+ Emacs knows.  Setting this variable does not change the speed of actual
+ data transmission, but the value is used for calculations such as
+ padding.  It also affects decisions about whether to scroll part of the
+ screen or repaint---even when using a window system.  (We designed it
+ this way despite the fact that a window system has no true ``output
+ speed'', to give you a way to tune these decisions.)
+ 
+ The value is measured in baud.
+ @end defvar
+ 
+   If you are running across a network, and different parts of the
+ network work at different baud rates, the value returned by Emacs may be
+ different from the value used by your local terminal.  Some network
+ protocols communicate the local terminal speed to the remote machine, so
+ that Emacs and other programs can get the proper value, but others do
+ not.  If Emacs has the wrong value, it makes decisions that are less
+ than optimal.  To fix the problem, set @code{baud-rate}.
+ 
+ @defun baud-rate
+ This function returns the value of the variable @code{baud-rate}.  In
+ Emacs versions 18 and earlier, this was the only way to find out the
+ terminal speed.
+ @end defun
+ 
+ @defun send-string-to-terminal string
+ This function sends @var{string} to the terminal without alteration.
+ Control characters in @var{string} have terminal-dependent effects.
+ 
+ One use of this function is to define function keys on terminals that
+ have downloadable function key definitions.  For example, this is how on
+ certain terminals to define function key 4 to move forward four
+ characters (by transmitting the characters @kbd{C-u C-f} to the
+ computer):
+ 
+ @example
+ @group
+ (send-string-to-terminal "\eF4\^U\^F")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @deffn Command open-termscript filename
+ @cindex termscript file
+ This function is used to open a @dfn{termscript file} that will record
+ all the characters sent by Emacs to the terminal.  It returns
+ @code{nil}.  Termscript files are useful for investigating problems
+ where Emacs garbles the screen, problems that are due to incorrect
+ Termcap entries or to undesirable settings of terminal options more
+ often than to actual Emacs bugs.  Once you are certain which characters
+ were actually output, you can determine reliably whether they correspond
+ to the Termcap specifications in use.
+ 
+ See also @code{open-dribble-file} in @ref{Terminal Input}.
+ 
+ @example
+ @group
+ (open-termscript "../junk/termscript")
+      @result{} nil
+ @end group
+ @end example
+ @end deffn
+ 
+ @node Special Keysyms
+ @section System-Specific X11 Keysyms
+ 
+ To define system-specific X11 keysyms, set the variable
+ @code{system-key-alist}.
+ 
+ @defvar system-key-alist
+ This variable's value should be an alist with one element for each
+ system-specific keysym.  An element has this form: @code{(@var{code}
+ . @var{symbol})}, where @var{code} is the numeric keysym code (not
+ including the ``vendor specific'' bit, 1 << 28), and @var{symbol} is the
+ name for the function key.
+ 
+ For example @code{(168 . mute-acute)} defines a system-specific key used
+ by HP X servers whose numeric code is (1 << 28) + 168.
+ 
+ It is not a problem if the alist defines keysyms for other X servers, as
+ long as they don't conflict with the ones used by the X server actually
+ in use.
+ 
+ The variable is always local to the current X terminal and cannot be
+ buffer-local.  @xref{Multiple Displays}.
+ @end defvar
+ 
+ @node Flow Control
+ @section Flow Control
+ @cindex flow control characters
+ 
+   This section attempts to answer the question ``Why does Emacs choose
+ to use flow-control characters in its command character set?''  For a
+ second view on this issue, read the comments on flow control in the
+ @file{emacs/INSTALL} file from the distribution; for help with Termcap
+ entries and DEC terminal concentrators, see @file{emacs/etc/TERMS}.
+ 
+ @cindex @kbd{C-s}
+ @cindex @kbd{C-q}
+   At one time, most terminals did not need flow control, and none used
+ @code{C-s} and @kbd{C-q} for flow control.  Therefore, the choice of
+ @kbd{C-s} and @kbd{C-q} as command characters was uncontroversial.
+ Emacs, for economy of keystrokes and portability, used nearly all the
+ @sc{ASCII} control characters, with mnemonic meanings when possible;
+ thus, @kbd{C-s} for search and @kbd{C-q} for quote.
+ 
+   Later, some terminals were introduced which required these characters
+ for flow control.  They were not very good terminals for full-screen
+ editing, so Emacs maintainers did not pay attention.  In later years,
+ flow control with @kbd{C-s} and @kbd{C-q} became widespread among
+ terminals, but by this time it was usually an option.  And the majority
+ of users, who can turn flow control off, were unwilling to switch to
+ less mnemonic key bindings for the sake of flow control.
+ 
+   So which usage is ``right'', Emacs's or that of some terminal and
+ concentrator manufacturers?  This question has no simple answer.
+ 
+   One reason why we are reluctant to cater to the problems caused by
+ @kbd{C-s} and @kbd{C-q} is that they are gratuitous.  There are other
+ techniques (albeit less common in practice) for flow control that
+ preserve transparency of the character stream.  Note also that their use
+ for flow control is not an official standard.  Interestingly, on the
+ model 33 teletype with a paper tape punch (which is very old), @kbd{C-s}
+ and @kbd{C-q} were sent by the computer to turn the punch on and off!
+ 
+   As X servers and other window systems replace character-only
+ terminals, this problem is gradually being cured.  For the mean time,
+ Emacs provides a convenient way of enabling flow control if you want it:
+ call the function @code{enable-flow-control}.
+ 
+ @defun enable-flow-control
+ This function enables use of @kbd{C-s} and @kbd{C-q} for output flow
+ control, and provides the characters @kbd{C-\} and @kbd{C-^} as aliases
+ for them using @code{keyboard-translate-table} (@pxref{Translating Input}).
+ @end defun
+ 
+ You can use the function @code{enable-flow-control-on} in your
+ @file{.emacs} file to enable flow control automatically on certain
+ terminal types.
+ 
+ @defun enable-flow-control-on &rest termtypes
+ This function enables flow control, and the aliases @kbd{C-\} and @kbd{C-^},
+ if the terminal type is one of @var{termtypes}.  For example:
+ 
+ @smallexample
+ (enable-flow-control-on "vt200" "vt300" "vt101" "vt131")
+ @end smallexample
+ @end defun
+ 
+   Here is how @code{enable-flow-control} does its job:
+ 
+ @enumerate
+ @item
+ @cindex @sc{cbreak}
+ It sets @sc{cbreak} mode for terminal input, and tells the operating
+ system to handle flow control, with @code{(set-input-mode nil t)}.
+ 
+ @item
+ It sets up @code{keyboard-translate-table} to translate @kbd{C-\} and
+ @kbd{C-^} into @kbd{C-s} and @kbd{C-q}.  Except at its very
+ lowest level, Emacs never knows that the characters typed were anything
+ but @kbd{C-s} and @kbd{C-q}, so you can in effect type them as @kbd{C-\}
+ and @kbd{C-^} even when they are input for other commands.
+ @xref{Translating Input}.
+ @end enumerate
+ 
+ If the terminal is the source of the flow control characters, then once
+ you enable kernel flow control handling, you probably can make do with
+ less padding than normal for that terminal.  You can reduce the amount
+ of padding by customizing the Termcap entry.  You can also reduce it by
+ setting @code{baud-rate} to a smaller value so that Emacs uses a smaller
+ speed when calculating the padding needed.  @xref{Terminal Output}.
+ 
+ @node Batch Mode
+ @section Batch Mode
+ @cindex batch mode
+ @cindex noninteractive use
+ 
+   The command line option @samp{-batch} causes Emacs to run
+ noninteractively.  In this mode, Emacs does not read commands from the
+ terminal, it does not alter the terminal modes, and it does not expect
+ to be outputting to an erasable screen.  The idea is that you specify
+ Lisp programs to run; when they are finished, Emacs should exit.  The
+ way to specify the programs to run is with @samp{-l @var{file}}, which
+ loads the library named @var{file}, and @samp{-f @var{function}}, which
+ calls @var{function} with no arguments.
+ 
+   Any Lisp program output that would normally go to the echo area,
+ either using @code{message} or using @code{prin1}, etc., with @code{t}
+ as the stream, goes instead to Emacs's standard error descriptor when
+ in batch mode.  Thus, Emacs behaves much like a noninteractive
+ application program.  (The echo area output that Emacs itself normally
+ generates, such as command echoing, is suppressed entirely.)
+ 
+ @defvar noninteractive
+ This variable is non-@code{nil} when Emacs is running in batch mode.
+ @end defvar
Index: emacs/man/elisp-positions.texi
diff -c /dev/null emacs/man/elisp-positions.texi:1.2
*** /dev/null	Fri Aug  2 20:57:24 1996
--- emacs/man/elisp-positions.texi	Thu Aug  1 00:23:22 1996
***************
*** 0 ****
--- 1,897 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/positions
+ @node Positions, Markers, Frames, Top
+ @chapter Positions
+ @cindex position (in buffer)
+ 
+   A @dfn{position} is the index of a character in the text of a buffer.
+ More precisely, a position identifies the place between two characters
+ (or before the first character, or after the last character), so we can
+ speak of the character before or after a given position.  However, we
+ often speak of the character ``at'' a position, meaning the character
+ after that position.
+ 
+   Positions are usually represented as integers starting from 1, but can
+ also be represented as @dfn{markers}---special objects that relocate
+ automatically when text is inserted or deleted so they stay with the
+ surrounding characters.  @xref{Markers}.
+ 
+ @menu
+ * Point::         The special position where editing takes place.
+ * Motion::        Changing point.
+ * Excursions::    Temporary motion and buffer changes.
+ * Narrowing::     Restricting editing to a portion of the buffer.
+ @end menu
+ 
+ @node Point
+ @section Point
+ @cindex point
+ 
+   @dfn{Point} is a special buffer position used by many editing
+ commands, including the self-inserting typed characters and text
+ insertion functions.  Other commands move point through the text
+ to allow editing and insertion at different places.
+ 
+   Like other positions, point designates a place between two characters
+ (or before the first character, or after the last character), rather
+ than a particular character.  Usually terminals display the cursor over
+ the character that immediately follows point; point is actually before
+ the character on which the cursor sits.
+ 
+ @cindex point with narrowing
+   The value of point is a number between 1 and the buffer size plus 1.
+ If narrowing is in effect (@pxref{Narrowing}), then point is constrained
+ to fall within the accessible portion of the buffer (possibly at one end
+ of it).
+ 
+   Each buffer has its own value of point, which is independent of the
+ value of point in other buffers.  Each window also has a value of point,
+ which is independent of the value of point in other windows on the same
+ buffer.  This is why point can have different values in various windows
+ that display the same buffer.  When a buffer appears in only one window,
+ the buffer's point and the window's point normally have the same value,
+ so the distinction is rarely important.  @xref{Window Point}, for more
+ details.
+ 
+ @defun point
+ @cindex current buffer position
+ This function returns the value of point in the current buffer,
+ as an integer.
+ 
+ @need 700
+ @example
+ @group
+ (point)
+      @result{} 175
+ @end group
+ @end example
+ @end defun
+ 
+ @defun point-min
+ This function returns the minimum accessible value of point in the
+ current buffer.  This is normally 1, but if narrowing is in effect, it
+ is the position of the start of the region that you narrowed to.
+ (@xref{Narrowing}.)
+ @end defun
+ 
+ @defun point-max
+ This function returns the maximum accessible value of point in the
+ current buffer.  This is @code{(1+ (buffer-size))}, unless narrowing is
+ in effect, in which case it is the position of the end of the region
+ that you narrowed to.  (@xref{Narrowing}).
+ @end defun
+ 
+ @defun buffer-end flag
+ This function returns @code{(point-min)} if @var{flag} is less than 1,
+ @code{(point-max)} otherwise.  The argument @var{flag} must be a number.
+ @end defun
+ 
+ @defun buffer-size
+ This function returns the total number of characters in the current
+ buffer.  In the absence of any narrowing (@pxref{Narrowing}),
+ @code{point-max} returns a value one larger than this.
+ 
+ @example
+ @group
+ (buffer-size)
+      @result{} 35
+ @end group
+ @group
+ (point-max)
+      @result{} 36
+ @end group
+ @end example
+ @end defun
+ 
+ @node Motion
+ @section Motion
+ 
+   Motion functions change the value of point, either relative to the
+ current value of point, relative to the beginning or end of the buffer,
+ or relative to the edges of the selected window.  @xref{Point}.
+ 
+ @menu
+ * Character Motion::       Moving in terms of characters.
+ * Word Motion::            Moving in terms of words.
+ * Buffer End Motion::      Moving to the beginning or end of the buffer.
+ * Text Lines::             Moving in terms of lines of text.
+ * Screen Lines::           Moving in terms of lines as displayed.
+ * List Motion::            Moving by parsing lists and sexps.
+ * Skipping Characters::    Skipping characters belonging to a certain set.
+ @end menu
+ 
+ @node Character Motion
+ @subsection Motion by Characters
+ 
+   These functions move point based on a count of characters.
+ @code{goto-char} is the fundamental primitive; the other functions use
+ that.
+ 
+ @deffn Command goto-char position
+ This function sets point in the current buffer to the value
+ @var{position}.  If @var{position} is less than 1, it moves point to the
+ beginning of the buffer.  If @var{position} is greater than the length
+ of the buffer, it moves point to the end.
+ 
+ If narrowing is in effect, @var{position} still counts from the
+ beginning of the buffer, but point cannot go outside the accessible
+ portion.  If @var{position} is out of range, @code{goto-char} moves
+ point to the beginning or the end of the accessible portion.
+ 
+ When this function is called interactively, @var{position} is the
+ numeric prefix argument, if provided; otherwise it is read from the
+ minibuffer.
+ 
+ @code{goto-char} returns @var{position}.
+ @end deffn
+ 
+ @deffn Command forward-char &optional count
+ @c @kindex beginning-of-buffer
+ @c @kindex end-of-buffer
+ This function moves point @var{count} characters forward, towards the
+ end of the buffer (or backward, towards the beginning of the buffer, if
+ @var{count} is negative).  If the function attempts to move point past
+ the beginning or end of the buffer (or the limits of the accessible
+ portion, when narrowing is in effect), an error is signaled with error
+ code @code{beginning-of-buffer} or @code{end-of-buffer}.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument.
+ @end deffn
+ 
+ @deffn Command backward-char &optional count
+ This function moves point @var{count} characters backward, towards the
+ beginning of the buffer (or forward, towards the end of the buffer, if
+ @var{count} is negative).  If the function attempts to move point past
+ the beginning or end of the buffer (or the limits of the accessible
+ portion, when narrowing is in effect), an error is signaled with error
+ code @code{beginning-of-buffer} or @code{end-of-buffer}.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument.
+ @end deffn
+ 
+ @node Word Motion
+ @subsection Motion by Words
+ 
+   These functions for parsing words use the syntax table to decide
+ whether a given character is part of a word.  @xref{Syntax Tables}.
+ 
+ @deffn Command forward-word count
+ This function moves point forward @var{count} words (or backward if
+ @var{count} is negative).  Normally it returns @code{t}.  If this motion
+ encounters the beginning or end of the buffer, or the limits of the
+ accessible portion when narrowing is in effect, point stops there
+ and the value is @code{nil}.
+ 
+ In an interactive call, @var{count} is set to the numeric prefix
+ argument.
+ @end deffn
+ 
+ @deffn Command backward-word count
+ This function is just like @code{forward-word}, except that it moves
+ backward until encountering the front of a word, rather than forward.
+ 
+ In an interactive call, @var{count} is set to the numeric prefix
+ argument.
+ 
+ This function is rarely used in programs, as it is more efficient to
+ call @code{forward-word} with a negative argument.
+ @end deffn
+ 
+ @defvar words-include-escapes
+ @c Emacs 19 feature
+ This variable affects the behavior of @code{forward-word} and everything
+ that uses it.  If it is non-@code{nil}, then characters in the
+ ``escape'' and ``character quote'' syntax classes count as part of
+ words.  Otherwise, they do not.
+ @end defvar
+ 
+ @node Buffer End Motion
+ @subsection Motion to an End of the Buffer
+ 
+   To move point to the beginning of the buffer, write:
+ 
+ @example
+ @group
+ (goto-char (point-min))
+ @end group
+ @end example
+ 
+ @noindent
+ Likewise, to move to the end of the buffer, use:
+ 
+ @example
+ @group
+ (goto-char (point-max))
+ @end group
+ @end example
+ 
+   Here are two commands that users use to do these things.  They are
+ documented here to warn you not to use them in Lisp programs, because
+ they set the mark and display messages in the echo area.
+ 
+ @deffn Command beginning-of-buffer &optional n
+ This function moves point to the beginning of the buffer (or the limits
+ of the accessible portion, when narrowing is in effect), setting the
+ mark at the previous position.  If @var{n} is non-@code{nil}, then it
+ puts point @var{n} tenths of the way from the beginning of the buffer.
+ 
+ In an interactive call, @var{n} is the numeric prefix argument,
+ if provided; otherwise @var{n} defaults to @code{nil}.
+ 
+ Don't use this function in Lisp programs!
+ @end deffn
+ 
+ @deffn Command end-of-buffer &optional n
+ This function moves point to the end of the buffer (or the limits of
+ the accessible portion, when narrowing is in effect), setting the mark
+ at the previous position.  If @var{n} is non-@code{nil}, then it puts
+ point @var{n} tenths of the way from the end of the buffer.
+ 
+ In an interactive call, @var{n} is the numeric prefix argument,
+ if provided; otherwise @var{n} defaults to @code{nil}.
+ 
+ Don't use this function in Lisp programs!
+ @end deffn
+ 
+ @node Text Lines
+ @subsection Motion by Text Lines
+ @cindex lines
+ 
+   Text lines are portions of the buffer delimited by newline characters,
+ which are regarded as part of the previous line.  The first text line
+ begins at the beginning of the buffer, and the last text line ends at
+ the end of the buffer whether or not the last character is a newline.
+ The division of the buffer into text lines is not affected by the width
+ of the window, by line continuation in display, or by how tabs and
+ control characters are displayed.
+ 
+ @deffn Command goto-line line
+ This function moves point to the front of the @var{line}th line,
+ counting from line 1 at beginning of the buffer.  If @var{line} is less
+ than 1, it moves point to the beginning of the buffer.  If @var{line} is
+ greater than the number of lines in the buffer, it moves point to the
+ end of the buffer---that is, the @emph{end of the last line} of the
+ buffer.  This is the only case in which @code{goto-line} does not
+ necessarily move to the beginning of a line.
+ 
+ If narrowing is in effect, then @var{line} still counts from the
+ beginning of the buffer, but point cannot go outside the accessible
+ portion.  So @code{goto-line} moves point to the beginning or end of the
+ accessible portion, if the line number specifies an inaccessible
+ position.
+ 
+ The return value of @code{goto-line} is the difference between
+ @var{line} and the line number of the line to which point actually was
+ able to move (in the full buffer, before taking account of narrowing).
+ Thus, the value is positive if the scan encounters the real end of the
+ buffer.  The value is zero if scan encounters the end of the accessible
+ portion but not the real end of the buffer.
+ 
+ In an interactive call, @var{line} is the numeric prefix argument if
+ one has been provided.  Otherwise @var{line} is read in the minibuffer.
+ @end deffn
+ 
+ @deffn Command beginning-of-line &optional count
+ This function moves point to the beginning of the current line.  With an
+ argument @var{count} not @code{nil} or 1, it moves forward
+ @var{count}@minus{}1 lines and then to the beginning of the line.
+ 
+ If this function reaches the end of the buffer (or of the accessible
+ portion, if narrowing is in effect), it positions point there.  No error
+ is signaled.
+ @end deffn
+ 
+ @deffn Command end-of-line &optional count
+ This function moves point to the end of the current line.  With an
+ argument @var{count} not @code{nil} or 1, it moves forward
+ @var{count}@minus{}1 lines and then to the end of the line.
+ 
+ If this function reaches the end of the buffer (or of the accessible
+ portion, if narrowing is in effect), it positions point there.  No error
+ is signaled.
+ @end deffn
+ 
+ @deffn Command forward-line &optional count
+ @cindex beginning of line
+ This function moves point forward @var{count} lines, to the beginning of
+ the line.  If @var{count} is negative, it moves point
+ @minus{}@var{count} lines backward, to the beginning of a line.  If
+ @var{count} is zero, it moves point to the beginning of the current
+ line.
+ 
+ If @code{forward-line} encounters the beginning or end of the buffer (or
+ of the accessible portion) before finding that many lines, it sets point
+ there.  No error is signaled.
+ 
+ @code{forward-line} returns the difference between @var{count} and the
+ number of lines actually moved.  If you attempt to move down five lines
+ from the beginning of a buffer that has only three lines, point stops at
+ the end of the last line, and the value will be 2.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument.
+ @end deffn
+ 
+ @defun count-lines start end
+ @cindex lines in region
+ This function returns the number of lines between the positions
+ @var{start} and @var{end} in the current buffer.  If @var{start} and
+ @var{end} are equal, then it returns 0.  Otherwise it returns at least
+ 1, even if @var{start} and @var{end} are on the same line.  This is
+ because the text between them, considered in isolation, must contain at
+ least one line unless it is empty.
+ 
+ Here is an example of using @code{count-lines}:
+ 
+ @example
+ @group
+ (defun current-line ()
+   "Return the vertical position of point@dots{}"
+   (+ (count-lines (window-start) (point))
+      (if (= (current-column) 0) 1 0)
+      -1))
+ @end group
+ @end example
+ @end defun
+ 
+ @ignore
+ @c ================
+ The @code{previous-line} and @code{next-line} commands are functions
+ that should not be used in programs.  They are for users and are
+ mentioned here only for completeness.
+ 
+ @deffn Command previous-line count
+ @cindex goal column
+ This function moves point up @var{count} lines (down if @var{count}
+ is negative).  In moving, it attempts to keep point in the ``goal column''
+ (normally the same column that it was at the beginning of the move).
+ 
+ If there is no character in the target line exactly under the current
+ column, point is positioned after the character in that line which
+ spans this column, or at the end of the line if it is not long enough.
+ 
+ If it attempts to move beyond the top or bottom of the buffer (or clipped
+ region), then point is positioned in the goal column in the top or
+ bottom line.  No error is signaled.
+ 
+ In an interactive call, @var{count} will be the numeric
+ prefix argument.
+ 
+ The command @code{set-goal-column} can be used to create a semipermanent
+ goal column to which this command always moves.  Then it does not try to
+ move vertically.
+ 
+ If you are thinking of using this in a Lisp program, consider using
+ @code{forward-line} with a negative argument instead.  It is usually easier
+ to use and more reliable (no dependence on goal column, etc.).
+ @end deffn
+ 
+ @deffn Command next-line count
+ This function moves point down @var{count} lines (up if @var{count}
+ is negative).  In moving, it attempts to keep point in the ``goal column''
+ (normally the same column that it was at the beginning of the move).
+ 
+ If there is no character in the target line exactly under the current
+ column, point is positioned after the character in that line which
+ spans this column, or at the end of the line if it is not long enough.
+ 
+ If it attempts to move beyond the top or bottom of the buffer (or clipped
+ region), then point is positioned in the goal column in the top or
+ bottom line.  No error is signaled.
+ 
+ In the case where the @var{count} is 1, and point is on the last
+ line of the buffer (or clipped region), a new empty line is inserted at the
+ end of the buffer (or clipped region) and point moved there.
+ 
+ In an interactive call, @var{count} will be the numeric
+ prefix argument.
+ 
+ The command @code{set-goal-column} can be used to create a semipermanent
+ goal column to which this command always moves.  Then it does not try to
+ move vertically.
+ 
+ If you are thinking of using this in a Lisp program, consider using
+ @code{forward-line} instead.  It is usually easier
+ to use and more reliable (no dependence on goal column, etc.).
+ @end deffn
+ 
+ @c ================
+ @end ignore
+ 
+   Also see the functions @code{bolp} and @code{eolp} in @ref{Near Point}.
+ These functions do not move point, but test whether it is already at the
+ beginning or end of a line.
+ 
+ @node Screen Lines
+ @subsection Motion by Screen Lines
+ 
+   The line functions in the previous section count text lines, delimited
+ only by newline characters.  By contrast, these functions count screen
+ lines, which are defined by the way the text appears on the screen.  A
+ text line is a single screen line if it is short enough to fit the width
+ of the selected window, but otherwise it may occupy several screen
+ lines.
+ 
+   In some cases, text lines are truncated on the screen rather than
+ continued onto additional screen lines.  In these cases,
+ @code{vertical-motion} moves point much like @code{forward-line}.
+ @xref{Truncation}.
+ 
+   Because the width of a given string depends on the flags that control
+ the appearance of certain characters, @code{vertical-motion} behaves
+ differently, for a given piece of text, depending on the buffer it is
+ in, and even on the selected window (because the width, the truncation
+ flag, and display table may vary between windows).  @xref{Usual
+ Display}.
+ 
+   These functions scan text to determine where screen lines break, and
+ thus take time proportional to the distance scanned.  If you intend to
+ use them heavily, Emacs provides caches which may improve the
+ performance of your code.  @xref{Text Lines, cache-long-line-scans}.
+ 
+ 
+ @defun vertical-motion count &optional window
+ This function moves point to the start of the screen line @var{count}
+ screen lines down from the screen line containing point.  If @var{count}
+ is negative, it moves up instead.
+ 
+ @code{vertical-motion} returns the number of lines moved.  The value may
+ be less in absolute value than @var{count} if the beginning or end of
+ the buffer was reached.
+ 
+ The window @var{window} is used for obtaining parameters such as the
+ width, the horizontal scrolling, and the display table.  But
+ @code{vertical-motion} always operates on the current buffer, even if
+ @var{window} currently displays some other buffer.
+ @end defun
+ 
+ @deffn Command move-to-window-line count
+ This function moves point with respect to the text currently displayed
+ in the selected window.  It moves point to the beginning of the screen
+ line @var{count} screen lines from the top of the window.  If
+ @var{count} is negative, that specifies a position
+ @w{@minus{}@var{count}} lines from the bottom (or the last line of the
+ buffer, if the buffer ends above the specified screen position).
+ 
+ If @var{count} is @code{nil}, then point moves to the beginning of the
+ line in the middle of the window.  If the absolute value of @var{count}
+ is greater than the size of the window, then point moves to the place
+ that would appear on that screen line if the window were tall enough.
+ This will probably cause the next redisplay to scroll to bring that
+ location onto the screen.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument.
+ 
+ The value returned is the window line number point has moved to, with
+ the top line in the window numbered 0.
+ @end deffn
+ 
+ @defun compute-motion from frompos to topos width offsets window
+ This function scans the current buffer, calculating screen positions.
+ It scans the buffer forward from position @var{from}, assuming that is
+ at screen coordinates @var{frompos}, to position @var{to} or coordinates
+ @var{topos}, whichever comes first.  It returns the ending buffer
+ position and screen coordinates.
+ 
+ The coordinate arguments @var{frompos} and @var{topos} are cons cells of
+ the form @code{(@var{hpos} . @var{vpos})}.
+ 
+ The argument @var{width} is the number of columns available to display
+ text; this affects handling of continuation lines.  Use the value
+ returned by @code{window-width} for the window of your choice;
+ normally, use @code{(window-width @var{window})}.
+ 
+ The argument @var{offsets} is either @code{nil} or a cons cell of the
+ form @code{(@var{hscroll} . @var{tab-offset})}.  Here @var{hscroll} is
+ the number of columns not being displayed at the left margin; most
+ callers get this from @code{window-hscroll}.  Meanwhile,
+ @var{tab-offset} is the offset between column numbers on the screen and
+ column numbers in the buffer.  This can be nonzero in a continuation
+ line, when the previous screen lines' widths do not add up to a multiple
+ of @code{tab-width}.  It is always zero in a non-continuation line.
+ 
+ The window @var{window} serves only to specify which display table to
+ use.  @code{compute-motion} always operates on the current buffer,
+ regardless of what buffer is displayed in @var{window}.
+ 
+ The return value is a list of five elements:
+ 
+ @example
+ (@var{pos} @var{vpos} @var{hpos} @var{prevhpos} @var{contin})
+ @end example
+ 
+ @noindent
+ Here @var{pos} is the buffer position where the scan stopped, @var{vpos}
+ is the vertical screen position, and @var{hpos} is the horizontal screen
+ position.
+ 
+ The result @var{prevhpos} is the horizontal position one character back
+ from @var{pos}.  The result @var{contin} is @code{t} if the last line
+ was continued after (or within) the previous character.
+ 
+ For example, to find the buffer position of column @var{col} of line
+ @var{line} of a certain window, pass the window's display start location
+ as @var{from} and the window's upper-left coordinates as @var{frompos}.
+ Pass the buffer's @code{(point-max)} as @var{to}, to limit the scan to
+ the end of the accessible portion of the buffer, and pass @var{line} and
+ @var{col} as @var{topos}.  Here's a function that does this:
+ 
+ @example
+ (defun coordinates-of-position (col line)
+   (car (compute-motion (window-start)
+                        '(0 . 0)
+                        (point-max)
+                        (cons col line)
+                        (window-width)
+                        (cons (window-hscroll) 0)
+                        (selected-window))))
+ @end example
+ 
+ When you use @code{compute-motion} for the minibuffer, you need to use
+ @code{minibuffer-prompt-width} to get the horizontal position of the
+ beginning of the first screen line.  @xref{Minibuffer Misc}.
+ @end defun
+ 
+ @node List Motion
+ @comment  node-name,  next,  previous,  up
+ @subsection Moving over Balanced Expressions 
+ @cindex sexp motion
+ @cindex Lisp expression motion
+ @cindex list motion
+ 
+   Here are several functions concerned with balanced-parenthesis
+ expressions (also called @dfn{sexps} in connection with moving across
+ them in Emacs).  The syntax table controls how these functions interpret
+ various characters; see @ref{Syntax Tables}.  @xref{Parsing
+ Expressions}, for lower-level primitives for scanning sexps or parts of
+ sexps.  For user-level commands, see @ref{Lists and Sexps,,, emacs, GNU
+ Emacs Manual}.
+ 
+ @deffn Command forward-list arg
+ This function moves forward across @var{arg} balanced groups of
+ parentheses.  (Other syntactic entities such as words or paired string
+ quotes are ignored.)
+ @end deffn
+ 
+ @deffn Command backward-list arg
+ This function moves backward across @var{arg} balanced groups of
+ parentheses.  (Other syntactic entities such as words or paired string
+ quotes are ignored.)
+ @end deffn
+ 
+ @deffn Command up-list arg
+ This function moves forward out of @var{arg} levels of parentheses.
+ A negative argument means move backward but still to a less deep spot.
+ @end deffn
+ 
+ @deffn Command down-list arg
+ This function moves forward into @var{arg} levels of parentheses.  A
+ negative argument means move backward but still go
+ deeper in parentheses (@minus{}@var{arg} levels).
+ @end deffn
+ 
+ @deffn Command forward-sexp arg
+ This function moves forward across @var{arg} balanced expressions.
+ Balanced expressions include both those delimited by parentheses and
+ other kinds, such as words and string constants.  For example,
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ (concat@point{} "foo " (car x) y z)
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (forward-sexp 3)
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ (concat "foo " (car x) y@point{} z)
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command backward-sexp arg
+ This function moves backward across @var{arg} balanced expressions.
+ @end deffn
+ 
+ @deffn Command beginning-of-defun arg
+ This function moves back to the @var{arg}th beginning of a defun.  If
+ @var{arg} is negative, this actually moves forward, but it still moves
+ to the beginning of a defun, not to the end of one.
+ @end deffn
+ 
+ @deffn Command end-of-defun arg
+ This function moves forward to the @var{arg}th end of a defun.  If
+ @var{arg} is negative, this actually moves backward, but it still moves
+ to the end of a defun, not to the beginning of one.
+ @end deffn
+ 
+ @defopt defun-prompt-regexp
+ If non-@code{nil}, this variable holds a regular expression that
+ specifies what text can appear before the open-parenthesis that starts a
+ defun.  That is to say, a defun begins on a line that starts with a
+ match for this regular expression, followed by a character with
+ open-parenthesis syntax.
+ @end defopt
+ 
+ @node Skipping Characters
+ @comment  node-name,  next,  previous,  up
+ @subsection Skipping Characters
+ @cindex skipping characters
+ 
+   The following two functions move point over a specified set of
+ characters.  For example, they are often used to skip whitespace.  For
+ related functions, see @ref{Motion and Syntax}.
+ 
+ @defun skip-chars-forward character-set &optional limit
+ This function moves point in the current buffer forward, skipping over a
+ given set of characters.  It examines the character following point,
+ then advances point if the character matches @var{character-set}.  This
+ continues until it reaches a character that does not match.  The
+ function returns @code{nil}.
+ 
+ The argument @var{character-set} is like the inside of a
+ @samp{[@dots{}]} in a regular expression except that @samp{]} is never
+ special and @samp{\} quotes @samp{^}, @samp{-} or @samp{\}.  Thus,
+ @code{"a-zA-Z"} skips over all letters, stopping before the first
+ nonletter, and @code{"^a-zA-Z}" skips nonletters stopping before the
+ first letter.  @xref{Regular Expressions}.
+ 
+ If @var{limit} is supplied (it must be a number or a marker), it
+ specifies the maximum position in the buffer that point can be skipped
+ to.  Point will stop at or before @var{limit}.
+ 
+ In the following example, point is initially located directly before the
+ @samp{T}.  After the form is evaluated, point is located at the end of
+ that line (between the @samp{t} of @samp{hat} and the newline).  The
+ function skips all letters and spaces, but not newlines.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ I read "@point{}The cat in the hat
+ comes back" twice.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (skip-chars-forward "a-zA-Z ")
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ I read "The cat in the hat@point{}
+ comes back" twice.
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end defun
+ 
+ @defun skip-chars-backward character-set &optional limit
+ This function moves point backward, skipping characters that match
+ @var{character-set}, until @var{limit}.  It just like
+ @code{skip-chars-forward} except for the direction of motion.
+ @end defun
+ 
+ @node Excursions
+ @section Excursions
+ @cindex excursion
+ 
+   It is often useful to move point ``temporarily'' within a localized
+ portion of the program, or to switch buffers temporarily.  This is
+ called an @dfn{excursion}, and it is done with the @code{save-excursion}
+ special form.  This construct saves the current buffer and its values of
+ point and the mark so they can be restored after the completion of the
+ excursion.
+ 
+   The forms for saving and restoring the configuration of windows are
+ described elsewhere (see @ref{Window Configurations}, and @pxref{Frame
+ Configurations}).
+ 
+ @defspec save-excursion forms@dots{}
+ @cindex mark excursion
+ @cindex point excursion
+ @cindex current buffer excursion
+ The @code{save-excursion} special form saves the identity of the current
+ buffer and the values of point and the mark in it, evaluates
+ @var{forms}, and finally restores the buffer and its saved values of
+ point and the mark.  All three saved values are restored even in case of
+ an abnormal exit via @code{throw} or error (@pxref{Nonlocal Exits}).
+ 
+ The @code{save-excursion} special form is the standard way to switch
+ buffers or move point within one part of a program and avoid affecting
+ the rest of the program.  It is used more than 500 times in the Lisp
+ sources of Emacs.
+ 
+ @code{save-excursion} does not save the values of point and the mark for
+ other buffers, so changes in other buffers remain in effect after
+ @code{save-excursion} exits.
+ 
+ @cindex window excursions
+ Likewise, @code{save-excursion} does not restore window-buffer
+ correspondences altered by functions such as @code{switch-to-buffer}.
+ One way to restore these correspondences, and the selected window, is to
+ use @code{save-window-excursion} inside @code{save-excursion}
+ (@pxref{Window Configurations}).
+ 
+ The value returned by @code{save-excursion} is the result of the last of
+ @var{forms}, or @code{nil} if no @var{forms} are given.
+ 
+ @example
+ @group
+ (save-excursion
+   @var{forms})
+ @equiv{}
+ (let ((old-buf (current-buffer))
+       (old-pnt (point-marker))
+       (old-mark (copy-marker (mark-marker))))
+   (unwind-protect
+       (progn @var{forms})
+     (set-buffer old-buf)
+     (goto-char old-pnt)
+     (set-marker (mark-marker) old-mark)))
+ @end group
+ @end example
+ @end defspec
+ 
+ @node Narrowing
+ @section Narrowing
+ @cindex narrowing
+ @cindex restriction (in a buffer)
+ @cindex accessible portion (of a buffer)
+ 
+   @dfn{Narrowing} means limiting the text addressable by Emacs editing
+ commands to a limited range of characters in a buffer.  The text that
+ remains addressable is called the @dfn{accessible portion} of the
+ buffer.
+ 
+   Narrowing is specified with two buffer positions which become the
+ beginning and end of the accessible portion.  For most editing commands
+ and most Emacs primitives, these positions replace the values of the
+ beginning and end of the buffer.  While narrowing is in effect, no text
+ outside the accessible portion is displayed, and point cannot move
+ outside the accessible portion.
+ 
+   Values such as positions or line numbers, which usually count from the
+ beginning of the buffer, do so despite narrowing, but the functions
+ which use them refuse to operate on text that is inaccessible.
+ 
+   The commands for saving buffers are unaffected by narrowing; they save
+ the entire buffer regardless of any narrowing.
+ 
+ @deffn Command narrow-to-region start end
+ This function sets the accessible portion of the current buffer to start
+ at @var{start} and end at @var{end}.  Both arguments should be character
+ positions.
+ 
+ In an interactive call, @var{start} and @var{end} are set to the bounds
+ of the current region (point and the mark, with the smallest first).
+ @end deffn
+ 
+ @deffn Command narrow-to-page move-count
+ This function sets the accessible portion of the current buffer to
+ include just the current page.  An optional first argument
+ @var{move-count} non-@code{nil} means to move forward or backward by
+ @var{move-count} pages and then narrow.  The variable
+ @code{page-delimiter} specifies where pages start and end
+ (@pxref{Standard Regexps}).
+ 
+ In an interactive call, @var{move-count} is set to the numeric prefix
+ argument.
+ @end deffn
+ 
+ @deffn Command widen
+ @cindex widening
+ This function cancels any narrowing in the current buffer, so that the
+ entire contents are accessible.  This is called @dfn{widening}.
+ It is equivalent to the following expression:
+ 
+ @example
+ (narrow-to-region 1 (1+ (buffer-size)))
+ @end example
+ @end deffn
+ 
+ @defspec save-restriction body@dots{}
+ This special form saves the current bounds of the accessible portion,
+ evaluates the @var{body} forms, and finally restores the saved bounds,
+ thus restoring the same state of narrowing (or absence thereof) formerly
+ in effect.  The state of narrowing is restored even in the event of an
+ abnormal exit via @code{throw} or error (@pxref{Nonlocal Exits}).
+ Therefore, this construct is a clean way to narrow a buffer temporarily.
+ 
+ The value returned by @code{save-restriction} is that returned by the
+ last form in @var{body}, or @code{nil} if no body forms were given.
+ 
+ @c Wordy to avoid overfull hbox.  --rjc 16mar92
+ @strong{Caution:} it is easy to make a mistake when using the
+ @code{save-restriction} construct.  Read the entire description here
+ before you try it.
+ 
+ If @var{body} changes the current buffer, @code{save-restriction} still
+ restores the restrictions on the original buffer (the buffer whose
+ restructions it saved from), but it does not restore the identity of the
+ current buffer.
+ 
+ @code{save-restriction} does @emph{not} restore point and the mark; use
+ @code{save-excursion} for that.  If you use both @code{save-restriction}
+ and @code{save-excursion} together, @code{save-excursion} should come
+ first (on the outside).  Otherwise, the old point value would be
+ restored with temporary narrowing still in effect.  If the old point
+ value were outside the limits of the temporary narrowing, this would
+ fail to restore it accurately.
+ 
+ The @code{save-restriction} special form records the values of the
+ beginning and end of the accessible portion as distances from the
+ beginning and end of the buffer.  In other words, it records the amount
+ of inaccessible text before and after the accessible portion.
+ 
+ This method yields correct results if @var{body} does further narrowing.
+ However, @code{save-restriction} can become confused if the body widens
+ and then make changes outside the range of the saved narrowing.  When
+ this is what you want to do, @code{save-restriction} is not the right
+ tool for the job.  Here is what you must use instead:
+ 
+ @example
+ @group
+ (let ((beg (point-min-marker))
+       (end (point-max-marker)))
+   (unwind-protect
+       (progn @var{body})
+     (save-excursion
+       (set-buffer (marker-buffer beg))
+       (narrow-to-region beg end))))
+ @end group
+ @end example
+ 
+ Here is a simple example of correct use of @code{save-restriction}:
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This is the contents of foo
+ This is the contents of foo
+ This is the contents of foo@point{}
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (save-excursion
+   (save-restriction
+     (goto-char 1)
+     (forward-line 2)
+     (narrow-to-region 1 (point))
+     (goto-char (point-min))
+     (replace-string "foo" "bar")))
+ 
+ ---------- Buffer: foo ----------
+ This is the contents of bar
+ This is the contents of bar
+ This is the contents of foo@point{}
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end defspec
Index: emacs/man/elisp-processes.texi
diff -c /dev/null emacs/man/elisp-processes.texi:1.2
*** /dev/null	Fri Aug  2 20:57:40 1996
--- emacs/man/elisp-processes.texi	Thu Aug  1 00:23:24 1996
***************
*** 0 ****
--- 1,1231 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/processes
+ @node Processes, System Interface, Abbrevs, Top
+ @chapter Processes
+ @cindex child process
+ @cindex parent process
+ @cindex subprocess
+ @cindex process
+ 
+   In the terminology of operating systems, a @dfn{process} is a space in
+ which a program can execute.  Emacs runs in a process.  Emacs Lisp
+ programs can invoke other programs in processes of their own.  These are
+ called @dfn{subprocesses} or @dfn{child processes} of the Emacs process,
+ which is their @dfn{parent process}.
+ 
+   A subprocess of Emacs may be @dfn{synchronous} or @dfn{asynchronous},
+ depending on how it is created.  When you create a synchronous
+ subprocess, the Lisp program waits for the subprocess to terminate
+ before continuing execution.  When you create an asynchronous
+ subprocess, it can run in parallel with the Lisp program.  This kind of
+ subprocess is represented within Emacs by a Lisp object which is also
+ called a ``process''.  Lisp programs can use this object to communicate
+ with the subprocess or to control it.  For example, you can send
+ signals, obtain status information, receive output from the process, or
+ send input to it.
+ 
+ @defun processp object
+ This function returns @code{t} if @var{object} is a process,
+ @code{nil} otherwise.
+ @end defun
+ 
+ @menu
+ * Subprocess Creation::      Functions that start subprocesses.
+ * Synchronous Processes::    Details of using synchronous subprocesses.
+ * MS-DOS Subprocesses::      On MS-DOS, you must indicate text vs binary
+                                 for data sent to and from a subprocess.
+ * Asynchronous Processes::   Starting up an asynchronous subprocess.
+ * Deleting Processes::       Eliminating an asynchronous subprocess.
+ * Process Information::      Accessing run-status and other attributes.
+ * Input to Processes::       Sending input to an asynchronous subprocess.
+ * Signals to Processes::     Stopping, continuing or interrupting
+                                an asynchronous subprocess.
+ * Output from Processes::    Collecting output from an asynchronous subprocess.
+ * Sentinels::                Sentinels run when process run-status changes.
+ * Transaction Queues::	     Transaction-based communication with subprocesses.
+ * Network::                  Opening network connections.
+ @end menu
+ 
+ @node Subprocess Creation
+ @section Functions that Create Subprocesses
+ 
+   There are three functions that create a new subprocess in which to run
+ a program.  One of them, @code{start-process}, creates an asynchronous
+ process and returns a process object (@pxref{Asynchronous Processes}).
+ The other two, @code{call-process} and @code{call-process-region},
+ create a synchronous process and do not return a process object
+ (@pxref{Synchronous Processes}).
+ 
+   Synchronous and asynchronous processes are explained in following
+ sections.  Since the three functions are all called in a similar
+ fashion, their common arguments are described here.
+ 
+ @cindex execute program
+ @cindex @code{PATH} environment variable
+ @cindex @code{HOME} environment variable
+   In all cases, the function's @var{program} argument specifies the
+ program to be run.  An error is signaled if the file is not found or
+ cannot be executed.  If the file name is relative, the variable
+ @code{exec-path} contains a list of directories to search.  Emacs
+ initializes @code{exec-path} when it starts up, based on the value of
+ the environment variable @code{PATH}.  The standard file name
+ constructs, @samp{~}, @samp{.}, and @samp{..}, are interpreted as usual
+ in @code{exec-path}, but environment variable substitutions
+ (@samp{$HOME}, etc.) are not recognized; use
+ @code{substitute-in-file-name} to perform them (@pxref{File Name
+ Expansion}).
+ 
+   Each of the subprocess-creating functions has a @var{buffer-or-name}
+ argument which specifies where the standard output from the program will
+ go.  If @var{buffer-or-name} is @code{nil}, that says to discard the
+ output unless a filter function handles it.  (@xref{Filter Functions},
+ and @ref{Read and Print}.)  Normally, you should avoid having multiple
+ processes send output to the same buffer because their output would be
+ intermixed randomly.
+ 
+ @cindex program arguments
+   All three of the subprocess-creating functions have a @code{&rest}
+ argument, @var{args}.  The @var{args} must all be strings, and they are
+ supplied to @var{program} as separate command line arguments.  Wildcard
+ characters and other shell constructs are not allowed in these strings,
+ since they are passed directly to the specified program.  
+ 
+   @strong{Please note:} The argument @var{program} contains only the
+ name of the program; it may not contain any command-line arguments.  You
+ must use @var{args} to provide those.
+ 
+   The subprocess gets its current directory from the value of
+ @code{default-directory} (@pxref{File Name Expansion}).
+ 
+ @cindex environment variables, subprocesses
+   The subprocess inherits its environment from Emacs; but you can
+ specify overrides for it with @code{process-environment}.  @xref{System
+ Environment}.
+ 
+ @defvar exec-directory 
+ @pindex wakeup
+ The value of this variable is the name of a directory (a string) that
+ contains programs that come with GNU Emacs, that are intended for Emacs
+ to invoke.  The program @code{wakeup} is an example of such a program;
+ the @code{display-time} command uses it to get a reminder once per
+ minute.
+ @end defvar
+ 
+ @defopt exec-path
+ The value of this variable is a list of directories to search for
+ programs to run in subprocesses.  Each element is either the name of a
+ directory (i.e., a string), or @code{nil}, which stands for the default
+ directory (which is the value of @code{default-directory}).
+ @cindex program directories
+ 
+ The value of @code{exec-path} is used by @code{call-process} and
+ @code{start-process} when the @var{program} argument is not an absolute
+ file name.
+ @end defopt
+ 
+ @node Synchronous Processes
+ @section Creating a Synchronous Process
+ @cindex synchronous subprocess
+ 
+   After a @dfn{synchronous process} is created, Emacs waits for the
+ process to terminate before continuing.  Starting Dired is an example of
+ this: it runs @code{ls} in a synchronous process, then modifies the
+ output slightly.  Because the process is synchronous, the entire
+ directory listing arrives in the buffer before Emacs tries to do
+ anything with it.
+ 
+   While Emacs waits for the synchronous subprocess to terminate, the
+ user can quit by typing @kbd{C-g}.  The first @kbd{C-g} tries to kill
+ the subprocess with a @code{SIGINT} signal; but it waits until the
+ subprocess actually terminates before quitting.  If during that time the
+ user types another @kbd{C-g}, that kills the subprocess instantly with
+ @code{SIGKILL} and quits immediately.  @xref{Quitting}.
+ 
+   The synchronous subprocess functions returned @code{nil} in version
+ 18.  In version 19, they return an indication of how the process
+ terminated.
+ 
+ @defun call-process program &optional infile destination display &rest args
+ This function calls @var{program} in a separate process and waits for
+ it to finish.
+ 
+ The standard input for the process comes from file @var{infile} if
+ @var{infile} is not @code{nil} and from @file{/dev/null} otherwise.
+ The argument @var{destination} says where to put the process output.
+ Here are the possibilities:
+ 
+ @table @asis
+ @item a buffer
+ Insert the output in that buffer, before point.  This includes both the
+ standard output stream and the standard error stream of the process.
+ 
+ @item a string
+ Find or create a buffer with that name, then insert
+ the output in that buffer, before point.
+ 
+ @item @code{t}
+ Insert the output in the current buffer, before point.
+ 
+ @item @code{nil}
+ Discard the output.
+ 
+ @item 0
+ Discard the output, and return immediately without waiting
+ for the subprocess to finish.
+ 
+ In this case, the process is not truly synchronous, since it can run in
+ parallel with Emacs; but you can think of it as synchronous in that
+ Emacs is essentially finished with the subprocess as soon as this
+ function returns.
+ 
+ @item (@var{real-destination} @var{error-destination})
+ Keep the standard output stream separate from the standard error stream;
+ deal with the ordinary output as specified by @var{real-destination},
+ and dispose of the error output according to @var{error-destination}.
+ The value @code{nil} means discard it, @code{t} means mix it with the
+ ordinary output, and a string specifies a file name to redirect error
+ output into.
+ 
+ You can't directly specify a buffer to put the error output in; that is
+ too difficult to implement.  But you can achieve this result by sending
+ the error output to a temporary file and then inserting the file into a
+ buffer.
+ @end table
+ 
+ If @var{display} is non-@code{nil}, then @code{call-process} redisplays
+ the buffer as output is inserted.  Otherwise the function does no
+ redisplay, and the results become visible on the screen only when Emacs
+ redisplays that buffer in the normal course of events.
+ 
+ The remaining arguments, @var{args}, are strings that specify command
+ line arguments for the program.
+ 
+ The value returned by @code{call-process} (unless you told it not to
+ wait) indicates the reason for process termination.  A number gives the
+ exit status of the subprocess; 0 means success, and any other value
+ means failure.  If the process terminated with a signal,
+ @code{call-process} returns a string describing the signal.
+ 
+ In the examples below, the buffer @samp{foo} is current.
+ 
+ @smallexample
+ @group
+ (call-process "pwd" nil t)
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ /usr/user/lewis/manual
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
+      @result{} nil
+ 
+ ---------- Buffer: bar ----------
+ lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh
+ 
+ ---------- Buffer: bar ----------
+ @end group
+ @end smallexample
+ 
+ The @code{insert-directory} function contains a good example of the use
+ of @code{call-process}:
+ 
+ @smallexample
+ @group
+ (call-process insert-directory-program nil t nil switches
+               (if full-directory-p
+                   (concat (file-name-as-directory file) ".")
+                 file))
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun call-process-region start end program &optional delete destination display &rest args
+ This function sends the text between @var{start} to @var{end} as
+ standard input to a process running @var{program}.  It deletes the text
+ sent if @var{delete} is non-@code{nil}; this is useful when @var{buffer}
+ is @code{t}, to insert the output in the current buffer.
+ 
+ The arguments @var{destination} and @var{display} control what to do
+ with the output from the subprocess, and whether to update the display
+ as it comes in.  For details, see the description of
+ @code{call-process}, above.  If @var{destination} is the integer 0,
+ @code{call-process-region} discards the output and returns @code{nil}
+ immediately, without waiting for the subprocess to finish.
+ 
+ The remaining arguments, @var{args}, are strings that specify command
+ line arguments for the program.
+ 
+ The return value of @code{call-process-region} is just like that of
+ @code{call-process}: @code{nil} if you told it to return without
+ waiting; otherwise, a number or string which indicates how the
+ subprocess terminated.
+ 
+ In the following example, we use @code{call-process-region} to run the
+ @code{cat} utility, with standard input being the first five characters
+ in buffer @samp{foo} (the word @samp{input}).  @code{cat} copies its
+ standard input into its standard output.  Since the argument
+ @var{destination} is @code{t}, this output is inserted in the current
+ buffer.
+ 
+ @smallexample
+ @group
+ ---------- Buffer: foo ----------
+ input@point{}
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (call-process-region 1 6 "cat" nil t)
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ inputinput@point{}
+ ---------- Buffer: foo ----------
+ @end group
+ @end smallexample
+ 
+   The @code{shell-command-on-region} command uses
+ @code{call-process-region} like this:
+ 
+ @smallexample
+ @group
+ (call-process-region 
+  start end         
+  shell-file-name      ; @r{Name of program.}
+  nil                  ; @r{Do not delete region.}
+  buffer               ; @r{Send output to @code{buffer}.}
+  nil                  ; @r{No redisplay during output.}
+  "-c" command)        ; @r{Arguments for the shell.}
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node MS-DOS Subprocesses
+ @section MS-DOS Subprocesses
+ 
+   On MS-DOS, you must indicate whether the data going to and from
+ a synchronous subprocess are text or binary.  Text data requires
+ translation between the end-of-line convention used within Emacs
+ (a single newline character) and the convention used outside Emacs
+ (the two-character sequence, @sc{crlf}).
+ 
+   The variable @code{binary-process-input} applies to input sent to the
+ subprocess, and @code{binary-process-output} applies to output received
+ from it.  A non-@code{nil} value means the data is non-text; @code{nil}
+ means the data is text, and calls for conversion.
+ 
+ @defvar binary-process-input
+ If this variable is @code{nil}, convert newlines to @sc{crlf} sequences in
+ the input to a synchronous subprocess.
+ @end defvar
+ 
+ @defvar binary-process-output
+ If this variable is @code{nil}, convert @sc{crlf} sequences to newlines in
+ the output from a synchronous subprocess.
+ @end defvar
+ 
+   @xref{Files and MS-DOS}, for related information.
+ 
+ @node Asynchronous Processes
+ @section Creating an Asynchronous Process
+ @cindex asynchronous subprocess
+ 
+   After an @dfn{asynchronous process} is created, Emacs and the Lisp
+ program both continue running immediately.  The process may thereafter
+ run in parallel with Emacs, and the two may communicate with each other
+ using the functions described in following sections.  Here we describe
+ how to create an asynchronous process with @code{start-process}.
+ 
+ @defun start-process name buffer-or-name program &rest args
+ This function creates a new asynchronous subprocess and starts the
+ program @var{program} running in it.  It returns a process object that
+ stands for the new subprocess in Lisp.  The argument @var{name}
+ specifies the name for the process object; if a process with this name
+ already exists, then @var{name} is modified (by adding @samp{<1>}, etc.)
+ to be unique.  The buffer @var{buffer-or-name} is the buffer to
+ associate with the process.
+ 
+ The remaining arguments, @var{args}, are strings that specify command
+ line arguments for the program.
+ 
+ In the example below, the first process is started and runs (rather,
+ sleeps) for 100 seconds.  Meanwhile, the second process is started, and
+ given the name @samp{my-process<1>} for the sake of uniqueness.  It
+ inserts the directory listing at the end of the buffer @samp{foo},
+ before the first process finishes.  Then it finishes, and a message to
+ that effect is inserted in the buffer.  Much later, the first process
+ finishes, and another message is inserted in the buffer for it.
+ 
+ @smallexample
+ @group
+ (start-process "my-process" "foo" "sleep" "100")
+      @result{} #<process my-process>
+ @end group
+ 
+ @group
+ (start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin")
+      @result{} #<process my-process<1>>
+ 
+ ---------- Buffer: foo ----------
+ total 2
+ lrwxrwxrwx  1 lewis     14 Jul 22 10:12 gnuemacs --> /emacs
+ -rwxrwxrwx  1 lewis     19 Jul 30 21:02 lemon
+ 
+ Process my-process<1> finished
+ 
+ Process my-process finished
+ ---------- Buffer: foo ----------
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun start-process-shell-command name buffer-or-name command &rest command-args
+ This function is like @code{start-process} except that it uses a shell
+ to execute the specified command.  The argument @var{command} is a shell
+ command name, and @var{command-args} are the arguments for the shell
+ command.
+ @end defun
+ 
+ @defvar process-connection-type
+ @cindex pipes
+ @cindex @sc{pty}s
+ This variable controls the type of device used to communicate with
+ asynchronous subprocesses.  If it is non-@code{nil}, then @sc{pty}s are
+ used, when available.  Otherwise, pipes are used.
+ 
+ @sc{pty}s are usually preferable for processes visible to the user, as
+ in Shell mode, because they allow job control (@kbd{C-c}, @kbd{C-z},
+ etc.) to work between the process and its children whereas pipes do not.
+ For subprocesses used for internal purposes by programs, it is often
+ better to use a pipe, because they are more efficient.  In addition, the
+ total number of @sc{pty}s is limited on many systems and it is good not
+ to waste them.
+ 
+ The value @code{process-connection-type} is used when
+ @code{start-process} is called.  So you can specify how to communicate
+ with one subprocess by binding the variable around the call to
+ @code{start-process}.
+ 
+ @smallexample
+ @group
+ (let ((process-connection-type nil))  ; @r{Use a pipe.}
+   (start-process @dots{}))
+ @end group
+ @end smallexample
+ 
+ To determine whether a given subprocess actually got a pipe or a
+ @sc{pty}, use the function @code{process-tty-name} (@pxref{Process
+ Information}).
+ @end defvar
+ 
+ @node Deleting Processes
+ @section Deleting Processes
+ @cindex deleting processes
+ 
+   @dfn{Deleting a process} disconnects Emacs immediately from the
+ subprocess, and removes it from the list of active processes.  It sends
+ a signal to the subprocess to make the subprocess terminate, but this is
+ not guaranteed to happen immediately.  The process object itself
+ continues to exist as long as other Lisp objects point to it.
+ 
+   You can delete a process explicitly at any time.  Processes are
+ deleted automatically after they terminate, but not necessarily right
+ away.  If you delete a terminated process explicitly before it is
+ deleted automatically, no harm results.
+ 
+ @defvar delete-exited-processes
+ This variable controls automatic deletion of processes that have
+ terminated (due to calling @code{exit} or to a signal).  If it is
+ @code{nil}, then they continue to exist until the user runs
+ @code{list-processes}.  Otherwise, they are deleted immediately after
+ they exit.
+ @end defvar
+ 
+ @defun delete-process name
+ This function deletes the process associated with @var{name}, killing it
+ with a @code{SIGHUP} signal.  The argument @var{name} may be a process,
+ the name of a process, a buffer, or the name of a buffer.
+ 
+ @smallexample
+ @group
+ (delete-process "*shell*")
+      @result{} nil
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun process-kill-without-query process
+ This function declares that Emacs need not query the user if
+ @var{process} is still running when Emacs is exited.  The process will
+ be deleted silently.  The value is @code{t}.
+ 
+ @smallexample
+ @group
+ (process-kill-without-query (get-process "shell"))
+      @result{} t
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Process Information
+ @section Process Information
+ 
+   Several functions return information about processes.
+ @code{list-processes} is provided for interactive use.
+ 
+ @deffn Command list-processes
+ This command displays a listing of all living processes.  In addition,
+ it finally deletes any process whose status was @samp{Exited} or
+ @samp{Signaled}.  It returns @code{nil}.
+ @end deffn
+ 
+ @defun process-list
+ This function returns a list of all processes that have not been deleted.
+ 
+ @smallexample
+ @group
+ (process-list)
+      @result{} (#<process display-time> #<process shell>)
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun get-process name
+ This function returns the process named @var{name}, or @code{nil} if
+ there is none.  An error is signaled if @var{name} is not a string.
+ 
+ @smallexample
+ @group
+ (get-process "shell")
+      @result{} #<process shell>
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun process-command process
+ This function returns the command that was executed to start
+ @var{process}.  This is a list of strings, the first string being the
+ program executed and the rest of the strings being the arguments that
+ were given to the program.
+ 
+ @smallexample
+ @group
+ (process-command (get-process "shell"))
+      @result{} ("/bin/csh" "-i")
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun process-id process
+ This function returns the @sc{pid} of @var{process}.  This is an
+ integer that distinguishes the process @var{process} from all other
+ processes running on the same computer at the current time.  The
+ @sc{pid} of a process is chosen by the operating system kernel when the
+ process is started and remains constant as long as the process exists.
+ @end defun
+ 
+ @defun process-name process
+ This function returns the name of @var{process}.
+ @end defun
+ 
+ @defun process-status process-name
+ This function returns the status of @var{process-name} as a symbol.
+ The argument @var{process-name} must be a process, a buffer, a
+ process name (string) or a buffer name (string).
+ 
+ The possible values for an actual subprocess are:
+ 
+ @table @code
+ @item run
+ for a process that is running.
+ @item stop
+ for a process that is stopped but continuable.
+ @item exit
+ for a process that has exited.
+ @item signal
+ for a process that has received a fatal signal.
+ @item open
+ for a network connection that is open.
+ @item closed
+ for a network connection that is closed.  Once a connection
+ is closed, you cannot reopen it, though you might be able to open
+ a new connection to the same place.
+ @item nil
+ if @var{process-name} is not the name of an existing process.
+ @end table
+ 
+ @smallexample
+ @group
+ (process-status "shell")
+      @result{} run
+ @end group
+ @group
+ (process-status (get-buffer "*shell*"))
+      @result{} run
+ @end group
+ @group
+ x
+      @result{} #<process xx<1>>
+ (process-status x)
+      @result{} exit
+ @end group
+ @end smallexample
+ 
+ For a network connection, @code{process-status} returns one of the symbols
+ @code{open} or @code{closed}.  The latter means that the other side
+ closed the connection, or Emacs did @code{delete-process}.
+ 
+ In earlier Emacs versions (prior to version 19), the status of a network
+ connection was @code{run} if open, and @code{exit} if closed.
+ @end defun
+ 
+ @defun process-exit-status process
+ This function returns the exit status of @var{process} or the signal
+ number that killed it.  (Use the result of @code{process-status} to
+ determine which of those it is.)  If @var{process} has not yet
+ terminated, the value is 0.
+ @end defun
+ 
+ @defun process-tty-name process
+ This function returns the terminal name that @var{process} is using for
+ its communication with Emacs---or @code{nil} if it is using pipes
+ instead of a terminal (see @code{process-connection-type} in
+ @ref{Asynchronous Processes}).
+ @end defun
+ 
+ @node Input to Processes
+ @section Sending Input to Processes
+ @cindex process input
+ 
+   Asynchronous subprocesses receive input when it is sent to them by
+ Emacs, which is done with the functions in this section.  You must
+ specify the process to send input to, and the input data to send.  The
+ data appears on the ``standard input'' of the subprocess.
+ 
+   Some operating systems have limited space for buffered input in a
+ @sc{pty}.  On these systems, Emacs sends an @sc{eof} periodically amidst
+ the other characters, to force them through.  For most programs,
+ these @sc{eof}s do no harm.
+ 
+ @defun process-send-string process-name string
+ This function sends @var{process-name} the contents of @var{string} as
+ standard input.  The argument @var{process-name} must be a process or
+ the name of a process.  If it is @code{nil}, the current buffer's
+ process is used.
+ 
+   The function returns @code{nil}.
+ 
+ @smallexample
+ @group
+ (process-send-string "shell<1>" "ls\n")
+      @result{} nil
+ @end group
+ 
+ 
+ @group
+ ---------- Buffer: *shell* ----------
+ ...
+ introduction.texi               syntax-tables.texi~
+ introduction.texi~              text.texi
+ introduction.txt                text.texi~
+ ...
+ ---------- Buffer: *shell* ----------
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @deffn Command process-send-region process-name start end
+ This function sends the text in the region defined by @var{start} and
+ @var{end} as standard input to @var{process-name}, which is a process or
+ a process name.  (If it is @code{nil}, the current buffer's process is
+ used.)
+ 
+ An error is signaled unless both @var{start} and @var{end} are
+ integers or markers that indicate positions in the current buffer.  (It
+ is unimportant which number is larger.)
+ @end deffn
+ 
+ @defun process-send-eof &optional process-name
+   This function makes @var{process-name} see an end-of-file in its
+ input.  The @sc{eof} comes after any text already sent to it.
+ 
+   If @var{process-name} is not supplied, or if it is @code{nil}, then
+ this function sends the @sc{eof} to the current buffer's process.  An
+ error is signaled if the current buffer has no process.
+ 
+   The function returns @var{process-name}.
+ 
+ @smallexample
+ @group
+ (process-send-eof "shell")
+      @result{} "shell"
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Signals to Processes
+ @section Sending Signals to Processes
+ @cindex process signals
+ @cindex sending signals
+ @cindex signals
+ 
+   @dfn{Sending a signal} to a subprocess is a way of interrupting its
+ activities.  There are several different signals, each with its own
+ meaning.  The set of signals and their names is defined by the operating
+ system.  For example, the signal @code{SIGINT} means that the user has
+ typed @kbd{C-c}, or that some analogous thing has happened.
+ 
+   Each signal has a standard effect on the subprocess.  Most signals
+ kill the subprocess, but some stop or resume execution instead.  Most
+ signals can optionally be handled by programs; if the program handles
+ the signal, then we can say nothing in general about its effects.
+ 
+   You can send signals explicitly by calling the functions in this
+ section.  Emacs also sends signals automatically at certain times:
+ killing a buffer sends a @code{SIGHUP} signal to all its associated
+ processes; killing Emacs sends a @code{SIGHUP} signal to all remaining
+ processes.  (@code{SIGHUP} is a signal that usually indicates that the
+ user hung up the phone.)
+ 
+   Each of the signal-sending functions takes two optional arguments:
+ @var{process-name} and @var{current-group}.
+ 
+   The argument @var{process-name} must be either a process, the name of
+ one, or @code{nil}.  If it is @code{nil}, the process defaults to the
+ process associated with the current buffer.  An error is signaled if
+ @var{process-name} does not identify a process.
+ 
+   The argument @var{current-group} is a flag that makes a difference
+ when you are running a job-control shell as an Emacs subprocess.  If it
+ is non-@code{nil}, then the signal is sent to the current process-group
+ of the terminal that Emacs uses to communicate with the subprocess.  If
+ the process is a job-control shell, this means the shell's current
+ subjob.  If it is @code{nil}, the signal is sent to the process group of
+ the immediate subprocess of Emacs.  If the subprocess is a job-control
+ shell, this is the shell itself.
+ 
+   The flag @var{current-group} has no effect when a pipe is used to
+ communicate with the subprocess, because the operating system does not
+ support the distinction in the case of pipes.  For the same reason,
+ job-control shells won't work when a pipe is used.  See
+ @code{process-connection-type} in @ref{Asynchronous Processes}.
+ 
+ @defun interrupt-process &optional process-name current-group
+ This function interrupts the process @var{process-name} by sending the
+ signal @code{SIGINT}.  Outside of Emacs, typing the ``interrupt
+ character'' (normally @kbd{C-c} on some systems, and @code{DEL} on
+ others) sends this signal.  When the argument @var{current-group} is
+ non-@code{nil}, you can think of this function as ``typing @kbd{C-c}''
+ on the terminal by which Emacs talks to the subprocess.
+ @end defun
+ 
+ @defun kill-process &optional process-name current-group
+ This function kills the process @var{process-name} by sending the
+ signal @code{SIGKILL}.  This signal kills the subprocess immediately,
+ and cannot be handled by the subprocess.
+ @end defun
+ 
+ @defun quit-process &optional process-name current-group
+ This function sends the signal @code{SIGQUIT} to the process
+ @var{process-name}.  This signal is the one sent by the ``quit
+ character'' (usually @kbd{C-b} or @kbd{C-\}) when you are not inside
+ Emacs.
+ @end defun
+ 
+ @defun stop-process &optional process-name current-group
+ This function stops the process @var{process-name} by sending the
+ signal @code{SIGTSTP}.  Use @code{continue-process} to resume its
+ execution.
+ 
+ On systems with job control, the ``stop character'' (usually @kbd{C-z})
+ sends this signal (outside of Emacs).  When @var{current-group} is
+ non-@code{nil}, you can think of this function as ``typing @kbd{C-z}''
+ on the terminal Emacs uses to communicate with the subprocess.
+ @end defun
+ 
+ @defun continue-process &optional process-name current-group
+ This function resumes execution of the process @var{process} by sending
+ it the signal @code{SIGCONT}.  This presumes that @var{process-name} was
+ stopped previously.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun signal-process pid signal
+ This function sends a signal to process @var{pid}, which need not be
+ a child of Emacs.  The argument @var{signal} specifies which signal
+ to send; it should be an integer.
+ @end defun
+ 
+ @node Output from Processes
+ @section Receiving Output from Processes
+ @cindex process output
+ @cindex output from processes
+ 
+   There are two ways to receive the output that a subprocess writes to
+ its standard output stream.  The output can be inserted in a buffer,
+ which is called the associated buffer of the process, or a function
+ called the @dfn{filter function} can be called to act on the output.  If
+ the process has no buffer and no filter function, its output is
+ discarded.
+ 
+ @menu
+ * Process Buffers::       If no filter, output is put in a buffer.
+ * Filter Functions::      Filter functions accept output from the process.
+ * Accepting Output::      Explicitly permitting subprocess output.
+                             Waiting for subprocess output.
+ @end menu
+ 
+ @node Process Buffers
+ @subsection Process Buffers
+ 
+   A process can (and usually does) have an @dfn{associated buffer},
+ which is an ordinary Emacs buffer that is used for two purposes: storing
+ the output from the process, and deciding when to kill the process.  You
+ can also use the buffer to identify a process to operate on, since in
+ normal practice only one process is associated with any given buffer.
+ Many applications of processes also use the buffer for editing input to
+ be sent to the process, but this is not built into Emacs Lisp.
+ 
+   Unless the process has a filter function (@pxref{Filter Functions}),
+ its output is inserted in the associated buffer.  The position to insert
+ the output is determined by the @code{process-mark}, which is then
+ updated to point to the end of the text just inserted.  Usually, but not
+ always, the @code{process-mark} is at the end of the buffer.
+ 
+ @defun process-buffer process
+ This function returns the associated buffer of the process
+ @var{process}.
+ 
+ @smallexample
+ @group
+ (process-buffer (get-process "shell"))
+      @result{} #<buffer *shell*>
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun process-mark process
+ This function returns the process marker for @var{process}, which is the
+ marker that says where to insert output from the process.
+ 
+ If @var{process} does not have a buffer, @code{process-mark} returns a
+ marker that points nowhere.
+ 
+ Insertion of process output in a buffer uses this marker to decide where
+ to insert, and updates it to point after the inserted text.  That is why
+ successive batches of output are inserted consecutively.
+ 
+ Filter functions normally should use this marker in the same fashion
+ as is done by direct insertion of output in the buffer.  A good
+ example of a filter function that uses @code{process-mark} is found at
+ the end of the following section.
+ 
+ When the user is expected to enter input in the process buffer for
+ transmission to the process, the process marker is useful for
+ distinguishing the new input from previous output.
+ @end defun
+ 
+ @defun set-process-buffer process buffer
+ This function sets the buffer associated with @var{process} to
+ @var{buffer}.  If @var{buffer} is @code{nil}, the process becomes
+ associated with no buffer.
+ @end defun
+ 
+ @defun get-buffer-process buffer-or-name
+ This function returns the process associated with @var{buffer-or-name}.
+ If there are several processes associated with it, then one is chosen.
+ (Presently, the one chosen is the one most recently created.)  It is
+ usually a bad idea to have more than one process associated with the
+ same buffer.
+ 
+ @smallexample
+ @group
+ (get-buffer-process "*shell*")
+      @result{} #<process shell>
+ @end group
+ @end smallexample
+ 
+ Killing the process's buffer deletes the process, which kills the
+ subprocess with a @code{SIGHUP} signal (@pxref{Signals to Processes}).
+ @end defun
+ 
+ @node Filter Functions
+ @subsection Process Filter Functions
+ @cindex filter function
+ @cindex process filter
+ 
+   A process @dfn{filter function} is a function that receives the
+ standard output from the associated process.  If a process has a filter,
+ then @emph{all} output from that process is passed to the filter.  The
+ process buffer is used directly for output from the process only when
+ there is no filter.
+ 
+   A filter function must accept two arguments: the associated process and
+ a string, which is the output.  The function is then free to do whatever it
+ chooses with the output.
+ 
+   A filter function runs only while Emacs is waiting (e.g., for terminal
+ input, or for time to elapse, or for process output).  This avoids the
+ timing errors that could result from running filters at random places in
+ the middle of other Lisp programs.  You may explicitly cause Emacs to
+ wait, so that filter functions will run, by calling @code{sit-for} or
+ @code{sleep-for} (@pxref{Waiting}), or @code{accept-process-output}
+ (@pxref{Accepting Output}).  Emacs is also waiting when the command loop
+ is reading input.
+ 
+   Quitting is normally inhibited within a filter function---otherwise,
+ the effect of typing @kbd{C-g} at command level or to quit a user
+ command would be unpredictable.  If you want to permit quitting inside a
+ filter function, bind @code{inhibit-quit} to @code{nil}.
+ @xref{Quitting}.
+ 
+   If an error happens during execution of a filter function, it is
+ caught automatically, so that it doesn't stop the execution of whatever
+ program was running when the filter function was started.  However, if
+ @code{debug-on-error} is non-@code{nil}, the error-catching is turned
+ off.  This makes it possible to use the Lisp debugger to debug the
+ filter function.  @xref{Debugger}.
+ 
+   Many filter functions sometimes or always insert the text in the
+ process's buffer, mimicking the actions of Emacs when there is no
+ filter.  Such filter functions need to use @code{set-buffer} in order to
+ be sure to insert in that buffer.  To avoid setting the current buffer
+ semipermanently, these filter functions must use @code{unwind-protect}
+ to make sure to restore the previous current buffer.  They should also
+ update the process marker, and in some cases update the value of point.
+ Here is how to do these things:
+ 
+ @smallexample
+ @group
+ (defun ordinary-insertion-filter (proc string)
+   (let ((old-buffer (current-buffer)))
+     (unwind-protect
+         (let (moving)
+           (set-buffer (process-buffer proc))
+           (setq moving (= (point) (process-mark proc)))
+ @end group
+ @group
+           (save-excursion
+             ;; @r{Insert the text, moving the process-marker.}
+             (goto-char (process-mark proc))
+             (insert string)
+             (set-marker (process-mark proc) (point)))
+           (if moving (goto-char (process-mark proc))))
+       (set-buffer old-buffer))))
+ @end group
+ @end smallexample
+ 
+ @noindent
+ The reason to use an explicit @code{unwind-protect} rather than letting
+ @code{save-excursion} restore the current buffer is so as to preserve
+ the change in point made by @code{goto-char}.
+ 
+   To make the filter force the process buffer to be visible whenever new
+ text arrives, insert the following line just before the
+ @code{unwind-protect}:
+ 
+ @smallexample
+ (display-buffer (process-buffer proc))
+ @end smallexample
+ 
+   To force point to move to the end of the new output no matter where
+ it was previously, eliminate the variable @code{moving} and call
+ @code{goto-char} unconditionally.
+ 
+   In earlier Emacs versions, every filter function that did regexp
+ searching or matching had to explicitly save and restore the match data.
+ Now Emacs does this automatically; filter functions never need to do it
+ explicitly.  @xref{Match Data}.
+ 
+   A filter function that writes the output into the buffer of the
+ process should check whether the buffer is still alive.  If it tries to
+ insert into a dead buffer, it will get an error.  If the buffer is dead,
+ @code{(buffer-name (process-buffer @var{process}))} returns @code{nil}.
+ 
+   The output to the function may come in chunks of any size.  A program
+ that produces the same output twice in a row may send it as one batch
+ of 200 characters one time, and five batches of 40 characters the next.
+ 
+ @defun set-process-filter process filter
+ This function gives @var{process} the filter function @var{filter}.  If
+ @var{filter} is @code{nil}, it gives the process no filter.
+ @end defun
+ 
+ @defun process-filter process
+ This function returns the filter function of @var{process}, or @code{nil}
+ if it has none.
+ @end defun
+ 
+   Here is an example of use of a filter function:
+ 
+ @smallexample
+ @group
+ (defun keep-output (process output)
+    (setq kept (cons output kept)))
+      @result{} keep-output
+ @end group
+ @group
+ (setq kept nil)
+      @result{} nil
+ @end group
+ @group
+ (set-process-filter (get-process "shell") 'keep-output)
+      @result{} keep-output
+ @end group
+ @group
+ (process-send-string "shell" "ls ~/other\n")
+      @result{} nil
+ kept
+      @result{} ("lewis@@slug[8] % "
+ @end group
+ @group
+ "FINAL-W87-SHORT.MSS    backup.otl              kolstad.mss~
+ address.txt             backup.psf              kolstad.psf
+ backup.bib~             david.mss               resume-Dec-86.mss~
+ backup.err              david.psf               resume-Dec.psf
+ backup.mss              dland                   syllabus.mss
+ "
+ "#backups.mss#          backup.mss~             kolstad.mss
+ ")
+ @end group
+ @end smallexample
+ 
+ @ignore   @c The code in this example doesn't show the right way to do things.
+ Here is another, more realistic example, which demonstrates how to use
+ the process mark to do insertion in the same fashion as is done when
+ there is no filter function:
+ 
+ @smallexample
+ @group
+ ;; @r{Insert input in the buffer specified by @code{my-shell-buffer}}
+ ;;   @r{and make sure that buffer is shown in some window.}
+ (defun my-process-filter (proc str)
+     (let ((cur (selected-window))
+           (pop-up-windows t))
+       (pop-to-buffer my-shell-buffer)
+ @end group
+ @group
+       (goto-char (point-max))
+       (insert str)
+       (set-marker (process-mark proc) (point-max))
+       (select-window cur)))
+ @end group
+ @end smallexample
+ @end ignore
+ 
+ @node Accepting Output
+ @subsection Accepting Output from Processes
+ 
+   Output from asynchronous subprocesses normally arrives only while
+ Emacs is waiting for some sort of external event, such as elapsed time
+ or terminal input.  Occasionally it is useful in a Lisp program to
+ explicitly permit output to arrive at a specific point, or even to wait
+ until output arrives from a process.
+ 
+ @defun accept-process-output &optional process seconds millisec
+ This function allows Emacs to read pending output from processes.  The
+ output is inserted in the associated buffers or given to their filter
+ functions.  If @var{process} is non-@code{nil} then this function does
+ not return until some output has been received from @var{process}.
+ 
+ @c Emacs 19 feature
+ The arguments @var{seconds} and @var{millisec} let you specify timeout
+ periods.  The former specifies a period measured in seconds and the
+ latter specifies one measured in milliseconds.  The two time periods
+ thus specified are added together, and @code{accept-process-output}
+ returns after that much time whether or not there has been any
+ subprocess output.
+ 
+ The argument @var{seconds} need not be an integer.  If it is a floating
+ point number, this function waits for a fractional number of seconds.
+ Some systems support only a whole number of seconds; on these systems,
+ @var{seconds} is rounded down.  If the system doesn't support waiting
+ fractions of a second, you get an error if you specify nonzero
+ @var{millisec}.
+ 
+ Not all operating systems support waiting periods other than multiples
+ of a second; on those that do not, you get an error if you specify
+ nonzero @var{millisec}.
+ 
+ The function @code{accept-process-output} returns non-@code{nil} if it
+ did get some output, or @code{nil} if the timeout expired before output
+ arrived.
+ @end defun
+ 
+ @node Sentinels
+ @section Sentinels: Detecting Process Status Changes
+ @cindex process sentinel
+ @cindex sentinel
+ 
+   A @dfn{process sentinel} is a function that is called whenever the
+ associated process changes status for any reason, including signals
+ (whether sent by Emacs or caused by the process's own actions) that
+ terminate, stop, or continue the process.  The process sentinel is also
+ called if the process exits.  The sentinel receives two arguments: the
+ process for which the event occurred, and a string describing the type
+ of event.
+ 
+   The string describing the event looks like one of the following:
+ 
+ @itemize @bullet
+ @item 
+ @code{"finished\n"}.
+ 
+ @item
+ @code{"exited abnormally with code @var{exitcode}\n"}.
+ 
+ @item
+ @code{"@var{name-of-signal}\n"}.
+ 
+ @item
+ @code{"@var{name-of-signal} (core dumped)\n"}.
+ @end itemize
+ 
+   A sentinel runs only while Emacs is waiting (e.g., for terminal input,
+ or for time to elapse, or for process output).  This avoids the timing
+ errors that could result from running them at random places in the
+ middle of other Lisp programs.  A program can wait, so that sentinels
+ will run, by calling @code{sit-for} or @code{sleep-for}
+ (@pxref{Waiting}), or @code{accept-process-output} (@pxref{Accepting
+ Output}).  Emacs is also waiting when the command loop is reading input.
+ 
+   Quitting is normally inhibited within a sentinel---otherwise, the
+ effect of typing @kbd{C-g} at command level or to quit a user command
+ would be unpredictable.  If you want to permit quitting inside a
+ sentinel, bind @code{inhibit-quit} to @code{nil}.  @xref{Quitting}.
+ 
+   A sentinel that writes the output into the buffer of the process
+ should check whether the buffer is still alive.  If it tries to insert
+ into a dead buffer, it will get an error.  If the buffer is dead,
+ @code{(buffer-name (process-buffer @var{process}))} returns @code{nil}.
+ 
+   If an error happens during execution of a sentinel, it is caught
+ automatically, so that it doesn't stop the execution of whatever
+ programs was running when the sentinel was started.  However, if
+ @code{debug-on-error} is non-@code{nil}, the error-catching is turned
+ off.  This makes it possible to use the Lisp debugger to debug the
+ sentinel.  @xref{Debugger}.
+ 
+   In earlier Emacs versions, every sentinel that did regexp searching or
+ matching had to explicitly save and restore the match data.  Now Emacs
+ does this automatically; sentinels never need to do it explicitly.
+ @xref{Match Data}.
+ 
+ @defun set-process-sentinel process sentinel
+ This function associates @var{sentinel} with @var{process}.  If
+ @var{sentinel} is @code{nil}, then the process will have no sentinel.
+ The default behavior when there is no sentinel is to insert a message in
+ the process's buffer when the process status changes.
+ 
+ @smallexample
+ @group
+ (defun msg-me (process event)
+    (princ
+      (format "Process: %s had the event `%s'" process event)))
+ (set-process-sentinel (get-process "shell") 'msg-me)
+      @result{} msg-me
+ @end group
+ @group
+ (kill-process (get-process "shell"))
+      @print{} Process: #<process shell> had the event `killed'
+      @result{} #<process shell>
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defun process-sentinel process
+ This function returns the sentinel of @var{process}, or @code{nil} if it
+ has none.
+ @end defun
+ 
+ @defun waiting-for-user-input-p
+ While a sentinel or filter function is running, this function returns
+ non-@code{nil} if Emacs was waiting for keyboard input from the user at
+ the time the sentinel or filter function was called, @code{nil} if it
+ was not.
+ @end defun
+ 
+ @node Transaction Queues
+ @section Transaction Queues
+ @cindex transaction queue
+ 
+ You can use a @dfn{transaction queue} for more convenient communication
+ with subprocesses using transactions.  First use @code{tq-create} to
+ create a transaction queue communicating with a specified process.  Then
+ you can call @code{tq-enqueue} to send a transaction.
+ 
+ @defun tq-create process
+ This function creates and returns a transaction queue communicating with
+ @var{process}.  The argument @var{process} should be a subprocess
+ capable of sending and receiving streams of bytes.  It may be a child
+ process, or it may be a TCP connection to a server, possibly on another
+ machine.
+ @end defun
+ 
+ @defun tq-enqueue queue question regexp closure fn
+ This function sends a transaction to queue @var{queue}.  Specifying the
+ queue has the effect of specifying the subprocess to talk to.
+ 
+ The argument @var{question} is the outgoing message that starts the
+ transaction.  The argument @var{fn} is the function to call when the
+ corresponding answer comes back; it is called with two arguments:
+ @var{closure}, and the answer received.
+ 
+ The argument @var{regexp} is a regular expression that should match the
+ entire answer, but nothing less; that's how @code{tq-enqueue} determines
+ where the answer ends.
+ 
+ The return value of @code{tq-enqueue} itself is not meaningful.
+ @end defun
+ 
+ @defun tq-close queue
+ Shut down transaction queue @var{queue}, waiting for all pending transactions
+ to complete, and then terminate the connection or child process.
+ @end defun
+ 
+ Transaction queues are implemented by means of a filter function.
+ @xref{Filter Functions}.
+ 
+ @node Network
+ @section Network Connections
+ @cindex network connection
+ @cindex TCP
+ 
+   Emacs Lisp programs can open TCP network connections to other processes on
+ the same machine or other machines.  A network connection is handled by Lisp
+ much like a subprocess, and is represented by a process object.
+ However, the process you are communicating with is not a child of the
+ Emacs process, so you can't kill it or send it signals.  All you can do
+ is send and receive data.  @code{delete-process} closes the connection,
+ but does not kill the process at the other end; that process must decide
+ what to do about closure of the connection.
+ 
+   You can distinguish process objects representing network connections
+ from those representing subprocesses with the @code{process-status}
+ function.  It always returns either @code{open} or @code{closed} for a
+ network connection, and it never returns either of those values for a
+ real subprocess.  @xref{Process Information}.
+ 
+ @defun open-network-stream name buffer-or-name host service
+ This function opens a TCP connection for a service to a host.  It
+ returns a process object to represent the connection.
+ 
+ The @var{name} argument specifies the name for the process object.  It
+ is modified as necessary to make it unique.
+ 
+ The @var{buffer-or-name} argument is the buffer to associate with the
+ connection.  Output from the connection is inserted in the buffer,
+ unless you specify a filter function to handle the output.  If
+ @var{buffer-or-name} is @code{nil}, it means that the connection is not
+ associated with any buffer.
+ 
+ The arguments @var{host} and @var{service} specify where to connect to;
+ @var{host} is the host name (a string), and @var{service} is the name of
+ a defined network service (a string) or a port number (an integer).
+ @end defun
Index: emacs/man/elisp-searching.texi
diff -c /dev/null emacs/man/elisp-searching.texi:1.2
*** /dev/null	Fri Aug  2 20:58:04 1996
--- emacs/man/elisp-searching.texi	Thu Aug  1 00:23:26 1996
***************
*** 0 ****
--- 1,1361 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/searching
+ @node Searching and Matching, Syntax Tables, Text, Top
+ @chapter Searching and Matching
+ @cindex searching
+ 
+   GNU Emacs provides two ways to search through a buffer for specified
+ text: exact string searches and regular expression searches.  After a
+ regular expression search, you can examine the @dfn{match data} to
+ determine which text matched the whole regular expression or various
+ portions of it.
+ 
+ @menu
+ * String Search::         Search for an exact match.
+ * Regular Expressions::   Describing classes of strings.
+ * Regexp Search::         Searching for a match for a regexp.
+ * POSIX Regexps::         Searching POSIX-style for the longest match.
+ * Search and Replace::	  Internals of @code{query-replace}.
+ * Match Data::            Finding out which part of the text matched
+                             various parts of a regexp, after regexp search.
+ * Searching and Case::    Case-independent or case-significant searching.
+ * Standard Regexps::      Useful regexps for finding sentences, pages,...
+ @end menu
+ 
+   The @samp{skip-chars@dots{}} functions also perform a kind of searching.
+ @xref{Skipping Characters}.
+ 
+ @node String Search
+ @section Searching for Strings
+ @cindex string search
+ 
+   These are the primitive functions for searching through the text in a
+ buffer.  They are meant for use in programs, but you may call them
+ interactively.  If you do so, they prompt for the search string;
+ @var{limit} and @var{noerror} are set to @code{nil}, and @var{repeat}
+ is set to 1.
+ 
+ @deffn Command search-forward string &optional limit noerror repeat
+   This function searches forward from point for an exact match for
+ @var{string}.  If successful, it sets point to the end of the occurrence
+ found, and returns the new value of point.  If no match is found, the
+ value and side effects depend on @var{noerror} (see below).
+ @c Emacs 19 feature
+ 
+   In the following example, point is initially at the beginning of the
+ line.  Then @code{(search-forward "fox")} moves point after the last
+ letter of @samp{fox}:
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ @point{}The quick brown fox jumped over the lazy dog.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (search-forward "fox")
+      @result{} 20
+ 
+ ---------- Buffer: foo ----------
+ The quick brown fox@point{} jumped over the lazy dog.
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ 
+   The argument @var{limit} specifies the upper bound to the search.  (It
+ must be a position in the current buffer.)  No match extending after
+ that position is accepted.  If @var{limit} is omitted or @code{nil}, it
+ defaults to the end of the accessible portion of the buffer.
+ 
+ @kindex search-failed
+   What happens when the search fails depends on the value of
+ @var{noerror}.  If @var{noerror} is @code{nil}, a @code{search-failed}
+ error is signaled.  If @var{noerror} is @code{t}, @code{search-forward}
+ returns @code{nil} and does nothing.  If @var{noerror} is neither
+ @code{nil} nor @code{t}, then @code{search-forward} moves point to the
+ upper bound and returns @code{nil}.  (It would be more consistent now
+ to return the new position of point in that case, but some programs
+ may depend on a value of @code{nil}.)
+ 
+ If @var{repeat} is supplied (it must be a positive number), then the
+ search is repeated that many times (each time starting at the end of the
+ previous time's match).  If these successive searches succeed, the
+ function succeeds, moving point and returning its new value.  Otherwise
+ the search fails.
+ @end deffn
+ 
+ @deffn Command search-backward string &optional limit noerror repeat
+ This function searches backward from point for @var{string}.  It is
+ just like @code{search-forward} except that it searches backwards and
+ leaves point at the beginning of the match.
+ @end deffn
+ 
+ @deffn Command word-search-forward string &optional limit noerror repeat
+ @cindex word search
+ This function searches forward from point for a ``word'' match for
+ @var{string}.  If it finds a match, it sets point to the end of the
+ match found, and returns the new value of point.
+ @c Emacs 19 feature
+ 
+ Word matching regards @var{string} as a sequence of words, disregarding
+ punctuation that separates them.  It searches the buffer for the same
+ sequence of words.  Each word must be distinct in the buffer (searching
+ for the word @samp{ball} does not match the word @samp{balls}), but the
+ details of punctuation and spacing are ignored (searching for @samp{ball
+ boy} does match @samp{ball.  Boy!}).
+ 
+ In this example, point is initially at the beginning of the buffer; the
+ search leaves it between the @samp{y} and the @samp{!}.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ @point{}He said "Please!  Find
+ the ball boy!"
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (word-search-forward "Please find the ball, boy.")
+      @result{} 35
+ 
+ ---------- Buffer: foo ----------
+ He said "Please!  Find
+ the ball boy@point{}!"
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ 
+ If @var{limit} is non-@code{nil} (it must be a position in the current
+ buffer), then it is the upper bound to the search.  The match found must
+ not extend after that position.
+ 
+ If @var{noerror} is @code{nil}, then @code{word-search-forward} signals
+ an error if the search fails.  If @var{noerror} is @code{t}, then it
+ returns @code{nil} instead of signaling an error.  If @var{noerror} is
+ neither @code{nil} nor @code{t}, it moves point to @var{limit} (or the
+ end of the buffer) and returns @code{nil}.
+ 
+ If @var{repeat} is non-@code{nil}, then the search is repeated that many
+ times.  Point is positioned at the end of the last match.
+ @end deffn
+ 
+ @deffn Command word-search-backward string &optional limit noerror repeat
+ This function searches backward from point for a word match to
+ @var{string}.  This function is just like @code{word-search-forward}
+ except that it searches backward and normally leaves point at the
+ beginning of the match.
+ @end deffn
+ 
+ @node Regular Expressions
+ @section Regular Expressions
+ @cindex regular expression
+ @cindex regexp
+ 
+   A @dfn{regular expression} (@dfn{regexp}, for short) is a pattern that
+ denotes a (possibly infinite) set of strings.  Searching for matches for
+ a regexp is a very powerful operation.  This section explains how to write
+ regexps; the following section says how to search for them.
+ 
+ @menu
+ * Syntax of Regexps::       Rules for writing regular expressions.
+ * Regexp Example::          Illustrates regular expression syntax.
+ @end menu
+ 
+ @node Syntax of Regexps
+ @subsection Syntax of Regular Expressions
+ 
+   Regular expressions have a syntax in which a few characters are
+ special constructs and the rest are @dfn{ordinary}.  An ordinary
+ character is a simple regular expression that matches that character and
+ nothing else.  The special characters are @samp{.}, @samp{*}, @samp{+},
+ @samp{?}, @samp{[}, @samp{]}, @samp{^}, @samp{$}, and @samp{\}; no new
+ special characters will be defined in the future.  Any other character
+ appearing in a regular expression is ordinary, unless a @samp{\}
+ precedes it.
+ 
+ For example, @samp{f} is not a special character, so it is ordinary, and
+ therefore @samp{f} is a regular expression that matches the string
+ @samp{f} and no other string.  (It does @emph{not} match the string
+ @samp{ff}.)  Likewise, @samp{o} is a regular expression that matches
+ only @samp{o}.@refill
+ 
+ Any two regular expressions @var{a} and @var{b} can be concatenated.  The
+ result is a regular expression that matches a string if @var{a} matches
+ some amount of the beginning of that string and @var{b} matches the rest of
+ the string.@refill
+ 
+ As a simple example, we can concatenate the regular expressions @samp{f}
+ and @samp{o} to get the regular expression @samp{fo}, which matches only
+ the string @samp{fo}.  Still trivial.  To do something more powerful, you
+ need to use one of the special characters.  Here is a list of them:
+ 
+ @need 1200
+ @table @kbd
+ @item .@: @r{(Period)}
+ @cindex @samp{.} in regexp
+ is a special character that matches any single character except a newline.
+ Using concatenation, we can make regular expressions like @samp{a.b}, which
+ matches any three-character string that begins with @samp{a} and ends with
+ @samp{b}.@refill
+ 
+ @item *
+ @cindex @samp{*} in regexp
+ is not a construct by itself; it is a suffix operator that means to
+ repeat the preceding regular expression as many times as possible.  In
+ @samp{fo*}, the @samp{*} applies to the @samp{o}, so @samp{fo*} matches
+ one @samp{f} followed by any number of @samp{o}s.  The case of zero
+ @samp{o}s is allowed: @samp{fo*} does match @samp{f}.@refill
+ 
+ @samp{*} always applies to the @emph{smallest} possible preceding
+ expression.  Thus, @samp{fo*} has a repeating @samp{o}, not a
+ repeating @samp{fo}.@refill
+ 
+ The matcher processes a @samp{*} construct by matching, immediately,
+ as many repetitions as can be found.  Then it continues with the rest
+ of the pattern.  If that fails, backtracking occurs, discarding some
+ of the matches of the @samp{*}-modified construct in case that makes
+ it possible to match the rest of the pattern.  For example, in matching
+ @samp{ca*ar} against the string @samp{caaar}, the @samp{a*} first
+ tries to match all three @samp{a}s; but the rest of the pattern is
+ @samp{ar} and there is only @samp{r} left to match, so this try fails.
+ The next alternative is for @samp{a*} to match only two @samp{a}s.
+ With this choice, the rest of the regexp matches successfully.@refill
+ 
+ Nested repetition operators can be extremely slow if they specify
+ backtracking loops.  For example, it could take hours for the regular
+ expression @samp{\(x+y*\)*a} to match the sequence
+ @samp{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz}.  The slowness is because
+ Emacs must try each imaginable way of grouping the 35 @samp{x}'s before
+ concluding that none of them can work.  To make sure your regular
+ expressions run fast, check nested repetitions carefully.
+ 
+ @item +
+ @cindex @samp{+} in regexp
+ is a suffix operator similar to @samp{*} except that the preceding
+ expression must match at least once.  So, for example, @samp{ca+r}
+ matches the strings @samp{car} and @samp{caaaar} but not the string
+ @samp{cr}, whereas @samp{ca*r} matches all three strings.
+ 
+ @item ?
+ @cindex @samp{?} in regexp
+ is a suffix operator similar to @samp{*} except that the preceding
+ expression can match either once or not at all.  For example,
+ @samp{ca?r} matches @samp{car} or @samp{cr}, but does not match anyhing
+ else.
+ 
+ @item [ @dots{} ]
+ @cindex character set (in regexp)
+ @cindex @samp{[} in regexp
+ @cindex @samp{]} in regexp
+ @samp{[} begins a @dfn{character set}, which is terminated by a
+ @samp{]}.  In the simplest case, the characters between the two brackets
+ form the set.  Thus, @samp{[ad]} matches either one @samp{a} or one
+ @samp{d}, and @samp{[ad]*} matches any string composed of just @samp{a}s
+ and @samp{d}s (including the empty string), from which it follows that
+ @samp{c[ad]*r} matches @samp{cr}, @samp{car}, @samp{cdr},
+ @samp{caddaar}, etc.@refill
+ 
+ The usual regular expression special characters are not special inside a
+ character set.  A completely different set of special characters exists
+ inside character sets: @samp{]}, @samp{-} and @samp{^}.@refill
+ 
+ @samp{-} is used for ranges of characters.  To write a range, write two
+ characters with a @samp{-} between them.  Thus, @samp{[a-z]} matches any
+ lower case letter.  Ranges may be intermixed freely with individual
+ characters, as in @samp{[a-z$%.]}, which matches any lower case letter
+ or @samp{$}, @samp{%}, or a period.@refill
+ 
+ To include a @samp{]} in a character set, make it the first character.
+ For example, @samp{[]a]} matches @samp{]} or @samp{a}.  To include a
+ @samp{-}, write @samp{-} as the first character in the set, or put it
+ immediately after a range.  (You can replace one individual character
+ @var{c} with the range @samp{@var{c}-@var{c}} to make a place to put the
+ @samp{-}.)  There is no way to write a set containing just @samp{-} and
+ @samp{]}.
+ 
+ To include @samp{^} in a set, put it anywhere but at the beginning of
+ the set.
+ 
+ @item [^ @dots{} ]
+ @cindex @samp{^} in regexp
+ @samp{[^} begins a @dfn{complement character set}, which matches any
+ character except the ones specified.  Thus, @samp{[^a-z0-9A-Z]}
+ matches all characters @emph{except} letters and digits.@refill
+ 
+ @samp{^} is not special in a character set unless it is the first
+ character.  The character following the @samp{^} is treated as if it
+ were first (thus, @samp{-} and @samp{]} are not special there).
+ 
+ Note that a complement character set can match a newline, unless
+ newline is mentioned as one of the characters not to match.
+ 
+ @item ^
+ @cindex @samp{^} in regexp
+ @cindex beginning of line in regexp
+ is a special character that matches the empty string, but only at the
+ beginning of a line in the text being matched.  Otherwise it fails to
+ match anything.  Thus, @samp{^foo} matches a @samp{foo} that occurs at
+ the beginning of a line.
+ 
+ When matching a string instead of a buffer, @samp{^} matches at the
+ beginning of the string or after a newline character @samp{\n}.
+ 
+ @item $
+ @cindex @samp{$} in regexp
+ is similar to @samp{^} but matches only at the end of a line.  Thus,
+ @samp{x+$} matches a string of one @samp{x} or more at the end of a line.
+ 
+ When matching a string instead of a buffer, @samp{$} matches at the end
+ of the string or before a newline character @samp{\n}.
+ 
+ @item \
+ @cindex @samp{\} in regexp
+ has two functions: it quotes the special characters (including
+ @samp{\}), and it introduces additional special constructs.
+ 
+ Because @samp{\} quotes special characters, @samp{\$} is a regular
+ expression that matches only @samp{$}, and @samp{\[} is a regular
+ expression that matches only @samp{[}, and so on.
+ 
+ Note that @samp{\} also has special meaning in the read syntax of Lisp
+ strings (@pxref{String Type}), and must be quoted with @samp{\}.  For
+ example, the regular expression that matches the @samp{\} character is
+ @samp{\\}.  To write a Lisp string that contains the characters
+ @samp{\\}, Lisp syntax requires you to quote each @samp{\} with another
+ @samp{\}.  Therefore, the read syntax for a regular expression matching
+ @samp{\} is @code{"\\\\"}.@refill
+ @end table
+ 
+ @strong{Please note:} For historical compatibility, special characters
+ are treated as ordinary ones if they are in contexts where their special
+ meanings make no sense.  For example, @samp{*foo} treats @samp{*} as
+ ordinary since there is no preceding expression on which the @samp{*}
+ can act.  It is poor practice to depend on this behavior; quote the
+ special character anyway, regardless of where it appears.@refill
+ 
+ For the most part, @samp{\} followed by any character matches only
+ that character.  However, there are several exceptions: characters
+ that, when preceded by @samp{\}, are special constructs.  Such
+ characters are always ordinary when encountered on their own.  Here
+ is a table of @samp{\} constructs:
+ 
+ @table @kbd
+ @item \|
+ @cindex @samp{|} in regexp
+ @cindex regexp alternative
+ specifies an alternative.
+ Two regular expressions @var{a} and @var{b} with @samp{\|} in
+ between form an expression that matches anything that either @var{a} or
+ @var{b} matches.@refill
+ 
+ Thus, @samp{foo\|bar} matches either @samp{foo} or @samp{bar}
+ but no other string.@refill
+ 
+ @samp{\|} applies to the largest possible surrounding expressions.  Only a
+ surrounding @samp{\( @dots{} \)} grouping can limit the grouping power of
+ @samp{\|}.@refill
+ 
+ Full backtracking capability exists to handle multiple uses of @samp{\|}.
+ 
+ @item \( @dots{} \)
+ @cindex @samp{(} in regexp
+ @cindex @samp{)} in regexp
+ @cindex regexp grouping
+ is a grouping construct that serves three purposes:
+ 
+ @enumerate
+ @item
+ To enclose a set of @samp{\|} alternatives for other operations.
+ Thus, @samp{\(foo\|bar\)x} matches either @samp{foox} or @samp{barx}.
+ 
+ @item
+ To enclose an expression for a suffix operator such as @samp{*} to act
+ on.  Thus, @samp{ba\(na\)*} matches @samp{bananana}, etc., with any
+ (zero or more) number of @samp{na} strings.@refill
+ 
+ @item
+ To record a matched substring for future reference.
+ @end enumerate
+ 
+ This last application is not a consequence of the idea of a
+ parenthetical grouping; it is a separate feature that happens to be
+ assigned as a second meaning to the same @samp{\( @dots{} \)} construct
+ because there is no conflict in practice between the two meanings.
+ Here is an explanation of this feature:
+ 
+ @item \@var{digit}
+ matches the same text that matched the @var{digit}th occurrence of a
+ @samp{\( @dots{} \)} construct.
+ 
+ In other words, after the end of a @samp{\( @dots{} \)} construct.  the
+ matcher remembers the beginning and end of the text matched by that
+ construct.  Then, later on in the regular expression, you can use
+ @samp{\} followed by @var{digit} to match that same text, whatever it
+ may have been.
+ 
+ The strings matching the first nine @samp{\( @dots{} \)} constructs
+ appearing in a regular expression are assigned numbers 1 through 9 in
+ the order that the open parentheses appear in the regular expression.
+ So you can use @samp{\1} through @samp{\9} to refer to the text matched
+ by the corresponding @samp{\( @dots{} \)} constructs.
+ 
+ For example, @samp{\(.*\)\1} matches any newline-free string that is
+ composed of two identical halves.  The @samp{\(.*\)} matches the first
+ half, which may be anything, but the @samp{\1} that follows must match
+ the same exact text.
+ 
+ @item \w
+ @cindex @samp{\w} in regexp
+ matches any word-constituent character.  The editor syntax table
+ determines which characters these are.  @xref{Syntax Tables}.
+ 
+ @item \W
+ @cindex @samp{\W} in regexp
+ matches any character that is not a word constituent.
+ 
+ @item \s@var{code}
+ @cindex @samp{\s} in regexp
+ matches any character whose syntax is @var{code}.  Here @var{code} is a
+ character that represents a syntax code: thus, @samp{w} for word
+ constituent, @samp{-} for whitespace, @samp{(} for open parenthesis,
+ etc.  @xref{Syntax Tables}, for a list of syntax codes and the
+ characters that stand for them.
+ 
+ @item \S@var{code}
+ @cindex @samp{\S} in regexp
+ matches any character whose syntax is not @var{code}.
+ @end table
+ 
+   The following regular expression constructs match the empty string---that is,
+ they don't use up any characters---but whether they match depends on the
+ context.
+ 
+ @table @kbd
+ @item \`
+ @cindex @samp{\`} in regexp
+ matches the empty string, but only at the beginning
+ of the buffer or string being matched against.
+ 
+ @item \'
+ @cindex @samp{\'} in regexp
+ matches the empty string, but only at the end of
+ the buffer or string being matched against.
+ 
+ @item \=
+ @cindex @samp{\=} in regexp
+ matches the empty string, but only at point.
+ (This construct is not defined when matching against a string.)
+ 
+ @item \b
+ @cindex @samp{\b} in regexp
+ matches the empty string, but only at the beginning or
+ end of a word.  Thus, @samp{\bfoo\b} matches any occurrence of
+ @samp{foo} as a separate word.  @samp{\bballs?\b} matches
+ @samp{ball} or @samp{balls} as a separate word.@refill
+ 
+ @item \B
+ @cindex @samp{\B} in regexp
+ matches the empty string, but @emph{not} at the beginning or
+ end of a word.
+ 
+ @item \<
+ @cindex @samp{\<} in regexp
+ matches the empty string, but only at the beginning of a word.
+ 
+ @item \>
+ @cindex @samp{\>} in regexp
+ matches the empty string, but only at the end of a word.
+ @end table
+ 
+ @kindex invalid-regexp
+   Not every string is a valid regular expression.  For example, a string
+ with unbalanced square brackets is invalid (with a few exceptions, such
+ as @samp{[]]}), and so is a string that ends with a single @samp{\}.  If
+ an invalid regular expression is passed to any of the search functions,
+ an @code{invalid-regexp} error is signaled.
+ 
+ @defun regexp-quote string
+ This function returns a regular expression string that matches exactly
+ @var{string} and nothing else.  This allows you to request an exact
+ string match when calling a function that wants a regular expression.
+ 
+ @example
+ @group
+ (regexp-quote "^The cat$")
+      @result{} "\\^The cat\\$"
+ @end group
+ @end example
+ 
+ One use of @code{regexp-quote} is to combine an exact string match with
+ context described as a regular expression.  For example, this searches
+ for the string that is the value of @code{string}, surrounded by
+ whitespace:
+ 
+ @example
+ @group
+ (re-search-forward
+  (concat "\\s-" (regexp-quote string) "\\s-"))
+ @end group
+ @end example
+ @end defun
+ 
+ @node Regexp Example
+ @comment  node-name,  next,  previous,  up
+ @subsection Complex Regexp Example
+ 
+   Here is a complicated regexp, used by Emacs to recognize the end of a
+ sentence together with any whitespace that follows.  It is the value of
+ the variable @code{sentence-end}.  
+ 
+   First, we show the regexp as a string in Lisp syntax to distinguish
+ spaces from tab characters.  The string constant begins and ends with a
+ double-quote.  @samp{\"} stands for a double-quote as part of the
+ string, @samp{\\} for a backslash as part of the string, @samp{\t} for a
+ tab and @samp{\n} for a newline.
+ 
+ @example
+ "[.?!][]\"')@}]*\\($\\| $\\|\t\\|  \\)[ \t\n]*"
+ @end example
+ 
+   In contrast, if you evaluate the variable @code{sentence-end}, you
+ will see the following:
+ 
+ @example
+ @group
+ sentence-end
+ @result{}
+ "[.?!][]\"')@}]*\\($\\| $\\|  \\|  \\)[       
+ ]*"
+ @end group
+ @end example
+ 
+ @noindent
+ In this output, tab and newline appear as themselves.
+ 
+   This regular expression contains four parts in succession and can be
+ deciphered as follows:
+ 
+ @table @code
+ @item [.?!]
+ The first part of the pattern is a character set that matches any one of
+ three characters: period, question mark, and exclamation mark.  The
+ match must begin with one of these three characters.
+ 
+ @item []\"')@}]*
+ The second part of the pattern matches any closing braces and quotation
+ marks, zero or more of them, that may follow the period, question mark
+ or exclamation mark.  The @code{\"} is Lisp syntax for a double-quote in
+ a string.  The @samp{*} at the end indicates that the immediately
+ preceding regular expression (a character set, in this case) may be
+ repeated zero or more times.
+ 
+ @item \\($\\|@ $\\|\t\\|@ @ \\)
+ The third part of the pattern matches the whitespace that follows the
+ end of a sentence: the end of a line, or a tab, or two spaces.  The
+ double backslashes mark the parentheses and vertical bars as regular
+ expression syntax; the parentheses delimit a group and the vertical bars
+ separate alternatives.  The dollar sign is used to match the end of a
+ line.
+ 
+ @item [ \t\n]*
+ Finally, the last part of the pattern matches any additional whitespace
+ beyond the minimum needed to end a sentence.
+ @end table
+ 
+ @node Regexp Search
+ @section Regular Expression Searching
+ @cindex regular expression searching
+ @cindex regexp searching
+ @cindex searching for regexp
+ 
+   In GNU Emacs, you can search for the next match for a regexp either
+ incrementally or not.  For incremental search commands, see @ref{Regexp
+ Search, , Regular Expression Search, emacs, The GNU Emacs Manual}.  Here
+ we describe only the search functions useful in programs.  The principal
+ one is @code{re-search-forward}.
+ 
+ @deffn Command re-search-forward regexp &optional limit noerror repeat
+ This function searches forward in the current buffer for a string of
+ text that is matched by the regular expression @var{regexp}.  The
+ function skips over any amount of text that is not matched by
+ @var{regexp}, and leaves point at the end of the first match found.
+ It returns the new value of point.
+ 
+ If @var{limit} is non-@code{nil} (it must be a position in the current
+ buffer), then it is the upper bound to the search.  No match extending
+ after that position is accepted.
+ 
+ What happens when the search fails depends on the value of
+ @var{noerror}.  If @var{noerror} is @code{nil}, a @code{search-failed}
+ error is signaled.  If @var{noerror} is @code{t},
+ @code{re-search-forward} does nothing and returns @code{nil}.  If
+ @var{noerror} is neither @code{nil} nor @code{t}, then
+ @code{re-search-forward} moves point to @var{limit} (or the end of the
+ buffer) and returns @code{nil}.
+ 
+ If @var{repeat} is supplied (it must be a positive number), then the
+ search is repeated that many times (each time starting at the end of the
+ previous time's match).  If these successive searches succeed, the
+ function succeeds, moving point and returning its new value.  Otherwise
+ the search fails.
+ 
+ In the following example, point is initially before the @samp{T}.
+ Evaluating the search call moves point to the end of that line (between
+ the @samp{t} of @samp{hat} and the newline).
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ I read "@point{}The cat in the hat
+ comes back" twice.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (re-search-forward "[a-z]+" nil t 5)
+      @result{} 27
+ 
+ ---------- Buffer: foo ----------
+ I read "The cat in the hat@point{}
+ comes back" twice.
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command re-search-backward regexp &optional limit noerror repeat
+ This function searches backward in the current buffer for a string of
+ text that is matched by the regular expression @var{regexp}, leaving
+ point at the beginning of the first text found.
+ 
+ This function is analogous to @code{re-search-forward}, but they are not
+ simple mirror images.  @code{re-search-forward} finds the match whose
+ beginning is as close as possible to the starting point.  If
+ @code{re-search-backward} were a perfect mirror image, it would find the
+ match whose end is as close as possible.  However, in fact it finds the
+ match whose beginning is as close as possible.  The reason is that
+ matching a regular expression at a given spot always works from
+ beginning to end, and starts at a specified beginning position.
+ 
+ A true mirror-image of @code{re-search-forward} would require a special
+ feature for matching regexps from end to beginning.  It's not worth the
+ trouble of implementing that.
+ @end deffn
+ 
+ @defun string-match regexp string &optional start
+ This function returns the index of the start of the first match for
+ the regular expression @var{regexp} in @var{string}, or @code{nil} if
+ there is no match.  If @var{start} is non-@code{nil}, the search starts
+ at that index in @var{string}.
+ 
+ For example,
+ 
+ @example
+ @group
+ (string-match
+  "quick" "The quick brown fox jumped quickly.")
+      @result{} 4
+ @end group
+ @group
+ (string-match
+  "quick" "The quick brown fox jumped quickly." 8)
+      @result{} 27
+ @end group
+ @end example
+ 
+ @noindent
+ The index of the first character of the
+ string is 0, the index of the second character is 1, and so on.
+ 
+ After this function returns, the index of the first character beyond
+ the match is available as @code{(match-end 0)}.  @xref{Match Data}.
+ 
+ @example
+ @group
+ (string-match
+  "quick" "The quick brown fox jumped quickly." 8)
+      @result{} 27
+ @end group
+ 
+ @group
+ (match-end 0)
+      @result{} 32
+ @end group
+ @end example
+ @end defun
+ 
+ @defun looking-at regexp
+ This function determines whether the text in the current buffer directly
+ following point matches the regular expression @var{regexp}.  ``Directly
+ following'' means precisely that: the search is ``anchored'' and it can
+ succeed only starting with the first character following point.  The
+ result is @code{t} if so, @code{nil} otherwise.
+ 
+ This function does not move point, but it updates the match data, which
+ you can access using @code{match-beginning} and @code{match-end}.
+ @xref{Match Data}.
+ 
+ In this example, point is located directly before the @samp{T}.  If it
+ were anywhere else, the result would be @code{nil}.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ I read "@point{}The cat in the hat
+ comes back" twice.
+ ---------- Buffer: foo ----------
+ 
+ (looking-at "The cat in the hat$")
+      @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @node POSIX Regexps
+ @section POSIX Regular Expression Searching
+ 
+   The usual regular expression functions do backtracking when necessary
+ to handle the @samp{\|} and repetition constructs, but they continue
+ this only until they find @emph{some} match.  Then they succeed and
+ report the first match found.
+ 
+   This section describes alternative search functions which perform the
+ full backtracking specified by the POSIX standard for regular expression
+ matching.  They continue backtracking until they have tried all
+ possibilities and found all matches, so they can report the longest
+ match, as required by POSIX.  This is much slower, so use these
+ functions only when you really need the longest match.
+ 
+   In Emacs versions prior to 19.29, these functions did not exist, and
+ the functions described above implemented full POSIX backtracking.
+ 
+ @defun posix-search-forward regexp &optional limit noerror repeat
+ This is like @code{re-search-forward} except that it performs the full
+ backtracking specified by the POSIX standard for regular expression
+ matching.
+ @end defun
+ 
+ @defun posix-search-backward regexp &optional limit noerror repeat
+ This is like @code{re-search-backward} except that it performs the full
+ backtracking specified by the POSIX standard for regular expression
+ matching.
+ @end defun
+ 
+ @defun posix-looking-at regexp
+ This is like @code{looking-at} except that it performs the full
+ backtracking specified by the POSIX standard for regular expression
+ matching.
+ @end defun
+ 
+ @defun posix-string-match regexp string &optional start
+ This is like @code{string-match} except that it performs the full
+ backtracking specified by the POSIX standard for regular expression
+ matching.
+ @end defun
+ 
+ @ignore
+ @deffn Command delete-matching-lines regexp
+ This function is identical to @code{delete-non-matching-lines}, save
+ that it deletes what @code{delete-non-matching-lines} keeps.
+ 
+ In the example below, point is located on the first line of text.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ We hold these truths
+ to be self-evident,
+ that all men are created
+ equal, and that they are
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (delete-matching-lines "the")
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ to be self-evident,
+ that all men are created
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command flush-lines regexp
+ This function is the same as @code{delete-matching-lines}.
+ @end deffn
+ 
+ @defun delete-non-matching-lines regexp
+ This function deletes all lines following point which don't
+ contain a match for the regular expression @var{regexp}.
+ @end defun
+ 
+ @deffn Command keep-lines regexp
+ This function is the same as @code{delete-non-matching-lines}.
+ @end deffn
+ 
+ @deffn Command how-many regexp
+ This function counts the number of matches for @var{regexp} there are in
+ the current buffer following point.  It prints this number in
+ the echo area, returning the string printed.
+ @end deffn
+ 
+ @deffn Command count-matches regexp
+ This function is a synonym of @code{how-many}.
+ @end deffn
+ 
+ @deffn Command list-matching-lines regexp nlines
+ This function is a synonym of @code{occur}.
+ Show all lines following point containing a match for @var{regexp}.
+ Display each line with @var{nlines} lines before and after,
+ or @code{-}@var{nlines} before if @var{nlines} is negative.
+ @var{nlines} defaults to @code{list-matching-lines-default-context-lines}.
+ Interactively it is the prefix arg.
+ 
+ The lines are shown in a buffer named @samp{*Occur*}.
+ It serves as a menu to find any of the occurrences in this buffer.
+ @kbd{C-h m} (@code{describe-mode} in that buffer gives help.
+ @end deffn
+ 
+ @defopt list-matching-lines-default-context-lines
+ Default value is 0.
+ Default number of context lines to include around a @code{list-matching-lines}
+ match.  A negative number means to include that many lines before the match.
+ A positive number means to include that many lines both before and after.
+ @end defopt
+ @end ignore
+ 
+ @node Search and Replace
+ @section Search and Replace
+ @cindex replacement
+ 
+ @defun perform-replace from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map
+ This function is the guts of @code{query-replace} and related commands.
+ It searches for occurrences of @var{from-string} and replaces some or
+ all of them.  If @var{query-flag} is @code{nil}, it replaces all
+ occurrences; otherwise, it asks the user what to do about each one.
+ 
+ If @var{regexp-flag} is non-@code{nil}, then @var{from-string} is
+ considered a regular expression; otherwise, it must match literally.  If
+ @var{delimited-flag} is non-@code{nil}, then only replacements
+ surrounded by word boundaries are considered.
+ 
+ The argument @var{replacements} specifies what to replace occurrences
+ with.  If it is a string, that string is used.  It can also be a list of
+ strings, to be used in cyclic order.
+ 
+ If @var{repeat-count} is non-@code{nil}, it should be an integer.  Then
+ it specifies how many times to use each of the strings in the
+ @var{replacements} list before advancing cyclicly to the next one.
+ 
+ Normally, the keymap @code{query-replace-map} defines the possible user
+ responses for queries.  The argument @var{map}, if non-@code{nil}, is a
+ keymap to use instead of @code{query-replace-map}.
+ @end defun
+ 
+ @defvar query-replace-map
+ This variable holds a special keymap that defines the valid user
+ responses for @code{query-replace} and related functions, as well as
+ @code{y-or-n-p} and @code{map-y-or-n-p}.  It is unusual in two ways:
+ 
+ @itemize @bullet
+ @item
+ The ``key bindings'' are not commands, just symbols that are meaningful
+ to the functions that use this map.
+ 
+ @item
+ Prefix keys are not supported; each key binding must be for a single event
+ key sequence.  This is because the functions don't use read key sequence to
+ get the input; instead, they read a single event and look it up ``by hand.''
+ @end itemize
+ @end defvar
+ 
+ Here are the meaningful ``bindings'' for @code{query-replace-map}.
+ Several of them are meaningful only for @code{query-replace} and
+ friends.
+ 
+ @table @code
+ @item act
+ Do take the action being considered---in other words, ``yes.''
+ 
+ @item skip
+ Do not take action for this question---in other words, ``no.''
+ 
+ @item exit
+ Answer this question ``no,'' and give up on the entire series of
+ questions, assuming that the answers will be ``no.''
+ 
+ @item act-and-exit
+ Answer this question ``yes,'' and give up on the entire series of
+ questions, assuming that subsequent answers will be ``no.''
+ 
+ @item act-and-show
+ Answer this question ``yes,'' but show the results---don't advance yet
+ to the next question.
+ 
+ @item automatic
+ Answer this question and all subsequent questions in the series with
+ ``yes,'' without further user interaction.
+ 
+ @item backup
+ Move back to the previous place that a question was asked about.
+ 
+ @item edit
+ Enter a recursive edit to deal with this question---instead of any
+ other action that would normally be taken.
+ 
+ @item delete-and-edit
+ Delete the text being considered, then enter a recursive edit to replace
+ it.
+ 
+ @item recenter
+ Redisplay and center the window, then ask the same question again.
+ 
+ @item quit
+ Perform a quit right away.  Only @code{y-or-n-p} and related functions
+ use this answer.
+ 
+ @item help
+ Display some help, then ask again.
+ @end table
+ 
+ @node Match Data
+ @section The Match Data
+ @cindex match data
+ 
+   Emacs keeps track of the positions of the start and end of segments of
+ text found during a regular expression search.  This means, for example,
+ that you can search for a complex pattern, such as a date in an Rmail
+ message, and then extract parts of the match under control of the
+ pattern.
+ 
+   Because the match data normally describe the most recent search only,
+ you must be careful not to do another search inadvertently between the
+ search you wish to refer back to and the use of the match data.  If you
+ can't avoid another intervening search, you must save and restore the
+ match data around it, to prevent it from being overwritten.
+ 
+ @menu
+ * Simple Match Data::     Accessing single items of match data,
+ 			    such as where a particular subexpression started.
+ * Replacing Match::	  Replacing a substring that was matched.
+ * Entire Match Data::     Accessing the entire match data at once, as a list.
+ * Saving Match Data::     Saving and restoring the match data.
+ @end menu
+ 
+ @node Simple Match Data
+ @subsection Simple Match Data Access
+ 
+   This section explains how to use the match data to find out what was
+ matched by the last search or match operation.
+ 
+   You can ask about the entire matching text, or about a particular
+ parenthetical subexpression of a regular expression.  The @var{count}
+ argument in the functions below specifies which.  If @var{count} is
+ zero, you are asking about the entire match.  If @var{count} is
+ positive, it specifies which subexpression you want.
+ 
+   Recall that the subexpressions of a regular expression are those
+ expressions grouped with escaped parentheses, @samp{\(@dots{}\)}.  The
+ @var{count}th subexpression is found by counting occurrences of
+ @samp{\(} from the beginning of the whole regular expression.  The first
+ subexpression is numbered 1, the second 2, and so on.  Only regular
+ expressions can have subexpressions---after a simple string search, the
+ only information available is about the entire match.
+ 
+ @defun match-string count &optional in-string
+ This function returns, as a string, the text matched in the last search
+ or match operation.  It returns the entire text if @var{count} is zero,
+ or just the portion corresponding to the @var{count}th parenthetical
+ subexpression, if @var{count} is positive.  If @var{count} is out of
+ range, or if that subexpression didn't match anything, the value is
+ @code{nil}.
+ 
+ If the last such operation was done against a string with
+ @code{string-match}, then you should pass the same string as the
+ argument @var{in-string}.  Otherwise, after a buffer search or match,
+ you should omit @var{in-string} or pass @code{nil} for it; but you
+ should make sure that the current buffer when you call
+ @code{match-string} is the one in which you did the searching or
+ matching.
+ @end defun
+ 
+ @defun match-beginning count
+ This function returns the position of the start of text matched by the
+ last regular expression searched for, or a subexpression of it.
+ 
+ If @var{count} is zero, then the value is the position of the start of
+ the entire match.  Otherwise, @var{count} specifies a subexpression in
+ the regular expresion, and the value of the function is the starting
+ position of the match for that subexpression.
+ 
+ The value is @code{nil} for a subexpression inside a @samp{\|}
+ alternative that wasn't used in the match.
+ @end defun
+ 
+ @defun match-end count
+ This function is like @code{match-beginning} except that it returns the
+ position of the end of the match, rather than the position of the
+ beginning.
+ @end defun
+ 
+   Here is an example of using the match data, with a comment showing the
+ positions within the text:
+ 
+ @example
+ @group
+ (string-match "\\(qu\\)\\(ick\\)"
+               "The quick fox jumped quickly.")
+               ;0123456789      
+      @result{} 4
+ @end group
+ 
+ @group
+ (match-string 0 "The quick fox jumped quickly.")
+      @result{} "quick"
+ (match-string 1 "The quick fox jumped quickly.")
+      @result{} "qu"
+ (match-string 2 "The quick fox jumped quickly.")
+      @result{} "ick"
+ @end group
+ 
+ @group
+ (match-beginning 1)       ; @r{The beginning of the match}
+      @result{} 4                 ;   @r{with @samp{qu} is at index 4.}
+ @end group
+ 
+ @group
+ (match-beginning 2)       ; @r{The beginning of the match}
+      @result{} 6                 ;   @r{with @samp{ick} is at index 6.}
+ @end group
+ 
+ @group
+ (match-end 1)             ; @r{The end of the match}
+      @result{} 6                 ;   @r{with @samp{qu} is at index 6.}
+ 
+ (match-end 2)             ; @r{The end of the match}
+      @result{} 9                 ;   @r{with @samp{ick} is at index 9.}
+ @end group
+ @end example
+ 
+   Here is another example.  Point is initially located at the beginning
+ of the line.  Searching moves point to between the space and the word
+ @samp{in}.  The beginning of the entire match is at the 9th character of
+ the buffer (@samp{T}), and the beginning of the match for the first
+ subexpression is at the 13th character (@samp{c}).
+ 
+ @example
+ @group
+ (list
+   (re-search-forward "The \\(cat \\)")
+   (match-beginning 0)
+   (match-beginning 1))
+     @result{} (9 9 13)
+ @end group
+ 
+ @group
+ ---------- Buffer: foo ----------
+ I read "The cat @point{}in the hat comes back" twice.
+         ^   ^
+         9  13
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ 
+ @noindent
+ (In this case, the index returned is a buffer position; the first
+ character of the buffer counts as 1.)
+ 
+ @node Replacing Match
+ @subsection Replacing the Text That Matched
+ 
+   This function replaces the text matched by the last search with
+ @var{replacement}.
+ 
+ @cindex case in replacements
+ @defun replace-match replacement &optional fixedcase literal string
+ This function replaces the text in the buffer (or in @var{string}) that
+ was matched by the last search.  It replaces that text with
+ @var{replacement}.
+ 
+ If you did the last search in a buffer, you should specify @code{nil}
+ for @var{string}.  Then @code{replace-match} does the replacement by
+ editing the buffer; it leaves point at the end of the replacement text,
+ and returns @code{t}.
+ 
+ If you did the search in a string, pass the same string as @var{string}.
+ Then @code{replace-match} does the replacement by constructing and
+ returning a new string.
+ 
+ If @var{fixedcase} is non-@code{nil}, then the case of the replacement
+ text is not changed; otherwise, the replacement text is converted to a
+ different case depending upon the capitalization of the text to be
+ replaced.  If the original text is all upper case, the replacement text
+ is converted to upper case.  If the first word of the original text is
+ capitalized, then the first word of the replacement text is capitalized.
+ If the original text contains just one word, and that word is a capital
+ letter, @code{replace-match} considers this a capitalized first word
+ rather than all upper case.
+ 
+ If @code{case-replace} is @code{nil}, then case conversion is not done,
+ regardless of the value of @var{fixed-case}.  @xref{Searching and Case}.
+ 
+ If @var{literal} is non-@code{nil}, then @var{replacement} is inserted
+ exactly as it is, the only alterations being case changes as needed.
+ If it is @code{nil} (the default), then the character @samp{\} is treated
+ specially.  If a @samp{\} appears in @var{replacement}, then it must be
+ part of one of the following sequences:
+ 
+ @table @asis
+ @item @samp{\&}
+ @cindex @samp{&} in replacement
+ @samp{\&} stands for the entire text being replaced.
+ 
+ @item @samp{\@var{n}}
+ @cindex @samp{\@var{n}} in replacement
+ @samp{\@var{n}}, where @var{n} is a digit, stands for the text that
+ matched the @var{n}th subexpression in the original regexp.
+ Subexpressions are those expressions grouped inside @samp{\(@dots{}\)}.
+ 
+ @item @samp{\\}
+ @cindex @samp{\} in replacement
+ @samp{\\} stands for a single @samp{\} in the replacement text.
+ @end table
+ @end defun
+ 
+ @node Entire Match Data
+ @subsection Accessing the Entire Match Data
+ 
+   The functions @code{match-data} and @code{set-match-data} read or
+ write the entire match data, all at once.
+ 
+ @defun match-data
+ This function returns a newly constructed list containing all the
+ information on what text the last search matched.  Element zero is the
+ position of the beginning of the match for the whole expression; element
+ one is the position of the end of the match for the expression.  The
+ next two elements are the positions of the beginning and end of the
+ match for the first subexpression, and so on.  In general, element
+ @ifinfo
+ number 2@var{n}
+ @end ifinfo
+ @tex
+ number {\mathsurround=0pt $2n$}
+ @end tex
+ corresponds to @code{(match-beginning @var{n})}; and
+ element
+ @ifinfo
+ number 2@var{n} + 1
+ @end ifinfo
+ @tex
+ number {\mathsurround=0pt $2n+1$}
+ @end tex
+ corresponds to @code{(match-end @var{n})}.
+ 
+ All the elements are markers or @code{nil} if matching was done on a
+ buffer, and all are integers or @code{nil} if matching was done on a
+ string with @code{string-match}.  (In Emacs 18 and earlier versions,
+ markers were used even for matching on a string, except in the case
+ of the integer 0.)
+ 
+ As always, there must be no possibility of intervening searches between
+ the call to a search function and the call to @code{match-data} that is
+ intended to access the match data for that search.
+ 
+ @example
+ @group
+ (match-data)
+      @result{}  (#<marker at 9 in foo>
+           #<marker at 17 in foo>
+           #<marker at 13 in foo>
+           #<marker at 17 in foo>)
+ @end group
+ @end example
+ @end defun
+ 
+ @defun set-match-data match-list
+ This function sets the match data from the elements of @var{match-list},
+ which should be a list that was the value of a previous call to
+ @code{match-data}.
+ 
+ If @var{match-list} refers to a buffer that doesn't exist, you don't get
+ an error; that sets the match data in a meaningless but harmless way.
+ 
+ @findex store-match-data
+ @code{store-match-data} is an alias for @code{set-match-data}.
+ @end defun
+ 
+ @node Saving Match Data
+ @subsection Saving and Restoring the Match Data
+ 
+   When you call a function that may do a search, you may need to save
+ and restore the match data around that call, if you want to preserve the
+ match data from an earlier search for later use.  Here is an example
+ that shows the problem that arises if you fail to save the match data:
+ 
+ @example
+ @group
+ (re-search-forward "The \\(cat \\)")
+      @result{} 48
+ (foo)                   ; @r{Perhaps @code{foo} does}
+                         ;   @r{more searching.}
+ (match-end 0)
+      @result{} 61              ; @r{Unexpected result---not 48!}
+ @end group
+ @end example
+ 
+   You can save and restore the match data with @code{save-match-data}:
+ 
+ @defmac save-match-data body@dots{}
+ This special form executes @var{body}, saving and restoring the match
+ data around it.
+ @end defmac
+ 
+   You can use @code{set-match-data} together with @code{match-data} to
+ imitate the effect of the special form @code{save-match-data}.  This is
+ useful for writing code that can run in Emacs 18.  Here is how:
+ 
+ @example
+ @group
+ (let ((data (match-data)))
+   (unwind-protect
+       @dots{}   ; @r{May change the original match data.}
+     (set-match-data data)))
+ @end group
+ @end example
+ 
+   Emacs automatically saves and restores the match data when it runs
+ process filter functions (@pxref{Filter Functions}) and process
+ sentinels (@pxref{Sentinels}).
+ 
+ @ignore
+   Here is a function which restores the match data provided the buffer
+ associated with it still exists.
+ 
+ @smallexample
+ @group
+ (defun restore-match-data (data)
+ @c It is incorrect to split the first line of a doc string.
+ @c If there's a problem here, it should be solved in some other way.
+   "Restore the match data DATA unless the buffer is missing."
+   (catch 'foo
+     (let ((d data))
+ @end group
+       (while d
+         (and (car d)
+              (null (marker-buffer (car d)))
+ @group
+              ;; @file{match-data} @r{buffer is deleted.}
+              (throw 'foo nil))
+         (setq d (cdr d)))
+       (set-match-data data))))
+ @end group
+ @end smallexample
+ @end ignore
+ 
+ @node Searching and Case
+ @section Searching and Case
+ @cindex searching and case
+ 
+   By default, searches in Emacs ignore the case of the text they are
+ searching through; if you specify searching for @samp{FOO}, then
+ @samp{Foo} or @samp{foo} is also considered a match.  Regexps, and in
+ particular character sets, are included: thus, @samp{[aB]} would match
+ @samp{a} or @samp{A} or @samp{b} or @samp{B}.
+ 
+   If you do not want this feature, set the variable
+ @code{case-fold-search} to @code{nil}.  Then all letters must match
+ exactly, including case.  This is a buffer-local variable; altering the
+ variable affects only the current buffer.  (@xref{Intro to
+ Buffer-Local}.)  Alternatively, you may change the value of
+ @code{default-case-fold-search}, which is the default value of
+ @code{case-fold-search} for buffers that do not override it.
+ 
+   Note that the user-level incremental search feature handles case
+ distinctions differently.  When given a lower case letter, it looks for
+ a match of either case, but when given an upper case letter, it looks
+ for an upper case letter only.  But this has nothing to do with the
+ searching functions Lisp functions use.
+ 
+ @defopt case-replace
+ This variable determines whether the replacement functions should
+ preserve case.  If the variable is @code{nil}, that means to use the
+ replacement text verbatim.  A non-@code{nil} value means to convert the
+ case of the replacement text according to the text being replaced.
+ 
+ The function @code{replace-match} is where this variable actually has
+ its effect.  @xref{Replacing Match}.
+ @end defopt
+ 
+ @defopt case-fold-search
+ This buffer-local variable determines whether searches should ignore
+ case.  If the variable is @code{nil} they do not ignore case; otherwise
+ they do ignore case.
+ @end defopt
+ 
+ @defvar default-case-fold-search
+ The value of this variable is the default value for
+ @code{case-fold-search} in buffers that do not override it.  This is the
+ same as @code{(default-value 'case-fold-search)}.
+ @end defvar
+ 
+ @node Standard Regexps
+ @section Standard Regular Expressions Used in Editing
+ @cindex regexps used standardly in editing
+ @cindex standard regexps used in editing
+ 
+   This section describes some variables that hold regular expressions
+ used for certain purposes in editing:
+ 
+ @defvar page-delimiter
+ This is the regexp describing line-beginnings that separate pages.  The
+ default value is @code{"^\014"} (i.e., @code{"^^L"} or @code{"^\C-l"});
+ this matches a line that starts with a formfeed character.
+ @end defvar
+ 
+   The following two regular expressions should @emph{not} assume the
+ match always starts at the beginning of a line; they should not use
+ @samp{^} to anchor the match.  Most often, the paragraph commands do
+ check for a match only at the beginning of a line, which means that
+ @samp{^} would be superfluous.  When there is a nonzero left margin,
+ they accept matches that start after the left margin.  In that case, a
+ @samp{^} would be incorrect.  However, a @samp{^} is harmless in modes
+ where a left margin is never used.
+ 
+ @defvar paragraph-separate
+ This is the regular expression for recognizing the beginning of a line
+ that separates paragraphs.  (If you change this, you may have to
+ change @code{paragraph-start} also.)  The default value is
+ @w{@code{"[@ \t\f]*$"}}, which matches a line that consists entirely of
+ spaces, tabs, and form feeds (after its left margin).
+ @end defvar
+ 
+ @defvar paragraph-start
+ This is the regular expression for recognizing the beginning of a line
+ that starts @emph{or} separates paragraphs.  The default value is
+ @w{@code{"[@ \t\n\f]"}}, which matches a line starting with a space, tab,
+ newline, or form feed (after its left margin).
+ @end defvar
+ 
+ @defvar sentence-end
+ This is the regular expression describing the end of a sentence.  (All
+ paragraph boundaries also end sentences, regardless.)  The default value
+ is:
+ 
+ @example
+ "[.?!][]\"')@}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
+ @end example
+ 
+ This means a period, question mark or exclamation mark, followed
+ optionally by a closing parenthetical character, followed by tabs,
+ spaces or new lines.
+ 
+ For a detailed explanation of this regular expression, see @ref{Regexp
+ Example}.
+ @end defvar
Index: emacs/man/elisp-sequences.texi
diff -c /dev/null emacs/man/elisp-sequences.texi:1.2
*** /dev/null	Fri Aug  2 20:58:24 1996
--- emacs/man/elisp-sequences.texi	Thu Aug  1 00:23:28 1996
***************
*** 0 ****
--- 1,493 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/sequences
+ @node Sequences Arrays Vectors, Symbols, Lists, Top
+ @chapter Sequences, Arrays, and Vectors
+ @cindex sequence
+ 
+   Recall that the @dfn{sequence} type is the union of three other Lisp
+ types: lists, vectors, and strings.  In other words, any list is a
+ sequence, any vector is a sequence, and any string is a sequence.  The
+ common property that all sequences have is that each is an ordered
+ collection of elements.
+ 
+   An @dfn{array} is a single primitive object that has a slot for each
+ elements.  All the elements are accessible in constant time, but the
+ length of an existing array cannot be changed.  Strings and vectors are
+ the two types of arrays.
+ 
+   A list is a sequence of elements, but it is not a single primitive
+ object; it is made of cons cells, one cell per element.  Finding the
+ @var{n}th element requires looking through @var{n} cons cells, so
+ elements farther from the beginning of the list take longer to access.
+ But it is possible to add elements to the list, or remove elements.
+ 
+   The following diagram shows the relationship between these types:
+ 
+ @example
+ @group
+           ___________________________________
+          |                                   |
+          |          Sequence                 |
+          |  ______   ______________________  |
+          | |      | |                      | |
+          | | List | |         Array        | |
+          | |      | |  ________   _______  | |   
+          | |______| | |        | |       | | |
+          |          | | Vector | | String| | |
+          |          | |________| |_______| | |
+          |          |______________________| |
+          |___________________________________|
+ @end group
+ @end example
+ 
+   The elements of vectors and lists may be any Lisp objects.  The
+ elements of strings are all characters.
+ 
+ @menu
+ * Sequence Functions::    Functions that accept any kind of sequence.
+ * Arrays::                Characteristics of arrays in Emacs Lisp.
+ * Array Functions::       Functions specifically for arrays.
+ * Vectors::               Special characteristics of Emacs Lisp vectors.
+ * Vector Functions::      Functions specifically for vectors.
+ @end menu
+ 
+ @node Sequence Functions
+ @section Sequences
+ 
+   In Emacs Lisp, a @dfn{sequence} is either a list, a vector or a
+ string.  The common property that all sequences have is that each is an
+ ordered collection of elements.  This section describes functions that
+ accept any kind of sequence.
+ 
+ @defun sequencep object
+ Returns @code{t} if @var{object} is a list, vector, or
+ string, @code{nil} otherwise.
+ @end defun
+ 
+ @defun copy-sequence sequence
+ @cindex copying sequences
+ Returns a copy of @var{sequence}.  The copy is the same type of object
+ as the original sequence, and it has the same elements in the same order.
+ 
+ Storing a new element into the copy does not affect the original
+ @var{sequence}, and vice versa.  However, the elements of the new
+ sequence are not copies; they are identical (@code{eq}) to the elements
+ of the original.  Therefore, changes made within these elements, as
+ found via the copied sequence, are also visible in the original
+ sequence.
+ 
+ If the sequence is a string with text properties, the property list in
+ the copy is itself a copy, not shared with the original's property
+ list.  However, the actual values of the properties are shared.
+ @xref{Text Properties}.
+ 
+ See also @code{append} in @ref{Building Lists}, @code{concat} in
+ @ref{Creating Strings}, and @code{vconcat} in @ref{Vectors}, for others
+ ways to copy sequences.
+ 
+ @example
+ @group
+ (setq bar '(1 2))
+      @result{} (1 2)
+ @end group
+ @group
+ (setq x (vector 'foo bar))
+      @result{} [foo (1 2)]
+ @end group
+ @group
+ (setq y (copy-sequence x))
+      @result{} [foo (1 2)]
+ @end group
+ 
+ @group
+ (eq x y)
+      @result{} nil
+ @end group
+ @group
+ (equal x y)
+      @result{} t
+ @end group
+ @group
+ (eq (elt x 1) (elt y 1))
+      @result{} t
+ @end group
+ 
+ @group
+ ;; @r{Replacing an element of one sequence.}
+ (aset x 0 'quux)
+ x @result{} [quux (1 2)]
+ y @result{} [foo (1 2)]
+ @end group
+ 
+ @group
+ ;; @r{Modifying the inside of a shared element.}
+ (setcar (aref x 1) 69)
+ x @result{} [quux (69 2)]
+ y @result{} [foo (69 2)]
+ @end group
+ @end example
+ @end defun
+ 
+ @defun length sequence
+ @cindex string length
+ @cindex list length
+ @cindex vector length
+ @cindex sequence length
+ Returns the number of elements in @var{sequence}.  If @var{sequence} is
+ a cons cell that is not a list (because the final @sc{cdr} is not
+ @code{nil}), a @code{wrong-type-argument} error is signaled.
+ 
+ @example
+ @group
+ (length '(1 2 3))
+     @result{} 3
+ @end group
+ @group
+ (length ())
+     @result{} 0
+ @end group
+ @group
+ (length "foobar")
+     @result{} 6
+ @end group
+ @group
+ (length [1 2 3])
+     @result{} 3
+ @end group
+ @end example
+ @end defun
+ 
+ @defun elt sequence index
+ @cindex elements of sequences
+ This function returns the element of @var{sequence} indexed by
+ @var{index}.  Legitimate values of @var{index} are integers ranging from
+ 0 up to one less than the length of @var{sequence}.  If @var{sequence}
+ is a list, then out-of-range values of @var{index} return @code{nil};
+ otherwise, they trigger an @code{args-out-of-range} error.
+ 
+ @example
+ @group
+ (elt [1 2 3 4] 2)
+      @result{} 3
+ @end group
+ @group
+ (elt '(1 2 3 4) 2)
+      @result{} 3
+ @end group
+ @group
+ (char-to-string (elt "1234" 2))
+      @result{} "3"
+ @end group
+ @group
+ (elt [1 2 3 4] 4)
+      @error{}Args out of range: [1 2 3 4], 4
+ @end group
+ @group
+ (elt [1 2 3 4] -1)
+      @error{}Args out of range: [1 2 3 4], -1
+ @end group
+ @end example
+ 
+ This function generalizes @code{aref} (@pxref{Array Functions}) and
+ @code{nth} (@pxref{List Elements}).
+ @end defun
+ 
+ @node Arrays
+ @section Arrays
+ @cindex array
+ 
+   An @dfn{array} object has slots that hold a number of other Lisp
+ objects, called the elements of the array.  Any element of an array may
+ be accessed in constant time.  In contrast, an element of a list
+ requires access time that is proportional to the position of the element
+ in the list.
+ 
+   When you create an array, you must specify how many elements it has.
+ The amount of space allocated depends on the number of elements.
+ Therefore, it is impossible to change the size of an array once it is
+ created; you cannot add or remove elements.  However, you can replace an
+ element with a different value.
+ 
+   Emacs defines two types of array, both of which are one-dimensional:
+ @dfn{strings} and @dfn{vectors}.  A vector is a general array; its
+ elements can be any Lisp objects.  A string is a specialized array; its
+ elements must be characters (i.e., integers between 0 and 255).  Each
+ type of array has its own read syntax.  @xref{String Type}, and
+ @ref{Vector Type}.
+ 
+   Both kinds of array share these characteristics:
+ 
+ @itemize @bullet
+ @item
+ The first element of an array has index zero, the second element has
+ index 1, and so on.  This is called @dfn{zero-origin} indexing.  For
+ example, an array of four elements has indices 0, 1, 2, @w{and 3}.
+ 
+ @item
+ The elements of an array may be referenced or changed with the functions
+ @code{aref} and @code{aset}, respectively (@pxref{Array Functions}).
+ @end itemize
+ 
+   In principle, if you wish to have an array of text characters, you
+ could use either a string or a vector.  In practice, we always choose
+ strings for such applications, for four reasons:
+ 
+ @itemize @bullet
+ @item
+ They occupy one-fourth the space of a vector of the same elements.
+ 
+ @item
+ Strings are printed in a way that shows the contents more clearly
+ as characters.
+ 
+ @item
+ Strings can hold text properties.  @xref{Text Properties}.
+ 
+ @item
+ Many of the specialized editing and I/O facilities of Emacs accept only
+ strings.  For example, you cannot insert a vector of characters into a
+ buffer the way you can insert a string.  @xref{Strings and Characters}.
+ @end itemize
+ 
+   By contrast, for an array of keyboard input characters (such as a key
+ sequence), a vector may be necessary, because many keyboard input
+ characters are outside the range that will fit in a string.  @xref{Key
+ Sequence Input}.
+ 
+ @node Array Functions
+ @section Functions that Operate on Arrays
+ 
+   In this section, we describe the functions that accept both strings
+ and vectors.
+ 
+ @defun arrayp object
+ This function returns @code{t} if @var{object} is an array (i.e., either a
+ vector or a string).
+ 
+ @example
+ @group
+ (arrayp [a])
+ @result{} t
+ (arrayp "asdf")
+ @result{} t
+ @end group
+ @end example
+ @end defun
+ 
+ @defun aref array index
+ @cindex array elements
+ This function returns the @var{index}th element of @var{array}.  The
+ first element is at index zero.
+ 
+ @example
+ @group
+ (setq primes [2 3 5 7 11 13])
+      @result{} [2 3 5 7 11 13]
+ (aref primes 4)
+      @result{} 11
+ (elt primes 4)
+      @result{} 11
+ @end group
+ 
+ @group
+ (aref "abcdefg" 1)
+      @result{} 98           ; @r{@samp{b} is @sc{ASCII} code 98.}
+ @end group
+ @end example
+ 
+ See also the function @code{elt}, in @ref{Sequence Functions}.
+ @end defun
+ 
+ @defun aset array index object
+ This function sets the @var{index}th element of @var{array} to be
+ @var{object}.  It returns @var{object}.
+ 
+ @example
+ @group
+ (setq w [foo bar baz])
+      @result{} [foo bar baz]
+ (aset w 0 'fu)
+      @result{} fu
+ w
+      @result{} [fu bar baz]
+ @end group
+ 
+ @group
+ (setq x "asdfasfd")
+      @result{} "asdfasfd"
+ (aset x 3 ?Z)
+      @result{} 90
+ x
+      @result{} "asdZasfd"
+ @end group
+ @end example
+ 
+ If @var{array} is a string and @var{object} is not a character, a
+ @code{wrong-type-argument} error results.
+ @end defun
+ 
+ @defun fillarray array object
+ This function fills the array @var{array} with @var{object}, so that
+ each element of @var{array} is @var{object}.  It returns @var{array}.
+ 
+ @example
+ @group
+ (setq a [a b c d e f g])
+      @result{} [a b c d e f g]
+ (fillarray a 0)
+      @result{} [0 0 0 0 0 0 0]
+ a
+      @result{} [0 0 0 0 0 0 0]
+ @end group
+ @group
+ (setq s "When in the course")
+      @result{} "When in the course"
+ (fillarray s ?-)
+      @result{} "------------------"
+ @end group
+ @end example
+ 
+ If @var{array} is a string and @var{object} is not a character, a
+ @code{wrong-type-argument} error results.
+ @end defun
+ 
+ The general sequence functions @code{copy-sequence} and @code{length}
+ are often useful for objects known to be arrays.  @xref{Sequence Functions}.
+ 
+ @node Vectors
+ @section Vectors
+ @cindex vector
+ 
+   Arrays in Lisp, like arrays in most languages, are blocks of memory
+ whose elements can be accessed in constant time.  A @dfn{vector} is a
+ general-purpose array; its elements can be any Lisp objects.  (The other
+ kind of array in Emacs Lisp is the @dfn{string}, whose elements must be
+ characters.)  Vectors in Emacs serve as syntax tables (vectors of
+ integers), as obarrays (vectors of symbols), and in keymaps (vectors of
+ commands).  They are also used internally as part of the representation
+ of a byte-compiled function; if you print such a function, you will see
+ a vector in it.
+ 
+   In Emacs Lisp, the indices of the elements of a vector start from zero
+ and count up from there.
+ 
+   Vectors are printed with square brackets surrounding the elements.
+ Thus, a vector whose elements are the symbols @code{a}, @code{b} and
+ @code{a} is printed as @code{[a b a]}.  You can write vectors in the
+ same way in Lisp input.
+ 
+   A vector, like a string or a number, is considered a constant for
+ evaluation: the result of evaluating it is the same vector.  This does
+ not evaluate or even examine the elements of the vector.
+ @xref{Self-Evaluating Forms}.
+ 
+   Here are examples of these principles:
+ 
+ @example
+ @group
+ (setq avector [1 two '(three) "four" [five]])
+      @result{} [1 two (quote (three)) "four" [five]]
+ (eval avector)
+      @result{} [1 two (quote (three)) "four" [five]]
+ (eq avector (eval avector))
+      @result{} t
+ @end group
+ @end example
+ 
+ @node Vector Functions
+ @section Functions That Operate on Vectors
+ 
+   Here are some functions that relate to vectors:
+ 
+ @defun vectorp object
+ This function returns @code{t} if @var{object} is a vector.
+ 
+ @example
+ @group
+ (vectorp [a])
+      @result{} t
+ (vectorp "asdf")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun vector &rest objects
+ This function creates and returns a vector whose elements are the
+ arguments, @var{objects}.
+ 
+ @example
+ @group
+ (vector 'foo 23 [bar baz] "rats")
+      @result{} [foo 23 [bar baz] "rats"]
+ (vector)
+      @result{} []
+ @end group
+ @end example
+ @end defun
+ 
+ @defun make-vector length object
+ This function returns a new vector consisting of @var{length} elements,
+ each initialized to @var{object}.
+ 
+ @example
+ @group
+ (setq sleepy (make-vector 9 'Z))
+      @result{} [Z Z Z Z Z Z Z Z Z]
+ @end group
+ @end example
+ @end defun
+ 
+ @defun vconcat &rest sequences
+ @cindex copying vectors
+ This function returns a new vector containing all the elements of the
+ @var{sequences}.  The arguments @var{sequences} may be lists, vectors,
+ or strings.  If no @var{sequences} are given, an empty vector is
+ returned.
+ 
+ The value is a newly constructed vector that is not @code{eq} to any
+ existing vector.
+ 
+ @example
+ @group
+ (setq a (vconcat '(A B C) '(D E F)))
+      @result{} [A B C D E F]
+ (eq a (vconcat a))
+      @result{} nil
+ @end group
+ @group
+ (vconcat)
+      @result{} []
+ (vconcat [A B C] "aa" '(foo (6 7)))
+      @result{} [A B C 97 97 foo (6 7)]
+ @end group
+ @end example
+ 
+ The @code{vconcat} function also allows integers as arguments.  It
+ converts them to strings of digits, making up the decimal print
+ representation of the integer, and then uses the strings instead of the
+ original integers.  @strong{Don't use this feature; we plan to eliminate
+ it.  If you already use this feature, change your programs now!}  The
+ proper way to convert an integer to a decimal number in this way is with
+ @code{format} (@pxref{Formatting Strings}) or @code{number-to-string}
+ (@pxref{String Conversion}).
+ 
+ For other concatenation functions, see @code{mapconcat} in @ref{Mapping
+ Functions}, @code{concat} in @ref{Creating Strings}, and @code{append}
+ in @ref{Building Lists}.
+ @end defun
+ 
+   The @code{append} function provides a way to convert a vector into a
+ list with the same elements (@pxref{Building Lists}):
+ 
+ @example
+ @group
+ (setq avector [1 two (quote (three)) "four" [five]])
+      @result{} [1 two (quote (three)) "four" [five]]
+ (append avector nil)
+      @result{} (1 two (quote (three)) "four" [five])
+ @end group
+ @end example
Index: emacs/man/elisp-streams.texi
diff -c /dev/null emacs/man/elisp-streams.texi:1.2
*** /dev/null	Fri Aug  2 20:58:31 1996
--- emacs/man/elisp-streams.texi	Thu Aug  1 00:23:30 1996
***************
*** 0 ****
--- 1,726 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/streams
+ @node Read and Print, Minibuffers, Debugging, Top
+ @comment  node-name,  next,  previous,  up
+ @chapter Reading and Printing Lisp Objects
+ 
+   @dfn{Printing} and @dfn{reading} are the operations of converting Lisp
+ objects to textual form and vice versa.  They use the printed
+ representations and read syntax described in @ref{Lisp Data Types}.
+ 
+   This chapter describes the Lisp functions for reading and printing.
+ It also describes @dfn{streams}, which specify where to get the text (if
+ reading) or where to put it (if printing).
+ 
+ @menu
+ * Streams Intro::     Overview of streams, reading and printing.
+ * Input Streams::     Various data types that can be used as input streams.
+ * Input Functions::   Functions to read Lisp objects from text.
+ * Output Streams::    Various data types that can be used as output streams.
+ * Output Functions::  Functions to print Lisp objects as text.
+ * Output Variables::  Variables that control what the printing functions do.
+ @end menu
+ 
+ @node Streams Intro
+ @section Introduction to Reading and Printing
+ @cindex Lisp reader
+ @cindex printing
+ @cindex reading
+ 
+   @dfn{Reading} a Lisp object means parsing a Lisp expression in textual
+ form and producing a corresponding Lisp object.  This is how Lisp
+ programs get into Lisp from files of Lisp code.  We call the text the
+ @dfn{read syntax} of the object.  For example, the text @samp{(a .@: 5)}
+ is the read syntax for a cons cell whose @sc{car} is @code{a} and whose
+ @sc{cdr} is the number 5.
+ 
+   @dfn{Printing} a Lisp object means producing text that represents that
+ object---converting the object to its printed representation.  Printing
+ the cons cell described above produces the text @samp{(a .@: 5)}.
+ 
+   Reading and printing are more or less inverse operations: printing the
+ object that results from reading a given piece of text often produces
+ the same text, and reading the text that results from printing an object
+ usually produces a similar-looking object.  For example, printing the
+ symbol @code{foo} produces the text @samp{foo}, and reading that text
+ returns the symbol @code{foo}.  Printing a list whose elements are
+ @code{a} and @code{b} produces the text @samp{(a b)}, and reading that
+ text produces a list (but not the same list) with elements @code{a}
+ and @code{b}.
+ 
+   However, these two operations are not precisely inverses.  There are
+ three kinds of exceptions:
+ 
+ @itemize @bullet
+ @item
+ Printing can produce text that cannot be read.  For example, buffers,
+ windows, frames, subprocesses and markers print into text that starts
+ with @samp{#}; if you try to read this text, you get an error.  There is
+ no way to read those data types.
+ 
+ @item
+ One object can have multiple textual representations.  For example,
+ @samp{1} and @samp{01} represent the same integer, and @samp{(a b)} and
+ @samp{(a .@: (b))} represent the same list.  Reading will accept any of
+ the alternatives, but printing must choose one of them.
+ 
+ @item
+ Comments can appear at certain points in the middle of an object's
+ read sequence without affecting the result of reading it.
+ @end itemize
+ 
+ @node Input Streams
+ @section Input Streams
+ @cindex stream (for reading)
+ @cindex input stream
+ 
+   Most of the Lisp functions for reading text take an @dfn{input stream}
+ as an argument.  The input stream specifies where or how to get the
+ characters of the text to be read.  Here are the possible types of input
+ stream:
+ 
+ @table @asis
+ @item @var{buffer}
+ @cindex buffer input stream
+ The input characters are read from @var{buffer}, starting with the
+ character directly after point.  Point advances as characters are read.
+ 
+ @item @var{marker}
+ @cindex marker input stream
+ The input characters are read from the buffer that @var{marker} is in,
+ starting with the character directly after the marker.  The marker
+ position advances as characters are read.  The value of point in the
+ buffer has no effect when the stream is a marker.
+ 
+ @item @var{string}
+ @cindex string input stream
+ The input characters are taken from @var{string}, starting at the first
+ character in the string and using as many characters as required.
+ 
+ @item @var{function}
+ @cindex function input stream
+ The input characters are generated by @var{function}, one character per
+ call.  Normally @var{function} is called with no arguments, and should
+ return a character.
+ 
+ @cindex unreading
+ Occasionally @var{function} is called with one argument (always a
+ character).  When that happens, @var{function} should save the argument
+ and arrange to return it on the next call.  This is called
+ @dfn{unreading} the character; it happens when the Lisp reader reads one
+ character too many and wants to ``put it back where it came from''.
+ 
+ @item @code{t}
+ @cindex @code{t} input stream
+ @code{t} used as a stream means that the input is read from the
+ minibuffer.  In fact, the minibuffer is invoked once and the text
+ given by the user is made into a string that is then used as the
+ input stream.
+ 
+ @item @code{nil}
+ @cindex @code{nil} input stream
+ @code{nil} supplied as an input stream means to use the value of
+ @code{standard-input} instead; that value is the @dfn{default input
+ stream}, and must be a non-@code{nil} input stream.
+ 
+ @item @var{symbol}
+ A symbol as input stream is equivalent to the symbol's function
+ definition (if any).
+ @end table
+ 
+   Here is an example of reading from a stream that is a buffer, showing
+ where point is located before and after:
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This@point{} is the contents of foo.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (read (get-buffer "foo"))
+      @result{} is
+ @end group
+ @group
+ (read (get-buffer "foo"))
+      @result{} the
+ @end group
+ 
+ @group
+ ---------- Buffer: foo ----------
+ This is the@point{} contents of foo.
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ 
+ @noindent
+ Note that the first read skips a space.  Reading skips any amount of
+ whitespace preceding the significant text.
+ 
+   In Emacs 18, reading a symbol discarded the delimiter terminating the
+ symbol.  Thus, point would end up at the beginning of @samp{contents}
+ rather than after @samp{the}.  The Emacs 19 behavior is superior because
+ it correctly handles input such as @samp{bar(foo)}, where the
+ open-parenthesis that ends one object is needed as the beginning of
+ another object.
+ 
+   Here is an example of reading from a stream that is a marker,
+ initially positioned at the beginning of the buffer shown.  The value
+ read is the symbol @code{This}.
+ 
+ @example
+ @group
+ 
+ ---------- Buffer: foo ----------
+ This is the contents of foo.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (setq m (set-marker (make-marker) 1 (get-buffer "foo")))
+      @result{} #<marker at 1 in foo>
+ @end group
+ @group
+ (read m)
+      @result{} This
+ @end group
+ @group
+ m
+      @result{} #<marker at 5 in foo>   ;; @r{Before the first space.}
+ @end group
+ @end example
+ 
+   Here we read from the contents of a string:
+ 
+ @example
+ @group
+ (read "(When in) the course")
+      @result{} (When in)
+ @end group
+ @end example
+ 
+   The following example reads from the minibuffer.  The
+ prompt is: @w{@samp{Lisp expression: }}.  (That is always the prompt
+ used when you read from the stream @code{t}.)  The user's input is shown
+ following the prompt.
+ 
+ @example
+ @group
+ (read t)
+      @result{} 23
+ ---------- Buffer: Minibuffer ----------
+ Lisp expression: @kbd{23 @key{RET}}
+ ---------- Buffer: Minibuffer ----------
+ @end group
+ @end example
+ 
+   Finally, here is an example of a stream that is a function, named
+ @code{useless-stream}.  Before we use the stream, we initialize the
+ variable @code{useless-list} to a list of characters.  Then each call to
+ the function @code{useless-stream} obtains the next character in the list
+ or unreads a character by adding it to the front of the list.
+ 
+ @example
+ @group
+ (setq useless-list (append "XY()" nil))
+      @result{} (88 89 40 41)
+ @end group
+ 
+ @group
+ (defun useless-stream (&optional unread)
+   (if unread
+       (setq useless-list (cons unread useless-list))
+     (prog1 (car useless-list)
+            (setq useless-list (cdr useless-list)))))
+      @result{} useless-stream
+ @end group
+ @end example
+ 
+ @noindent
+ Now we read using the stream thus constructed:
+ 
+ @example
+ @group
+ (read 'useless-stream)
+      @result{} XY
+ @end group
+ 
+ @group
+ useless-list
+      @result{} (40 41)
+ @end group
+ @end example
+ 
+ @noindent
+ Note that the open and close parentheses remains in the list.  The Lisp
+ reader encountered the open parenthesis, decided that it ended the
+ input, and unread it.  Another attempt to read from the stream at this
+ point would read @samp{()} and return @code{nil}.
+ 
+ @defun get-file-char
+ This function is used internally as an input stream to read from the
+ input file opened by the function @code{load}.  Don't use this function
+ yourself.
+ @end defun
+ 
+ @node Input Functions
+ @section Input Functions
+ 
+   This section describes the Lisp functions and variables that pertain
+ to reading.
+ 
+   In the functions below, @var{stream} stands for an input stream (see
+ the previous section).  If @var{stream} is @code{nil} or omitted, it
+ defaults to the value of @code{standard-input}.
+ 
+ @kindex end-of-file
+   An @code{end-of-file} error is signaled if reading encounters an
+ unterminated list, vector, or string.
+ 
+ @defun read &optional stream
+ This function reads one textual Lisp expression from @var{stream},
+ returning it as a Lisp object.  This is the basic Lisp input function.
+ @end defun
+ 
+ @defun read-from-string string &optional start end
+ @cindex string to object
+ This function reads the first textual Lisp expression from the text in
+ @var{string}.  It returns a cons cell whose @sc{car} is that expression,
+ and whose @sc{cdr} is an integer giving the position of the next
+ remaining character in the string (i.e., the first one not read).
+ 
+ If @var{start} is supplied, then reading begins at index @var{start} in
+ the string (where the first character is at index 0).  If @var{end} is
+ also supplied, then reading stops just before that index, as if the rest
+ of the string were not there.
+ 
+ For example:
+ 
+ @example
+ @group
+ (read-from-string "(setq x 55) (setq y 5)")
+      @result{} ((setq x 55) . 11)
+ @end group
+ @group
+ (read-from-string "\"A short string\"")
+      @result{} ("A short string" . 16)
+ @end group
+ 
+ @group
+ ;; @r{Read starting at the first character.}
+ (read-from-string "(list 112)" 0)
+      @result{} ((list 112) . 10)
+ @end group
+ @group
+ ;; @r{Read starting at the second character.}
+ (read-from-string "(list 112)" 1)
+      @result{} (list . 5)
+ @end group
+ @group
+ ;; @r{Read starting at the seventh character,}
+ ;;   @r{and stopping at the ninth.}
+ (read-from-string "(list 112)" 6 8)
+      @result{} (11 . 8)
+ @end group
+ @end example
+ @end defun
+ 
+ @defvar standard-input
+ This variable holds the default input stream---the stream that
+ @code{read} uses when the @var{stream} argument is @code{nil}.
+ @end defvar
+ 
+ @node Output Streams
+ @section Output Streams
+ @cindex stream (for printing)
+ @cindex output stream
+ 
+   An output stream specifies what to do with the characters produced
+ by printing.  Most print functions accept an output stream as an
+ optional argument.  Here are the possible types of output stream:
+ 
+ @table @asis
+ @item @var{buffer}
+ @cindex buffer output stream
+ The output characters are inserted into @var{buffer} at point.
+ Point advances as characters are inserted.
+ 
+ @item @var{marker}
+ @cindex marker output stream
+ The output characters are inserted into the buffer that @var{marker}
+ points into, at the marker position.  The marker position advances as
+ characters are inserted.  The value of point in the buffer has no effect
+ on printing when the stream is a marker.
+ 
+ @item @var{function}
+ @cindex function output stream
+ The output characters are passed to @var{function}, which is responsible
+ for storing them away.  It is called with a single character as
+ argument, as many times as there are characters to be output, and is
+ free to do anything at all with the characters it receives.
+ 
+ @item @code{t}
+ @cindex @code{t} output stream
+ The output characters are displayed in the echo area.
+ 
+ @item @code{nil}
+ @cindex @code{nil} output stream
+ @code{nil} specified as an output stream means to the value of
+ @code{standard-output} instead; that value is the @dfn{default output
+ stream}, and must be a non-@code{nil} output stream.
+ 
+ @item @var{symbol}
+ A symbol as output stream is equivalent to the symbol's function
+ definition (if any).
+ @end table
+ 
+   Many of the valid output streams are also valid as input streams.  The
+ difference between input and output streams is therefore mostly one of
+ how you use a Lisp object, not a distinction of types of object.
+ 
+   Here is an example of a buffer used as an output stream.  Point is
+ initially located as shown immediately before the @samp{h} in
+ @samp{the}.  At the end, point is located directly before that same
+ @samp{h}.
+ 
+ @cindex print example
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This is t@point{}he contents of foo.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ (print "This is the output" (get-buffer "foo"))
+      @result{} "This is the output"
+ 
+ @group
+ ---------- Buffer: foo ----------
+ This is t
+ "This is the output"
+ @point{}he contents of foo.
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ 
+   Now we show a use of a marker as an output stream.  Initially, the
+ marker is in buffer @code{foo}, between the @samp{t} and the @samp{h} in
+ the word @samp{the}.  At the end, the marker has advanced over the
+ inserted text so that it remains positioned before the same @samp{h}.
+ Note that the location of point, shown in the usual fashion, has no
+ effect.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ "This is the @point{}output"
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ m
+      @result{} #<marker at 11 in foo>
+ @end group
+ 
+ @group
+ (print "More output for foo." m)
+      @result{} "More output for foo."
+ @end group
+ 
+ @group
+ ---------- Buffer: foo ----------
+ "This is t
+ "More output for foo."
+ he @point{}output"
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ m
+      @result{} #<marker at 35 in foo>
+ @end group
+ @end example
+ 
+   The following example shows output to the echo area:
+ 
+ @example
+ @group
+ (print "Echo Area output" t)
+      @result{} "Echo Area output"
+ ---------- Echo Area ----------
+ "Echo Area output"
+ ---------- Echo Area ----------
+ @end group
+ @end example
+ 
+   Finally, we show the use of a function as an output stream.  The
+ function @code{eat-output} takes each character that it is given and
+ conses it onto the front of the list @code{last-output} (@pxref{Building
+ Lists}).  At the end, the list contains all the characters output, but
+ in reverse order.
+ 
+ @example
+ @group
+ (setq last-output nil)
+      @result{} nil
+ @end group
+ 
+ @group
+ (defun eat-output (c)
+   (setq last-output (cons c last-output)))
+      @result{} eat-output
+ @end group
+ 
+ @group
+ (print "This is the output" 'eat-output)
+      @result{} "This is the output"
+ @end group
+ 
+ @group
+ last-output
+      @result{} (10 34 116 117 112 116 117 111 32 101 104 
+     116 32 115 105 32 115 105 104 84 34 10)
+ @end group
+ @end example
+ 
+ @noindent
+ Now we can put the output in the proper order by reversing the list:
+ 
+ @example
+ @group
+ (concat (nreverse last-output))
+      @result{} "
+ \"This is the output\"
+ "
+ @end group
+ @end example
+ 
+ @noindent
+ Calling @code{concat} converts the list to a string so you can see its
+ contents more clearly.
+ 
+ @node Output Functions
+ @section Output Functions
+ 
+   This section describes the Lisp functions for printing Lisp objects.
+ 
+ @cindex @samp{"} in printing
+ @cindex @samp{\} in printing
+ @cindex quoting characters in printing
+ @cindex escape characters in printing
+   Some of the Emacs printing functions add quoting characters to the
+ output when necessary so that it can be read properly.  The quoting
+ characters used are @samp{"} and @samp{\}; they distinguish strings from
+ symbols, and prevent punctuation characters in strings and symbols from
+ being taken as delimiters when reading.  @xref{Printed Representation},
+ for full details.  You specify quoting or no quoting by the choice of
+ printing function.
+ 
+   If the text is to be read back into Lisp, then it is best to print
+ with quoting characters to avoid ambiguity.  Likewise, if the purpose is
+ to describe a Lisp object clearly for a Lisp programmer.  However, if
+ the purpose of the output is to look nice for humans, then it is better
+ to print without quoting.
+ 
+   Printing a self-referent Lisp object requires an infinite amount of
+ text.  In certain cases, trying to produce this text leads to a stack
+ overflow.  Emacs detects such recursion and prints @samp{#@var{level}}
+ instead of recursively printing an object already being printed.  For
+ example, here @samp{#0} indicates a recursive reference to the object at
+ level 0 of the current print operation:
+ 
+ @example
+ (setq foo (list nil))
+      @result{} (nil)
+ (setcar foo foo)
+      @result{} (#0)
+ @end example
+ 
+   In the functions below, @var{stream} stands for an output stream.
+ (See the previous section for a description of output streams.)  If
+ @var{stream} is @code{nil} or omitted, it defaults to the value of
+ @code{standard-output}.
+ 
+ @defun print object &optional stream
+ @cindex Lisp printer
+ The @code{print} function is a convenient way of printing.  It outputs
+ the printed representation of @var{object} to @var{stream}, printing in
+ addition one newline before @var{object} and another after it.  Quoting
+ characters are used.  @code{print} returns @var{object}.  For example:
+ 
+ @example
+ @group
+ (progn (print 'The\ cat\ in)
+        (print "the hat")
+        (print " came back"))
+      @print{} 
+      @print{} The\ cat\ in
+      @print{} 
+      @print{} "the hat"
+      @print{} 
+      @print{} " came back"
+      @print{} 
+      @result{} " came back"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun prin1 object &optional stream
+ This function outputs the printed representation of @var{object} to
+ @var{stream}.  It does not print newlines to separate output as
+ @code{print} does, but it does use quoting characters just like
+ @code{print}.  It returns @var{object}.
+ 
+ @example
+ @group
+ (progn (prin1 'The\ cat\ in) 
+        (prin1 "the hat") 
+        (prin1 " came back"))
+      @print{} The\ cat\ in"the hat"" came back"
+      @result{} " came back"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun princ object &optional stream
+ This function outputs the printed representation of @var{object} to
+ @var{stream}.  It returns @var{object}.
+ 
+ This function is intended to produce output that is readable by people,
+ not by @code{read}, so it doesn't insert quoting characters and doesn't
+ put double-quotes around the contents of strings.  It does not add any
+ spacing between calls.
+ 
+ @example
+ @group
+ (progn
+   (princ 'The\ cat)
+   (princ " in the \"hat\""))
+      @print{} The cat in the "hat"
+      @result{} " in the \"hat\""
+ @end group
+ @end example
+ @end defun
+ 
+ @defun terpri &optional stream
+ @cindex newline in print
+ This function outputs a newline to @var{stream}.  The name stands
+ for ``terminate print''.
+ @end defun
+ 
+ @defun write-char character &optional stream
+ This function outputs @var{character} to @var{stream}.  It returns
+ @var{character}.
+ @end defun
+ 
+ @defun prin1-to-string object &optional noescape
+ @cindex object to string
+ This function returns a string containing the text that @code{prin1}
+ would have printed for the same argument.
+ 
+ @example
+ @group
+ (prin1-to-string 'foo)
+      @result{} "foo"
+ @end group
+ @group
+ (prin1-to-string (mark-marker))
+      @result{} "#<marker at 2773 in strings.texi>"
+ @end group
+ @end example
+ 
+ If @var{noescape} is non-@code{nil}, that inhibits use of quoting
+ characters in the output.  (This argument is supported in Emacs versions
+ 19 and later.)
+ 
+ @example
+ @group
+ (prin1-to-string "foo")
+      @result{} "\"foo\""
+ @end group
+ @group
+ (prin1-to-string "foo" t)
+      @result{} "foo"
+ @end group
+ @end example
+ 
+ See @code{format}, in @ref{String Conversion}, for other ways to obtain
+ the printed representation of a Lisp object as a string.
+ @end defun
+ 
+ @node Output Variables
+ @section Variables Affecting Output
+ 
+ @defvar standard-output
+ The value of this variable is the default output stream---the stream
+ that print functions use when the @var{stream} argument is @code{nil}.
+ @end defvar
+ 
+ @defvar print-escape-newlines
+ @cindex @samp{\n} in print
+ @cindex escape characters
+ If this variable is non-@code{nil}, then newline characters in strings
+ are printed as @samp{\n} and formfeeds are printed as @samp{\f}.
+ Normally these characters are printed as actual newlines and formfeeds.
+ 
+ This variable affects the print functions @code{prin1} and @code{print},
+ as well as everything that uses them.  It does not affect @code{princ}.
+ Here is an example using @code{prin1}:
+ 
+ @example
+ @group
+ (prin1 "a\nb")
+      @print{} "a
+      @print{} b"
+      @result{} "a
+ b"
+ @end group
+ 
+ @group
+ (let ((print-escape-newlines t))
+   (prin1 "a\nb"))
+      @print{} "a\nb"
+      @result{} "a
+ b"
+ @end group
+ @end example
+ 
+ @noindent
+ In the second expression, the local binding of
+ @code{print-escape-newlines} is in effect during the call to
+ @code{prin1}, but not during the printing of the result.
+ @end defvar
+ 
+ @defvar print-length
+ @cindex printing limits
+ The value of this variable is the maximum number of elements of a list
+ that will be printed.  If a list being printed has more than this many
+ elements, it is abbreviated with an ellipsis.
+ 
+ If the value is @code{nil} (the default), then there is no limit.
+ 
+ @example
+ @group
+ (setq print-length 2)
+      @result{} 2
+ @end group
+ @group
+ (print '(1 2 3 4 5))
+      @print{} (1 2 ...)
+      @result{} (1 2 ...)
+ @end group
+ @end example
+ @end defvar
+ 
+ @defvar print-level
+ The value of this variable is the maximum depth of nesting of
+ parentheses and brackets when printed.  Any list or vector at a depth
+ exceeding this limit is abbreviated with an ellipsis.  A value of
+ @code{nil} (which is the default) means no limit.
+ 
+ This variable exists in version 19 and later versions.
+ @end defvar
Index: emacs/man/elisp-strings.texi
diff -c /dev/null emacs/man/elisp-strings.texi:1.2
*** /dev/null	Fri Aug  2 20:58:43 1996
--- emacs/man/elisp-strings.texi	Thu Aug  1 00:23:31 1996
***************
*** 0 ****
--- 1,828 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/strings
+ @node Strings and Characters, Lists, Numbers, Top
+ @comment  node-name,  next,  previous,  up
+ @chapter Strings and Characters
+ @cindex strings
+ @cindex character arrays
+ @cindex characters
+ @cindex bytes
+ 
+   A string in Emacs Lisp is an array that contains an ordered sequence
+ of characters.  Strings are used as names of symbols, buffers, and
+ files, to send messages to users, to hold text being copied between
+ buffers, and for many other purposes.  Because strings are so important,
+ Emacs Lisp has many functions expressly for manipulating them.  Emacs
+ Lisp programs use strings more often than individual characters.
+ 
+   @xref{Strings of Events}, for special considerations for strings of
+ keyboard character events.
+ 
+ @menu
+ * Basics: String Basics.      Basic properties of strings and characters.
+ * Predicates for Strings::    Testing whether an object is a string or char.
+ * Creating Strings::          Functions to allocate new strings.
+ * Text Comparison::           Comparing characters or strings.
+ * String Conversion::         Converting characters or strings and vice versa.
+ * Formatting Strings::        @code{format}: Emacs's analog of @code{printf}.
+ * Character Case::            Case conversion functions.
+ * Case Table::		      Customizing case conversion.
+ @end menu
+ 
+ @node String Basics
+ @section String and Character Basics
+ 
+   Strings in Emacs Lisp are arrays that contain an ordered sequence of
+ characters.  Characters are represented in Emacs Lisp as integers;
+ whether an integer was intended as a character or not is determined only
+ by how it is used.  Thus, strings really contain integers.
+ 
+   The length of a string (like any array) is fixed and independent of
+ the string contents, and cannot be altered.  Strings in Lisp are
+ @emph{not} terminated by a distinguished character code.  (By contrast,
+ strings in C are terminated by a character with @sc{ASCII} code 0.)
+ This means that any character, including the null character (@sc{ASCII}
+ code 0), is a valid element of a string.@refill
+ 
+   Since strings are considered arrays, you can operate on them with the
+ general array functions.  (@xref{Sequences Arrays Vectors}.)  For
+ example, you can access or change individual characters in a string
+ using the functions @code{aref} and @code{aset} (@pxref{Array
+ Functions}).
+ 
+   Each character in a string is stored in a single byte.  Therefore,
+ numbers not in the range 0 to 255 are truncated when stored into a
+ string.  This means that a string takes up much less memory than a
+ vector of the same length.
+ 
+   Sometimes key sequences are represented as strings.  When a string is
+ a key sequence, string elements in the range 128 to 255 represent meta
+ characters (which are extremely large integers) rather than keyboard
+ events in the range 128 to 255.
+ 
+   Strings cannot hold characters that have the hyper, super or alt
+ modifiers; they can hold @sc{ASCII} control characters, but no other
+ control characters.  They do not distinguish case in @sc{ASCII} control
+ characters.  @xref{Character Type}, for more information about
+ representation of meta and other modifiers for keyboard input
+ characters.
+ 
+   Strings are useful for holding regular expressions.  You can also
+ match regular expressions against strings (@pxref{Regexp Search}).  The
+ functions @code{match-string} (@pxref{Simple Match Data}) and
+ @code{replace-match} (@pxref{Replacing Match}) are useful for
+ decomposing and modifying strings based on regular expression matching.
+ 
+   Like a buffer, a string can contain text properties for the characters
+ in it, as well as the characters themselves.  @xref{Text Properties}.
+ All the Lisp primitives that copy text from strings to buffers or other
+ strings also copy the properties of the characters being copied.
+ 
+   @xref{Text}, for information about functions that display strings or
+ copy them into buffers.  @xref{Character Type}, and @ref{String Type},
+ for information about the syntax of characters and strings.
+ 
+ @node Predicates for Strings
+ @section The Predicates for Strings
+ 
+ For more information about general sequence and array predicates,
+ see @ref{Sequences Arrays Vectors}, and @ref{Arrays}.
+ 
+ @defun stringp object
+   This function returns @code{t} if @var{object} is a string, @code{nil}
+ otherwise.
+ @end defun
+ 
+ @defun char-or-string-p object
+   This function returns @code{t} if @var{object} is a string or a
+ character (i.e., an integer), @code{nil} otherwise.
+ @end defun
+ 
+ @node Creating Strings
+ @section Creating Strings
+ 
+   The following functions create strings, either from scratch, or by
+ putting strings together, or by taking them apart.
+ 
+ @defun make-string count character
+   This function returns a string made up of @var{count} repetitions of
+ @var{character}.  If @var{count} is negative, an error is signaled.
+ 
+ @example
+ (make-string 5 ?x)
+      @result{} "xxxxx"
+ (make-string 0 ?x)
+      @result{} ""
+ @end example
+ 
+   Other functions to compare with this one include @code{char-to-string}
+ (@pxref{String Conversion}), @code{make-vector} (@pxref{Vectors}), and
+ @code{make-list} (@pxref{Building Lists}).
+ @end defun
+ 
+ @defun substring string start &optional end
+ This function returns a new string which consists of those characters
+ from @var{string} in the range from (and including) the character at the
+ index @var{start} up to (but excluding) the character at the index
+ @var{end}.  The first character is at index zero.
+ 
+ @example
+ @group
+ (substring "abcdefg" 0 3)
+      @result{} "abc"
+ @end group
+ @end example
+ 
+ @noindent
+ Here the index for @samp{a} is 0, the index for @samp{b} is 1, and the
+ index for @samp{c} is 2.  Thus, three letters, @samp{abc}, are copied
+ from the string @code{"abcdefg"}.  The index 3 marks the character
+ position up to which the substring is copied.  The character whose index
+ is 3 is actually the fourth character in the string.
+ 
+ A negative number counts from the end of the string, so that @minus{}1
+ signifies the index of the last character of the string.  For example: 
+ 
+ @example
+ @group
+ (substring "abcdefg" -3 -1)
+      @result{} "ef"
+ @end group
+ @end example
+ 
+ @noindent
+ In this example, the index for @samp{e} is @minus{}3, the index for
+ @samp{f} is @minus{}2, and the index for @samp{g} is @minus{}1.
+ Therefore, @samp{e} and @samp{f} are included, and @samp{g} is excluded.
+ 
+ When @code{nil} is used as an index, it stands for the length of the
+ string.  Thus,
+ 
+ @example
+ @group
+ (substring "abcdefg" -3 nil)
+      @result{} "efg"
+ @end group
+ @end example
+ 
+ Omitting the argument @var{end} is equivalent to specifying @code{nil}.
+ It follows that @code{(substring @var{string} 0)} returns a copy of all
+ of @var{string}.
+ 
+ @example
+ @group
+ (substring "abcdefg" 0)
+      @result{} "abcdefg"
+ @end group
+ @end example
+ 
+ @noindent
+ But we recommend @code{copy-sequence} for this purpose (@pxref{Sequence
+ Functions}).
+ 
+ If the characters copied from @var{string} have text properties, the
+ properties are copied into the new string also.  @xref{Text Properties}.
+ 
+ A @code{wrong-type-argument} error is signaled if either @var{start} or
+ @var{end} is not an integer or @code{nil}.  An @code{args-out-of-range}
+ error is signaled if @var{start} indicates a character following
+ @var{end}, or if either integer is out of range for @var{string}.
+ 
+ Contrast this function with @code{buffer-substring} (@pxref{Buffer
+ Contents}), which returns a string containing a portion of the text in
+ the current buffer.  The beginning of a string is at index 0, but the
+ beginning of a buffer is at index 1.
+ @end defun
+ 
+ @defun concat &rest sequences
+ @cindex copying strings
+ @cindex concatenating strings
+ This function returns a new string consisting of the characters in the
+ arguments passed to it (along with their text properties, if any).  The
+ arguments may be strings, lists of numbers, or vectors of numbers; they
+ are not themselves changed.  If @code{concat} receives no arguments, it
+ returns an empty string.
+ 
+ @example
+ (concat "abc" "-def")
+      @result{} "abc-def"
+ (concat "abc" (list 120 (+ 256 121)) [122])
+      @result{} "abcxyz"
+ ;; @r{@code{nil} is an empty sequence.}
+ (concat "abc" nil "-def")
+      @result{} "abc-def"
+ (concat "The " "quick brown " "fox.")
+      @result{} "The quick brown fox."
+ (concat)
+      @result{} ""
+ @end example
+ 
+ @noindent
+ The second example above shows how characters stored in strings are
+ taken modulo 256.  In other words, each character in the string is
+ stored in one byte.
+ 
+ The @code{concat} function always constructs a new string that is
+ not @code{eq} to any existing string.
+ 
+ When an argument is an integer (not a sequence of integers), it is
+ converted to a string of digits making up the decimal printed
+ representation of the integer.  @strong{Don't use this feature; we plan
+ to eliminate it.  If you already use this feature, change your programs
+ now!}  The proper way to convert an integer to a decimal number in this
+ way is with @code{format} (@pxref{Formatting Strings}) or
+ @code{number-to-string} (@pxref{String Conversion}).
+ 
+ @example
+ @group
+ (concat 137)
+      @result{} "137"
+ (concat 54 321)
+      @result{} "54321"
+ @end group
+ @end example
+ 
+ For information about other concatenation functions, see the
+ description of @code{mapconcat} in @ref{Mapping Functions},
+ @code{vconcat} in @ref{Vectors}, and @code{append} in @ref{Building
+ Lists}.
+ @end defun
+ 
+ @need 2000
+ @node Text Comparison
+ @section Comparison of Characters and Strings
+ @cindex string equality
+ 
+ @defun char-equal character1 character2
+ This function returns @code{t} if the arguments represent the same
+ character, @code{nil} otherwise.  This function ignores differences
+ in case if @code{case-fold-search} is non-@code{nil}.
+ 
+ @example
+ (char-equal ?x ?x)
+      @result{} t
+ (char-to-string (+ 256 ?x))
+      @result{} "x"
+ (char-equal ?x  (+ 256 ?x))
+      @result{} t
+ @end example
+ @end defun
+ 
+ @defun string= string1 string2
+ This function returns @code{t} if the characters of the two strings
+ match exactly; case is significant.
+ 
+ @example
+ (string= "abc" "abc")
+      @result{} t
+ (string= "abc" "ABC")
+      @result{} nil
+ (string= "ab" "ABC")
+      @result{} nil
+ @end example
+ 
+ The function @code{string=} ignores the text properties of the
+ two strings.  To compare strings in a way that compares their text
+ properties also, use @code{equal} (@pxref{Equality Predicates}).
+ @end defun
+ 
+ @defun string-equal string1 string2
+ @code{string-equal} is another name for @code{string=}.
+ @end defun
+ 
+ @cindex lexical comparison
+ @defun string< string1 string2
+ @c (findex string< causes problems for permuted index!!)
+ This function compares two strings a character at a time.  First it
+ scans both the strings at once to find the first pair of corresponding
+ characters that do not match.  If the lesser character of those two is
+ the character from @var{string1}, then @var{string1} is less, and this
+ function returns @code{t}.  If the lesser character is the one from
+ @var{string2}, then @var{string1} is greater, and this function returns
+ @code{nil}.  If the two strings match entirely, the value is @code{nil}.
+ 
+ Pairs of characters are compared by their @sc{ASCII} codes.  Keep in
+ mind that lower case letters have higher numeric values in the
+ @sc{ASCII} character set than their upper case counterparts; numbers and
+ many punctuation characters have a lower numeric value than upper case
+ letters.
+ 
+ @example
+ @group
+ (string< "abc" "abd")
+      @result{} t
+ (string< "abd" "abc")
+      @result{} nil
+ (string< "123" "abc")
+      @result{} t
+ @end group
+ @end example
+ 
+ When the strings have different lengths, and they match up to the
+ length of @var{string1}, then the result is @code{t}.  If they match up
+ to the length of @var{string2}, the result is @code{nil}.  A string of
+ no characters is less than any other string.
+ 
+ @example
+ @group
+ (string< "" "abc")
+      @result{} t
+ (string< "ab" "abc")
+      @result{} t
+ (string< "abc" "")
+      @result{} nil
+ (string< "abc" "ab")
+      @result{} nil
+ (string< "" "")
+      @result{} nil                   
+ @end group
+ @end example
+ @end defun
+ 
+ @defun string-lessp string1 string2
+ @code{string-lessp} is another name for @code{string<}.
+ @end defun
+ 
+   See also @code{compare-buffer-substrings} in @ref{Comparing Text}, for
+ a way to compare text in buffers.  The function @code{string-match},
+ which matches a regular expression against a string, can be used
+ for a kind of string comparison; see @ref{Regexp Search}.
+ 
+ @node String Conversion
+ @comment  node-name,  next,  previous,  up
+ @section Conversion of Characters and Strings
+ @cindex conversion of strings
+ 
+   This section describes functions for conversions between characters,
+ strings and integers.  @code{format} and @code{prin1-to-string}
+ (@pxref{Output Functions}) can also convert Lisp objects into strings.
+ @code{read-from-string} (@pxref{Input Functions}) can ``convert'' a
+ string representation of a Lisp object into an object.
+ 
+   @xref{Documentation}, for functions that produce textual descriptions
+ of text characters and general input events
+ (@code{single-key-description} and @code{text-char-description}).  These
+ functions are used primarily for making help messages.
+ 
+ @defun char-to-string character
+ @cindex character to string
+   This function returns a new string with a length of one character.
+ The value of @var{character}, modulo 256, is used to initialize the
+ element of the string.
+ 
+ This function is similar to @code{make-string} with an integer argument
+ of 1.  (@xref{Creating Strings}.)  This conversion can also be done with
+ @code{format} using the @samp{%c} format specification.
+ (@xref{Formatting Strings}.)
+ 
+ @example
+ (char-to-string ?x)
+      @result{} "x"
+ (char-to-string (+ 256 ?x))
+      @result{} "x"
+ (make-string 1 ?x)
+      @result{} "x"
+ @end example
+ @end defun
+ 
+ @defun string-to-char string
+ @cindex string to character
+   This function returns the first character in @var{string}.  If the
+ string is empty, the function returns 0.  The value is also 0 when the
+ first character of @var{string} is the null character, @sc{ASCII} code
+ 0.
+ 
+ @example
+ (string-to-char "ABC")
+      @result{} 65
+ (string-to-char "xyz")
+      @result{} 120
+ (string-to-char "")
+      @result{} 0
+ (string-to-char "\000")
+      @result{} 0
+ @end example
+ 
+ This function may be eliminated in the future if it does not seem useful
+ enough to retain.
+ @end defun
+ 
+ @defun number-to-string number
+ @cindex integer to string
+ @cindex integer to decimal
+ This function returns a string consisting of the printed
+ representation of @var{number}, which may be an integer or a floating
+ point number.  The value starts with a sign if the argument is
+ negative.
+ 
+ @example
+ (number-to-string 256)
+      @result{} "256"
+ (number-to-string -23)
+      @result{} "-23"
+ (number-to-string -23.5)
+      @result{} "-23.5"
+ @end example
+ 
+ @cindex int-to-string
+ @code{int-to-string} is a semi-obsolete alias for this function.
+ 
+ See also the function @code{format} in @ref{Formatting Strings}.
+ @end defun
+ 
+ @defun string-to-number string
+ @cindex string to number
+ This function returns the numeric value of the characters in
+ @var{string}, read in base ten.  It skips spaces and tabs at the
+ beginning of @var{string}, then reads as much of @var{string} as it can
+ interpret as a number.  (On some systems it ignores other whitespace at
+ the beginning, not just spaces and tabs.)  If the first character after
+ the ignored whitespace is not a digit or a minus sign, this function
+ returns 0.
+ 
+ @example
+ (string-to-number "256")
+      @result{} 256
+ (string-to-number "25 is a perfect square.")
+      @result{} 25
+ (string-to-number "X256")
+      @result{} 0
+ (string-to-number "-4.5")
+      @result{} -4.5
+ @end example
+ 
+ @findex string-to-int
+ @code{string-to-int} is an obsolete alias for this function.
+ @end defun
+ 
+ @node Formatting Strings
+ @comment  node-name,  next,  previous,  up
+ @section Formatting Strings
+ @cindex formatting strings
+ @cindex strings, formatting them
+ 
+   @dfn{Formatting} means constructing a string by substitution of
+ computed values at various places in a constant string.  This string
+ controls how the other values are printed as well as where they appear;
+ it is called a @dfn{format string}.
+ 
+   Formatting is often useful for computing messages to be displayed.  In
+ fact, the functions @code{message} and @code{error} provide the same
+ formatting feature described here; they differ from @code{format} only
+ in how they use the result of formatting.
+ 
+ @defun format string &rest objects
+   This function returns a new string that is made by copying
+ @var{string} and then replacing any format specification 
+ in the copy with encodings of the corresponding @var{objects}.  The
+ arguments @var{objects} are the computed values to be formatted.
+ @end defun
+ 
+ @cindex @samp{%} in format
+ @cindex format specification
+   A format specification is a sequence of characters beginning with a
+ @samp{%}.  Thus, if there is a @samp{%d} in @var{string}, the
+ @code{format} function replaces it with the printed representation of
+ one of the values to be formatted (one of the arguments @var{objects}).
+ For example:
+ 
+ @example
+ @group
+ (format "The value of fill-column is %d." fill-column)
+      @result{} "The value of fill-column is 72."
+ @end group
+ @end example
+ 
+   If @var{string} contains more than one format specification, the
+ format specifications correspond with successive values from
+ @var{objects}.  Thus, the first format specification in @var{string}
+ uses the first such value, the second format specification uses the
+ second such value, and so on.  Any extra format specifications (those
+ for which there are no corresponding values) cause unpredictable
+ behavior.  Any extra values to be formatted are ignored.
+ 
+   Certain format specifications require values of particular types.
+ However, no error is signaled if the value actually supplied fails to
+ have the expected type.  Instead, the output is likely to be
+ meaningless.
+ 
+   Here is a table of valid format specifications:
+ 
+ @table @samp
+ @item %s
+ Replace the specification with the printed representation of the object,
+ made without quoting.  Thus, strings are represented by their contents
+ alone, with no @samp{"} characters, and symbols appear without @samp{\}
+ characters.
+ 
+ If there is no corresponding object, the empty string is used.
+ 
+ @item %S
+ Replace the specification with the printed representation of the object,
+ made with quoting.  Thus, strings are enclosed in @samp{"} characters,
+ and @samp{\} characters appear where necessary before special characters.
+ 
+ If there is no corresponding object, the empty string is used.
+ 
+ @item %o
+ @cindex integer to octal
+ Replace the specification with the base-eight representation of an
+ integer.
+ 
+ @item %d
+ Replace the specification with the base-ten representation of an
+ integer.
+ 
+ @item %x
+ @cindex integer to hexadecimal
+ Replace the specification with the base-sixteen representation of an
+ integer.
+ 
+ @item %c
+ Replace the specification with the character which is the value given.
+ 
+ @item %e
+ Replace the specification with the exponential notation for a floating
+ point number.
+ 
+ @item %f
+ Replace the specification with the decimal-point notation for a floating
+ point number.
+ 
+ @item %g
+ Replace the specification with notation for a floating point number,
+ using either exponential notation or decimal-point notation whichever
+ is shorter.
+ 
+ @item %%
+ A single @samp{%} is placed in the string.  This format specification is
+ unusual in that it does not use a value.  For example, @code{(format "%%
+ %d" 30)} returns @code{"% 30"}.
+ @end table
+ 
+   Any other format character results in an @samp{Invalid format
+ operation} error.
+ 
+   Here are several examples:
+ 
+ @example
+ @group
+ (format "The name of this buffer is %s." (buffer-name))
+      @result{} "The name of this buffer is strings.texi."
+ 
+ (format "The buffer object prints as %s." (current-buffer))
+      @result{} "The buffer object prints as #<buffer strings.texi>."
+ 
+ (format "The octal value of %d is %o, 
+          and the hex value is %x." 18 18 18)
+      @result{} "The octal value of 18 is 22, 
+          and the hex value is 12."
+ @end group
+ @end example
+ 
+ @cindex numeric prefix
+ @cindex field width
+ @cindex padding
+   All the specification characters allow an optional numeric prefix
+ between the @samp{%} and the character.  The optional numeric prefix
+ defines the minimum width for the object.  If the printed representation
+ of the object contains fewer characters than this, then it is padded.
+ The padding is on the left if the prefix is positive (or starts with
+ zero) and on the right if the prefix is negative.  The padding character
+ is normally a space, but if the numeric prefix starts with a zero, zeros
+ are used for padding.
+ 
+ @example
+ (format "%06d is padded on the left with zeros" 123)
+      @result{} "000123 is padded on the left with zeros"
+ 
+ (format "%-6d is padded on the right" 123)
+      @result{} "123    is padded on the right"
+ @end example
+ 
+   @code{format} never truncates an object's printed representation, no
+ matter what width you specify.  Thus, you can use a numeric prefix to
+ specify a minimum spacing between columns with no risk of losing
+ information.
+ 
+   In the following three examples, @samp{%7s} specifies a minimum width
+ of 7.  In the first case, the string inserted in place of @samp{%7s} has
+ only 3 letters, so 4 blank spaces are inserted for padding.  In the
+ second case, the string @code{"specification"} is 13 letters wide but is
+ not truncated.  In the third case, the padding is on the right.
+ 
+ @smallexample 
+ @group
+ (format "The word `%7s' actually has %d letters in it."
+         "foo" (length "foo"))
+      @result{} "The word `    foo' actually has 3 letters in it."  
+ @end group
+ 
+ @group
+ (format "The word `%7s' actually has %d letters in it."
+         "specification" (length "specification")) 
+      @result{} "The word `specification' actually has 13 letters in it."  
+ @end group
+ 
+ @group
+ (format "The word `%-7s' actually has %d letters in it."
+         "foo" (length "foo"))
+      @result{} "The word `foo    ' actually has 3 letters in it."  
+ @end group
+ @end smallexample
+ 
+ @node Character Case
+ @comment node-name, next, previous, up 
+ @section Character Case
+ @cindex upper case 
+ @cindex lower case 
+ @cindex character case 
+ 
+   The character case functions change the case of single characters or
+ of the contents of strings.  The functions convert only alphabetic
+ characters (the letters @samp{A} through @samp{Z} and @samp{a} through
+ @samp{z}); other characters are not altered.  The functions do not
+ modify the strings that are passed to them as arguments.
+ 
+   The examples below use the characters @samp{X} and @samp{x} which have
+ @sc{ASCII} codes 88 and 120 respectively.
+ 
+ @defun downcase string-or-char
+ This function converts a character or a string to lower case.
+ 
+ When the argument to @code{downcase} is a string, the function creates
+ and returns a new string in which each letter in the argument that is
+ upper case is converted to lower case.  When the argument to
+ @code{downcase} is a character, @code{downcase} returns the
+ corresponding lower case character.  This value is an integer.  If the
+ original character is lower case, or is not a letter, then the value
+ equals the original character.
+ 
+ @example
+ (downcase "The cat in the hat")
+      @result{} "the cat in the hat"
+ 
+ (downcase ?X)
+      @result{} 120
+ @end example
+ @end defun
+ 
+ @defun upcase string-or-char
+ This function converts a character or a string to upper case.
+ 
+ When the argument to @code{upcase} is a string, the function creates
+ and returns a new string in which each letter in the argument that is
+ lower case is converted to upper case.
+ 
+ When the argument to @code{upcase} is a character, @code{upcase}
+ returns the corresponding upper case character.  This value is an integer.
+ If the original character is upper case, or is not a letter, then the
+ value equals the original character.
+ 
+ @example
+ (upcase "The cat in the hat")
+      @result{} "THE CAT IN THE HAT"
+ 
+ (upcase ?x)
+      @result{} 88
+ @end example
+ @end defun
+ 
+ @defun capitalize string-or-char
+ @cindex capitalization
+ This function capitalizes strings or characters.  If
+ @var{string-or-char} is a string, the function creates and returns a new
+ string, whose contents are a copy of @var{string-or-char} in which each
+ word has been capitalized.  This means that the first character of each
+ word is converted to upper case, and the rest are converted to lower
+ case.
+ 
+ The definition of a word is any sequence of consecutive characters that
+ are assigned to the word constituent syntax class in the current syntax
+ table (@xref{Syntax Class Table}).
+ 
+ When the argument to @code{capitalize} is a character, @code{capitalize}
+ has the same result as @code{upcase}.
+ 
+ @example
+ (capitalize "The cat in the hat")
+      @result{} "The Cat In The Hat"
+ 
+ (capitalize "THE 77TH-HATTED CAT")
+      @result{} "The 77th-Hatted Cat"
+ 
+ @group
+ (capitalize ?x)
+      @result{} 88
+ @end group
+ @end example
+ @end defun
+ 
+ @node Case Table
+ @section The Case Table
+ 
+   You can customize case conversion by installing a special @dfn{case
+ table}.  A case table specifies the mapping between upper case and lower
+ case letters.  It affects both the string and character case conversion
+ functions (see the previous section) and those that apply to text in the
+ buffer (@pxref{Case Changes}).  You need a case table if you are using a
+ language which has letters other than the standard @sc{ASCII} letters.
+ 
+   A case table is a list of this form:
+ 
+ @example
+ (@var{downcase} @var{upcase} @var{canonicalize} @var{equivalences})
+ @end example
+ 
+ @noindent
+ where each element is either @code{nil} or a string of length 256.  The
+ element @var{downcase} says how to map each character to its lower-case
+ equivalent.  The element @var{upcase} maps each character to its
+ upper-case equivalent.  If lower and upper case characters are in
+ one-to-one correspondence, use @code{nil} for @var{upcase}; then Emacs
+ deduces the upcase table from @var{downcase}.
+ 
+   For some languages, upper and lower case letters are not in one-to-one
+ correspondence.  There may be two different lower case letters with the
+ same upper case equivalent.  In these cases, you need to specify the
+ maps for both directions.
+ 
+   The element @var{canonicalize} maps each character to a canonical
+ equivalent; any two characters that are related by case-conversion have
+ the same canonical equivalent character.
+ 
+   The element @var{equivalences} is a map that cyclicly permutes each
+ equivalence class (of characters with the same canonical equivalent).
+ (For ordinary @sc{ASCII}, this would map @samp{a} into @samp{A} and
+ @samp{A} into @samp{a}, and likewise for each set of equivalent
+ characters.)
+ 
+   When you construct a case table, you can provide @code{nil} for
+ @var{canonicalize}; then Emacs fills in this string from @var{upcase}
+ and @var{downcase}.  You can also provide @code{nil} for
+ @var{equivalences}; then Emacs fills in this string from
+ @var{canonicalize}.  In a case table that is actually in use, those
+ components are non-@code{nil}.  Do not try to specify @var{equivalences}
+ without also specifying @var{canonicalize}.
+ 
+   Each buffer has a case table.  Emacs also has a @dfn{standard case
+ table} which is copied into each buffer when you create the buffer.
+ Changing the standard case table doesn't affect any existing buffers.
+ 
+   Here are the functions for working with case tables:
+ 
+ @defun case-table-p object
+ This predicate returns non-@code{nil} if @var{object} is a valid case
+ table.
+ @end defun
+ 
+ @defun set-standard-case-table table
+ This function makes @var{table} the standard case table, so that it will
+ apply to any buffers created subsequently.
+ @end defun
+ 
+ @defun standard-case-table
+ This returns the standard case table.
+ @end defun
+ 
+ @defun current-case-table
+ This function returns the current buffer's case table.
+ @end defun
+ 
+ @defun set-case-table table
+ This sets the current buffer's case table to @var{table}.
+ @end defun
+ 
+   The following three functions are convenient subroutines for packages
+ that define non-@sc{ASCII} character sets.  They modify a string
+ @var{downcase-table} provided as an argument; this should be a string to
+ be used as the @var{downcase} part of a case table.  They also modify
+ the standard syntax table.  @xref{Syntax Tables}.
+ 
+ @defun set-case-syntax-pair uc lc downcase-table
+ This function specifies a pair of corresponding letters, one upper case
+ and one lower case.
+ @end defun
+ 
+ @defun set-case-syntax-delims l r downcase-table
+ This function makes characters @var{l} and @var{r} a matching pair of
+ case-invariant delimiters.
+ @end defun
+ 
+ @defun set-case-syntax char syntax downcase-table
+ This function makes @var{char} case-invariant, with syntax
+ @var{syntax}.
+ @end defun
+ 
+ @deffn Command describe-buffer-case-table
+ This command displays a description of the contents of the current
+ buffer's case table.
+ @end deffn
+ 
+ @cindex ISO Latin 1
+ @pindex iso-syntax
+ You can load the library @file{iso-syntax} to set up the standard syntax
+ table and define a case table for the 8-bit ISO Latin 1 character set.
Index: emacs/man/elisp-symbols.texi
diff -c /dev/null emacs/man/elisp-symbols.texi:1.2
*** /dev/null	Fri Aug  2 20:58:57 1996
--- emacs/man/elisp-symbols.texi	Thu Aug  1 00:23:33 1996
***************
*** 0 ****
--- 1,528 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/symbols
+ @node Symbols, Evaluation, Sequences Arrays Vectors, Top
+ @chapter Symbols
+ @cindex symbol
+ 
+   A @dfn{symbol} is an object with a unique name.  This chapter
+ describes symbols, their components, their property lists, and how they
+ are created and interned.  Separate chapters describe the use of symbols
+ as variables and as function names; see @ref{Variables}, and
+ @ref{Functions}.  For the precise read syntax for symbols, see
+ @ref{Symbol Type}.
+ 
+   You can test whether an arbitrary Lisp object is a symbol
+ with @code{symbolp}:
+ 
+ @defun symbolp object
+ This function returns @code{t} if @var{object} is a symbol, @code{nil}
+ otherwise.
+ @end defun
+ 
+ @menu
+ * Symbol Components::        Symbols have names, values, function definitions
+                                and property lists.
+ * Definitions::              A definition says how a symbol will be used.
+ * Creating Symbols::         How symbols are kept unique.
+ * Property Lists::           Each symbol has a property list
+                                for recording miscellaneous information.
+ @end menu
+ 
+ @node Symbol Components, Definitions, Symbols, Symbols
+ @section Symbol Components
+ @cindex symbol components
+ 
+   Each symbol has four components (or ``cells''), each of which
+ references another object:
+ 
+ @table @asis
+ @item Print name
+ @cindex print name cell
+ The @dfn{print name cell} holds a string that names the symbol for
+ reading and printing.  See @code{symbol-name} in @ref{Creating Symbols}.
+ 
+ @item Value
+ @cindex value cell
+ The @dfn{value cell} holds the current value of the symbol as a
+ variable.  When a symbol is used as a form, the value of the form is the
+ contents of the symbol's value cell.  See @code{symbol-value} in
+ @ref{Accessing Variables}.
+ 
+ @item Function
+ @cindex function cell
+ The @dfn{function cell} holds the function definition of the symbol.
+ When a symbol is used as a function, its function definition is used in
+ its place.  This cell is also used to make a symbol stand for a keymap
+ or a keyboard macro, for editor command execution.  Because each symbol
+ has separate value and function cells, variables and function names do
+ not conflict.  See @code{symbol-function} in @ref{Function Cells}.
+ 
+ @item Property list
+ @cindex property list cell
+ The @dfn{property list cell} holds the property list of the symbol.  See
+ @code{symbol-plist} in @ref{Property Lists}.
+ @end table
+ 
+   The print name cell always holds a string, and cannot be changed.  The
+ other three cells can be set individually to any specified Lisp object.
+ 
+   The print name cell holds the string that is the name of the symbol.
+ Since symbols are represented textually by their names, it is important
+ not to have two symbols with the same name.  The Lisp reader ensures
+ this: every time it reads a symbol, it looks for an existing symbol with
+ the specified name before it creates a new one.  (In GNU Emacs Lisp,
+ this lookup uses a hashing algorithm and an obarray; see @ref{Creating
+ Symbols}.)
+ 
+   In normal usage, the function cell usually contains a function or
+ macro, as that is what the Lisp interpreter expects to see there
+ (@pxref{Evaluation}).  Keyboard macros (@pxref{Keyboard Macros}),
+ keymaps (@pxref{Keymaps}) and autoload objects (@pxref{Autoloading}) are
+ also sometimes stored in the function cell of symbols.  We often refer
+ to ``the function @code{foo}'' when we really mean the function stored
+ in the function cell of the symbol @code{foo}.  We make the distinction
+ only when necessary.
+ 
+   The property list cell normally should hold a correctly formatted
+ property list (@pxref{Property Lists}), as a number of functions expect
+ to see a property list there.
+ 
+   The function cell or the value cell may be @dfn{void}, which means
+ that the cell does not reference any object.  (This is not the same
+ thing as holding the symbol @code{void}, nor the same as holding the
+ symbol @code{nil}.)  Examining a cell that is void results in an error,
+ such as @samp{Symbol's value as variable is void}.
+ 
+   The four functions @code{symbol-name}, @code{symbol-value},
+ @code{symbol-plist}, and @code{symbol-function} return the contents of
+ the four cells of a symbol.  Here as an example we show the contents of
+ the four cells of the symbol @code{buffer-file-name}:
+ 
+ @example
+ (symbol-name 'buffer-file-name)
+      @result{} "buffer-file-name"
+ (symbol-value 'buffer-file-name)
+      @result{} "/gnu/elisp/symbols.texi"
+ (symbol-plist 'buffer-file-name)
+      @result{} (variable-documentation 29529)
+ (symbol-function 'buffer-file-name)
+      @result{} #<subr buffer-file-name>
+ @end example
+ 
+ @noindent
+ Because this symbol is the variable which holds the name of the file
+ being visited in the current buffer, the value cell contents we see are
+ the name of the source file of this chapter of the Emacs Lisp Manual.
+ The property list cell contains the list @code{(variable-documentation
+ 29529)} which tells the documentation functions where to find the
+ documentation string for the variable @code{buffer-file-name} in the
+ @file{DOC} file.  (29529 is the offset from the beginning of the
+ @file{DOC} file to where that documentation string begins.)  The
+ function cell contains the function for returning the name of the file.
+ @code{buffer-file-name} names a primitive function, which has no read
+ syntax and prints in hash notation (@pxref{Primitive Function Type}).  A
+ symbol naming a function written in Lisp would have a lambda expression
+ (or a byte-code object) in this cell.
+ 
+ @node Definitions, Creating Symbols, Symbol Components, Symbols
+ @section Defining Symbols
+ @cindex definition of a symbol
+ 
+   A @dfn{definition} in Lisp is a special form that announces your
+ intention to use a certain symbol in a particular way.  In Emacs Lisp,
+ you can define a symbol as a variable, or define it as a function (or
+ macro), or both independently.
+ 
+   A definition construct typically specifies a value or meaning for the
+ symbol for one kind of use, plus documentation for its meaning when used
+ in this way.  Thus, when you define a symbol as a variable, you can
+ supply an initial value for the variable, plus documentation for the
+ variable.
+ 
+   @code{defvar} and @code{defconst} are special forms that define a
+ symbol as a global variable.  They are documented in detail in
+ @ref{Defining Variables}.
+ 
+   @code{defun} defines a symbol as a function, creating a lambda
+ expression and storing it in the function cell of the symbol.  This
+ lambda expression thus becomes the function definition of the symbol.
+ (The term ``function definition'', meaning the contents of the function
+ cell, is derived from the idea that @code{defun} gives the symbol its
+ definition as a function.)  @code{defsubst} and @code{defalias} are two
+ other ways of defining a function.  @xref{Functions}.
+ 
+   @code{defmacro} defines a symbol as a macro.  It creates a macro
+ object and stores it in the function cell of the symbol.  Note that a
+ given symbol can be a macro or a function, but not both at once, because
+ both macro and function definitions are kept in the function cell, and
+ that cell can hold only one Lisp object at any given time.
+ @xref{Macros}.
+ 
+   In Emacs Lisp, a definition is not required in order to use a symbol
+ as a variable or function.  Thus, you can make a symbol a global
+ variable with @code{setq}, whether you define it first or not.  The real
+ purpose of definitions is to guide programmers and programming tools.
+ They inform programmers who read the code that certain symbols are
+ @emph{intended} to be used as variables, or as functions.  In addition,
+ utilities such as @file{etags} and @file{make-docfile} recognize
+ definitions, and add appropriate information to tag tables and the
+ @file{emacs/etc/DOC-@var{version}} file. @xref{Accessing Documentation}.
+ 
+ @node Creating Symbols, Property Lists, Definitions, Symbols
+ @section Creating and Interning Symbols
+ @cindex reading symbols
+ 
+   To understand how symbols are created in GNU Emacs Lisp, you must know
+ how Lisp reads them.  Lisp must ensure that it finds the same symbol
+ every time it reads the same set of characters.  Failure to do so would
+ cause complete confusion.
+ 
+ @cindex symbol name hashing
+ @cindex hashing
+ @cindex obarray
+ @cindex bucket (in obarray)
+   When the Lisp reader encounters a symbol, it reads all the characters
+ of the name.  Then it ``hashes'' those characters to find an index in a
+ table called an @dfn{obarray}.  Hashing is an efficient method of
+ looking something up.  For example, instead of searching a telephone
+ book cover to cover when looking up Jan Jones, you start with the J's
+ and go from there.  That is a simple version of hashing.  Each element
+ of the obarray is a @dfn{bucket} which holds all the symbols with a
+ given hash code; to look for a given name, it is sufficient to look
+ through all the symbols in the bucket for that name's hash code.
+ 
+ @cindex interning
+   If a symbol with the desired name is found, the reader uses that
+ symbol.  If the obarray does not contain a symbol with that name, the
+ reader makes a new symbol and adds it to the obarray.  Finding or adding
+ a symbol with a certain name is called @dfn{interning} it, and the
+ symbol is then called an @dfn{interned symbol}.
+ 
+   Interning ensures that each obarray has just one symbol with any
+ particular name.  Other like-named symbols may exist, but not in the
+ same obarray.  Thus, the reader gets the same symbols for the same
+ names, as long as you keep reading with the same obarray.
+ 
+ @cindex symbol equality
+ @cindex uninterned symbol
+   No obarray contains all symbols; in fact, some symbols are not in any
+ obarray.  They are called @dfn{uninterned symbols}.  An uninterned
+ symbol has the same four cells as other symbols; however, the only way
+ to gain access to it is by finding it in some other object or as the
+ value of a variable.
+ 
+   In Emacs Lisp, an obarray is actually a vector.  Each element of the
+ vector is a bucket; its value is either an interned symbol whose name
+ hashes to that bucket, or 0 if the bucket is empty.  Each interned
+ symbol has an internal link (invisible to the user) to the next symbol
+ in the bucket.  Because these links are invisible, there is no way to
+ find all the symbols in an obarray except using @code{mapatoms} (below).
+ The order of symbols in a bucket is not significant.
+ 
+   In an empty obarray, every element is 0, and you can create an obarray
+ with @code{(make-vector @var{length} 0)}.  @strong{This is the only
+ valid way to create an obarray.}  Prime numbers as lengths tend
+ to result in good hashing; lengths one less than a power of two are also
+ good.
+ 
+   @strong{Do not try to put symbols in an obarray yourself.}  This does
+ not work---only @code{intern} can enter a symbol in an obarray properly.
+ @strong{Do not try to intern one symbol in two obarrays.}  This would
+ garble both obarrays, because a symbol has just one slot to hold the
+ following symbol in the obarray bucket.  The results would be
+ unpredictable.
+ 
+   It is possible for two different symbols to have the same name in
+ different obarrays; these symbols are not @code{eq} or @code{equal}.
+ However, this normally happens only as part of the abbrev mechanism
+ (@pxref{Abbrevs}).
+ 
+ @cindex CL note---symbol in obarrays
+ @quotation
+ @b{Common Lisp note:} In Common Lisp, a single symbol may be interned in
+ several obarrays.
+ @end quotation
+ 
+   Most of the functions below take a name and sometimes an obarray as
+ arguments.  A @code{wrong-type-argument} error is signaled if the name
+ is not a string, or if the obarray is not a vector.
+ 
+ @defun symbol-name symbol
+ This function returns the string that is @var{symbol}'s name.  For example:
+ 
+ @example
+ @group
+ (symbol-name 'foo)
+      @result{} "foo"
+ @end group
+ @end example
+ 
+ Changing the string by substituting characters, etc, does change the
+ name of the symbol, but fails to update the obarray, so don't do it!
+ @end defun
+ 
+ @defun make-symbol name
+ This function returns a newly-allocated, uninterned symbol whose name is
+ @var{name} (which must be a string).  Its value and function definition
+ are void, and its property list is @code{nil}.  In the example below,
+ the value of @code{sym} is not @code{eq} to @code{foo} because it is a
+ distinct uninterned symbol whose name is also @samp{foo}.
+ 
+ @example
+ (setq sym (make-symbol "foo"))
+      @result{} foo
+ (eq sym 'foo)
+      @result{} nil
+ @end example
+ @end defun
+ 
+ @defun intern name &optional obarray
+ This function returns the interned symbol whose name is @var{name}.  If
+ there is no such symbol in the obarray @var{obarray}, @code{intern}
+ creates a new one, adds it to the obarray, and returns it.  If
+ @var{obarray} is omitted, the value of the global variable
+ @code{obarray} is used.
+ 
+ @example
+ (setq sym (intern "foo"))
+      @result{} foo
+ (eq sym 'foo)
+      @result{} t
+ 
+ (setq sym1 (intern "foo" other-obarray))
+      @result{} foo
+ (eq sym 'foo)
+      @result{} nil
+ @end example
+ @end defun
+ 
+ @defun intern-soft name &optional obarray
+ This function returns the symbol in @var{obarray} whose name is
+ @var{name}, or @code{nil} if @var{obarray} has no symbol with that name.
+ Therefore, you can use @code{intern-soft} to test whether a symbol with
+ a given name is already interned.  If @var{obarray} is omitted, the
+ value of the global variable @code{obarray} is used.
+ 
+ @smallexample
+ (intern-soft "frazzle")        ; @r{No such symbol exists.}
+      @result{} nil
+ (make-symbol "frazzle")        ; @r{Create an uninterned one.}
+      @result{} frazzle
+ @group
+ (intern-soft "frazzle")        ; @r{That one cannot be found.}
+      @result{} nil
+ @end group
+ @group
+ (setq sym (intern "frazzle"))  ; @r{Create an interned one.}
+      @result{} frazzle
+ @end group
+ @group
+ (intern-soft "frazzle")        ; @r{That one can be found!}
+      @result{} frazzle
+ @end group
+ @group
+ (eq sym 'frazzle)              ; @r{And it is the same one.}
+      @result{} t
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @defvar obarray
+ This variable is the standard obarray for use by @code{intern} and
+ @code{read}.
+ @end defvar
+ 
+ @defun mapatoms function &optional obarray
+ This function calls @var{function} for each symbol in the obarray
+ @var{obarray}.  It returns @code{nil}.  If @var{obarray} is omitted, it
+ defaults to the value of @code{obarray}, the standard obarray for
+ ordinary symbols.
+ 
+ @smallexample
+ (setq count 0)
+      @result{} 0
+ (defun count-syms (s)
+   (setq count (1+ count)))
+      @result{} count-syms
+ (mapatoms 'count-syms)
+      @result{} nil
+ count
+      @result{} 1871
+ @end smallexample
+ 
+ See @code{documentation} in @ref{Accessing Documentation}, for another
+ example using @code{mapatoms}.
+ @end defun
+ 
+ @defun unintern symbol &optional obarray
+ This function deletes @var{symbol} from the obarray @var{obarray}.  If
+ @code{symbol} is not actually in the obarray, @code{unintern} does
+ nothing.  If @var{obarray} is @code{nil}, the current obarray is used.
+ 
+ If you provide a string instead of a symbol as @var{symbol}, it stands
+ for a symbol name.  Then @code{unintern} deletes the symbol (if any) in
+ the obarray which has that name.  If there is no such symbol,
+ @code{unintern} does nothing.
+ 
+ If @code{unintern} does delete a symbol, it returns @code{t}.  Otherwise
+ it returns @code{nil}.
+ @end defun
+ 
+ @node Property Lists,, Creating Symbols, Symbols
+ @section Property Lists
+ @cindex property list
+ @cindex plist
+ 
+   A @dfn{property list} (@dfn{plist} for short) is a list of paired
+ elements stored in the property list cell of a symbol.  Each of the
+ pairs associates a property name (usually a symbol) with a property or
+ value.  Property lists are generally used to record information about a
+ symbol, such as its documentation as a variable, the name of the file
+ where it was defined, or perhaps even the grammatical class of the
+ symbol (representing a word) in a language-understanding system.
+ 
+   Character positions in a string or buffer can also have property lists.
+ @xref{Text Properties}.
+ 
+   The property names and values in a property list can be any Lisp
+ objects, but the names are usually symbols.  They are compared using
+ @code{eq}.  Here is an example of a property list, found on the symbol
+ @code{progn} when the compiler is loaded:
+ 
+ @example
+ (lisp-indent-function 0 byte-compile byte-compile-progn)
+ @end example
+ 
+ @noindent
+ Here @code{lisp-indent-function} and @code{byte-compile} are property
+ names, and the other two elements are the corresponding values.
+ 
+ @menu
+ * Plists and Alists::           Comparison of the advantages of property
+                                   lists and association lists.
+ * Symbol Plists::               Functions to access symbols' property lists.
+ * Other Plists::                Accessing property lists stored elsewhere.
+ @end menu
+ 
+ @node Plists and Alists
+ @subsection Property Lists and Association Lists
+ 
+ @cindex property lists vs association lists
+   Association lists (@pxref{Association Lists}) are very similar to
+ property lists.  In contrast to association lists, the order of the
+ pairs in the property list is not significant since the property names
+ must be distinct.
+ 
+   Property lists are better than association lists for attaching
+ information to various Lisp function names or variables.  If all the
+ associations are recorded in one association list, the program will need
+ to search that entire list each time a function or variable is to be
+ operated on.  By contrast, if the information is recorded in the
+ property lists of the function names or variables themselves, each
+ search will scan only the length of one property list, which is usually
+ short.  This is why the documentation for a variable is recorded in a
+ property named @code{variable-documentation}.  The byte compiler
+ likewise uses properties to record those functions needing special
+ treatment.
+ 
+   However, association lists have their own advantages.  Depending on
+ your application, it may be faster to add an association to the front of
+ an association list than to update a property.  All properties for a
+ symbol are stored in the same property list, so there is a possibility
+ of a conflict between different uses of a property name.  (For this
+ reason, it is a good idea to choose property names that are probably
+ unique, such as by including the name of the library in the property
+ name.)  An association list may be used like a stack where associations
+ are pushed on the front of the list and later discarded; this is not
+ possible with a property list.
+ 
+ @node Symbol Plists
+ @subsection Property List Functions for Symbols
+ 
+ @defun symbol-plist symbol
+ This function returns the property list of @var{symbol}.
+ @end defun
+ 
+ @defun setplist symbol plist
+ This function sets @var{symbol}'s property list to @var{plist}.
+ Normally, @var{plist} should be a well-formed property list, but this is
+ not enforced.
+ 
+ @smallexample
+ (setplist 'foo '(a 1 b (2 3) c nil))
+      @result{} (a 1 b (2 3) c nil)
+ (symbol-plist 'foo)
+      @result{} (a 1 b (2 3) c nil)
+ @end smallexample
+ 
+ For symbols in special obarrays, which are not used for ordinary
+ purposes, it may make sense to use the property list cell in a
+ nonstandard fashion; in fact, the abbrev mechanism does so
+ (@pxref{Abbrevs}).
+ @end defun
+ 
+ @defun get symbol property
+ This function finds the value of the property named @var{property} in
+ @var{symbol}'s property list.  If there is no such property, @code{nil}
+ is returned.  Thus, there is no distinction between a value of
+ @code{nil} and the absence of the property.
+ 
+ The name @var{property} is compared with the existing property names
+ using @code{eq}, so any object is a legitimate property.
+ 
+ See @code{put} for an example.
+ @end defun
+ 
+ @defun put symbol property value
+ This function puts @var{value} onto @var{symbol}'s property list under
+ the property name @var{property}, replacing any previous property value.
+ The @code{put} function returns @var{value}.
+ 
+ @smallexample
+ (put 'fly 'verb 'transitive)
+      @result{}'transitive
+ (put 'fly 'noun '(a buzzing little bug))
+      @result{} (a buzzing little bug)
+ (get 'fly 'verb)
+      @result{} transitive
+ (symbol-plist 'fly)
+      @result{} (verb transitive noun (a buzzing little bug))
+ @end smallexample
+ @end defun
+ 
+ @node Other Plists
+ @subsection Property Lists Outside Symbols
+ 
+   These two functions are useful for manipulating property lists
+ that are stored in places other than symbols:
+ 
+ @defun plist-get plist property
+ This returns the value of the @var{property} property
+ stored in the property list @var{plist}.  For example,
+ 
+ @example
+ (plist-get '(foo 4) 'foo)
+      @result{} 4
+ @end example
+ @end defun
+ 
+ @defun plist-put plist property value
+ This stores @var{value} as the value of the @var{property} property in
+ the property list @var{plist}.  It may modify @var{plist} destructively,
+ or it may construct a new list structure without altering the old.  The
+ function returns the modified property list, so you can store that back
+ in the place where you got @var{plist}.  For example,
+ 
+ @example
+ (setq my-plist '(bar t foo 4))
+      @result{} (bar t foo 4)
+ (setq my-plist (plist-put my-plist 'foo 69))
+      @result{} (bar t foo 69)
+ (setq my-plist (plist-put my-plist 'quux '(a)))
+      @result{} (quux (a) bar t foo 5)
+ @end example
+ @end defun
+ 
Index: emacs/man/elisp-syntax.texi
diff -c /dev/null emacs/man/elisp-syntax.texi:1.2
*** /dev/null	Fri Aug  2 20:59:07 1996
--- emacs/man/elisp-syntax.texi	Thu Aug  1 00:23:34 1996
***************
*** 0 ****
--- 1,723 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/syntax
+ @node Syntax Tables, Abbrevs, Searching and Matching, Top
+ @chapter Syntax Tables
+ @cindex parsing
+ @cindex syntax table
+ @cindex text parsing
+ 
+   A @dfn{syntax table} specifies the syntactic textual function of each
+ character.  This information is used by the parsing commands, the
+ complex movement commands, and others to determine where words, symbols,
+ and other syntactic constructs begin and end.  The current syntax table
+ controls the meaning of the word motion functions (@pxref{Word Motion})
+ and the list motion functions (@pxref{List Motion}) as well as the
+ functions in this chapter.
+ 
+ @menu
+ * Basics: Syntax Basics.     Basic concepts of syntax tables.
+ * Desc: Syntax Descriptors.  How characters are classified.
+ * Syntax Table Functions::   How to create, examine and alter syntax tables.
+ * Motion and Syntax::	     Moving over characters with certain syntaxes.
+ * Parsing Expressions::      Parsing balanced expressions
+                                 using the syntax table.
+ * Standard Syntax Tables::   Syntax tables used by various major modes.
+ * Syntax Table Internals::   How syntax table information is stored.
+ @end menu
+ 
+ @node Syntax Basics
+ @section Syntax Table Concepts
+ 
+ @ifinfo
+   A @dfn{syntax table} provides Emacs with the information that
+ determines the syntactic use of each character in a buffer.  This
+ information is used by the parsing commands, the complex movement
+ commands, and others to determine where words, symbols, and other
+ syntactic constructs begin and end.  The current syntax table controls
+ the meaning of the word motion functions (@pxref{Word Motion}) and the
+ list motion functions (@pxref{List Motion}) as well as the functions in
+ this chapter.
+ @end ifinfo
+ 
+   A syntax table is a vector of 256 elements; it contains one entry for
+ each of the 256 possible characters in an 8-bit byte.  Each element is
+ an integer that encodes the syntax of the character in question.
+ 
+   Syntax tables are used only for moving across text, not for the Emacs
+ Lisp reader.  Emacs Lisp uses built-in syntactic rules when reading Lisp
+ expressions, and these rules cannot be changed.
+ 
+   Each buffer has its own major mode, and each major mode has its own
+ idea of the syntactic class of various characters.  For example, in Lisp
+ mode, the character @samp{;} begins a comment, but in C mode, it
+ terminates a statement.  To support these variations, Emacs makes the
+ choice of syntax table local to each buffer.  Typically, each major
+ mode has its own syntax table and installs that table in each buffer
+ that uses that mode.  Changing this table alters the syntax in all
+ those buffers as well as in any buffers subsequently put in that mode.
+ Occasionally several similar modes share one syntax table.
+ @xref{Example Major Modes}, for an example of how to set up a syntax
+ table.
+ 
+ A syntax table can inherit the data for some characters from the
+ standard syntax table, while specifying other characters itself.  The
+ ``inherit'' syntax class means ``inherit this character's syntax from
+ the standard syntax table.''  Most major modes' syntax tables inherit
+ the syntax of character codes 0 through 31 and 128 through 255.  This is
+ useful with character sets such as ISO Latin-1 that have additional
+ alphabetic characters in the range 128 to 255.  Just changing the
+ standard syntax for these characters affects all major modes.
+ 
+ @defun syntax-table-p object
+ This function returns @code{t} if @var{object} is a vector of length 256
+ elements.  This means that the vector may be a syntax table.  However,
+ according to this test, any vector of length 256 is considered to be a
+ syntax table, no matter what its contents.
+ @end defun
+ 
+ @node Syntax Descriptors
+ @section Syntax Descriptors
+ @cindex syntax classes
+ 
+   This section describes the syntax classes and flags that denote the
+ syntax of a character, and how they are represented as a @dfn{syntax
+ descriptor}, which is a Lisp string that you pass to
+ @code{modify-syntax-entry} to specify the desired syntax.
+ 
+   Emacs defines a number of @dfn{syntax classes}.  Each syntax table
+ puts each character into one class.  There is no necessary relationship
+ between the class of a character in one syntax table and its class in
+ any other table.
+ 
+   Each class is designated by a mnemonic character, which serves as the
+ name of the class when you need to specify a class.  Usually the
+ designator character is one that is frequently in that class; however,
+ its meaning as a designator is unvarying and independent of what syntax
+ that character currently has.
+ 
+ @cindex syntax descriptor
+   A syntax descriptor is a Lisp string that specifies a syntax class, a
+ matching character (used only for the parenthesis classes) and flags.
+ The first character is the designator for a syntax class.  The second
+ character is the character to match; if it is unused, put a space there.
+ Then come the characters for any desired flags.  If no matching
+ character or flags are needed, one character is sufficient.
+ 
+   For example, the descriptor for the character @samp{*} in C mode is
+ @samp{@w{. 23}} (i.e., punctuation, matching character slot unused,
+ second character of a comment-starter, first character of an
+ comment-ender), and the entry for @samp{/} is @samp{@w{. 14}} (i.e.,
+ punctuation, matching character slot unused, first character of a
+ comment-starter, second character of a comment-ender).
+ 
+ @menu
+ * Syntax Class Table::      Table of syntax classes.
+ * Syntax Flags::            Additional flags each character can have.
+ @end menu
+ 
+ @node Syntax Class Table
+ @subsection Table of Syntax Classes
+ 
+   Here is a table of syntax classes, the characters that stand for them,
+ their meanings, and examples of their use.
+ 
+ @deffn {Syntax class} @w{whitespace character}
+ @dfn{Whitespace characters} (designated with @w{@samp{@ }} or @samp{-})
+ separate symbols and words from each other.  Typically, whitespace
+ characters have no other syntactic significance, and multiple whitespace
+ characters are syntactically equivalent to a single one.  Space, tab,
+ newline and formfeed are almost always classified as whitespace.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{word constituent}
+ @dfn{Word constituents} (designated with @samp{w}) are parts of normal
+ English words and are typically used in variable and command names in
+ programs.  All upper- and lower-case letters, and the digits, are typically
+ word constituents.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{symbol constituent}
+ @dfn{Symbol constituents} (designated with @samp{_}) are the extra
+ characters that are used in variable and command names along with word
+ constituents.  For example, the symbol constituents class is used in
+ Lisp mode to indicate that certain characters may be part of symbol
+ names even though they are not part of English words.  These characters
+ are @samp{$&*+-_<>}.  In standard C, the only non-word-constituent
+ character that is valid in symbols is underscore (@samp{_}).
+ @end deffn
+ 
+ @deffn {Syntax class} @w{punctuation character}
+ @dfn{Punctuation characters} (@samp{.}) are those characters that are
+ used as punctuation in English, or are used in some way in a programming
+ language to separate symbols from one another.  Most programming
+ language modes, including Emacs Lisp mode, have no characters in this
+ class since the few characters that are not symbol or word constituents
+ all have other uses.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{open parenthesis character}
+ @deffnx {Syntax class} @w{close parenthesis character}
+ @cindex parenthesis syntax
+ Open and close @dfn{parenthesis characters} are characters used in
+ dissimilar pairs to surround sentences or expressions.  Such a grouping
+ is begun with an open parenthesis character and terminated with a close.
+ Each open parenthesis character matches a particular close parenthesis
+ character, and vice versa.  Normally, Emacs indicates momentarily the
+ matching open parenthesis when you insert a close parenthesis.
+ @xref{Blinking}.
+ 
+ The class of open parentheses is designated with @samp{(}, and that of
+ close parentheses with @samp{)}.
+ 
+ In English text, and in C code, the parenthesis pairs are @samp{()},
+ @samp{[]}, and @samp{@{@}}.  In Emacs Lisp, the delimiters for lists and
+ vectors (@samp{()} and @samp{[]}) are classified as parenthesis
+ characters.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{string quote}
+ @dfn{String quote characters} (designated with @samp{"}) are used in
+ many languages, including Lisp and C, to delimit string constants.  The
+ same string quote character appears at the beginning and the end of a
+ string.  Such quoted strings do not nest.
+ 
+ The parsing facilities of Emacs consider a string as a single token.
+ The usual syntactic meanings of the characters in the string are
+ suppressed.
+ 
+ The Lisp modes have two string quote characters: double-quote (@samp{"})
+ and vertical bar (@samp{|}).  @samp{|} is not used in Emacs Lisp, but it
+ is used in Common Lisp.  C also has two string quote characters:
+ double-quote for strings, and single-quote (@samp{'}) for character
+ constants.
+ 
+ English text has no string quote characters because English is not a
+ programming language.  Although quotation marks are used in English,
+ we do not want them to turn off the usual syntactic properties of
+ other characters in the quotation.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{escape}
+ An @dfn{escape character} (designated with @samp{\}) starts an escape
+ sequence such as is used in C string and character constants.  The
+ character @samp{\} belongs to this class in both C and Lisp.  (In C, it
+ is used thus only inside strings, but it turns out to cause no trouble
+ to treat it this way throughout C code.)
+ 
+ Characters in this class count as part of words if
+ @code{words-include-escapes} is non-@code{nil}.  @xref{Word Motion}.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{character quote}
+ A @dfn{character quote character} (designated with @samp{/}) quotes the
+ following character so that it loses its normal syntactic meaning.  This
+ differs from an escape character in that only the character immediately
+ following is ever affected.
+ 
+ Characters in this class count as part of words if
+ @code{words-include-escapes} is non-@code{nil}.  @xref{Word Motion}.
+ 
+ This class is used for backslash in @TeX{} mode.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{paired delimiter}
+ @dfn{Paired delimiter characters} (designated with @samp{$}) are like
+ string quote characters except that the syntactic properties of the
+ characters between the delimiters are not suppressed.  Only @TeX{} mode
+ uses a paired delimiter presently---the @samp{$} that both enters and
+ leaves math mode.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{expression prefix}
+ An @dfn{expression prefix operator} (designated with @samp{'}) is used
+ for syntactic operators that are part of an expression if they appear
+ next to one.  These characters in Lisp include the apostrophe, @samp{'}
+ (used for quoting), the comma, @samp{,} (used in macros), and @samp{#}
+ (used in the read syntax for certain data types).
+ @end deffn
+ 
+ @deffn {Syntax class} @w{comment starter}
+ @deffnx {Syntax class} @w{comment ender}
+ @cindex comment syntax
+ The @dfn{comment starter} and @dfn{comment ender} characters are used in
+ various languages to delimit comments.  These classes are designated
+ with @samp{<} and @samp{>}, respectively.
+ 
+ English text has no comment characters.  In Lisp, the semicolon
+ (@samp{;}) starts a comment and a newline or formfeed ends one.
+ @end deffn
+ 
+ @deffn {Syntax class} @w{inherit}
+ This syntax class does not specify a syntax.  It says to look in the
+ standard syntax table to find the syntax of this character.  The
+ designator for this syntax code is @samp{@@}.
+ @end deffn
+ 
+ @node Syntax Flags
+ @subsection Syntax Flags
+ @cindex syntax flags
+ 
+   In addition to the classes, entries for characters in a syntax table
+ can include flags.  There are six possible flags, represented by the
+ characters @samp{1}, @samp{2}, @samp{3}, @samp{4}, @samp{b} and
+ @samp{p}.
+ 
+   All the flags except @samp{p} are used to describe multi-character
+ comment delimiters.  The digit flags indicate that a character can
+ @emph{also} be part of a comment sequence, in addition to the syntactic
+ properties associated with its character class.  The flags are
+ independent of the class and each other for the sake of characters such
+ as @samp{*} in C mode, which is a punctuation character, @emph{and} the
+ second character of a start-of-comment sequence (@samp{/*}), @emph{and}
+ the first character of an end-of-comment sequence (@samp{*/}).
+ 
+ The flags for a character @var{c} are:
+ 
+ @itemize @bullet
+ @item
+ @samp{1} means @var{c} is the start of a two-character comment-start
+ sequence.
+ 
+ @item
+ @samp{2} means @var{c} is the second character of such a sequence.
+ 
+ @item
+ @samp{3} means @var{c} is the start of a two-character comment-end
+ sequence.
+ 
+ @item
+ @samp{4} means @var{c} is the second character of such a sequence.
+ 
+ @item
+ @c Emacs 19 feature
+ @samp{b} means that @var{c} as a comment delimiter belongs to the
+ alternative ``b'' comment style.
+ 
+ Emacs supports two comment styles simultaneously in any one syntax
+ table.  This is for the sake of C++.  Each style of comment syntax has
+ its own comment-start sequence and its own comment-end sequence.  Each
+ comment must stick to one style or the other; thus, if it starts with
+ the comment-start sequence of style ``b'', it must also end with the
+ comment-end sequence of style ``b''.
+ 
+ The two comment-start sequences must begin with the same character; only
+ the second character may differ.  Mark the second character of the
+ ``b''-style comment-start sequence with the @samp{b} flag.
+ 
+ A comment-end sequence (one or two characters) applies to the ``b''
+ style if its first character has the @samp{b} flag set; otherwise, it
+ applies to the ``a'' style.
+ 
+ The appropriate comment syntax settings for C++ are as follows:
+ 
+ @table @asis
+ @item @samp{/}
+ @samp{124b}
+ @item @samp{*}
+ @samp{23}
+ @item newline
+ @samp{>b}
+ @end table
+ 
+ This defines four comment-delimiting sequences:
+ 
+ @table @asis
+ @item @samp{/*}
+ This is a comment-start sequence for ``a'' style because the
+ second character, @samp{*}, does not have the @samp{b} flag.
+ 
+ @item @samp{//}
+ This is a comment-start sequence for ``b'' style because the second
+ character, @samp{/}, does have the @samp{b} flag.
+ 
+ @item @samp{*/}
+ This is a comment-end sequence for ``a'' style because the first
+ character, @samp{*}, does not have the @samp{b} flag
+ 
+ @item newline
+ This is a comment-end sequence for ``b'' style, because the newline
+ character has the @samp{b} flag.
+ @end table
+ 
+ @item
+ @c Emacs 19 feature
+ @samp{p} identifies an additional ``prefix character'' for Lisp syntax.
+ These characters are treated as whitespace when they appear between
+ expressions.  When they appear within an expression, they are handled
+ according to their usual syntax codes.
+ 
+ The function @code{backward-prefix-chars} moves back over these
+ characters, as well as over characters whose primary syntax class is
+ prefix (@samp{'}).  @xref{Motion and Syntax}.
+ @end itemize
+ 
+ @node Syntax Table Functions
+ @section Syntax Table Functions
+ 
+   In this section we describe functions for creating, accessing and
+ altering syntax tables.
+ 
+ @defun make-syntax-table
+ This function creates a new syntax table.  Character codes 0 through
+ 31 and 128 through 255 are set up to inherit from the standard syntax
+ table.  The other character codes are set up by copying what the
+ standard syntax table says about them.
+ 
+ Most major mode syntax tables are created in this way.
+ @end defun
+ 
+ @defun copy-syntax-table &optional table
+ This function constructs a copy of @var{table} and returns it.  If
+ @var{table} is not supplied (or is @code{nil}), it returns a copy of the
+ current syntax table.  Otherwise, an error is signaled if @var{table} is
+ not a syntax table.
+ @end defun
+ 
+ @deffn Command modify-syntax-entry char syntax-descriptor  &optional table
+ This function sets the syntax entry for @var{char} according to
+ @var{syntax-descriptor}.  The syntax is changed only for @var{table},
+ which defaults to the current buffer's syntax table, and not in any
+ other syntax table.  The argument @var{syntax-descriptor} specifies the
+ desired syntax; this is a string beginning with a class designator
+ character, and optionally containing a matching character and flags as
+ well.  @xref{Syntax Descriptors}.
+ 
+ This function always returns @code{nil}.  The old syntax information in
+ the table for this character is discarded.
+ 
+ An error is signaled if the first character of the syntax descriptor is not
+ one of the twelve syntax class designator characters.  An error is also
+ signaled if @var{char} is not a character.
+ 
+ @example
+ @group
+ @exdent @r{Examples:}
+ 
+ ;; @r{Put the space character in class whitespace.}
+ (modify-syntax-entry ?\  " ")
+      @result{} nil
+ @end group
+ 
+ @group
+ ;; @r{Make @samp{$} an open parenthesis character,}
+ ;;   @r{with @samp{^} as its matching close.}
+ (modify-syntax-entry ?$ "(^")
+      @result{} nil
+ @end group
+ 
+ @group
+ ;; @r{Make @samp{^} a close parenthesis character,}
+ ;;   @r{with @samp{$} as its matching open.}
+ (modify-syntax-entry ?^ ")$")
+      @result{} nil
+ @end group
+ 
+ @group
+ ;; @r{Make @samp{/} a punctuation character,}
+ ;;   @r{the first character of a start-comment sequence,}
+ ;;   @r{and the second character of an end-comment sequence.}
+ ;;   @r{This is used in C mode.}
+ (modify-syntax-entry ?/ ". 14")
+      @result{} nil
+ @end group
+ @end example
+ @end deffn
+ 
+ @defun char-syntax character
+ This function returns the syntax class of @var{character}, represented
+ by its mnemonic designator character.  This @emph{only} returns the
+ class, not any matching parenthesis or flags.
+ 
+ An error is signaled if @var{char} is not a character.
+ 
+ The following examples apply to C mode.  The first example shows that
+ the syntax class of space is whitespace (represented by a space).  The
+ second example shows that the syntax of @samp{/} is punctuation.  This
+ does not show the fact that it is also part of comment-start and -end
+ sequences.  The third example shows that open parenthesis is in the class
+ of open parentheses.  This does not show the fact that it has a matching
+ character, @samp{)}.
+ 
+ @example
+ @group
+ (char-to-string (char-syntax ?\ ))
+      @result{} " "
+ @end group
+ 
+ @group
+ (char-to-string (char-syntax ?/))
+      @result{} "."
+ @end group
+ 
+ @group
+ (char-to-string (char-syntax ?\())
+      @result{} "("
+ @end group
+ @end example
+ @end defun
+ 
+ @defun set-syntax-table table
+ This function makes @var{table} the syntax table for the current buffer.
+ It returns @var{table}.
+ @end defun
+ 
+ @defun syntax-table
+ This function returns the current syntax table, which is the table for
+ the current buffer.
+ @end defun
+ 
+ @node Motion and Syntax
+ @section Motion and Syntax
+ 
+   This section describes functions for moving across characters in
+ certain syntax classes.  None of these functions exists in Emacs
+ version 18 or earlier.
+ 
+ @defun skip-syntax-forward syntaxes &optional limit
+ This function moves point forward across characters having syntax classes
+ mentioned in @var{syntaxes}.  It stops when it encounters the end of
+ the buffer, or position @var{limit} (if specified), or a character it is
+ not supposed to skip.
+ @ignore @c may want to change this.
+ The return value is the distance traveled, which is a nonnegative
+ integer.
+ @end ignore
+ @end defun
+ 
+ @defun skip-syntax-backward syntaxes &optional limit
+ This function moves point backward across characters whose syntax
+ classes are mentioned in @var{syntaxes}.  It stops when it encounters
+ the beginning of the buffer, or position @var{limit} (if specified), or a
+ character it is not supposed to skip.
+ @ignore @c may want to change this.
+ The return value indicates the distance traveled.  It is an integer that
+ is zero or less.
+ @end ignore
+ @end defun
+ 
+ @defun backward-prefix-chars
+ This function moves point backward over any number of characters with
+ expression prefix syntax.  This includes both characters in the
+ expression prefix syntax class, and characters with the @samp{p} flag.
+ @end defun
+ 
+ @node Parsing Expressions
+ @section Parsing Balanced Expressions
+ 
+   Here are several functions for parsing and scanning balanced
+ expressions, also known as @dfn{sexps}, in which parentheses match in
+ pairs.  The syntax table controls the interpretation of characters, so
+ these functions can be used for Lisp expressions when in Lisp mode and
+ for C expressions when in C mode.  @xref{List Motion}, for convenient
+ higher-level functions for moving over balanced expressions.
+ 
+ @defun parse-partial-sexp start limit &optional target-depth stop-before state stop-comment
+ This function parses a sexp in the current buffer starting at
+ @var{start}, not scanning past @var{limit}.  It stops at position
+ @var{limit} or when certain criteria described below are met, and sets
+ point to the location where parsing stops.  It returns a value
+ describing the status of the parse at the point where it stops.
+ 
+ If @var{state} is @code{nil}, @var{start} is assumed to be at the top
+ level of parenthesis structure, such as the beginning of a function
+ definition.  Alternatively, you might wish to resume parsing in the
+ middle of the structure.  To do this, you must provide a @var{state}
+ argument that describes the initial status of parsing.
+ 
+ @cindex parenthesis depth
+ If the third argument @var{target-depth} is non-@code{nil}, parsing
+ stops if the depth in parentheses becomes equal to @var{target-depth}.
+ The depth starts at 0, or at whatever is given in @var{state}.
+ 
+ If the fourth argument @var{stop-before} is non-@code{nil}, parsing
+ stops when it comes to any character that starts a sexp.  If
+ @var{stop-comment} is non-@code{nil}, parsing stops when it comes to the
+ start of a comment.
+ 
+ @cindex parse state
+ The fifth argument @var{state} is an eight-element list of the same
+ form as the value of this function, described below.  The return value
+ of one call may be used to initialize the state of the parse on another
+ call to @code{parse-partial-sexp}.
+ 
+ The result is a list of eight elements describing the final state of
+ the parse:
+ 
+ @enumerate 0
+ @item 
+ The depth in parentheses, counting from 0.
+ 
+ @item 
+ @cindex innermost containing parentheses
+ The character position of the start of the innermost parenthetical
+ grouping containing the stopping point; @code{nil} if none.
+ 
+ @item 
+ @cindex previous complete subexpression
+ The character position of the start of the last complete subexpression
+ terminated; @code{nil} if none.
+ 
+ @item 
+ @cindex inside string
+ Non-@code{nil} if inside a string.  More precisely, this is the
+ character that will terminate the string.
+ 
+ @item 
+ @cindex inside comment
+ @code{t} if inside a comment (of either style).
+ 
+ @item 
+ @cindex quote character
+ @code{t} if point is just after a quote character.
+ 
+ @item 
+ The minimum parenthesis depth encountered during this scan.
+ 
+ @item
+ @code{t} if inside a comment of style ``b''.
+ @end enumerate
+ 
+ Elements 0, 3, 4, 5 and 7 are significant in the argument @var{state}.
+ 
+ @cindex indenting with parentheses
+ This function is most often used to compute indentation for languages
+ that have nested parentheses.
+ @end defun
+ 
+ @defun scan-lists from count depth
+ This function scans forward @var{count} balanced parenthetical groupings
+ from character number @var{from}.  It returns the character position
+ where the scan stops.
+ 
+ If @var{depth} is nonzero, parenthesis depth counting begins from that
+ value.  The only candidates for stopping are places where the depth in
+ parentheses becomes zero; @code{scan-lists} counts @var{count} such
+ places and then stops.  Thus, a positive value for @var{depth} means go
+ out @var{depth} levels of parenthesis.
+ 
+ Scanning ignores comments if @code{parse-sexp-ignore-comments} is
+ non-@code{nil}.
+ 
+ If the scan reaches the beginning or end of the buffer (or its
+ accessible portion), and the depth is not zero, an error is signaled.
+ If the depth is zero but the count is not used up, @code{nil} is
+ returned.
+ @end defun
+ 
+ @defun scan-sexps from count
+ This function scans forward @var{count} sexps from character position
+ @var{from}.  It returns the character position where the scan stops.
+ 
+ Scanning ignores comments if @code{parse-sexp-ignore-comments} is
+ non-@code{nil}.
+ 
+ If the scan reaches the beginning or end of (the accessible part of) the
+ buffer in the middle of a parenthetical grouping, an error is signaled.
+ If it reaches the beginning or end between groupings but before count is
+ used up, @code{nil} is returned.
+ @end defun
+ 
+ @defvar parse-sexp-ignore-comments
+ @cindex skipping comments
+ If the value is non-@code{nil}, then comments are treated as
+ whitespace by the functions in this section and by @code{forward-sexp}.
+ 
+ In older Emacs versions, this feature worked only when the comment
+ terminator is something like @samp{*/}, and appears only to end a
+ comment.  In languages where newlines terminate comments, it was
+ necessary make this variable @code{nil}, since not every newline is the
+ end of a comment.  This limitation no longer exists.
+ @end defvar
+ 
+ You can use @code{forward-comment} to move forward or backward over
+ one comment or several comments.
+ 
+ @defun forward-comment count
+ This function moves point forward across @var{count} comments (backward,
+ if @var{count} is negative).  If it finds anything other than a comment
+ or whitespace, it stops, leaving point at the place where it stopped.
+ It also stops after satisfying @var{count}.
+ @end defun
+ 
+ To move forward over all comments and whitespace following point, use
+ @code{(forward-comment (buffer-size))}.  @code{(buffer-size)} is a good
+ argument to use, because the number of comments in the buffer cannot
+ exceed that many.
+ 
+ @node Standard Syntax Tables
+ @section Some Standard Syntax Tables
+ 
+   Most of the major modes in Emacs have their own syntax tables.  Here
+ are several of them:
+ 
+ @defun standard-syntax-table
+ This function returns the standard syntax table, which is the syntax
+ table used in Fundamental mode.
+ @end defun
+ 
+ @defvar text-mode-syntax-table
+ The value of this variable is the syntax table used in Text mode.
+ @end defvar
+ 
+ @defvar c-mode-syntax-table
+ The value of this variable is the syntax table for C-mode buffers.
+ @end defvar
+ 
+ @defvar emacs-lisp-mode-syntax-table
+ The value of this variable is the syntax table used in Emacs Lisp mode
+ by editing commands.  (It has no effect on the Lisp @code{read}
+ function.)
+ @end defvar
+ 
+ @node Syntax Table Internals
+ @section Syntax Table Internals
+ @cindex syntax table internals
+ 
+   Each element of a syntax table is an integer that encodes the syntax
+ of one character: the syntax class, possible matching character, and
+ flags.  Lisp programs don't usually work with the elements directly; the
+ Lisp-level syntax table functions usually work with syntax descriptors
+ (@pxref{Syntax Descriptors}).
+ 
+   The low 8 bits of each element of a syntax table indicate the
+ syntax class.
+ 
+ @table @asis
+ @item @i{Integer}
+ @i{Class}
+ @item 0
+ whitespace
+ @item 1
+ punctuation
+ @item 2
+ word
+ @item 3
+ symbol
+ @item 4
+ open parenthesis
+ @item 5
+ close parenthesis
+ @item 6
+ expression prefix
+ @item 7
+ string quote
+ @item 8
+ paired delimiter
+ @item 9
+ escape
+ @item 10
+ character quote
+ @item 11
+ comment-start
+ @item 12
+ comment-end
+ @item 13
+ inherit
+ @end table
+ 
+   The next 8 bits are the matching opposite parenthesis (if the
+ character has parenthesis syntax); otherwise, they are not meaningful.
+ The next 6 bits are the flags.
Index: emacs/man/elisp-text.texi
diff -c /dev/null emacs/man/elisp-text.texi:1.2
*** /dev/null	Fri Aug  2 20:59:19 1996
--- emacs/man/elisp-text.texi	Thu Aug  1 00:23:37 1996
***************
*** 0 ****
--- 1,2955 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/text
+ @node Text, Searching and Matching, Markers, Top
+ @chapter Text
+ @cindex text
+ 
+   This chapter describes the functions that deal with the text in a
+ buffer.  Most examine, insert, or delete text in the current buffer,
+ often in the vicinity of point.  Many are interactive.  All the
+ functions that change the text provide for undoing the changes
+ (@pxref{Undo}).
+ 
+   Many text-related functions operate on a region of text defined by two
+ buffer positions passed in arguments named @var{start} and @var{end}.
+ These arguments should be either markers (@pxref{Markers}) or numeric
+ character positions (@pxref{Positions}).  The order of these arguments
+ does not matter; it is all right for @var{start} to be the end of the
+ region and @var{end} the beginning.  For example, @code{(delete-region 1
+ 10)} and @code{(delete-region 10 1)} are equivalent.  An
+ @code{args-out-of-range} error is signaled if either @var{start} or
+ @var{end} is outside the accessible portion of the buffer.  In an
+ interactive call, point and the mark are used for these arguments.
+ 
+ @cindex buffer contents
+   Throughout this chapter, ``text'' refers to the characters in the
+ buffer, together with their properties (when relevant).
+ 
+ @menu
+ * Near Point::       Examining text in the vicinity of point.
+ * Buffer Contents::  Examining text in a general fashion.
+ * Comparing Text::   Comparing substrings of buffers.
+ * Insertion::        Adding new text to a buffer.
+ * Commands for Insertion::  User-level commands to insert text.
+ * Deletion::         Removing text from a buffer.
+ * User-Level Deletion::     User-level commands to delete text.
+ * The Kill Ring::    Where removed text sometimes is saved for later use.
+ * Undo::             Undoing changes to the text of a buffer.
+ * Maintaining Undo:: How to enable and disable undo information.
+ 			How to control how much information is kept.
+ * Filling::          Functions for explicit filling.
+ * Margins::          How to specify margins for filling commands.
+ * Auto Filling::     How auto-fill mode is implemented to break lines.
+ * Sorting::          Functions for sorting parts of the buffer.
+ * Columns::          Computing horizontal positions, and using them.
+ * Indentation::      Functions to insert or adjust indentation.
+ * Case Changes::     Case conversion of parts of the buffer.
+ * Text Properties::  Assigning Lisp property lists to text characters.
+ * Substitution::     Replacing a given character wherever it appears.
+ * Transposition::    Swapping two portions of a buffer.
+ * Registers::        How registers are implemented.  Accessing the text or
+                        position stored in a register.
+ * Change Hooks::     Supplying functions to be run when text is changed.
+ @end menu
+ 
+ @node Near Point
+ @section Examining Text Near Point
+ 
+   Many functions are provided to look at the characters around point.
+ Several simple functions are described here.  See also @code{looking-at}
+ in @ref{Regexp Search}.
+ 
+ @defun char-after position
+ This function returns the character in the current buffer at (i.e.,
+ immediately after) position @var{position}.  If @var{position} is out of
+ range for this purpose, either before the beginning of the buffer, or at
+ or beyond the end, then the value is @code{nil}.
+ 
+ In the following example, assume that the first character in the
+ buffer is @samp{@@}:
+ 
+ @example
+ @group
+ (char-to-string (char-after 1))
+      @result{} "@@"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun following-char
+ This function returns the character following point in the current
+ buffer.  This is similar to @code{(char-after (point))}.  However, if
+ point is at the end of the buffer, then @code{following-char} returns 0.
+ 
+ Remember that point is always between characters, and the terminal
+ cursor normally appears over the character following point.  Therefore,
+ the character returned by @code{following-char} is the character the
+ cursor is over.
+ 
+ In this example, point is between the @samp{a} and the @samp{c}.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ Gentlemen may cry ``Pea@point{}ce! Peace!,''
+ but there is no peace.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (char-to-string (preceding-char))
+      @result{} "a"
+ (char-to-string (following-char))
+      @result{} "c"
+ @end group
+ @end example
+ @end defun
+ 
+ @defun preceding-char
+ This function returns the character preceding point in the current
+ buffer.  See above, under @code{following-char}, for an example.  If
+ point is at the beginning of the buffer, @code{preceding-char} returns
+ 0.
+ @end defun
+ 
+ @defun bobp
+ This function returns @code{t} if point is at the beginning of the
+ buffer.  If narrowing is in effect, this means the beginning of the
+ accessible portion of the text.  See also @code{point-min} in
+ @ref{Point}.
+ @end defun
+ 
+ @defun eobp
+ This function returns @code{t} if point is at the end of the buffer.
+ If narrowing is in effect, this means the end of accessible portion of
+ the text.  See also @code{point-max} in @xref{Point}.
+ @end defun
+ 
+ @defun bolp
+ This function returns @code{t} if point is at the beginning of a line.
+ @xref{Text Lines}.  The beginning of the buffer (or its accessible
+ portion) always counts as the beginning of a line.
+ @end defun
+ 
+ @defun eolp
+ This function returns @code{t} if point is at the end of a line.  The
+ end of the buffer (or of its accessible portion) is always considered
+ the end of a line.
+ @end defun
+ 
+ @node Buffer Contents
+ @section Examining Buffer Contents
+ 
+   This section describes two functions that allow a Lisp program to
+ convert any portion of the text in the buffer into a string.
+ 
+ @defun buffer-substring start end
+ This function returns a string containing a copy of the text of the
+ region defined by positions @var{start} and @var{end} in the current
+ buffer.  If the arguments are not positions in the accessible portion of
+ the buffer, @code{buffer-substring} signals an @code{args-out-of-range}
+ error.
+ 
+ It is not necessary for @var{start} to be less than @var{end}; the
+ arguments can be given in either order.  But most often the smaller
+ argument is written first.
+ 
+ If the text being copied has any text properties, these are copied into
+ the string along with the characters they belong to.  @xref{Text
+ Properties}.  However, overlays (@pxref{Overlays}) in the buffer and
+ their properties are ignored, not copied.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This is the contents of buffer foo
+ 
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (buffer-substring 1 10)
+ @result{} "This is t"
+ @end group
+ @group
+ (buffer-substring (point-max) 10)
+ @result{} "he contents of buffer foo
+ "
+ @end group
+ @end example
+ @end defun
+ 
+ @defun buffer-substring-without-properties start end
+ This is like @code{buffer-substring}, except that it does not copy text
+ properties, just the characters themselves.  @xref{Text Properties}.
+ Here's an example of using this function to get a word to look up in an
+ alist:
+ 
+ @example
+ (setq flammable
+       (assoc (buffer-substring start end)
+              '(("wood" . t) ("paper" . t)
+                ("steel" . nil) ("asbestos" . nil))))
+ @end example
+ 
+ If this were written using @code{buffer-substring} instead, it would not
+ work reliably; any text properties that happened to be in the word
+ copied from the buffer would make the comparisons fail.
+ @end defun
+ 
+ @defun buffer-string
+ This function returns the contents of the accessible portion of the
+ current buffer as a string.  This is the portion between
+ @code{(point-min)} and @code{(point-max)} (@pxref{Narrowing}).
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This is the contents of buffer foo
+ 
+ ---------- Buffer: foo ----------
+ 
+ (buffer-string)
+      @result{} "This is the contents of buffer foo
+ "
+ @end group
+ @end example
+ @end defun
+ 
+ @node Comparing Text
+ @section Comparing Text
+ @cindex comparing buffer text
+ 
+   This function lets you compare portions of the text in a buffer, without
+ copying them into strings first.
+ 
+ @defun compare-buffer-substrings buffer1 start1 end1 buffer2 start2 end2
+ This function lets you compare two substrings of the same buffer or two
+ different buffers.  The first three arguments specify one substring,
+ giving a buffer and two positions within the buffer.  The last three
+ arguments specify the other substring in the same way.  You can use
+ @code{nil} for @var{buffer1}, @var{buffer2}, or both to stand for the
+ current buffer.
+ 
+ The value is negative if the first substring is less, positive if the
+ first is greater, and zero if they are equal.  The absolute value of
+ the result is one plus the index of the first differing characters
+ within the substrings.
+ 
+ This function ignores case when comparing characters
+ if @code{case-fold-search} is non-@code{nil}.  It always ignores
+ text properties.
+ 
+ Suppose the current buffer contains the text @samp{foobarbar
+ haha!rara!}; then in this example the two substrings are @samp{rbar }
+ and @samp{rara!}.  The value is 2 because the first substring is greater
+ at the second character.
+ 
+ @example
+ (compare-buffer-substring nil 6 11 nil 16 21)
+      @result{} 2
+ @end example
+ @end defun
+ 
+ @node Insertion
+ @section Inserting Text
+ @cindex insertion of text
+ @cindex text insertion
+ 
+   @dfn{Insertion} means adding new text to a buffer.  The inserted text
+ goes at point---between the character before point and the character
+ after point.
+ 
+   Insertion relocates markers that point at positions after the
+ insertion point, so that they stay with the surrounding text
+ (@pxref{Markers}).  When a marker points at the place of insertion,
+ insertion normally doesn't relocate the marker, so that it points to the
+ beginning of the inserted text; however, certain special functions such
+ as @code{insert-before-markers} relocate such markers to point after the
+ inserted text.
+ 
+ @cindex insertion before point
+ @cindex before point, insertion
+   Some insertion functions leave point before the inserted text, while
+ other functions leave it after.  We call the former insertion @dfn{after
+ point} and the latter insertion @dfn{before point}.
+ 
+   Insertion functions signal an error if the current buffer is
+ read-only.
+ 
+   These functions copy text characters from strings and buffers along
+ with their properties.  The inserted characters have exactly the same
+ properties as the characters they were copied from.  By contrast,
+ characters specified as separate arguments, not part of a string or
+ buffer, inherit their text properties from the neighboring text.
+ 
+ @defun insert &rest args
+ This function inserts the strings and/or characters @var{args} into the
+ current buffer, at point, moving point forward.  In other words, it
+ inserts the text before point.  An error is signaled unless all
+ @var{args} are either strings or characters.  The value is @code{nil}.
+ @end defun
+ 
+ @defun insert-before-markers &rest args
+ This function inserts the strings and/or characters @var{args} into the
+ current buffer, at point, moving point forward.  An error is signaled
+ unless all @var{args} are either strings or characters.  The value is
+ @code{nil}.
+ 
+ This function is unlike the other insertion functions in that it
+ relocates markers initially pointing at the insertion point, to point
+ after the inserted text.
+ @end defun
+ 
+ @defun insert-char character count &optional inherit
+ This function inserts @var{count} instances of @var{character} into the
+ current buffer before point.  The argument @var{count} must be a number,
+ and @var{character} must be a character.  The value is @code{nil}.
+ @c It's unfortunate that count comes second.  Not like make-string, etc.
+ 
+ If @var{inherit} is non-@code{nil}, then the inserted characters inherit
+ sticky text properties from the two characters before and after the
+ insertion point.  @xref{Sticky Properties}.
+ @end defun
+ 
+ @defun insert-buffer-substring from-buffer-or-name &optional start end
+ This function inserts a portion of buffer @var{from-buffer-or-name}
+ (which must already exist) into the current buffer before point.  The
+ text inserted is the region from @var{start} and @var{end}.  (These
+ arguments default to the beginning and end of the accessible portion of
+ that buffer.)  This function returns @code{nil}.
+ 
+ In this example, the form is executed with buffer @samp{bar} as the
+ current buffer.  We assume that buffer @samp{bar} is initially empty.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ We hold these truths to be self-evident, that all
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (insert-buffer-substring "foo" 1 20)
+      @result{} nil
+ 
+ ---------- Buffer: bar ----------
+ We hold these truth@point{}
+ ---------- Buffer: bar ----------
+ @end group
+ @end example
+ @end defun
+ 
+   @xref{Sticky Properties}, for other insertion functions that inherit
+ text properties from the nearby text in addition to inserting it.
+ Whitespace inserted by indentation functions also inherits text
+ properties.
+ 
+ @node Commands for Insertion
+ @section User-Level Insertion Commands
+ 
+   This section describes higher-level commands for inserting text,
+ commands intended primarily for the user but useful also in Lisp
+ programs.
+ 
+ @deffn Command insert-buffer from-buffer-or-name
+ This command inserts the entire contents of @var{from-buffer-or-name}
+ (which must exist) into the current buffer after point.  It leaves
+ the mark after the inserted text.  The value is @code{nil}.
+ @end deffn
+ 
+ @deffn Command self-insert-command count
+ @cindex character insertion
+ @cindex self-insertion
+ This command inserts the last character typed; it does so @var{count}
+ times, before point, and returns @code{nil}.  Most printing characters
+ are bound to this command.  In routine use, @code{self-insert-command}
+ is the most frequently called function in Emacs, but programs rarely use
+ it except to install it on a keymap.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument.
+ 
+ This command calls @code{auto-fill-function} whenever that is
+ non-@code{nil} and the character inserted is a space or a newline
+ (@pxref{Auto Filling}).
+ 
+ @c Cross refs reworded to prevent overfull hbox.  --rjc 15mar92
+ This command performs abbrev expansion if Abbrev mode is enabled and
+ the inserted character does not have word-constituent
+ syntax. (@xref{Abbrevs}, and @ref{Syntax Class Table}.)
+ 
+ This is also responsible for calling @code{blink-paren-function} when
+ the inserted character has close parenthesis syntax (@pxref{Blinking}).
+ @end deffn
+ 
+ @deffn Command newline &optional number-of-newlines 
+ This command inserts newlines into the current buffer before point.
+ If @var{number-of-newlines} is supplied, that many newline characters
+ are inserted.
+ 
+ @cindex newline and Auto Fill mode
+ This function calls @code{auto-fill-function} if the current column
+ number is greater than the value of @code{fill-column} and
+ @var{number-of-newlines} is @code{nil}.  Typically what
+ @code{auto-fill-function} does is insert a newline; thus, the overall
+ result in this case is to insert two newlines at different places: one
+ at point, and another earlier in the line.  @code{newline} does not
+ auto-fill if @var{number-of-newlines} is non-@code{nil}.
+ 
+ This command indents to the left margin if that is not zero.
+ @xref{Margins}.
+ 
+ The value returned is @code{nil}.  In an interactive call, @var{count}
+ is the numeric prefix argument.
+ @end deffn
+ 
+ @deffn Command split-line
+ This command splits the current line, moving the portion of the line
+ after point down vertically so that it is on the next line directly
+ below where it was before.  Whitespace is inserted as needed at the
+ beginning of the lower line, using the @code{indent-to} function.
+ @code{split-line} returns the position of point.
+ 
+ Programs hardly ever use this function.
+ @end deffn
+ 
+ @defvar overwrite-mode
+ This variable controls whether overwrite mode is in effect: a
+ non-@code{nil} value enables the mode.  It is automatically made
+ buffer-local when set in any fashion.
+ @end defvar
+ 
+ @node Deletion
+ @section Deleting Text
+ 
+ @cindex deletion vs killing
+   Deletion means removing part of the text in a buffer, without saving
+ it in the kill ring (@pxref{The Kill Ring}).  Deleted text can't be
+ yanked, but can be reinserted using the undo mechanism (@pxref{Undo}).
+ Some deletion functions do save text in the kill ring in some special
+ cases.
+ 
+   All of the deletion functions operate on the current buffer, and all
+ return a value of @code{nil}.
+ 
+ @defun erase-buffer
+ This function deletes the entire text of the current buffer, leaving it
+ empty.  If the buffer is read-only, it signals a @code{buffer-read-only}
+ error.  Otherwise, it deletes the text without asking for any
+ confirmation.  It returns @code{nil}.
+ 
+ Normally, deleting a large amount of text from a buffer inhibits further
+ auto-saving of that buffer ``because it has shrunk''.  However,
+ @code{erase-buffer} does not do this, the idea being that the future
+ text is not really related to the former text, and its size should not
+ be compared with that of the former text.
+ @end defun
+ 
+ @deffn Command delete-region start end
+ This command deletes the text in the current buffer in the region
+ defined by @var{start} and @var{end}.  The value is @code{nil}.
+ @end deffn
+ 
+ @deffn Command delete-char count &optional killp
+ This command deletes @var{count} characters directly after point, or
+ before point if @var{count} is negative.  If @var{killp} is
+ non-@code{nil}, then it saves the deleted characters in the kill ring.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument, and
+ @var{killp} is the unprocessed prefix argument.  Therefore, if a prefix
+ argument is supplied, the text is saved in the kill ring.  If no prefix
+ argument is supplied, then one character is deleted, but not saved in
+ the kill ring.
+ 
+ The value returned is always @code{nil}.
+ @end deffn
+ 
+ @deffn Command delete-backward-char count &optional killp
+ @cindex delete previous char
+ This command deletes @var{count} characters directly before point, or
+ after point if @var{count} is negative.  If @var{killp} is
+ non-@code{nil}, then it saves the deleted characters in the kill ring.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument, and
+ @var{killp} is the unprocessed prefix argument.  Therefore, if a prefix
+ argument is supplied, the text is saved in the kill ring.  If no prefix
+ argument is supplied, then one character is deleted, but not saved in
+ the kill ring.
+ 
+ The value returned is always @code{nil}.
+ @end deffn
+ 
+ @deffn Command backward-delete-char-untabify count &optional killp
+ @cindex tab deletion
+ This command deletes @var{count} characters backward, changing tabs
+ into spaces.  When the next character to be deleted is a tab, it is
+ first replaced with the proper number of spaces to preserve alignment
+ and then one of those spaces is deleted instead of the tab.  If
+ @var{killp} is non-@code{nil}, then the command saves the deleted
+ characters in the kill ring.
+ 
+ Conversion of tabs to spaces happens only if @var{count} is positive.
+ If it is negative, exactly @minus{}@var{count} characters after point
+ are deleted.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument, and
+ @var{killp} is the unprocessed prefix argument.  Therefore, if a prefix
+ argument is supplied, the text is saved in the kill ring.  If no prefix
+ argument is supplied, then one character is deleted, but not saved in
+ the kill ring.
+ 
+ The value returned is always @code{nil}.
+ @end deffn
+ 
+ @node User-Level Deletion
+ @section User-Level Deletion Commands
+ 
+   This section describes higher-level commands for deleting text,
+ commands intended primarily for the user but useful also in Lisp
+ programs.
+ 
+ @deffn Command delete-horizontal-space
+ @cindex deleting whitespace
+ This function deletes all spaces and tabs around point.  It returns
+ @code{nil}.
+ 
+ In the following examples, we call @code{delete-horizontal-space} four
+ times, once on each line, with point between the second and third
+ characters on the line each time.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ I @point{}thought
+ I @point{}     thought
+ We@point{} thought
+ Yo@point{}u thought
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (delete-horizontal-space)   ; @r{Four times.}
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ Ithought
+ Ithought
+ Wethought
+ You thought
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command delete-indentation &optional join-following-p 
+ This function joins the line point is on to the previous line, deleting
+ any whitespace at the join and in some cases replacing it with one
+ space.  If @var{join-following-p} is non-@code{nil},
+ @code{delete-indentation} joins this line to the following line
+ instead.  The value is @code{nil}.
+ 
+ If there is a fill prefix, and the second of the lines being joined
+ starts with the prefix, then @code{delete-indentation} deletes the
+ fill prefix before joining the lines.  @xref{Margins}.
+ 
+ In the example below, point is located on the line starting
+ @samp{events}, and it makes no difference if there are trailing spaces
+ in the preceding line.
+ 
+ @smallexample
+ @group
+ ---------- Buffer: foo ----------
+ When in the course of human
+ @point{}    events, it becomes necessary
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ (delete-indentation)
+      @result{} nil
+ 
+ @group
+ ---------- Buffer: foo ----------
+ When in the course of human@point{} events, it becomes necessary
+ ---------- Buffer: foo ----------
+ @end group
+ @end smallexample
+ 
+ After the lines are joined, the function @code{fixup-whitespace} is
+ responsible for deciding whether to leave a space at the junction.
+ @end deffn
+ 
+ @defun fixup-whitespace
+ This function replaces all the white space surrounding point with either
+ one space or no space, according to the context.  It returns @code{nil}.
+ 
+ At the beginning or end of a line, the appropriate amount of space is
+ none.  Before a character with close parenthesis syntax, or after a
+ character with open parenthesis or expression-prefix syntax, no space is
+ also appropriate.  Otherwise, one space is appropriate.  @xref{Syntax
+ Class Table}.
+ 
+ In the example below, @code{fixup-whitespace} is called the first time
+ with point before the word @samp{spaces} in the first line.  For the
+ second invocation, point is directly after the @samp{(}.
+ 
+ @smallexample
+ @group
+ ---------- Buffer: foo ----------
+ This has too many     @point{}spaces
+ This has too many spaces at the start of (@point{}   this list)
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (fixup-whitespace)
+      @result{} nil
+ (fixup-whitespace)
+      @result{} nil
+ @end group
+ 
+ @group
+ ---------- Buffer: foo ----------
+ This has too many spaces
+ This has too many spaces at the start of (this list)
+ ---------- Buffer: foo ----------
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @deffn Command just-one-space
+ @comment !!SourceFile simple.el
+ This command replaces any spaces and tabs around point with a single
+ space.  It returns @code{nil}.
+ @end deffn
+ 
+ @deffn Command delete-blank-lines
+ This function deletes blank lines surrounding point.  If point is on a
+ blank line with one or more blank lines before or after it, then all but
+ one of them are deleted.  If point is on an isolated blank line, then it
+ is deleted.  If point is on a nonblank line, the command deletes all
+ blank lines following it.
+ 
+ A blank line is defined as a line containing only tabs and spaces.
+ 
+ @code{delete-blank-lines} returns @code{nil}.
+ @end deffn
+ 
+ @node The Kill Ring
+ @section The Kill Ring
+ @cindex kill ring
+ 
+   @dfn{Kill} functions delete text like the deletion functions, but save
+ it so that the user can reinsert it by @dfn{yanking}.  Most of these
+ functions have @samp{kill-} in their name.  By contrast, the functions
+ whose names start with @samp{delete-} normally do not save text for
+ yanking (though they can still be undone); these are ``deletion''
+ functions.
+ 
+   Most of the kill commands are primarily for interactive use, and are
+ not described here.  What we do describe are the functions provided for
+ use in writing such commands.  You can use these functions to write
+ commands for killing text.  When you need to delete text for internal
+ purposes within a Lisp function, you should normally use deletion
+ functions, so as not to disturb the kill ring contents.
+ @xref{Deletion}.
+ 
+   Killed text is saved for later yanking in the @dfn{kill ring}.  This
+ is a list that holds a number of recent kills, not just the last text
+ kill.  We call this a ``ring'' because yanking treats it as having
+ elements in a cyclic order.  The list is kept in the variable
+ @code{kill-ring}, and can be operated on with the usual functions for
+ lists; there are also specialized functions, described in this section,
+ that treat it as a ring.
+ 
+   Some people think this use of the word ``kill'' is unfortunate, since
+ it refers to operations that specifically @emph{do not} destroy the
+ entities ``killed''.  This is in sharp contrast to ordinary life, in
+ which death is permanent and ``killed'' entities do not come back to
+ life.  Therefore, other metaphors have been proposed.  For example, the
+ term ``cut ring'' makes sense to people who, in pre-computer days, used
+ scissors and paste to cut up and rearrange manuscripts.  However, it
+ would be difficult to change the terminology now.
+ 
+ @menu
+ * Kill Ring Concepts::     What text looks like in the kill ring.
+ * Kill Functions::         Functions that kill text.
+ * Yank Commands::          Commands that access the kill ring.
+ * Low-Level Kill Ring::	   Functions and variables for kill ring access.
+ * Internals of Kill Ring:: Variables that hold kill-ring data.
+ @end menu
+ 
+ @node Kill Ring Concepts
+ @comment  node-name,  next,  previous,  up
+ @subsection Kill Ring Concepts
+ 
+   The kill ring records killed text as strings in a list, most recent
+ first.  A short kill ring, for example, might look like this:
+ 
+ @example
+ ("some text" "a different piece of text" "even older text")
+ @end example
+ 
+ @noindent
+ When the list reaches @code{kill-ring-max} entries in length, adding a
+ new entry automatically deletes the last entry.
+ 
+   When kill commands are interwoven with other commands, each kill
+ command makes a new entry in the kill ring.  Multiple kill commands in
+ succession build up a single entry in the kill ring, which would be
+ yanked as a unit; the second and subsequent consecutive kill commands
+ add text to the entry made by the first one.
+ 
+   For yanking, one entry in the kill ring is designated the ``front'' of
+ the ring.  Some yank commands ``rotate'' the ring by designating a
+ different element as the ``front.''  But this virtual rotation doesn't
+ change the list itself---the most recent entry always comes first in the
+ list.
+ 
+ @node Kill Functions
+ @comment  node-name,  next,  previous,  up
+ @subsection Functions for Killing
+ 
+   @code{kill-region} is the usual subroutine for killing text.  Any
+ command that calls this function is a ``kill command'' (and should
+ probably have @samp{kill} in its name).  @code{kill-region} puts the
+ newly killed text in a new element at the beginning of the kill ring or
+ adds it to the most recent element.  It uses the @code{last-command}
+ variable to determine whether the previous command was a kill command,
+ and if so appends the killed text to the most recent entry.
+ 
+ @deffn Command kill-region start end
+ This function kills the text in the region defined by @var{start} and
+ @var{end}.  The text is deleted but saved in the kill ring, along with
+ its text properties.  The value is always @code{nil}.
+ 
+ In an interactive call, @var{start} and @var{end} are point and
+ the mark.
+ 
+ @c Emacs 19 feature
+ If the buffer is read-only, @code{kill-region} modifies the kill ring
+ just the same, then signals an error without modifying the buffer.  This
+ is convenient because it lets the user use all the kill commands to copy
+ text into the kill ring from a read-only buffer.
+ @end deffn
+ 
+ @deffn Command copy-region-as-kill start end
+ This command saves the region defined by @var{start} and @var{end} on
+ the kill ring (including text properties), but does not delete the text
+ from the buffer.  It returns @code{nil}.  It also indicates the extent
+ of the text copied by moving the cursor momentarily, or by displaying a
+ message in the echo area.
+ 
+ The command does not set @code{this-command} to @code{kill-region}, so a
+ subsequent kill command does not append to the same kill ring entry.
+ 
+ Don't call @code{copy-region-as-kill} in Lisp programs unless you aim to
+ support Emacs 18.  For Emacs 19, it is better to use @code{kill-new} or
+ @code{kill-append} instead.  @xref{Low-Level Kill Ring}.
+ @end deffn
+ 
+ @node Yank Commands
+ @comment  node-name,  next,  previous,  up
+ @subsection Functions for Yanking
+ 
+   @dfn{Yanking} means reinserting an entry of previously killed text
+ from the kill ring.  The text properties are copied too.
+ 
+ @deffn Command yank &optional arg
+ @cindex inserting killed text
+ This command inserts before point the text in the first entry in the
+ kill ring.  It positions the mark at the beginning of that text, and
+ point at the end.
+ 
+ If @var{arg} is a list (which occurs interactively when the user
+ types @kbd{C-u} with no digits), then @code{yank} inserts the text as
+ described above, but puts point before the yanked text and puts the mark
+ after it.
+ 
+ If @var{arg} is a number, then @code{yank} inserts the @var{arg}th most
+ recently killed text---the @var{arg}th element of the kill ring list.
+ 
+ @code{yank} does not alter the contents of the kill ring or rotate it.
+ It returns @code{nil}.
+ @end deffn
+ 
+ @deffn Command yank-pop arg
+ This command replaces the just-yanked entry from the kill ring with a
+ different entry from the kill ring.
+ 
+ This is allowed only immediately after a @code{yank} or another
+ @code{yank-pop}.  At such a time, the region contains text that was just
+ inserted by yanking.  @code{yank-pop} deletes that text and inserts in
+ its place a different piece of killed text.  It does not add the deleted
+ text to the kill ring, since it is already in the kill ring somewhere.
+ 
+ If @var{arg} is @code{nil}, then the replacement text is the previous
+ element of the kill ring.  If @var{arg} is numeric, the replacement is
+ the @var{arg}th previous kill.  If @var{arg} is negative, a more recent
+ kill is the replacement.
+ 
+ The sequence of kills in the kill ring wraps around, so that after the
+ oldest one comes the newest one, and before the newest one goes the
+ oldest.
+ 
+ The value is always @code{nil}.
+ @end deffn
+ 
+ @node Low-Level Kill Ring
+ @subsection Low-Level Kill Ring
+ 
+   These functions and variables provide access to the kill ring at a lower
+ level, but still convenient for use in Lisp programs.  They take care of
+ interaction with X Window selections.  They do not exist in Emacs
+ version 18.
+ 
+ @defun current-kill n &optional do-not-move
+ The function @code{current-kill} rotates the yanking pointer which
+ designates the ``front'' of the kill ring by @var{n} places (from newer
+ kills to older ones), and returns the text at that place in the ring.
+ 
+ If the optional second argument @var{do-not-move} is non-@code{nil},
+ then @code{current-kill} doesn't alter the yanking pointer; it just
+ returns the @var{n}th kill, counting from the current yanking pointer.
+ 
+ If @var{n} is zero, indicating a request for the latest kill,
+ @code{current-kill} calls the value of
+ @code{interprogram-paste-function} (documented below) before consulting
+ the kill ring.
+ @end defun
+ 
+ @defun kill-new string
+ This function puts the text @var{string} into the kill ring as a new
+ entry at the front of the ring.  It discards the oldest entry if
+ appropriate.  It also invokes the value of
+ @code{interprogram-cut-function} (see below).
+ @end defun
+ 
+ @defun kill-append string before-p
+ This function appends the text @var{string} to the first entry in the
+ kill ring.  Normally @var{string} goes at the end of the entry, but if
+ @var{before-p} is non-@code{nil}, it goes at the beginning.  This
+ function also invokes the value of @code{interprogram-cut-function} (see
+ below).
+ @end defun
+ 
+ @defvar interprogram-paste-function
+ This variable provides a way of transferring killed text from other
+ programs, when you are using a window system.  Its value should be
+ @code{nil} or a function of no arguments.
+ 
+ If the value is a function, @code{current-kill} calls it to get the
+ ``most recent kill''.  If the function returns a non-@code{nil} value,
+ then that value is used as the ``most recent kill''.  If it returns
+ @code{nil}, then the first element of @code{kill-ring} is used.
+ 
+ The normal use of this hook is to get the X server's primary selection
+ as the most recent kill, even if the selection belongs to another X
+ client.  @xref{X Selections}.
+ @end defvar
+ 
+ @defvar interprogram-cut-function
+ This variable provides a way of communicating killed text to other
+ programs, when you are using a window system.  Its value should be
+ @code{nil} or a function of one argument.
+ 
+ If the value is a function, @code{kill-new} and @code{kill-append} call
+ it with the new first element of the kill ring as an argument.
+ 
+ The normal use of this hook is to set the X server's primary selection
+ to the newly killed text.
+ @end defvar
+ 
+ @node Internals of Kill Ring
+ @comment  node-name,  next,  previous,  up
+ @subsection Internals of the Kill Ring
+ 
+   The variable @code{kill-ring} holds the kill ring contents, in the
+ form of a list of strings.  The most recent kill is always at the front
+ of the list. 
+ 
+   The @code{kill-ring-yank-pointer} variable points to a link in the
+ kill ring list, whose @sc{car} is the text to yank next.  We say it
+ identifies the ``front'' of the ring.  Moving
+ @code{kill-ring-yank-pointer} to a different link is called
+ @dfn{rotating the kill ring}.  We call the kill ring a ``ring'' because
+ the functions that move the yank pointer wrap around from the end of the
+ list to the beginning, or vice-versa.  Rotation of the kill ring is
+ virtual; it does not change the value of @code{kill-ring}.
+ 
+   Both @code{kill-ring} and @code{kill-ring-yank-pointer} are Lisp
+ variables whose values are normally lists.  The word ``pointer'' in the
+ name of the @code{kill-ring-yank-pointer} indicates that the variable's
+ purpose is to identify one element of the list for use by the next yank
+ command.
+ 
+   The value of @code{kill-ring-yank-pointer} is always @code{eq} to one
+ of the links in the kill ring list.  The element it identifies is the
+ @sc{car} of that link.  Kill commands, which change the kill ring, also
+ set this variable to the value of @code{kill-ring}.  The effect is to
+ rotate the ring so that the newly killed text is at the front.
+ 
+   Here is a diagram that shows the variable @code{kill-ring-yank-pointer}
+ pointing to the second entry in the kill ring @code{("some text" "a
+ different piece of text" "yet older text")}.  
+ 
+ @example
+ @group
+ kill-ring       kill-ring-yank-pointer
+   |               |
+   |     ___ ___    --->  ___ ___      ___ ___
+    --> |___|___|------> |___|___|--> |___|___|--> nil
+          |                |            |            
+          |                |            |            
+          |                |             -->"yet older text" 
+          |                |
+          |                 --> "a different piece of text" 
+          |
+           --> "some text"
+ @end group
+ @end example
+ 
+ @noindent
+ This state of affairs might occur after @kbd{C-y} (@code{yank})
+ immediately followed by @kbd{M-y} (@code{yank-pop}).
+ 
+ @defvar kill-ring
+ This variable holds the list of killed text sequences, most recently
+ killed first.
+ @end defvar
+ 
+ @defvar kill-ring-yank-pointer
+ This variable's value indicates which element of the kill ring is at the
+ ``front'' of the ring for yanking.  More precisely, the value is a tail
+ of the value of @code{kill-ring}, and its @sc{car} is the kill string
+ that @kbd{C-y} should yank.
+ @end defvar
+ 
+ @defopt kill-ring-max
+ The value of this variable is the maximum length to which the kill
+ ring can grow, before elements are thrown away at the end.  The default
+ value for @code{kill-ring-max} is 30.
+ @end defopt
+ 
+ @node Undo
+ @comment  node-name,  next,  previous,  up
+ @section Undo
+ @cindex redo
+ 
+   Most buffers have an @dfn{undo list}, which records all changes made
+ to the buffer's text so that they can be undone.  (The buffers that
+ don't have one are usually special-purpose buffers for which Emacs
+ assumes that undoing is not useful.)  All the primitives that modify the
+ text in the buffer automatically add elements to the front of the undo
+ list, which is in the variable @code{buffer-undo-list}.
+ 
+ @defvar buffer-undo-list
+ This variable's value is the undo list of the current buffer.
+ A value of @code{t} disables the recording of undo information.
+ @end defvar
+ 
+ Here are the kinds of elements an undo list can have:
+ 
+ @table @code
+ @item @var{integer}
+ This kind of element records a previous value of point.  Ordinary cursor
+ motion does not get any sort of undo record, but deletion commands use
+ these entries to record where point was before the command.
+ 
+ @item (@var{beg} . @var{end})
+ This kind of element indicates how to delete text that was inserted.
+ Upon insertion, the text occupied the range @var{beg}--@var{end} in the 
+ buffer.
+ 
+ @item (@var{text} . @var{position})
+ This kind of element indicates how to reinsert text that was deleted.
+ The deleted text itself is the string @var{text}.  The place to
+ reinsert it is @code{(abs @var{position})}.
+ 
+ @item (t @var{high} . @var{low})
+ This kind of element indicates that an unmodified buffer became
+ modified.  The elements @var{high} and @var{low} are two integers, each
+ recording 16 bits of the visited file's modification time as of when it
+ was previously visited or saved.  @code{primitive-undo} uses those
+ values to determine whether to mark the buffer as unmodified once again;
+ it does so only if the file's modification time matches those numbers.
+ 
+ @item (nil @var{property} @var{value} @var{beg} . @var{end})
+ This kind of element records a change in a text property.
+ Here's how you might undo the change:
+ 
+ @example
+ (put-text-property @var{beg} @var{end} @var{property} @var{value})
+ @end example
+ 
+ @item @var{position}
+ This element indicates where point was at an earlier time.  Undoing this
+ element sets point to @var{position}.  Deletion normally creates an
+ element of this kind as well as a reinsertion element.
+ 
+ @item nil
+ This element is a boundary.  The elements between two boundaries are
+ called a @dfn{change group}; normally, each change group corresponds to
+ one keyboard command, and undo commands normally undo an entire group as
+ a unit.
+ @end table
+ 
+ @defun undo-boundary
+ This function places a boundary element in the undo list.  The undo
+ command stops at such a boundary, and successive undo commands undo
+ to earlier and earlier boundaries.  This function returns @code{nil}.
+ 
+ The editor command loop automatically creates an undo boundary before
+ each key sequence is executed.  Thus, each undo normally undoes the
+ effects of one command.  Self-inserting input characters are an
+ exception.  The command loop makes a boundary for the first such
+ character; the next 19 consecutive self-inserting input characters do
+ not make boundaries, and then the 20th does, and so on as long as
+ self-inserting characters continue.
+ 
+ All buffer modifications add a boundary whenever the previous undoable
+ change was made in some other buffer.  This way, a command that modifies
+ several buffers makes a boundary in each buffer it changes.
+ 
+ Calling this function explicitly is useful for splitting the effects of
+ a command into more than one unit.  For example, @code{query-replace}
+ calls @code{undo-boundary} after each replacement, so that the user can
+ undo individual replacements one by one.
+ @end defun
+ 
+ @defun primitive-undo count list
+ This is the basic function for undoing elements of an undo list.
+ It undoes the first @var{count} elements of @var{list}, returning
+ the rest of @var{list}.  You could write this function in Lisp,
+ but it is convenient to have it in C.
+ 
+ @code{primitive-undo} adds elements to the buffer's undo list when it
+ changes the buffer.  Undo commands avoid confusion by saving the undo
+ list value at the beginning of a sequence of undo operations.  Then the
+ undo operations use and update the saved value.  The new elements added
+ by undoing are not part of this saved value, so they don't interfere with
+ continuing to undo.
+ @end defun
+ 
+ @node Maintaining Undo
+ @section Maintaining Undo Lists
+ 
+   This section describes how to enable and disable undo information for
+ a given buffer.  It also explains how the undo list is truncated
+ automatically so it doesn't get too big.
+ 
+   Recording of undo information in a newly created buffer is normally
+ enabled to start with; but if the buffer name starts with a space, the
+ undo recording is initially disabled.  You can explicitly enable or
+ disable undo recording with the following two functions, or by setting
+ @code{buffer-undo-list} yourself.
+ 
+ @deffn Command buffer-enable-undo &optional buffer-or-name
+ This command enables recording undo information for buffer
+ @var{buffer-or-name}, so that subsequent changes can be undone.  If no
+ argument is supplied, then the current buffer is used.  This function
+ does nothing if undo recording is already enabled in the buffer.  It
+ returns @code{nil}.
+ 
+ In an interactive call, @var{buffer-or-name} is the current buffer.
+ You cannot specify any other buffer.
+ @end deffn
+ 
+ @defun buffer-disable-undo &optional buffer
+ @defunx buffer-flush-undo &optional buffer
+ @cindex disable undo
+ This function discards the undo list of @var{buffer}, and disables
+ further recording of undo information.  As a result, it is no longer
+ possible to undo either previous changes or any subsequent changes.  If
+ the undo list of @var{buffer} is already disabled, this function
+ has no effect.
+ 
+ This function returns @code{nil}.  It cannot be called interactively.
+ 
+ The name @code{buffer-flush-undo} is not considered obsolete, but the
+ preferred name @code{buffer-disable-undo} is new as of Emacs versions
+ 19.
+ @end defun
+ 
+   As editing continues, undo lists get longer and longer.  To prevent
+ them from using up all available memory space, garbage collection trims
+ them back to size limits you can set.  (For this purpose, the ``size''
+ of an undo list measures the cons cells that make up the list, plus the
+ strings of deleted text.)  Two variables control the range of acceptable
+ sizes: @code{undo-limit} and @code{undo-strong-limit}.
+ 
+ @defvar undo-limit
+ This is the soft limit for the acceptable size of an undo list.  The
+ change group at which this size is exceeded is the last one kept.
+ @end defvar
+ 
+ @defvar undo-strong-limit
+ This is the upper limit for the acceptable size of an undo list.  The
+ change group at which this size is exceeded is discarded itself (along
+ with all older change groups).  There is one exception: the very latest
+ change group is never discarded no matter how big it is.
+ @end defvar
+ 
+ @node Filling
+ @comment  node-name,  next,  previous,  up
+ @section Filling
+ @cindex filling, explicit
+ 
+   @dfn{Filling} means adjusting the lengths of lines (by moving the line
+ breaks) so that they are nearly (but no greater than) a specified
+ maximum width.  Additionally, lines can be @dfn{justified}, which means
+ inserting spaces to make the left and/or right margins line up
+ precisely.  The width is controlled by the variable @code{fill-column}.
+ For ease of reading, lines should be no longer than 70 or so columns.
+ 
+   You can use Auto Fill mode (@pxref{Auto Filling}) to fill text
+ automatically as you insert it, but changes to existing text may leave
+ it improperly filled.  Then you must fill the text explicitly.
+ 
+   Most of the commands in this section return values that are not
+ meaningful.  All the functions that do filling take note of the current
+ left margin, current right margin, and current justification style
+ (@pxref{Margins}).  If the current justification style is
+ @code{none}, the filling functions don't actually do anything.
+ 
+   Several of the filling functions have an argument @var{justify}.
+ If it is non-@code{nil}, that requests some kind of justification.  It
+ can be @code{left}, @code{right}, @code{full}, or @code{center}, to
+ request a specific style of justification.  If it is @code{t}, that
+ means to use the current justification style for this part of the text
+ (see @code{current-justification}, below).
+ 
+   When you call the filling functions interactively, using a prefix
+ argument implies the value @code{full} for @var{justify}.
+ 
+ @deffn Command fill-paragraph justify
+ @cindex filling a paragraph
+ This command fills the paragraph at or after point.  If
+ @var{justify} is non-@code{nil}, each line is justified as well.
+ It uses the ordinary paragraph motion commands to find paragraph
+ boundaries.  @xref{Paragraphs,,, emacs, The Emacs Manual}.
+ @end deffn
+ 
+ @deffn Command fill-region start end &optional justify
+ This command fills each of the paragraphs in the region from @var{start}
+ to @var{end}.  It justifies as well if @var{justify} is
+ non-@code{nil}.
+ 
+ The variable @code{paragraph-separate} controls how to distinguish
+ paragraphs.  @xref{Standard Regexps}.
+ @end deffn
+ 
+ @deffn Command fill-individual-paragraphs start end &optional justify mail-flag
+ This command fills each paragraph in the region according to its
+ individual fill prefix.  Thus, if the lines of a paragraph were indented
+ with spaces, the filled paragraph will remain indented in the same
+ fashion.
+ 
+ The first two arguments, @var{start} and @var{end}, are the beginning
+ and end of the region to be filled.  The third and fourth arguments,
+ @var{justify} and @var{mail-flag}, are optional.  If
+ @var{justify} is non-@code{nil}, the paragraphs are justified as
+ well as filled.  If @var{mail-flag} is non-@code{nil}, it means the
+ function is operating on a mail message and therefore should not fill
+ the header lines.
+ 
+ Ordinarily, @code{fill-individual-paragraphs} regards each change in
+ indentation as starting a new paragraph.  If
+ @code{fill-individual-varying-indent} is non-@code{nil}, then only
+ separator lines separate paragraphs.  That mode can handle indented
+ paragraphs with additional indentation on the first line.
+ @end deffn
+ 
+ @defopt fill-individual-varying-indent
+ This variable alters the action of @code{fill-individual-paragraphs} as
+ described above.
+ @end defopt
+ 
+ @deffn Command fill-region-as-paragraph start end &optional justify
+ This command considers a region of text as a paragraph and fills it.  If
+ the region was made up of many paragraphs, the blank lines between
+ paragraphs are removed.  This function justifies as well as filling when
+ @var{justify} is non-@code{nil}.
+ 
+ In an interactive call, any prefix argument requests justification.
+ 
+ In Adaptive Fill mode, which is enabled by default,
+ @code{fill-region-as-paragraph} on an indented paragraph when there is
+ no fill prefix uses the indentation of the second line of the paragraph
+ as the fill prefix.
+ @end deffn
+ 
+ @deffn Command justify-current-line how eop nosqueeze
+ This command inserts spaces between the words of the current line so
+ that the line ends exactly at @code{fill-column}.  It returns
+ @code{nil}.
+ 
+ The argument @var{how}, if non-@code{nil} specifies explicitly the style
+ of justification.  It can be @code{left}, @code{right}, @code{full},
+ @code{center}, or @code{none}.  If it is @code{t}, that means to do
+ follow specified justification style (see @code{current-justification},
+ below).  @code{nil} means to do full justification.
+ 
+ If @var{eop} is non-@code{nil}, that means do left-justification when
+ @code{current-justification} specifies full justification.  This is used
+ for the last line of a paragraph; even if the paragraph as a whole is
+ fully justified, the last line should not be.
+ 
+ If @var{nosqueeze} is non-@code{nil}, that means do not change interior
+ whitespace.
+ @end deffn
+ 
+ @defopt default-justification
+ This variable's value specifies the style of justification to use for
+ text that doesn't specify a style with a text property.  The possible
+ values are @code{left}, @code{right}, @code{full}, @code{center}, or
+ @code{none}.  The default value is @code{left}.
+ @end defopt
+ 
+ @defun current-justification
+ This function returns the proper justification style to use for filling
+ the text around point.
+ @end defun
+ 
+ @defvar fill-paragraph-function
+ This variable provides a way for major modes to override the filling of
+ paragraphs.  If the value is non-@code{nil}, @code{fill-paragraph} calls
+ this function to do the work.  If the function returns a non-@code{nil}
+ value, @code{fill-paragraph} assumes the job is done, and immediately
+ returns that value.
+ 
+ The usual use of this feature is to fill comments in programming
+ language modes.  If the function needs to fill a paragraph in the usual
+ way, it can do so as follows:
+ 
+ @example
+ (let ((fill-paragraph-function nil))
+   (fill-paragraph arg))
+ @end example
+ @end defvar
+ 
+ @defvar use-hard-newlines
+ If this variable is non-@code{nil}, the filling functions do not delete
+ newlines that have the @code{hard} text property.  These ``hard
+ newlines'' act as paragraph separators.
+ @end defvar
+ 
+ @node Margins
+ @section Margins for Filling
+ 
+ @defopt fill-prefix
+ This variable specifies a string of text that appears at the beginning
+ of normal text lines and should be disregarded when filling them.  Any
+ line that fails to start with the fill prefix is considered the start of
+ a paragraph; so is any line that starts with the fill prefix followed by
+ additional whitespace.  Lines that start with the fill prefix but no
+ additional whitespace are ordinary text lines that can be filled
+ together.  The resulting filled lines also start with the fill prefix.
+ 
+ The fill prefix follows the left margin whitespace, if any.
+ @end defopt
+ 
+ @defopt fill-column
+ This buffer-local variable specifies the maximum width of filled
+ lines.  Its value should be an integer, which is a number of columns.
+ All the filling, justification and centering commands are affected by
+ this variable, including Auto Fill mode (@pxref{Auto Filling}).
+ 
+ As a practical matter, if you are writing text for other people to
+ read, you should set @code{fill-column} to no more than 70.  Otherwise
+ the line will be too long for people to read comfortably, and this can
+ make the text seem clumsy.
+ @end defopt
+ 
+ @defvar default-fill-column
+ The value of this variable is the default value for @code{fill-column} in
+ buffers that do not override it.  This is the same as
+ @code{(default-value 'fill-column)}.
+ 
+ The default value for @code{default-fill-column} is 70.
+ @end defvar
+ 
+ @deffn Command set-left-margin from to margin
+ This sets the @code{left-margin} property on the text from @var{from} to
+ @var{to} to the value @var{margin}.  If Auto Fill mode is enabled, this
+ command also refills the region to fit the new margin.
+ @end deffn
+ 
+ @deffn Command set-right-margin from to margin
+ This sets the @code{right-margin} property on the text from @var{from}
+ to @var{to} to the value @var{margin}.  If Auto Fill mode is enabled,
+ this command also refills the region to fit the new margin.
+ @end deffn
+ 
+ @defun current-left-margin
+ This function returns the proper left margin value to use for filling
+ the text around point.  The value is the sum of the @code{left-margin}
+ property of the character at the start of the current line (or zero if
+ none), and the value of the variable @code{left-margin}.
+ @end defun
+ 
+ @defun current-fill-column
+ This function returns the proper fill column value to use for filling
+ the text around point.  The value is the value of the @code{fill-column}
+ variable, minus the value of the @code{right-margin} property of the
+ character after point.
+ @end defun
+ 
+ @deffn Command move-to-left-margin &optional n force
+ This function moves point to the left margin of the current line.  The
+ column moved to is determined by calling the function
+ @code{current-left-margin}.  If the argument @var{n} is non-@code{nil},
+ @code{move-to-left-margin} moves forward @var{n}@minus{}1 lines first.
+ 
+ If @var{force} is non-@code{nil}, that says to fix the line's
+ indentation if that doesn't match the left margin value.
+ @end deffn
+ 
+ @defun delete-to-left-margin from to
+ This function removes left margin indentation from the text
+ between @var{from} and @var{to}.  The amount of indentation
+ to delete is determined by calling @code{current-left-margin}.
+ In no case does this function delete non-whitespace.
+ @end defun
+ 
+ @defun indent-to-left-margin
+ This is the default @code{indent-line-function}, used in Fundamental
+ mode, Text mode, etc.  Its effect is to adjust the indentation at the
+ beginning of the current line to the value specified by the variable
+ @code{left-margin}.  This may involve either inserting or deleting
+ whitespace.
+ @end defun
+ 
+ @defvar left-margin
+ This variable specifies the base left margin column.  In Fundamental
+ mode, @key{LFD} indents to this column.  This variable automatically
+ becomes buffer-local when set in any fashion.
+ @end defvar
+ 
+ @node Auto Filling
+ @comment  node-name,  next,  previous,  up
+ @section Auto Filling
+ @cindex filling, automatic
+ @cindex Auto Fill mode
+ 
+   Auto Fill mode is a minor mode that fills lines automatically as text
+ is inserted.  This section describes the hook used by Auto Fill mode.
+ For a description of functions that you can call explicitly to fill and
+ justify existing text, see @ref{Filling}.
+ 
+   Auto Fill mode also enables the functions that change the margins and
+ justification style to refill portions of the text.  @xref{Margins}.
+ 
+ @defvar auto-fill-function
+ The value of this variable should be a function (of no arguments) to be
+ called after self-inserting a space or a newline.  It may be @code{nil},
+ in which case nothing special is done in that case.
+ 
+ The value of @code{auto-fill-function} is @code{do-auto-fill} when
+ Auto-Fill mode is enabled.  That is a function whose sole purpose is to
+ implement the usual strategy for breaking a line.
+ 
+ @quotation
+ In older Emacs versions, this variable was named @code{auto-fill-hook},
+ but since it is not called with the standard convention for hooks, it
+ was renamed to @code{auto-fill-function} in version 19.
+ @end quotation
+ @end defvar
+ 
+ @node Sorting
+ @section Sorting Text
+ @cindex sorting text
+ 
+   The sorting functions described in this section all rearrange text in
+ a buffer.  This is in contrast to the function @code{sort}, which
+ rearranges the order of the elements of a list (@pxref{Rearrangement}).
+ The values returned by these functions are not meaningful.
+ 
+ @defun sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun
+ This function is the general text-sorting routine that divides a buffer
+ into records and sorts them.  Most of the commands in this section use
+ this function.
+ 
+ To understand how @code{sort-subr} works, consider the whole accessible
+ portion of the buffer as being divided into disjoint pieces called
+ @dfn{sort records}.  The records may or may not be contiguous; they may
+ not overlap.  A portion of each sort record (perhaps all of it) is
+ designated as the sort key.  Sorting rearranges the records in order by
+ their sort keys.
+ 
+ Usually, the records are rearranged in order of ascending sort key.
+ If the first argument to the @code{sort-subr} function, @var{reverse},
+ is non-@code{nil}, the sort records are rearranged in order of
+ descending sort key.
+ 
+ The next four arguments to @code{sort-subr} are functions that are
+ called to move point across a sort record.  They are called many times
+ from within @code{sort-subr}.
+ 
+ @enumerate
+ @item
+ @var{nextrecfun} is called with point at the end of a record.  This
+ function moves point to the start of the next record.  The first record
+ is assumed to start at the position of point when @code{sort-subr} is
+ called.  Therefore, you should usually move point to the beginning of
+ the buffer before calling @code{sort-subr}.
+ 
+ This function can indicate there are no more sort records by leaving
+ point at the end of the buffer.
+ 
+ @item
+ @var{endrecfun} is called with point within a record.  It moves point to
+ the end of the record.
+ 
+ @item
+ @var{startkeyfun} is called to move point from the start of a record to
+ the start of the sort key.  This argument is optional; if it is omitted,
+ the whole record is the sort key.  If supplied, the function should
+ either return a non-@code{nil} value to be used as the sort key, or
+ return @code{nil} to indicate that the sort key is in the buffer
+ starting at point.  In the latter case, @var{endkeyfun} is called to
+ find the end of the sort key.
+ 
+ @item
+ @var{endkeyfun} is called to move point from the start of the sort key
+ to the end of the sort key.  This argument is optional.  If
+ @var{startkeyfun} returns @code{nil} and this argument is omitted (or
+ @code{nil}), then the sort key extends to the end of the record.  There
+ is no need for @var{endkeyfun} if @var{startkeyfun} returns a
+ non-@code{nil} value.
+ @end enumerate
+ 
+ As an example of @code{sort-subr}, here is the complete function
+ definition for @code{sort-lines}:
+ 
+ @example
+ @group
+ ;; @r{Note that the first two lines of doc string}
+ ;; @r{are effectively one line when viewed by a user.}
+ (defun sort-lines (reverse beg end)
+   "Sort lines in region alphabetically.
+ Called from a program, there are three arguments:
+ @end group
+ @group
+ REVERSE (non-nil means reverse order),
+ and BEG and END (the region to sort)."
+   (interactive "P\nr")
+   (save-restriction
+     (narrow-to-region beg end)
+     (goto-char (point-min))
+     (sort-subr reverse
+                'forward-line
+                'end-of-line)))
+ @end group
+ @end example
+ 
+ Here @code{forward-line} moves point to the start of the next record,
+ and @code{end-of-line} moves point to the end of record.  We do not pass
+ the arguments @var{startkeyfun} and @var{endkeyfun}, because the entire
+ record is used as the sort key.
+ 
+ The @code{sort-paragraphs} function is very much the same, except that
+ its @code{sort-subr} call looks like this:
+ 
+ @example
+ @group
+ (sort-subr reverse
+            (function 
+             (lambda () 
+               (skip-chars-forward "\n \t\f")))
+            'forward-paragraph)
+ @end group
+ @end example
+ @end defun
+ 
+ @deffn Command sort-regexp-fields reverse record-regexp key-regexp start end
+ This command sorts the region between @var{start} and @var{end}
+ alphabetically as specified by @var{record-regexp} and @var{key-regexp}.
+ If @var{reverse} is a negative integer, then sorting is in reverse
+ order.
+ 
+ Alphabetical sorting means that two sort keys are compared by
+ comparing the first characters of each, the second characters of each,
+ and so on.  If a mismatch is found, it means that the sort keys are
+ unequal; the sort key whose character is less at the point of first
+ mismatch is the lesser sort key.  The individual characters are compared
+ according to their numerical values.  Since Emacs uses the @sc{ASCII}
+ character set, the ordering in that set determines alphabetical order.
+ @c version 19 change
+ 
+ The value of the @var{record-regexp} argument specifies how to divide
+ the buffer into sort records.  At the end of each record, a search is
+ done for this regular expression, and the text that matches it is the
+ next record.  For example, the regular expression @samp{^.+$}, which
+ matches lines with at least one character besides a newline, would make
+ each such line into a sort record.  @xref{Regular Expressions}, for a
+ description of the syntax and meaning of regular expressions.
+ 
+ The value of the @var{key-regexp} argument specifies what part of each
+ record is the sort key.  The @var{key-regexp} could match the whole
+ record, or only a part.  In the latter case, the rest of the record has
+ no effect on the sorted order of records, but it is carried along when
+ the record moves to its new position.
+ 
+ The @var{key-regexp} argument can refer to the text matched by a
+ subexpression of @var{record-regexp}, or it can be a regular expression
+ on its own.
+ 
+ If @var{key-regexp} is:
+ 
+ @table @asis
+ @item @samp{\@var{digit}}
+ then the text matched by the @var{digit}th @samp{\(...\)} parenthesis
+ grouping in @var{record-regexp} is the sort key.
+ 
+ @item @samp{\&}
+ then the whole record is the sort key.
+ 
+ @item a regular expression
+ then @code{sort-regexp-fields} searches for a match for the regular
+ expression within the record.  If such a match is found, it is the sort
+ key.  If there is no match for @var{key-regexp} within a record then
+ that record is ignored, which means its position in the buffer is not
+ changed.  (The other records may move around it.)
+ @end table
+ 
+ For example, if you plan to sort all the lines in the region by the
+ first word on each line starting with the letter @samp{f}, you should
+ set @var{record-regexp} to @samp{^.*$} and set @var{key-regexp} to
+ @samp{\<f\w*\>}.  The resulting expression looks like this:
+ 
+ @example
+ @group
+ (sort-regexp-fields nil "^.*$" "\\<f\\w*\\>"
+                     (region-beginning)
+                     (region-end))
+ @end group
+ @end example
+ 
+ If you call @code{sort-regexp-fields} interactively, it prompts for
+ @var{record-regexp} and @var{key-regexp} in the minibuffer.
+ @end deffn
+ 
+ @deffn Command sort-lines reverse start end
+ This command alphabetically sorts lines in the region between
+ @var{start} and @var{end}.  If @var{reverse} is non-@code{nil}, the sort
+ is in reverse order.
+ @end deffn
+ 
+ @deffn Command sort-paragraphs reverse start end
+ This command alphabetically sorts paragraphs in the region between
+ @var{start} and @var{end}.  If @var{reverse} is non-@code{nil}, the sort
+ is in reverse order.
+ @end deffn
+ 
+ @deffn Command sort-pages reverse start end
+ This command alphabetically sorts pages in the region between
+ @var{start} and @var{end}.  If @var{reverse} is non-@code{nil}, the sort
+ is in reverse order.
+ @end deffn
+ 
+ @deffn Command sort-fields field start end
+ This command sorts lines in the region between @var{start} and
+ @var{end}, comparing them alphabetically by the @var{field}th field
+ of each line.  Fields are separated by whitespace and numbered starting
+ from 1.  If @var{field} is negative, sorting is by the
+ @w{@minus{}@var{field}th} field from the end of the line.  This command
+ is useful for sorting tables.
+ @end deffn
+ 
+ @deffn Command sort-numeric-fields field start end
+ This command sorts lines in the region between @var{start} and
+ @var{end}, comparing them numerically by the @var{field}th field of each
+ line.  The specified field must contain a number in each line of the
+ region.  Fields are separated by whitespace and numbered starting from
+ 1.  If @var{field} is negative, sorting is by the
+ @w{@minus{}@var{field}th} field from the end of the line.  This command
+ is useful for sorting tables.
+ @end deffn
+ 
+ @deffn Command sort-columns reverse &optional beg end
+ This command sorts the lines in the region between @var{beg} and
+ @var{end}, comparing them alphabetically by a certain range of columns.
+ The column positions of @var{beg} and @var{end} bound the range of
+ columns to sort on.
+ 
+ If @var{reverse} is non-@code{nil}, the sort is in reverse order.
+ 
+ One unusual thing about this command is that the entire line
+ containing position @var{beg}, and the entire line containing position
+ @var{end}, are included in the region sorted.
+ 
+ Note that @code{sort-columns} uses the @code{sort} utility program,
+ and so cannot work properly on text containing tab characters.  Use
+ @kbd{M-x @code{untabify}} to convert tabs to spaces before sorting.
+ @end deffn
+ 
+ @node Columns
+ @comment  node-name,  next,  previous,  up
+ @section Counting Columns
+ @cindex columns
+ @cindex counting columns
+ @cindex horizontal position
+ 
+   The column functions convert between a character position (counting
+ characters from the beginning of the buffer) and a column position
+ (counting screen characters from the beginning of a line).
+ 
+   A character counts according to the number of columns it occupies on
+ the screen.  This means control characters count as occupying 2 or 4
+ columns, depending upon the value of @code{ctl-arrow}, and tabs count as
+ occupying a number of columns that depends on the value of
+ @code{tab-width} and on the column where the tab begins.  @xref{Usual Display}.
+ 
+   Column number computations ignore the width of the window and the
+ amount of horizontal scrolling.  Consequently, a column value can be
+ arbitrarily high.  The first (or leftmost) column is numbered 0.
+ 
+ @defun current-column
+ This function returns the horizontal position of point, measured in
+ columns, counting from 0 at the left margin.  The column position is the
+ sum of the widths of all the displayed representations of the characters
+ between the start of the current line and point.
+ 
+ For an example of using @code{current-column}, see the description of
+ @code{count-lines} in @ref{Text Lines}.
+ @end defun
+ 
+ @defun move-to-column column &optional force
+ This function moves point to @var{column} in the current line.  The
+ calculation of @var{column} takes into account the widths of the
+ displayed representations of the characters between the start of the
+ line and point.
+ 
+ If column @var{column} is beyond the end of the line, point moves to the
+ end of the line.  If @var{column} is negative, point moves to the
+ beginning of the line.
+ 
+ If it is impossible to move to column @var{column} because that is in
+ the middle of a multicolumn character such as a tab, point moves to the
+ end of that character.  However, if @var{force} is non-@code{nil}, and
+ @var{column} is in the middle of a tab, then @code{move-to-column}
+ converts the tab into spaces so that it can move precisely to column
+ @var{column}.  Other multicolumn characters can cause anomalies despite
+ @var{force}, since there is no way to split them.
+ 
+ The argument @var{force} also has an effect if the line isn't long
+ enough to reach column @var{column}; in that case, it says to add
+ whitespace at the end of the line to reach that column.
+ 
+ If @var{column} is not an integer, an error is signaled.
+ 
+ The return value is the column number actually moved to.
+ @end defun
+ 
+ @node Indentation
+ @section Indentation
+ @cindex indentation
+ 
+   The indentation functions are used to examine, move to, and change
+ whitespace that is at the beginning of a line.  Some of the functions
+ can also change whitespace elsewhere on a line.  Columns and indentation
+ count from zero at the left margin.
+ 
+ @menu
+ * Primitive Indent::      Functions used to count and insert indentation.
+ * Mode-Specific Indent::  Customize indentation for different modes.
+ * Region Indent::         Indent all the lines in a region.
+ * Relative Indent::       Indent the current line based on previous lines.
+ * Indent Tabs::           Adjustable, typewriter-like tab stops.
+ * Motion by Indent::      Move to first non-blank character.
+ @end menu
+ 
+ @node Primitive Indent
+ @subsection Indentation Primitives
+ 
+   This section describes the primitive functions used to count and
+ insert indentation.  The functions in the following sections use these
+ primitives.
+ 
+ @defun current-indentation
+ @comment !!Type Primitive Function
+ @comment !!SourceFile indent.c
+ This function returns the indentation of the current line, which is
+ the horizontal position of the first nonblank character.  If the
+ contents are entirely blank, then this is the horizontal position of the
+ end of the line.
+ @end defun
+ 
+ @deffn Command indent-to column &optional minimum
+ @comment !!Type Primitive Function
+ @comment !!SourceFile indent.c
+ This function indents from point with tabs and spaces until @var{column}
+ is reached.  If @var{minimum} is specified and non-@code{nil}, then at
+ least that many spaces are inserted even if this requires going beyond
+ @var{column}.  Otherwise the function does nothing if point is already
+ beyond @var{column}.  The value is the column at which the inserted
+ indentation ends.
+ 
+ The inserted whitespace characters inherit text properties from the
+ surrounding text (usually, from the preceding text only).  @xref{Sticky
+ Properties}.
+ @end deffn
+ 
+ @defopt indent-tabs-mode
+ @comment !!SourceFile indent.c
+ If this variable is non-@code{nil}, indentation functions can insert
+ tabs as well as spaces.  Otherwise, they insert only spaces.  Setting
+ this variable automatically makes it local to the current buffer.
+ @end defopt
+ 
+ @node Mode-Specific Indent
+ @subsection Indentation Controlled by Major Mode
+ 
+   An important function of each major mode is to customize the @key{TAB}
+ key to indent properly for the language being edited.  This section
+ describes the mechanism of the @key{TAB} key and how to control it.
+ The functions in this section return unpredictable values.
+ 
+ @defvar indent-line-function
+ This variable's value is the function to be used by @key{TAB} (and
+ various commands) to indent the current line.  The command
+ @code{indent-according-to-mode} does no more than call this function.
+ 
+ In Lisp mode, the value is the symbol @code{lisp-indent-line}; in C
+ mode, @code{c-indent-line}; in Fortran mode, @code{fortran-indent-line}.
+ In Fundamental mode, Text mode, and many other modes with no standard
+ for indentation, the value is @code{indent-to-left-margin} (which is the
+ default value).
+ @end defvar
+ 
+ @deffn Command indent-according-to-mode
+ This command calls the function in @code{indent-line-function} to
+ indent the current line in a way appropriate for the current major mode.
+ @end deffn
+ 
+ @deffn Command indent-for-tab-command
+ This command calls the function in @code{indent-line-function} to indent
+ the current line; except that if that function is
+ @code{indent-to-left-margin}, it calls @code{insert-tab} instead.  (That
+ is a trivial command that inserts a tab character.)
+ @end deffn
+ 
+ @deffn Command newline-and-indent
+ @comment !!SourceFile simple.el
+ This function inserts a newline, then indents the new line (the one
+ following the newline just inserted) according to the major mode.
+ 
+ It does indentation by calling the current @code{indent-line-function}.
+ In programming language modes, this is the same thing @key{TAB} does,
+ but in some text modes, where @key{TAB} inserts a tab,
+ @code{newline-and-indent} indents to the column specified by
+ @code{left-margin}.
+ @end deffn
+ 
+ @deffn Command reindent-then-newline-and-indent
+ @comment !!SourceFile simple.el
+ This command reindents the current line, inserts a newline at point,
+ and then reindents the new line (the one following the newline just
+ inserted).
+ 
+ This command does indentation on both lines according to the current
+ major mode, by calling the current value of @code{indent-line-function}.
+ In programming language modes, this is the same thing @key{TAB} does,
+ but in some text modes, where @key{TAB} inserts a tab,
+ @code{reindent-then-newline-and-indent} indents to the column specified
+ by @code{left-margin}.
+ @end deffn
+ 
+ @node Region Indent
+ @subsection Indenting an Entire Region
+ 
+   This section describes commands that indent all the lines in the
+ region.  They return unpredictable values.
+ 
+ @deffn Command indent-region start end to-column
+ This command indents each nonblank line starting between @var{start}
+ (inclusive) and @var{end} (exclusive).  If @var{to-column} is
+ @code{nil}, @code{indent-region} indents each nonblank line by calling
+ the current mode's indentation function, the value of
+ @code{indent-line-function}.
+ 
+ If @var{to-column} is non-@code{nil}, it should be an integer
+ specifying the number of columns of indentation; then this function
+ gives each line exactly that much indentation, by either adding or
+ deleting whitespace.
+ 
+ If there is a fill prefix, @code{indent-region} indents each line
+ by making it start with the fill prefix.
+ @end deffn
+ 
+ @defvar indent-region-function
+ The value of this variable is a function that can be used by
+ @code{indent-region} as a short cut.  You should design the function so
+ that it will produce the same results as indenting the lines of the
+ region one by one, but presumably faster.
+ 
+ If the value is @code{nil}, there is no short cut, and
+ @code{indent-region} actually works line by line.
+ 
+ A short-cut function is useful in modes such as C mode and Lisp mode,
+ where the @code{indent-line-function} must scan from the beginning of
+ the function definition: applying it to each line would be quadratic in
+ time.  The short cut can update the scan information as it moves through
+ the lines indenting them; this takes linear time.  In a mode where
+ indenting a line individually is fast, there is no need for a short cut.
+ 
+ @code{indent-region} with a non-@code{nil} argument @var{to-column} has
+ a different meaning and does not use this variable.
+ @end defvar
+ 
+ @deffn Command indent-rigidly start end count
+ @comment !!SourceFile indent.el
+ This command indents all lines starting between @var{start}
+ (inclusive) and @var{end} (exclusive) sideways by @var{count} columns.
+ This ``preserves the shape'' of the affected region, moving it as a
+ rigid unit.  Consequently, this command is useful not only for indenting
+ regions of unindented text, but also for indenting regions of formatted
+ code.
+ 
+ For example, if @var{count} is 3, this command adds 3 columns of
+ indentation to each of the lines beginning in the region specified.
+ 
+ In Mail mode, @kbd{C-c C-y} (@code{mail-yank-original}) uses
+ @code{indent-rigidly} to indent the text copied from the message being
+ replied to.
+ @end deffn
+ 
+ @defun indent-code-rigidly start end columns &optional nochange-regexp
+ This is like @code{indent-rigidly}, except that it doesn't alter lines
+ that start within strings or comments.
+ 
+ In addition, it doesn't alter a line if @var{nochange-regexp} matches at
+ the beginning of the line (if @var{nochange-regexp} is non-@code{nil}).
+ @end defun
+ 
+ @node Relative Indent
+ @subsection Indentation Relative to Previous Lines
+ 
+   This section describes two commands that indent the current line
+ based on the contents of previous lines.
+ 
+ @deffn Command indent-relative &optional unindented-ok
+ This command inserts whitespace at point, extending to the same
+ column as the next @dfn{indent point} of the previous nonblank line.  An
+ indent point is a non-whitespace character following whitespace.  The
+ next indent point is the first one at a column greater than the current
+ column of point.  For example, if point is underneath and to the left of
+ the first non-blank character of a line of text, it moves to that column
+ by inserting whitespace.
+ 
+ If the previous nonblank line has no next indent point (i.e., none at a
+ great enough column position), @code{indent-relative} either does
+ nothing (if @var{unindented-ok} is non-@code{nil}) or calls
+ @code{tab-to-tab-stop}.  Thus, if point is underneath and to the right
+ of the last column of a short line of text, this command ordinarily
+ moves point to the next tab stop by inserting whitespace.
+ 
+ The return value of @code{indent-relative} is unpredictable.
+ 
+ In the following example, point is at the beginning of the second
+ line:
+ 
+ @example
+ @group
+             This line is indented twelve spaces.
+ @point{}The quick brown fox jumped.
+ @end group
+ @end example
+ 
+ @noindent
+ Evaluation of the expression @code{(indent-relative nil)} produces the
+ following:
+ 
+ @example
+ @group
+             This line is indented twelve spaces.
+             @point{}The quick brown fox jumped.
+ @end group
+ @end example
+ 
+   In this example, point is between the @samp{m} and @samp{p} of
+ @samp{jumped}:
+ 
+ @example
+ @group
+             This line is indented twelve spaces.
+ The quick brown fox jum@point{}ped.
+ @end group
+ @end example
+ 
+ @noindent
+ Evaluation of the expression @code{(indent-relative nil)} produces the
+ following:
+ 
+ @example
+ @group
+             This line is indented twelve spaces.
+ The quick brown fox jum  @point{}ped.
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command indent-relative-maybe
+ @comment !!SourceFile indent.el
+ This command indents the current line like the previous nonblank line.
+ It calls @code{indent-relative} with @code{t} as the @var{unindented-ok}
+ argument.  The return value is unpredictable.
+ 
+ If the previous nonblank line has no indent points beyond the current
+ column, this command does nothing.
+ @end deffn
+ 
+ @node Indent Tabs
+ @comment  node-name,  next,  previous,  up
+ @subsection Adjustable ``Tab Stops''
+ @cindex tabs stops for indentation
+ 
+   This section explains the mechanism for user-specified ``tab stops''
+ and the mechanisms that use and set them.  The name ``tab stops'' is
+ used because the feature is similar to that of the tab stops on a
+ typewriter.  The feature works by inserting an appropriate number of
+ spaces and tab characters to reach the next tab stop column; it does not
+ affect the display of tab characters in the buffer (@pxref{Usual
+ Display}).  Note that the @key{TAB} character as input uses this tab
+ stop feature only in a few major modes, such as Text mode.
+ 
+ @deffn Command tab-to-tab-stop
+ This command inserts spaces or tabs up to the next tab stop column
+ defined by @code{tab-stop-list}.  It searches the list for an element
+ greater than the current column number, and uses that element as the
+ column to indent to.  It does nothing if no such element is found.
+ @end deffn
+ 
+ @defopt tab-stop-list
+ This variable is the list of tab stop columns used by
+ @code{tab-to-tab-stops}.  The elements should be integers in increasing
+ order.  The tab stop columns need not be evenly spaced.
+ 
+ Use @kbd{M-x edit-tab-stops} to edit the location of tab stops
+ interactively.
+ @end defopt
+ 
+ @node Motion by Indent
+ @subsection Indentation-Based Motion Commands
+ 
+   These commands, primarily for interactive use, act based on the
+ indentation in the text.
+ 
+ @deffn Command back-to-indentation 
+ @comment !!SourceFile simple.el
+ This command moves point to the first non-whitespace character in the
+ current line (which is the line in which point is located).  It returns
+ @code{nil}.
+ @end deffn
+ 
+ @deffn Command backward-to-indentation arg
+ @comment !!SourceFile simple.el
+ This command moves point backward @var{arg} lines and then to the
+ first nonblank character on that line.  It returns @code{nil}.
+ @end deffn
+ 
+ @deffn Command forward-to-indentation arg
+ @comment !!SourceFile simple.el
+ This command moves point forward @var{arg} lines and then to the first
+ nonblank character on that line.  It returns @code{nil}.
+ @end deffn
+ 
+ @node Case Changes
+ @comment  node-name,  next,  previous,  up
+ @section Case Changes
+ @cindex case changes
+ 
+   The case change commands described here work on text in the current
+ buffer.  @xref{Character Case}, for case conversion commands that work
+ on strings and characters.  @xref{Case Table}, for how to customize
+ which characters are upper or lower case and how to convert them.
+ 
+ @deffn Command capitalize-region start end
+ This function capitalizes all words in the region defined by
+ @var{start} and @var{end}.  To capitalize means to convert each word's
+ first character to upper case and convert the rest of each word to lower
+ case.  The function returns @code{nil}.
+ 
+ If one end of the region is in the middle of a word, the part of the
+ word within the region is treated as an entire word.
+ 
+ When @code{capitalize-region} is called interactively, @var{start} and
+ @var{end} are point and the mark, with the smallest first.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This is the contents of the 5th foo.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (capitalize-region 1 44)
+ @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ This Is The Contents Of The 5th Foo.
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command downcase-region start end
+ This function converts all of the letters in the region defined by
+ @var{start} and @var{end} to lower case.  The function returns
+ @code{nil}.
+ 
+ When @code{downcase-region} is called interactively, @var{start} and
+ @var{end} are point and the mark, with the smallest first.
+ @end deffn
+ 
+ @deffn Command upcase-region start end
+ This function converts all of the letters in the region defined by
+ @var{start} and @var{end} to upper case.  The function returns
+ @code{nil}.
+ 
+ When @code{upcase-region} is called interactively, @var{start} and
+ @var{end} are point and the mark, with the smallest first.
+ @end deffn
+ 
+ @deffn Command capitalize-word count
+ This function capitalizes @var{count} words after point, moving point
+ over as it does.  To capitalize means to convert each word's first
+ character to upper case and convert the rest of each word to lower case.
+ If @var{count} is negative, the function capitalizes the
+ @minus{}@var{count} previous words but does not move point.  The value
+ is @code{nil}.
+ 
+ If point is in the middle of a word, the part of the word before point
+ is ignored when moving forward.  The rest is treated as an entire word.
+ 
+ When @code{capitalize-word} is called interactively, @var{count} is
+ set to the numeric prefix argument.
+ @end deffn
+ 
+ @deffn Command downcase-word count
+ This function converts the @var{count} words after point to all lower
+ case, moving point over as it does.  If @var{count} is negative, it
+ converts the @minus{}@var{count} previous words but does not move point.
+ The value is @code{nil}.
+ 
+ When @code{downcase-word} is called interactively, @var{count} is set
+ to the numeric prefix argument.
+ @end deffn
+ 
+ @deffn Command upcase-word count
+ This function converts the @var{count} words after point to all upper
+ case, moving point over as it does.  If @var{count} is negative, it
+ converts the @minus{}@var{count} previous words but does not move point.
+ The value is @code{nil}.
+ 
+ When @code{upcase-word} is called interactively, @var{count} is set to
+ the numeric prefix argument.
+ @end deffn
+ 
+ @node Text Properties
+ @section Text Properties
+ @cindex text properties
+ @cindex attributes of text
+ @cindex properties of text
+ 
+   Each character position in a buffer or a string can have a @dfn{text
+ property list}, much like the property list of a symbol (@pxref{Property
+ Lists}).  The properties belong to a particular character at a
+ particular place, such as, the letter @samp{T} at the beginning of this
+ sentence or the first @samp{o} in @samp{foo}---if the same character
+ occurs in two different places, the two occurrences generally have
+ different properties.
+ 
+   Each property has a name and a value.  Both of these can be any Lisp
+ object, but the name is normally a symbol.  The usual way to access the
+ property list is to specify a name and ask what value corresponds to it.
+ 
+   If a character has a @code{category} property, we call it the
+ @dfn{category} of the character.  It should be a symbol.  The properties
+ of the symbol serve as defaults for the properties of the character.
+ 
+   Copying text between strings and buffers preserves the properties
+ along with the characters; this includes such diverse functions as
+ @code{substring}, @code{insert}, and @code{buffer-substring}.
+ 
+ @menu
+ * Examining Properties::	Looking at the properties of one character.
+ * Changing Properties::		Setting the properties of a range of text.
+ * Property Search::		Searching for where a property changes value.
+ * Special Properties::		Particular properties with special meanings.
+ * Format Properties::           Properties for representing formatting of text.
+ * Sticky Properties::           How inserted text gets properties from
+                                   neighboring text.
+ * Saving Properties::           Saving text properties in files, and reading
+                                   them back.
+ * Not Intervals::		Why text properties do not use
+ 				  Lisp-visible text intervals.
+ @end menu
+ 
+ @node Examining Properties
+ @subsection Examining Text Properties
+ 
+   The simplest way to examine text properties is to ask for the value of
+ a particular property of a particular character.  For that, use
+ @code{get-text-property}.  Use @code{text-properties-at} to get the
+ entire property list of a character.  @xref{Property Search}, for
+ functions to examine the properties of a number of characters at once.
+ 
+   These functions handle both strings and buffers.  Keep in mind that
+ positions in a string start from 0, whereas positions in a buffer start
+ from 1.
+ 
+ @defun get-text-property pos prop &optional object
+ This function returns the value of the @var{prop} property of the
+ character after position @var{pos} in @var{object} (a buffer or
+ string).  The argument @var{object} is optional and defaults to the
+ current buffer.
+ 
+ If there is no @var{prop} property strictly speaking, but the character
+ has a category that is a symbol, then @code{get-text-property} returns
+ the @var{prop} property of that symbol.
+ @end defun
+ 
+ @defun get-char-property pos prop &optional object
+ This function is like @code{get-text-property}, except that it checks
+ overlays first and then text properties.  @xref{Overlays}.
+ 
+ The argument @var{object} may be a string, a buffer, or a window.  If it
+ is a window, then the buffer displayed in that window is used for text
+ properties and overlays, but only the overlays active for that window
+ are considered.  If @var{object} is a buffer, then all overlays in that
+ buffer are considered, as well as text properties.  If @var{object} is a
+ string, only text properties are considered, since strings never have
+ overlays.
+ @end defun
+ 
+ @defun text-properties-at position &optional object
+ This function returns the entire property list of the character at
+ @var{position} in the string or buffer @var{object}.  If @var{object} is
+ @code{nil}, it defaults to the current buffer.
+ @end defun
+ 
+ @defvar default-text-properties
+ This variable holds a property list giving default values for text
+ properties.  Whenever a character does not specify a value for a
+ property, neither directly nor through a category symbol, the value
+ stored in this list is used instead.  Here is an example:
+ 
+ @example
+ (setq default-text-properties '(foo 69))
+ ;; @r{Make sure character 1 has no properties of its own.}
+ (set-text-properties 1 2 nil)
+ ;; @r{What we get, when we ask, is the default value.}
+ (get-text-property 1 'foo)
+      @result{} 69
+ @end example
+ @end defvar
+ 
+ @node Changing Properties
+ @subsection Changing Text Properties
+ 
+   The primitives for changing properties apply to a specified range of
+ text.  The function @code{set-text-properties} (see end of section) sets
+ the entire property list of the text in that range; more often, it is
+ useful to add, change, or delete just certain properties specified by
+ name.
+ 
+   Since text properties are considered part of the buffer's contents, and
+ can affect how the buffer looks on the screen, any change in the text
+ properties is considered a buffer modification.  Buffer text property
+ changes are undoable (@pxref{Undo}).
+ 
+ @defun put-text-property start end prop value &optional object
+ This function sets the @var{prop} property to @var{value} for the text
+ between @var{start} and @var{end} in the string or buffer @var{object}.
+ If @var{object} is @code{nil}, it defaults to the current buffer.
+ @end defun
+ 
+ @defun add-text-properties start end props &optional object
+ This function modifies the text properties for the text between
+ @var{start} and @var{end} in the string or buffer @var{object}.  If
+ @var{object} is @code{nil}, it defaults to the current buffer.
+ 
+ The argument @var{props} specifies which properties to change.  It
+ should have the form of a property list (@pxref{Property Lists}): a list
+ whose elements include the property names followed alternately by the
+ corresponding values.
+ 
+ The return value is @code{t} if the function actually changed some
+ property's value; @code{nil} otherwise (if @var{props} is @code{nil} or
+ its values agree with those in the text).
+ 
+ For example, here is how to set the @code{comment} and @code{face}
+ properties of a range of text:
+ 
+ @example
+ (add-text-properties @var{start} @var{end}
+                      '(comment t face highlight))
+ @end example
+ @end defun
+ 
+ @defun remove-text-properties start end props &optional object
+ This function deletes specified text properties from the text between
+ @var{start} and @var{end} in the string or buffer @var{object}.  If
+ @var{object} is @code{nil}, it defaults to the current buffer.
+ 
+ The argument @var{props} specifies which properties to delete.  It
+ should have the form of a property list (@pxref{Property Lists}): a list
+ whose elements are property names alternating with corresponding values.
+ But only the names matter---the values that accompany them are ignored.
+ For example, here's how to remove the @code{face} property.
+ 
+ @example
+ (remove-text-properties @var{start} @var{end} '(face nil))
+ @end example
+ 
+ The return value is @code{t} if the function actually changed some
+ property's value; @code{nil} otherwise (if @var{props} is @code{nil} or
+ if no character in the specified text had any of those properties).
+ @end defun
+ 
+ @defun set-text-properties start end props &optional object
+ This function completely replaces the text property list for the text
+ between @var{start} and @var{end} in the string or buffer @var{object}.
+ If @var{object} is @code{nil}, it defaults to the current buffer.
+ 
+ The argument @var{props} is the new property list.  It should be a list
+ whose elements are property names alternating with corresponding values.
+ 
+ After @code{set-text-properties} returns, all the characters in the
+ specified range have identical properties.
+ 
+ If @var{props} is @code{nil}, the effect is to get rid of all properties
+ from the specified range of text.  Here's an example:
+ 
+ @example
+ (set-text-properties @var{start} @var{end} nil)
+ @end example
+ @end defun
+ 
+ See also the function @code{buffer-substring-without-properties}
+ (@pxref{Buffer Contents}) which copies text from the buffer
+ but does not copy its properties.
+ 
+ @node Property Search
+ @subsection Property Search Functions
+ 
+ In typical use of text properties, most of the time several or many
+ consecutive characters have the same value for a property.  Rather than
+ writing your programs to examine characters one by one, it is much
+ faster to process chunks of text that have the same property value.
+ 
+ Here are functions you can use to do this.  They use @code{eq} for
+ comparing property values.  In all cases, @var{object} defaults to the
+ current buffer.
+ 
+ For high performance, it's very important to use the @var{limit}
+ argument to these functions, especially the ones that search for a
+ single property---otherwise, they may spend a long time scanning to the
+ end of the buffer, if the property you are interested in does not change.
+ 
+ Remember that a position is always between two characters; the position
+ returned by these functions is between two characters with different
+ properties.
+ 
+ @defun next-property-change pos &optional object limit
+ The function scans the text forward from position @var{pos} in the
+ string or buffer @var{object} till it finds a change in some text
+ property, then returns the position of the change.  In other words, it
+ returns the position of the first character beyond @var{pos} whose
+ properties are not identical to those of the character just after
+ @var{pos}.
+ 
+ If @var{limit} is non-@code{nil}, then the scan ends at position
+ @var{limit}.  If there is no property change before that point, 
+ @code{next-property-change} returns @var{limit}.
+ 
+ The value is @code{nil} if the properties remain unchanged all the way
+ to the end of @var{object} and @var{limit} is @code{nil}.  If the value
+ is non-@code{nil}, it is a position greater than or equal to @var{pos}.
+ The value equals @var{pos} only when @var{limit} equals @var{pos}.
+ 
+ Here is an example of how to scan the buffer by chunks of text within
+ which all properties are constant:
+ 
+ @smallexample
+ (while (not (eobp))
+   (let ((plist (text-properties-at (point)))
+         (next-change
+          (or (next-property-change (point) (current-buffer))
+              (point-max))))
+     @r{Process text from point to @var{next-change}@dots{}}
+     (goto-char next-change)))
+ @end smallexample
+ @end defun
+ 
+ @defun next-single-property-change pos prop &optional object limit
+ The function scans the text forward from position @var{pos} in the
+ string or buffer @var{object} till it finds a change in the @var{prop}
+ property, then returns the position of the change.  In other words, it
+ returns the position of the first character beyond @var{pos} whose
+ @var{prop} property differs from that of the character just after
+ @var{pos}.
+ 
+ If @var{limit} is non-@code{nil}, then the scan ends at position
+ @var{limit}.  If there is no property change before that point, 
+ @code{next-single-property-change} returns @var{limit}.
+ 
+ The value is @code{nil} if the property remains unchanged all the way to
+ the end of @var{object} and @var{limit} is @code{nil}.  If the value is
+ non-@code{nil}, it is a position greater than or equal to @var{pos}; it
+ equals @var{pos} only if @var{limit} equals @var{pos}.
+ @end defun
+ 
+ @defun previous-property-change pos &optional object limit
+ This is like @code{next-property-change}, but scans back from @var{pos}
+ instead of forward.  If the value is non-@code{nil}, it is a position
+ less than or equal to @var{pos}; it equals @var{pos} only if @var{limit}
+ equals @var{pos}.
+ @end defun
+ 
+ @defun previous-single-property-change pos prop &optional object limit
+ This is like @code{next-single-property-change}, but scans back from
+ @var{pos} instead of forward.  If the value is non-@code{nil}, it is a
+ position less than or equal to @var{pos}; it equals @var{pos} only if
+ @var{limit} equals @var{pos}.
+ @end defun
+ 
+ @defun text-property-any start end prop value &optional object
+ This function returns non-@code{nil} if at least one character between
+ @var{start} and @var{end} has a property @var{prop} whose value is
+ @var{value}.  More precisely, it returns the position of the first such
+ character.  Otherwise, it returns @code{nil}.
+ 
+ The optional fifth argument, @var{object}, specifies the string or
+ buffer to scan.  Positions are relative to @var{object}.  The default
+ for @var{object} is the current buffer.
+ @end defun
+ 
+ @defun text-property-not-all start end prop value &optional object
+ This function returns non-@code{nil} if at least one character between
+ @var{start} and @var{end} has a property @var{prop} whose value differs
+ from @var{value}.  More precisely, it returns the position of the
+ first such character.  Otherwise, it returns @code{nil}.
+ 
+ The optional fifth argument, @var{object}, specifies the string or
+ buffer to scan.  Positions are relative to @var{object}.  The default
+ for @var{object} is the current buffer.
+ @end defun
+ 
+ @node Special Properties
+ @subsection Properties with Special Meanings
+ 
+   Here is a table of text property names that have special built-in
+ meanings.  The following section lists a few more special property names
+ that are used to control filling.  All other names have no standard
+ meaning, and you can use them as you like.
+ 
+ @table @code
+ @cindex category of text character
+ @kindex category @r{(text property)}
+ @item category
+ If a character has a @code{category} property, we call it the
+ @dfn{category} of the character.  It should be a symbol.  The properties
+ of the symbol serve as defaults for the properties of the character.
+ 
+ @item face
+ @cindex face codes of text
+ @kindex face @r{(text property)}
+ You can use the property @code{face} to control the font and color of
+ text.  Its value is a face name or a list of face names.  @xref{Faces},
+ for more information.  This feature may be temporary; in the future, we
+ may replace it with other ways of specifying how to display text.
+ 
+ @item mouse-face
+ @kindex mouse-face @r{(text property)}
+ The property @code{mouse-face} is used instead of @code{face} when the
+ mouse is on or near the character.  For this purpose, ``near'' means
+ that all text between the character and where the mouse is have the same
+ @code{mouse-face} property value.
+ 
+ @item local-map
+ @cindex keymap of character
+ @kindex local-map @r{(text property)}
+ You can specify a different keymap for a portion of the text by means of
+ a @code{local-map} property.  The property's value for the character
+ after point, if non-@code{nil}, replaces the buffer's local map.
+ @xref{Active Keymaps}.
+ 
+ @item read-only
+ @cindex read-only character
+ @kindex read-only @r{(text property)}
+ If a character has the property @code{read-only}, then modifying that
+ character is not allowed.  Any command that would do so gets an error.
+ 
+ Insertion next to a read-only character is an error if inserting
+ ordinary text there would inherit the @code{read-only} property due to
+ stickiness.  Thus, you can control permission to insert next to
+ read-only text by controlling the stickiness.  @xref{Sticky Properties}.
+ 
+ Since changing properties counts as modifying the buffer, it is not
+ possible to remove a @code{read-only} property unless you know the
+ special trick: bind @code{inhibit-read-only} to a non-@code{nil} value
+ and then remove the property.  @xref{Read Only Buffers}.
+ 
+ @item invisible
+ @kindex invisible @r{(text property)}
+ A non-@code{nil} @code{invisible} property can make a character invisible
+ on the screen.  @xref{Invisible Text}, for details.
+ 
+ @item intangible
+ @kindex intangible @r{(text property)}
+ If a group of consecutive characters have equal and non-@code{nil}
+ @code{intangible} properties, then you cannot place point between them.
+ If you try to move point forward into the group, point actually moves to
+ the end of the group.  If you try to move point backward into the group,
+ point actually moves to the start of the group.
+ 
+ When the variable @code{inhibit-point-motion-hooks} is non-@code{nil},
+ the @code{intangible} property is ignored.
+ 
+ @item modification-hooks
+ @cindex change hooks for a character
+ @cindex hooks for changing a character
+ @kindex modification-hooks @r{(text property)}
+ If a character has the property @code{modification-hooks}, then its
+ value should be a list of functions; modifying that character calls all
+ of those functions.  Each function receives two arguments: the beginning
+ and end of the part of the buffer being modified.  Note that if a
+ particular modification hook function appears on several characters
+ being modified by a single primitive, you can't predict how many times
+ the function will be called.
+ 
+ @item insert-in-front-hooks
+ @itemx insert-behind-hooks
+ @kindex insert-in-front-hooks @r{(text property)}
+ @kindex insert-behind-hooks @r{(text property)}
+ The operation of inserting text in a buffer, before actually modifying
+ the buffer, calls the functions listed in the
+ @code{insert-in-front-hooks} property of the following character and in
+ the @code{insert-behind-hooks} property of the preceding character.
+ These functions receive two arguments, the beginning and end of the
+ inserted text.
+ 
+ See also @ref{Change Hooks}, for other hooks that are called
+ when you change text in a buffer.
+ 
+ @item point-entered
+ @itemx point-left
+ @cindex hooks for motion of point
+ @kindex point-entered @r{(text property)}
+ @kindex point-left @r{(text property)}
+ The special properties @code{point-entered} and @code{point-left}
+ record hook functions that report motion of point.  Each time point
+ moves, Emacs compares these two property values:
+ 
+ @itemize @bullet
+ @item
+ the @code{point-left} property of the character after the old location,
+ and
+ @item
+ the @code{point-entered} property of the character after the new
+ location.
+ @end itemize
+ 
+ @noindent
+ If these two values differ, each of them is called (if not @code{nil})
+ with two arguments: the old value of point, and the new one.
+ 
+ The same comparison is made for the characters before the old and new
+ locations.  The result may be to execute two @code{point-left} functions
+ (which may be the same function) and/or two @code{point-entered}
+ functions (which may be the same function).  In any case, all the
+ @code{point-left} functions are called first, followed by all the
+ @code{point-entered} functions.
+ 
+ A primitive function may examine characters at various positions
+ without moving point to those positions.  Only an actual change in the
+ value of point runs these hook functions.
+ @end table
+ 
+ @defvar inhibit-point-motion-hooks
+ When this variable is non-@code{nil}, @code{point-left} and
+ @code{point-entered} hooks are not run, and the @code{intangible}
+ property has no effect.
+ @end defvar
+ 
+ @node Format Properties
+ @subsection Formatted Text Properties
+ 
+   These text properties affect the behavior of the fill commands.  They
+ are used for representing formatted text.  @xref{Filling}, and
+ @ref{Margins}.
+ 
+ @table @code
+ @item hard
+ If a newline character has this property, it is a ``hard'' newline.
+ The fill commands do not alter hard newlines and do not move words
+ across them.  However, this property takes effect only if the variable
+ @code{use-hard-newlines} is non-@code{nil}.
+ 
+ @item right-margin
+ This property specifies an extra right margin for filling this part of the
+ text.
+ 
+ @item left-margin
+ This property specifies an extra left margin for filling this part of the
+ text.
+ 
+ @item justification
+ This property specifies the style of justification for filling this part
+ of the text.
+ @end table
+ 
+ @node Sticky Properties
+ @subsection Stickiness of Text Properties
+ @cindex sticky text properties
+ @cindex inheritance of text properties
+ 
+   Self-inserting characters normally take on the same properties as the
+ preceding character.  This is called @dfn{inheritance} of properties.
+ 
+   In a Lisp program, you can do insertion with inheritance or without,
+ depending on your choice of insertion primitive.  The ordinary text
+ insertion functions such as @code{insert} do not inherit any properties.
+ They insert text with precisely the properties of the string being
+ inserted, and no others.  This is correct for programs that copy text
+ from one context to another---for example, into or out of the kill ring.
+ To insert with inheritance, use the special primitives described in this
+ section.  Self-inserting characters inherit properties because they work
+ using these primitives.
+ 
+   When you do insertion with inheritance, @emph{which} properties are
+ inherited depends on two specific properties: @code{front-sticky} and
+ @code{rear-nonsticky}.
+ 
+   Insertion after a character inherits those of its properties that are
+ @dfn{rear-sticky}.  Insertion before a character inherits those of its
+ properties that are @dfn{front-sticky}.  By default, a text property is
+ rear-sticky but not front-sticky.  Thus, the default is to inherit all
+ the properties of the preceding character, and nothing from the
+ following character.  You can request different behavior by specifying
+ the stickiness of certain properties.
+ 
+   If a character's @code{front-sticky} property is @code{t}, then all
+ its properties are front-sticky.  If the @code{front-sticky} property is
+ a list, then the sticky properties of the character are those whose
+ names are in the list.  For example, if a character has a
+ @code{front-sticky} property whose value is @code{(face read-only)},
+ then insertion before the character can inherit its @code{face} property
+ and its @code{read-only} property, but no others.
+ 
+   The @code{rear-nonsticky} works the opposite way.  Every property is
+ rear-sticky by default, so the @code{rear-nonsticky} property says which
+ properties are @emph{not} rear-sticky.  If a character's
+ @code{rear-nonsticky} property is @code{t}, then none of its properties
+ are rear-sticky.  If the @code{rear-nonsticky} property is a list,
+ properties are rear-sticky @emph{unless} their names are in the list.
+ 
+   When you insert text with inheritance, it inherits all the rear-sticky
+ properties of the preceding character, and all the front-sticky
+ properties of the following character.  The previous character's
+ properties take precedence when both sides offer different sticky values
+ for the same property.
+ 
+   Here are the functions that insert text with inheritance of properties:
+ 
+ @defun insert-and-inherit &rest strings
+ Insert the strings @var{strings}, just like the function @code{insert},
+ but inherit any sticky properties from the adjoining text.
+ @end defun
+ 
+ @defun insert-before-markers-and-inherit &rest strings
+ Insert the strings @var{strings}, just like the function
+ @code{insert-before-markers}, but inherit any sticky properties from the
+ adjoining text.
+ @end defun
+ 
+ @node Saving Properties
+ @subsection Saving Text Properties in Files
+ @cindex text properties in files
+ @cindex saving text properties
+ 
+   You can save text properties in files, and restore text properties
+ when inserting the files, using these two hooks: 
+ 
+ @defvar write-region-annotate-functions
+ This variable's value is a list of functions for @code{write-region} to
+ run to encode text properties in some fashion as annotations to the text
+ being written in the file.  @xref{Writing to Files}.
+ 
+ Each function in the list is called with two arguments: the start and
+ end of the region to be written.  These functions should not alter the
+ contents of the buffer.  Instead, they should return lists indicating
+ annotations to write in the file in addition to the text in the
+ buffer.
+ 
+ Each function should return a list of elements of the form
+ @code{(@var{position} . @var{string})}, where @var{position} is an
+ integer specifying the relative position in the text to be written, and
+ @var{string} is the annotation to add there.
+ 
+ Each list returned by one of these functions must be already sorted in
+ increasing order by @var{position}.  If there is more than one function,
+ @code{write-region} merges the lists destructively into one sorted list.
+ 
+ When @code{write-region} actually writes the text from the buffer to the
+ file, it intermixes the specified annotations at the corresponding
+ positions.  All this takes place without modifying the buffer.
+ @end defvar
+ 
+ @defvar after-insert-file-functions
+ This variable holds a list of functions for @code{insert-file-contents}
+ to call after inserting a file's contents.  These functions should scan
+ the inserted text for annotations, and convert them to the text
+ properties they stand for.
+ 
+ Each function receives one argument, the length of the inserted text;
+ point indicates the start of that text.  The function should scan that
+ text for annotations, delete them, and create the text properties that
+ the annotations specify.  The function should return the updated length
+ of the inserted text, as it stands after those changes.  The value
+ returned by one function becomes the argument to the next function.
+ 
+ These functions should always return with point at the beginning of
+ the inserted text.
+ 
+ The intended use of @code{after-insert-file-functions} is for converting
+ some sort of textual annotations into actual text properties.  But other
+ uses may be possible.
+ @end defvar
+ 
+ We invite users to write Lisp programs to store and retrieve text
+ properties in files, using these hooks, and thus to experiment with
+ various data formats and find good ones.  Eventually we hope users 
+ will produce good, general extensions we can install in Emacs.
+ 
+ We suggest not trying to handle arbitrary Lisp objects as property
+ names or property values---because a program that general is probably
+ difficult to write, and slow.  Instead, choose a set of possible data
+ types that are reasonably flexible, and not too hard to encode.
+ 
+ @xref{Format Conversion}, for a related feature.
+ 
+ @c ??? In next edition, merge this info Format Conversion.
+ 
+ @node Not Intervals
+ @subsection Why Text Properties are not Intervals
+ @cindex intervals
+ 
+   Some editors that support adding attributes to text in the buffer do
+ so by letting the user specify ``intervals'' within the text, and adding
+ the properties to the intervals.  Those editors permit the user or the
+ programmer to determine where individual intervals start and end.  We
+ deliberately provided a different sort of interface in Emacs Lisp to
+ avoid certain paradoxical behavior associated with text modification.
+ 
+   If the actual subdivision into intervals is meaningful, that means you
+ can distinguish between a buffer that is just one interval with a
+ certain property, and a buffer containing the same text subdivided into
+ two intervals, both of which have that property.
+ 
+   Suppose you take the buffer with just one interval and kill part of
+ the text.  The text remaining in the buffer is one interval, and the
+ copy in the kill ring (and the undo list) becomes a separate interval.
+ Then if you yank back the killed text, you get two intervals with the
+ same properties.  Thus, editing does not preserve the distinction
+ between one interval and two.
+ 
+   Suppose we ``fix'' this problem by coalescing the two intervals when
+ the text is inserted.  That works fine if the buffer originally was a
+ single interval.  But suppose instead that we have two adjacent
+ intervals with the same properties, and we kill the text of one interval
+ and yank it back.  The same interval-coalescence feature that rescues
+ the other case causes trouble in this one: after yanking, we have just
+ one interval.  One again, editing does not preserve the distinction
+ between one interval and two.
+ 
+   Insertion of text at the border between intervals also raises
+ questions that have no satisfactory answer.
+ 
+   However, it is easy to arrange for editing to behave consistently for
+ questions of the form, ``What are the properties of this character?''
+ So we have decided these are the only questions that make sense; we have
+ not implemented asking questions about where intervals start or end.
+ 
+   In practice, you can usually use the property search functions in
+ place of explicit interval boundaries.  You can think of them as finding
+ the boundaries of intervals, assuming that intervals are always
+ coalesced whenever possible.  @xref{Property Search}.
+ 
+   Emacs also provides explicit intervals as a presentation feature; see
+ @ref{Overlays}.
+ 
+ @node Substitution
+ @section Substituting for a Character Code
+ 
+   The following functions replace characters within a specified region
+ based on their character codes.
+ 
+ @defun subst-char-in-region start end old-char new-char &optional noundo
+ @cindex replace characters
+ This function replaces all occurrences of the character @var{old-char}
+ with the character @var{new-char} in the region of the current buffer
+ defined by @var{start} and @var{end}.
+ 
+ @cindex Outline mode
+ @cindex undo avoidance
+ If @var{noundo} is non-@code{nil}, then @code{subst-char-in-region} does
+ not record the change for undo and does not mark the buffer as modified.
+ This feature is used for controlling selective display (@pxref{Selective
+ Display}).
+ 
+ @code{subst-char-in-region} does not move point and returns
+ @code{nil}.
+ 
+ @example
+ @group
+ ---------- Buffer: foo ----------
+ This is the contents of the buffer before.
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (subst-char-in-region 1 20 ?i ?X)
+      @result{} nil
+ 
+ ---------- Buffer: foo ----------
+ ThXs Xs the contents of the buffer before.
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ @end defun
+ 
+ @defun translate-region start end table
+ This function applies a translation table to the characters in the
+ buffer between positions @var{start} and @var{end}.
+ 
+ The translation table @var{table} is a string; @code{(aref @var{table}
+ @var{ochar})} gives the translated character corresponding to
+ @var{ochar}.  If the length of @var{table} is less than 256, any
+ characters with codes larger than the length of @var{table} are not
+ altered by the translation.
+ 
+ The return value of @code{translate-region} is the number of
+ characters that were actually changed by the translation.  This does
+ not count characters that were mapped into themselves in the
+ translation table.
+ @end defun
+ 
+ @node Registers
+ @section Registers
+ @cindex registers
+ 
+   A register is a sort of variable used in Emacs editing that can hold a
+ marker, a string, a rectangle, a window configuration (of one frame), or
+ a frame configuration (of all frames).  Each register is named by a
+ single character.  All characters, including control and meta characters
+ (but with the exception of @kbd{C-g}), can be used to name registers.
+ Thus, there are 255 possible registers.  A register is designated in
+ Emacs Lisp by a character that is its name.
+ 
+   The functions in this section return unpredictable values unless
+ otherwise stated.
+ @c Will change in version 19
+ 
+ @defvar register-alist
+ This variable is an alist of elements of the form @code{(@var{name} .
+ @var{contents})}.  Normally, there is one element for each Emacs
+ register that has been used.
+ 
+ The object @var{name} is a character (an integer) identifying the
+ register.  The object @var{contents} is a string, marker, or list
+ representing the register contents.  A string represents text stored in
+ the register.  A marker represents a position.  A list represents a
+ rectangle; its elements are strings, one per line of the rectangle.
+ @end defvar
+ 
+ @defun get-register reg
+ This function returns the contents of the register
+ @var{reg}, or @code{nil} if it has no contents.
+ @end defun
+ 
+ @defun set-register reg value
+ This function sets the contents of register @var{reg} to @var{value}.
+ A register can be set to any value, but the other register functions
+ expect only certain data types.  The return value is @var{value}.
+ @end defun
+ 
+ @deffn Command view-register reg
+ This command displays what is contained in register @var{reg}.
+ @end deffn
+ 
+ @ignore
+ @deffn Command point-to-register reg
+ This command stores both the current location of point and the current
+ buffer in register @var{reg} as a marker.
+ @end deffn
+ 
+ @deffn Command jump-to-register reg
+ @deffnx Command register-to-point reg
+ @comment !!SourceFile register.el
+ This command restores the status recorded in register @var{reg}.
+ 
+ If @var{reg} contains a marker, it moves point to the position stored in
+ the marker.  Since both the buffer and the location within the buffer
+ are stored by the @code{point-to-register} function, this command can
+ switch you to another buffer.
+ 
+ If @var{reg} contains a window configuration or a frame configuration.
+ @code{jump-to-register} restores that configuration.
+ @end deffn
+ @end ignore
+ 
+ @deffn Command insert-register reg &optional beforep
+ This command inserts contents of register @var{reg} into the current
+ buffer.
+ 
+ Normally, this command puts point before the inserted text, and the
+ mark after it.  However, if the optional second argument @var{beforep}
+ is non-@code{nil}, it puts the mark before and point after.
+ You can pass a non-@code{nil} second argument @var{beforep} to this
+ function interactively by supplying any prefix argument.
+ 
+ If the register contains a rectangle, then the rectangle is inserted
+ with its upper left corner at point.  This means that text is inserted
+ in the current line and underneath it on successive lines.
+ 
+ If the register contains something other than saved text (a string) or
+ a rectangle (a list), currently useless things happen.  This may be
+ changed in the future.
+ @end deffn
+ 
+ @ignore
+ @deffn Command copy-to-register reg start end &optional delete-flag
+ This command copies the region from @var{start} to @var{end} into
+ register @var{reg}.  If @var{delete-flag} is non-@code{nil}, it deletes
+ the region from the buffer after copying it into the register.
+ @end deffn
+ 
+ @deffn Command prepend-to-register reg start end &optional delete-flag
+ This command prepends the region from @var{start} to @var{end} into
+ register @var{reg}.  If @var{delete-flag} is non-@code{nil}, it deletes
+ the region from the buffer after copying it to the register.
+ @end deffn
+ 
+ @deffn Command append-to-register reg start end &optional delete-flag
+ This command appends the region from @var{start} to @var{end} to the
+ text already in register @var{reg}.  If @var{delete-flag} is
+ non-@code{nil}, it deletes the region from the buffer after copying it
+ to the register.
+ @end deffn
+ 
+ @deffn Command copy-rectangle-to-register reg start end &optional delete-flag
+ This command copies a rectangular region from @var{start} to @var{end}
+ into register @var{reg}.  If @var{delete-flag} is non-@code{nil}, it
+ deletes the region from the buffer after copying it to the register.
+ @end deffn
+ 
+ @deffn Command window-configuration-to-register reg
+ This function stores the window configuration of the selected frame in
+ register @var{reg}.
+ @end deffn
+ 
+ @deffn Command frame-configuration-to-register reg
+ This function stores the current frame configuration in register
+ @var{reg}.
+ @end deffn
+ @end ignore
+ 
+ @node Transposition
+ @section Transposition of Text
+ 
+   This subroutine is used by the transposition commands.
+ 
+ @defun transpose-regions start1 end1 start2 end2 &optional leave-markers
+ This function exchanges two nonoverlapping portions of the buffer.
+ Arguments @var{start1} and @var{end1} specify the bounds of one portion
+ and arguments @var{start2} and @var{end2} specify the bounds of the
+ other portion.
+ 
+ Normally, @code{transpose-regions} relocates markers with the transposed
+ text; a marker previously positioned within one of the two transposed
+ portions moves along with that portion, thus remaining between the same
+ two characters in their new position.  However, if @var{leave-markers}
+ is non-@code{nil}, @code{transpose-regions} does not do this---it leaves
+ all markers unrelocated.
+ @end defun
+ 
+ @node Change Hooks
+ @section Change Hooks
+ @cindex change hooks
+ @cindex hooks for text changes
+ 
+   These hook variables let you arrange to take notice of all changes in
+ all buffers (or in a particular buffer, if you make them buffer-local).
+ See also @ref{Special Properties}, for how to detect changes to specific
+ parts of the text.
+ 
+   The functions you use in these hooks should save and restore the match
+ data if they do anything that uses regular expressions; otherwise, they
+ will interfere in bizarre ways with the editing operations that call
+ them.
+ 
+ @defvar before-change-functions
+ This variable holds a list of a functions to call before any buffer
+ modification.  Each function gets two arguments, the beginning and end
+ of the region that is about to change, represented as integers.  The
+ buffer that is about to change is always the current buffer.
+ @end defvar
+ 
+ @defvar after-change-functions
+ This variable holds a list of a functions to call after any buffer
+ modification.  Each function receives three arguments: the beginning and
+ end of the region just changed, and the length of the text that existed
+ before the change.  (To get the current length, subtract the region
+ beginning from the region end.)  All three arguments are integers.  The
+ buffer that's about to change is always the current buffer.
+ @end defvar
+ 
+ @defvar before-change-function
+ This obsolete variable holds one function to call before any buffer
+ modification (or @code{nil} for no function).  It is called just like
+ the functions in @code{before-change-functions}.
+ @end defvar
+ 
+ @defvar after-change-function
+ This obsolete variable holds one function to call after any buffer modification
+ (or @code{nil} for no function).  It is called just like the functions in
+ @code{after-change-functions}.
+ @end defvar
+ 
+ The four variables above are temporarily bound to @code{nil} during the
+ time that any of these functions is running.  This means that if one of
+ these functions changes the buffer, that change won't run these
+ functions.  If you do want a hook function to make changes that run
+ these functions, make it bind these variables back to their usual
+ values.
+ 
+ One inconvenient result of this protective feature is that you cannot
+ have a function in @code{after-change-functions} or
+ @code{before-change-functions} which changes the value of that variable.
+ But that's not a real limitation.  If you want those functions to change
+ the list of functions to run, simply add one fixed function to the hook,
+ and code that function to look in another variable for other functions
+ to call.  Here is an example:
+ 
+ @example
+ (setq my-own-after-change-functions nil)
+ (defun indirect-after-change-function (beg end len)
+   (let ((list my-own-after-change-functions))
+     (while list
+       (funcall (car list) beg end len)
+       (setq list (cdr list)))))
+ (add-hooks 'after-change-functions
+            'indirect-after-change-function)
+ @end example
+ 
+ @defvar first-change-hook
+ This variable is a normal hook that is run whenever a buffer is changed
+ that was previously in the unmodified state.
+ @end defvar
Index: emacs/man/elisp-tips.texi
diff -c /dev/null emacs/man/elisp-tips.texi:1.2
*** /dev/null	Fri Aug  2 21:00:05 1996
--- emacs/man/elisp-tips.texi	Thu Aug  1 00:23:39 1996
***************
*** 0 ****
--- 1,658 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/tips
+ @node Tips, GNU Emacs Internals, Calendar, Top
+ @appendix Tips and Standards
+ @cindex tips
+ @cindex standards of coding style
+ @cindex coding standards
+ 
+   This chapter describes no additional features of Emacs Lisp.
+ Instead it gives advice on making effective use of the features described
+ in the previous chapters.
+ 
+ @menu
+ * Style Tips::                Writing clean and robust programs.
+ * Compilation Tips::          Making compiled code run fast.
+ * Documentation Tips::        Writing readable documentation strings.
+ * Comment Tips::	      Conventions for writing comments.
+ * Library Headers::           Standard headers for library packages.
+ @end menu
+ 
+ @node Style Tips
+ @section Writing Clean Lisp Programs
+ 
+   Here are some tips for avoiding common errors in writing Lisp code
+ intended for widespread use:
+ 
+ @itemize @bullet
+ @item
+ Since all global variables share the same name space, and all functions
+ share another name space, you should choose a short word to distinguish
+ your program from other Lisp programs.  Then take care to begin the
+ names of all global variables, constants, and functions with the chosen
+ prefix.  This helps avoid name conflicts.
+ 
+ This recommendation applies even to names for traditional Lisp
+ primitives that are not primitives in Emacs Lisp---even to @code{cadr}.
+ Believe it or not, there is more than one plausible way to define
+ @code{cadr}.  Play it safe; append your name prefix to produce a name
+ like @code{foo-cadr} or @code{mylib-cadr} instead.
+ 
+ If you write a function that you think ought to be added to Emacs under
+ a certain name, such as @code{twiddle-files}, don't call it by that name
+ in your program.  Call it @code{mylib-twiddle-files} in your program,
+ and send mail to @samp{bug-gnu-emacs@@prep.ai.mit.edu} suggesting we add
+ it to Emacs.  If and when we do, we can change the name easily enough.
+ 
+ If one prefix is insufficient, your package may use two or three
+ alternative common prefixes, so long as they make sense.
+ 
+ Separate the prefix from the rest of the symbol name with a hyphen,
+ @samp{-}.  This will be consistent with Emacs itself and with most Emacs
+ Lisp programs.
+ 
+ @item
+ It is often useful to put a call to @code{provide} in each separate
+ library program, at least if there is more than one entry point to the
+ program.
+ 
+ @item
+ If a file requires certain other library programs to be loaded
+ beforehand, then the comments at the beginning of the file should say
+ so.  Also, use @code{require} to make sure they are loaded.
+ 
+ @item
+ If one file @var{foo} uses a macro defined in another file @var{bar},
+ @var{foo} should contain this expression before the first use of the
+ macro:
+ 
+ @example
+ (eval-when-compile (require '@var{bar}))
+ @end example
+ 
+ @noindent
+ (And @var{bar} should contain @code{(provide '@var{bar})}, to make the
+ @code{require} work.)  This will cause @var{bar} to be loaded when you
+ byte-compile @var{foo}.  Otherwise, you risk compiling @var{foo} without
+ the necessary macro loaded, and that would produce compiled code that
+ won't work right.  @xref{Compiling Macros}.
+ 
+ Using @code{eval-when-compile} avoids loading @var{bar} when
+ the compiled version of @var{foo} is @emph{used}.
+ 
+ @item
+ If you define a major mode, make sure to run a hook variable using
+ @code{run-hooks}, just as the existing major modes do.  @xref{Hooks}.
+ 
+ @item
+ If the purpose of a function is to tell you whether a certain condition
+ is true or false, give the function a name that ends in @samp{p}.  If
+ the name is one word, add just @samp{p}; if the name is multiple words,
+ add @samp{-p}.  Examples are @code{framep} and @code{frame-live-p}.
+ 
+ @item
+ If a user option variable records a true-or-false condition, give it a
+ name that ends in @samp{-flag}.
+ 
+ @item
+ Please do not define @kbd{C-c @var{letter}} as a key in your major
+ modes.  These sequences are reserved for users; they are the
+ @strong{only} sequences reserved for users, so we cannot do without
+ them.
+ 
+ Instead, define sequences consisting of @kbd{C-c} followed by a
+ non-letter.  These sequences are reserved for major modes.
+ 
+ Changing all the major modes in Emacs 18 so they would follow this
+ convention was a lot of work.  Abandoning this convention would make
+ that work go to waste, and inconvenience users.
+ 
+ @item
+ Sequences consisting of @kbd{C-c} followed by @kbd{@{}, @kbd{@}},
+ @kbd{<}, @kbd{>}, @kbd{:} or @kbd{;} are also reserved for major modes.
+ 
+ @item
+ Sequences consisting of @kbd{C-c} followed by any other punctuation
+ character are allocated for minor modes.  Using them in a major mode is
+ not absolutely prohibited, but if you do that, the major mode binding
+ may be shadowed from time to time by minor modes.
+ 
+ @item
+ You should not bind @kbd{C-h} following any prefix character (including
+ @kbd{C-c}).  If you don't bind @kbd{C-h}, it is automatically available
+ as a help character for listing the subcommands of the prefix character.
+ 
+ @item
+ You should not bind a key sequence ending in @key{ESC} except following
+ another @key{ESC}.  (That is, it is ok to bind a sequence ending in
+ @kbd{@key{ESC} @key{ESC}}.)
+ 
+ The reason for this rule is that a non-prefix binding for @key{ESC} in
+ any context prevents recognition of escape sequences as function keys in
+ that context.
+ 
+ @item
+ Applications should not bind mouse events based on button 1 with the
+ shift key held down.  These events include @kbd{S-mouse-1},
+ @kbd{M-S-mouse-1}, @kbd{C-S-mouse-1}, and so on.  They are reserved for
+ users.
+ 
+ @item
+ Modes should redefine @kbd{mouse-2} as a command to follow some sort of
+ reference in the text of a buffer, if users usually would not want to
+ alter the text in that buffer by hand.  Modes such as Dired, Info,
+ Compilation, and Occur redefine it in this way.
+ 
+ @item
+ When a package provides a modification of ordinary Emacs behavior, it is
+ good to include a command to enable and disable the feature, Provide a
+ command named @code{@var{whatever}-mode} which turns the feature on or
+ off, and make it autoload (@pxref{Autoload}).  Design the package so
+ that simply loading it has no visible effect---that should not enable
+ the feature.  Users will request the feature by invoking the command.
+ 
+ @item
+ It is a bad idea to define aliases for the Emacs primitives.  Use the
+ standard names instead.
+ 
+ @item
+ Redefining an Emacs primitive is an even worse idea.
+ It may do the right thing for a particular program, but 
+ there is no telling what other programs might break as a result.
+ 
+ @item
+ If a file does replace any of the functions or library programs of
+ standard Emacs, prominent comments at the beginning of the file should
+ say which functions are replaced, and how the behavior of the
+ replacements differs from that of the originals.
+ 
+ @item
+ Please keep the names of your Emacs Lisp source files to 13 characters
+ or less.  This way, if the files are compiled, the compiled files' names
+ will be 14 characters or less, which is short enough to fit on all kinds
+ of Unix systems.
+ 
+ @item
+ Don't use @code{next-line} or @code{previous-line} in programs; nearly
+ always, @code{forward-line} is more convenient as well as more
+ predictable and robust.  @xref{Text Lines}.
+ 
+ @item
+ Don't call functions that set the mark, unless setting the mark is one
+ of the intended features of your program.  The mark is a user-level
+ feature, so it is incorrect to change the mark except to supply a value
+ for the user's benefit.  @xref{The Mark}.
+ 
+ In particular, don't use these functions:
+ 
+ @itemize @bullet
+ @item
+ @code{beginning-of-buffer}, @code{end-of-buffer}
+ @item
+ @code{replace-string}, @code{replace-regexp}
+ @end itemize
+ 
+ If you just want to move point, or replace a certain string, without any
+ of the other features intended for interactive users, you can replace
+ these functions with one or two lines of simple Lisp code.
+ 
+ @item
+ Use lists rather than vectors, except when there is a particular reason
+ to use a vector.  Lisp has more facilities for manipulating lists than
+ for vectors, and working with lists is usually more convenient.
+ 
+ Vectors are advantageous for tables that are substantial in size and are
+ accessed in random order (not searched front to back), provided there is
+ no need to insert or delete elements (only lists allow that).
+ 
+ @item
+ The recommended way to print a message in the echo area is with
+ the @code{message} function, not @code{princ}.  @xref{The Echo Area}.
+ 
+ @item
+ When you encounter an error condition, call the function @code{error}
+ (or @code{signal}).  The function @code{error} does not return.
+ @xref{Signaling Errors}.
+ 
+ Do not use @code{message}, @code{throw}, @code{sleep-for},
+ or @code{beep} to report errors.
+ 
+ @item
+ An error message should start with a capital letter but should not end
+ with a period.
+ 
+ @item
+ Try to avoid using recursive edits.  Instead, do what the Rmail @kbd{e}
+ command does: use a new local keymap that contains one command defined
+ to switch back to the old local keymap.  Or do what the
+ @code{edit-options} command does: switch to another buffer and let the
+ user switch back at will.  @xref{Recursive Editing}.
+ 
+ @item
+ In some other systems there is a convention of choosing variable names
+ that begin and end with @samp{*}.  We don't use that convention in Emacs
+ Lisp, so please don't use it in your programs.  (Emacs uses such names
+ only for program-generated buffers.)  The users will find Emacs more
+ coherent if all libraries use the same conventions.
+ 
+ @item
+ Indent each function with @kbd{C-M-q} (@code{indent-sexp}) using the
+ default indentation parameters.
+ 
+ @item
+ Don't make a habit of putting close-parentheses on lines by themselves;
+ Lisp programmers find this disconcerting.  Once in a while, when there
+ is a sequence of many consecutive close-parentheses, it may make sense
+ to split them in one or two significant places.
+ 
+ @item
+ Please put a copyright notice on the file if you give copies to anyone.
+ Use the same lines that appear at the top of the Lisp files in Emacs
+ itself.  If you have not signed papers to assign the copyright to the
+ Foundation, then place your name in the copyright notice in place of the
+ Foundation's name.
+ @end itemize
+ 
+ @node Compilation Tips
+ @section Tips for Making Compiled Code Fast
+ @cindex execution speed
+ @cindex speedups
+ 
+   Here are ways of improving the execution speed of byte-compiled
+ Lisp programs.
+ 
+ @itemize @bullet
+ @item
+ @cindex profiling
+ @cindex timing programs
+ @cindex @file{profile.el}
+ Use the @file{profile} library to profile your program.  See the file
+ @file{profile.el} for instructions.
+ 
+ @item
+ Use iteration rather than recursion whenever possible.
+ Function calls are slow in Emacs Lisp even when a compiled function
+ is calling another compiled function.
+ 
+ @item
+ Using the primitive list-searching functions @code{memq}, @code{member},
+ @code{assq}, or @code{assoc} is even faster than explicit iteration.  It
+ may be worth rearranging a data structure so that one of these primitive
+ search functions can be used.
+ 
+ @item
+ Certain built-in functions are handled specially in byte-compiled code, 
+ avoiding the need for an ordinary function call.  It is a good idea to
+ use these functions rather than alternatives.  To see whether a function
+ is handled specially by the compiler, examine its @code{byte-compile}
+ property.  If the property is non-@code{nil}, then the function is
+ handled specially.
+ 
+ For example, the following input will show you that @code{aref} is
+ compiled specially (@pxref{Array Functions}) while @code{elt} is not
+ (@pxref{Sequence Functions}):
+ 
+ @example
+ @group
+ (get 'aref 'byte-compile)
+      @result{} byte-compile-two-args
+ @end group
+ 
+ @group
+ (get 'elt 'byte-compile)
+      @result{} nil
+ @end group
+ @end example
+ 
+ @item
+ If calling a small function accounts for a  substantial part of your
+ program's running time, make the function inline.  This eliminates
+ the function call overhead.  Since making a function inline reduces
+ the flexibility of changing the program, don't do it unless it gives
+ a noticeable speedup in something slow enough that users care about
+ the speed.  @xref{Inline Functions}.
+ @end itemize
+ 
+ @node Documentation Tips
+ @section Tips for Documentation Strings
+ 
+   Here are some tips for the writing of documentation strings.
+ 
+ @itemize @bullet
+ @item
+ Every command, function, or variable intended for users to know about
+ should have a documentation string.
+ 
+ @item
+ An internal variable or subroutine of a Lisp program might as well have
+ a documentation string.  In earlier Emacs versions, you could save space
+ by using a comment instead of a documentation string, but that is no
+ longer the case.
+ 
+ @item
+ The first line of the documentation string should consist of one or two
+ complete sentences that stand on their own as a summary.  @kbd{M-x
+ apropos} displays just the first line, and if it doesn't stand on its
+ own, the result looks bad.  In particular, start the first line with a
+ capital letter and end with a period.
+ 
+ The documentation string can have additional lines that expand on the
+ details of how to use the function or variable.  The additional lines
+ should be made up of complete sentences also, but they may be filled if
+ that looks good.
+ 
+ @item
+ For consistency, phrase the verb in the first sentence of a
+ documentation string as an infinitive with ``to'' omitted.  For
+ instance, use ``Return the cons of A and B.'' in preference to ``Returns
+ the cons of A and B@.''  Usually it looks good to do likewise for the
+ rest of the first paragraph.  Subsequent paragraphs usually look better
+ if they have proper subjects.
+ 
+ @item
+ Write documentation strings in the active voice, not the passive, and in
+ the present tense, not the future.  For instance, use ``Return a list
+ containing A and B.'' instead of ``A list containing A and B will be
+ returned.''
+ 
+ @item
+ Avoid using the word ``cause'' (or its equivalents) unnecessarily.
+ Instead of, ``Cause Emacs to display text in boldface,'' write just
+ ``Display text in boldface.''
+ 
+ @item
+ Do not start or end a documentation string with whitespace.
+ 
+ @item
+ Format the documentation string so that it fits in an Emacs window on an
+ 80-column screen.  It is a good idea for most lines to be no wider than
+ 60 characters.  The first line can be wider if necessary to fit the 
+ information that ought to be there.
+ 
+ However, rather than simply filling the entire documentation string, you
+ can make it much more readable by choosing line breaks with care.
+ Use blank lines between topics if the documentation string is long.
+  
+ @item
+ @strong{Do not} indent subsequent lines of a documentation string so
+ that the text is lined up in the source code with the text of the first
+ line.  This looks nice in the source code, but looks bizarre when users
+ view the documentation.  Remember that the indentation before the
+ starting double-quote is not part of the string!
+ 
+ @item
+ A variable's documentation string should start with @samp{*} if the
+ variable is one that users would often want to set interactively.  If
+ the value is a long list, or a function, or if the variable would be set
+ only in init files, then don't start the documentation string with
+ @samp{*}.  @xref{Defining Variables}.
+ 
+ @item
+ The documentation string for a variable that is a yes-or-no flag should
+ start with words such as ``Non-nil means@dots{}'', to make it clear that
+ all non-@code{nil} values are equivalent and indicate explicitly what
+ @code{nil} and non-@code{nil} mean.
+ 
+ @item
+ When a function's documentation string mentions the value of an argument
+ of the function, use the argument name in capital letters as if it were
+ a name for that value.  Thus, the documentation string of the function
+ @code{/} refers to its second argument as @samp{DIVISOR}, because the
+ actual argument name is @code{divisor}.
+ 
+ Also use all caps for meta-syntactic variables, such as when you show
+ the decomposition of a list or vector into subunits, some of which may
+ vary.
+ 
+ @item
+ @iftex
+ When a documentation string refers to a Lisp symbol, write it as it
+ would be printed (which usually means in lower case), with single-quotes
+ around it.  For example: @samp{`lambda'}.  There are two exceptions:
+ write @code{t} and @code{nil} without single-quotes.
+ @end iftex
+ @ifinfo
+ When a documentation string refers to a Lisp symbol, write it as it
+ would be printed (which usually means in lower case), with single-quotes
+ around it.  For example: @samp{lambda}.  There are two exceptions: write
+ t and nil without single-quotes.  (In this manual, we normally do use
+ single-quotes for those symbols.)
+ @end ifinfo
+ 
+ @item
+ Don't write key sequences directly in documentation strings.  Instead,
+ use the @samp{\\[@dots{}]} construct to stand for them.  For example,
+ instead of writing @samp{C-f}, write @samp{\\[forward-char]}.  When
+ Emacs displays the documentation string, it substitutes whatever key is
+ currently bound to @code{forward-char}.  (This is normally @samp{C-f},
+ but it may be some other character if the user has moved key bindings.)
+ @xref{Keys in Documentation}.
+ 
+ @item
+ In documentation strings for a major mode, you will want to refer to the
+ key bindings of that mode's local map, rather than global ones.
+ Therefore, use the construct @samp{\\<@dots{}>} once in the
+ documentation string to specify which key map to use.  Do this before
+ the first use of @samp{\\[@dots{}]}.  The text inside the
+ @samp{\\<@dots{}>} should be the name of the variable containing the
+ local keymap for the major mode.
+ 
+ It is not practical to use @samp{\\[@dots{}]} very many times, because
+ display of the documentation string will become slow.  So use this to
+ describe the most important commands in your major mode, and then use
+ @samp{\\@{@dots{}@}} to display the rest of the mode's keymap.
+ @end itemize
+ 
+ @node Comment Tips
+ @section Tips on Writing Comments
+ 
+   We recommend these conventions for where to put comments and how to
+ indent them:
+ 
+ @table @samp
+ @item ;
+ Comments that start with a single semicolon, @samp{;}, should all be
+ aligned to the same column on the right of the source code.  Such
+ comments usually explain how the code on the same line does its job.  In
+ Lisp mode and related modes, the @kbd{M-;} (@code{indent-for-comment})
+ command automatically inserts such a @samp{;} in the right place, or
+ aligns such a comment if it is already present.
+ 
+ This and following examples are taken from the Emacs sources.
+ 
+ @smallexample
+ @group
+ (setq base-version-list                 ; there was a base
+       (assoc (substring fn 0 start-vn)  ; version to which
+              file-version-assoc-list))  ; this looks like
+                                         ; a subversion
+ @end group
+ @end smallexample
+ 
+ @item ;;
+ Comments that start with two semicolons, @samp{;;}, should be aligned to
+ the same level of indentation as the code.  Such comments usually
+ describe the purpose of the following lines or the state of the program
+ at that point.  For example:
+ 
+ @smallexample
+ @group
+ (prog1 (setq auto-fill-function
+              @dots{}
+              @dots{}
+   ;; update mode line
+   (force-mode-line-update)))
+ @end group
+ @end smallexample
+ 
+ Every function that has no documentation string (because it is use only
+ internally within the package it belongs to), should have instead a
+ two-semicolon comment right before the function, explaining what the
+ function does and how to call it properly.  Explain precisely what each
+ argument means and how the function interprets its possible values.
+ 
+ @item ;;;
+ Comments that start with three semicolons, @samp{;;;}, should start at
+ the left margin.  Such comments are used outside function definitions to
+ make general statements explaining the design principles of the program.
+ For example:
+ 
+ @smallexample
+ @group
+ ;;; This Lisp code is run in Emacs
+ ;;; when it is to operate as a server
+ ;;; for other processes.
+ @end group
+ @end smallexample
+ 
+ Another use for triple-semicolon comments is for commenting out lines
+ within a function.  We use triple-semicolons for this precisely so that
+ they remain at the left margin.
+ 
+ @smallexample
+ (defun foo (a)
+ ;;; This is no longer necessary.
+ ;;;  (force-mode-line-update)
+   (message "Finished with %s" a))
+ @end smallexample
+ 
+ @item ;;;;
+ Comments that start with four semicolons, @samp{;;;;}, should be aligned
+ to the left margin and are used for headings of major sections of a
+ program.  For example:
+ 
+ @smallexample
+ ;;;; The kill ring
+ @end smallexample
+ @end table
+ 
+ @noindent
+ The indentation commands of the Lisp modes in Emacs, such as @kbd{M-;}
+ (@code{indent-for-comment}) and @key{TAB} (@code{lisp-indent-line})
+ automatically indent comments according to these conventions,
+ depending on the number of semicolons.  @xref{Comments,,
+ Manipulating Comments, emacs, The GNU Emacs Manual}.
+ 
+ @node Library Headers
+ @section Conventional Headers for Emacs Libraries
+ @cindex header comments
+ @cindex library header comments
+ 
+   Emacs 19 has conventions for using special comments in Lisp libraries
+ to divide them into sections and give information such as who wrote
+ them.  This section explains these conventions.  First, an example:
+ 
+ @smallexample
+ @group
+ ;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers
+ 
+ ;; Copyright (C) 1992 Free Software Foundation, Inc.
+ @end group
+ 
+ ;; Author: Eric S. Raymond <esr@@snark.thyrsus.com>
+ ;; Maintainer: Eric S. Raymond <esr@@snark.thyrsus.com>
+ ;; Created: 14 Jul 1992
+ ;; Version: 1.2
+ @group
+ ;; Keywords: docs
+ 
+ ;; This file is part of GNU Emacs.
+ @var{copying permissions}@dots{}
+ @end group
+ @end smallexample
+ 
+   The very first line should have this format:
+ 
+ @example
+ ;;; @var{filename} --- @var{description}
+ @end example
+ 
+ @noindent
+ The description should be complete in one line.
+ 
+   After the copyright notice come several @dfn{header comment} lines,
+ each beginning with @samp{;; @var{header-name}:}.  Here is a table of
+ the conventional possibilities for @var{header-name}:
+ 
+ @table @samp
+ @item Author
+ This line states the name and net address of at least the principal
+ author of the library.
+ 
+ If there are multiple authors, you can list them on continuation lines
+ led by @code{;;} and a tab character, like this:
+ 
+ @smallexample
+ @group
+ ;; Author: Ashwin Ram <Ram-Ashwin@@cs.yale.edu>
+ ;;      Dave Sill <de5@@ornl.gov>
+ ;;      Dave Brennan <brennan@@hal.com>
+ ;;      Eric Raymond <esr@@snark.thyrsus.com>
+ @end group
+ @end smallexample
+ 
+ @item Maintainer
+ This line should contain a single name/address as in the Author line, or
+ an address only, or the string @samp{FSF}.  If there is no maintainer
+ line, the person(s) in the Author field are presumed to be the
+ maintainers.  The example above is mildly bogus because the maintainer
+ line is redundant.
+ 
+ The idea behind the @samp{Author} and @samp{Maintainer} lines is to make
+ possible a Lisp function to ``send mail to the maintainer'' without
+ having to mine the name out by hand.
+ 
+ Be sure to surround the network address with @samp{<@dots{}>} if
+ you include the person's full name as well as the network address.
+ 
+ @item Created
+ This optional line gives the original creation date of the
+ file.  For historical interest only.
+ 
+ @item Version
+ If you wish to record version numbers for the individual Lisp program, put
+ them in this line.
+ 
+ @item Adapted-By
+ In this header line, place the name of the person who adapted the
+ library for installation (to make it fit the style conventions, for
+ example).
+ 
+ @item Keywords
+ This line lists keywords for the @code{finder-by-keyword} help command.
+ This field is important; it's how people will find your package when
+ they're looking for things by topic area.  To separate the keywords, you
+ can use spaces, commas, or both.
+ @end table
+ 
+   Just about every Lisp library ought to have the @samp{Author} and
+ @samp{Keywords} header comment lines.  Use the others if they are
+ appropriate.  You can also put in header lines with other header
+ names---they have no standard meanings, so they can't do any harm.
+ 
+   We use additional stylized comments to subdivide the contents of the
+ library file.  Here is a table of them:
+ 
+ @table @samp
+ @item ;;; Commentary:
+ This begins introductory comments that explain how the library works.
+ It should come right after the copying permissions.
+ 
+ @item ;;; Change log:
+ This begins change log information stored in the library file (if you
+ store the change history there).  For most of the Lisp
+ files distributed with Emacs, the change history is kept in the file
+ @file{ChangeLog} and not in the source file at all; these files do
+ not have a @samp{;;; Change log:} line.
+ 
+ @item ;;; Code:
+ This begins the actual code of the program.
+ 
+ @item ;;; @var{filename} ends here
+ This is the @dfn{footer line}; it appears at the very end of the file.
+ Its purpose is to enable people to detect truncated versions of the file
+ from the lack of a footer line.
+ @end table
Index: emacs/man/elisp-variables.texi
diff -c /dev/null emacs/man/elisp-variables.texi:1.2
*** /dev/null	Fri Aug  2 21:00:14 1996
--- emacs/man/elisp-variables.texi	Thu Aug  1 00:23:41 1996
***************
*** 0 ****
--- 1,1349 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/variables
+ @node Variables, Functions, Control Structures, Top
+ @chapter Variables
+ @cindex variable
+ 
+   A @dfn{variable} is a name used in a program to stand for a value.
+ Nearly all programming languages have variables of some sort.  In the
+ text of a Lisp program, variables are written using the syntax for
+ symbols.
+ 
+   In Lisp, unlike most programming languages, programs are represented
+ primarily as Lisp objects and only secondarily as text.  The Lisp
+ objects used for variables are symbols: the symbol name is the variable
+ name, and the variable's value is stored in the value cell of the
+ symbol.  The use of a symbol as a variable is independent of its use as
+ a function name.  @xref{Symbol Components}.
+ 
+   The Lisp objects that constitute a Lisp program determine the textual
+ form of the program---it is simply the read syntax for those Lisp
+ objects.  This is why, for example, a variable in a textual Lisp program
+ is written using the read syntax for the symbol that represents the
+ variable.
+ 
+ @menu
+ * Global Variables::      Variable values that exist permanently, everywhere.
+ * Constant Variables::    Certain "variables" have values that never change.
+ * Local Variables::       Variable values that exist only temporarily.
+ * Void Variables::        Symbols that lack values.
+ * Defining Variables::    A definition says a symbol is used as a variable.
+ * Accessing Variables::   Examining values of variables whose names
+                             are known only at run time.
+ * Setting Variables::     Storing new values in variables.
+ * Variable Scoping::      How Lisp chooses among local and global values.
+ * Buffer-Local Variables::  Variable values in effect only in one buffer.
+ @end menu
+ 
+ @node Global Variables
+ @section Global Variables
+ @cindex global variable
+ 
+   The simplest way to use a variable is @dfn{globally}.  This means that
+ the variable has just one value at a time, and this value is in effect
+ (at least for the moment) throughout the Lisp system.  The value remains
+ in effect until you specify a new one.  When a new value replaces the
+ old one, no trace of the old value remains in the variable.
+ 
+   You specify a value for a symbol with @code{setq}.  For example,
+ 
+ @example
+ (setq x '(a b))
+ @end example
+ 
+ @noindent
+ gives the variable @code{x} the value @code{(a b)}.  Note that
+ @code{setq} does not evaluate its first argument, the name of the
+ variable, but it does evaluate the second argument, the new value.
+ 
+   Once the variable has a value, you can refer to it by using the symbol
+ by itself as an expression.  Thus,
+ 
+ @example
+ @group
+ x @result{} (a b)
+ @end group
+ @end example
+ 
+ @noindent
+ assuming the @code{setq} form shown above has already been executed.
+ 
+   If you do another @code{setq}, the new value replaces the old one:
+ 
+ @example
+ @group
+ x
+      @result{} (a b)
+ @end group
+ @group
+ (setq x 4)
+      @result{} 4
+ @end group
+ @group
+ x
+      @result{} 4
+ @end group
+ @end example
+ 
+ @node Constant Variables
+ @section Variables That Never Change
+ @vindex nil
+ @vindex t
+ @kindex setting-constant
+ 
+   Emacs Lisp has two special symbols, @code{nil} and @code{t}, that
+ always evaluate to themselves.  These symbols cannot be rebound, nor can
+ their value cells be changed.  An attempt to change the value of
+ @code{nil} or @code{t} signals a @code{setting-constant} error.
+ 
+ @example
+ @group
+ nil @equiv{} 'nil
+      @result{} nil
+ @end group
+ @group
+ (setq nil 500)
+ @error{} Attempt to set constant symbol: nil
+ @end group
+ @end example
+ 
+ @node Local Variables
+ @section Local Variables
+ @cindex binding local variables
+ @cindex local variables
+ @cindex local binding
+ @cindex global binding
+ 
+   Global variables have values that last until explicitly superseded
+ with new values.  Sometimes it is useful to create variable values that
+ exist temporarily---only while within a certain part of the program.
+ These values are called @dfn{local}, and the variables so used are
+ called @dfn{local variables}.
+ 
+   For example, when a function is called, its argument variables receive
+ new local values that last until the function exits.  The @code{let}
+ special form explicitly establishes new local values for specified
+ variables; these last until exit from the @code{let} form.
+ 
+ @cindex shadowing of variables
+   Establishing a local value saves away the previous value (or lack of
+ one) of the variable.  When the life span of the local value is over,
+ the previous value is restored.  In the mean time, we say that the
+ previous value is @dfn{shadowed} and @dfn{not visible}.  Both global and
+ local values may be shadowed (@pxref{Scope}).
+ 
+   If you set a variable (such as with @code{setq}) while it is local,
+ this replaces the local value; it does not alter the global value, or
+ previous local values that are shadowed.  To model this behavior, we
+ speak of a @dfn{local binding} of the variable as well as a local value.
+ 
+   The local binding is a conceptual place that holds a local value.
+ Entry to a function, or a special form such as @code{let}, creates the
+ local binding; exit from the function or from the @code{let} removes the
+ local binding.  As long as the local binding lasts, the variable's value
+ is stored within it.  Use of @code{setq} or @code{set} while there is a
+ local binding stores a different value into the local binding; it does
+ not create a new binding.
+ 
+   We also speak of the @dfn{global binding}, which is where
+ (conceptually) the global value is kept.
+ 
+ @cindex current binding
+   A variable can have more than one local binding at a time (for
+ example, if there are nested @code{let} forms that bind it).  In such a
+ case, the most recently created local binding that still exists is the
+ @dfn{current binding} of the variable.  (This is called @dfn{dynamic
+ scoping}; see @ref{Variable Scoping}.)  If there are no local bindings,
+ the variable's global binding is its current binding.  We also call the
+ current binding the @dfn{most-local existing binding}, for emphasis.
+ Ordinary evaluation of a symbol always returns the value of its current
+ binding.
+ 
+   The special forms @code{let} and @code{let*} exist to create
+ local bindings.
+ 
+ @defspec let (bindings@dots{}) forms@dots{}
+ This special form binds variables according to @var{bindings} and then
+ evaluates all of the @var{forms} in textual order.  The @code{let}-form
+ returns the value of the last form in @var{forms}.
+ 
+ Each of the @var{bindings} is either @w{(i) a} symbol, in which case
+ that symbol is bound to @code{nil}; or @w{(ii) a} list of the form
+ @code{(@var{symbol} @var{value-form})}, in which case @var{symbol} is
+ bound to the result of evaluating @var{value-form}.  If @var{value-form}
+ is omitted, @code{nil} is used.
+ 
+ All of the @var{value-form}s in @var{bindings} are evaluated in the
+ order they appear and @emph{before} any of the symbols are bound.  Here
+ is an example of this: @code{Z} is bound to the old value of @code{Y},
+ which is 2, not the new value, 1.
+ 
+ @example
+ @group
+ (setq Y 2)
+      @result{} 2
+ @end group
+ @group
+ (let ((Y 1) 
+       (Z Y))
+   (list Y Z))
+      @result{} (1 2)
+ @end group
+ @end example
+ @end defspec
+ 
+ @defspec let* (bindings@dots{}) forms@dots{}
+ This special form is like @code{let}, but it binds each variable right
+ after computing its local value, before computing the local value for
+ the next variable.  Therefore, an expression in @var{bindings} can
+ reasonably refer to the preceding symbols bound in this @code{let*}
+ form.  Compare the following example with the example above for
+ @code{let}.
+ 
+ @example
+ @group
+ (setq Y 2)
+      @result{} 2
+ @end group
+ @group
+ (let* ((Y 1)
+        (Z Y))    ; @r{Use the just-established value of @code{Y}.}
+   (list Y Z))
+      @result{} (1 1)
+ @end group
+ @end example
+ @end defspec
+ 
+   Here is a complete list of the other facilities that create local
+ bindings:
+ 
+ @itemize @bullet
+ @item
+ Function calls (@pxref{Functions}).
+ 
+ @item
+ Macro calls (@pxref{Macros}).
+ 
+ @item
+ @code{condition-case} (@pxref{Errors}).
+ @end itemize
+ 
+   Variables can also have buffer-local bindings (@pxref{Buffer-Local
+ Variables}); a few variables have terminal-local bindings
+ (@pxref{Multiple Displays}).  These kinds of bindings work somewhat like
+ ordinary local bindings, but they are localized depending on ``where''
+ you are in Emacs, rather than localized in time.
+ 
+ @defvar max-specpdl-size
+ @cindex variable limit error
+ @cindex evaluation error
+ @cindex infinite recursion
+   This variable defines the limit on the total number of local variable
+ bindings and @code{unwind-protect} cleanups (@pxref{Nonlocal Exits})
+ that are allowed before signaling an error (with data @code{"Variable
+ binding depth exceeds max-specpdl-size"}).
+ 
+   This limit, with the associated error when it is exceeded, is one way
+ that Lisp avoids infinite recursion on an ill-defined function.
+ 
+   The default value is 600.
+ 
+   @code{max-lisp-eval-depth} provides another limit on depth of nesting.
+ @xref{Eval}.
+ @end defvar
+ 
+ @node Void Variables
+ @section When a Variable is ``Void''
+ @kindex void-variable
+ @cindex void variable
+ 
+   If you have never given a symbol any value as a global variable, we
+ say that that symbol's global value is @dfn{void}.  In other words, the
+ symbol's value cell does not have any Lisp object in it.  If you try to
+ evaluate the symbol, you get a @code{void-variable} error rather than
+ a value.
+ 
+   Note that a value of @code{nil} is not the same as void.  The symbol
+ @code{nil} is a Lisp object and can be the value of a variable just as any
+ other object can be; but it is @emph{a value}.  A void variable does not
+ have any value.
+ 
+   After you have given a variable a value, you can make it void once more
+ using @code{makunbound}.
+ 
+ @defun makunbound symbol
+ This function makes the current binding of @var{symbol} void.
+ Subsequent attempts to use this symbol's value as a variable will signal
+ the error @code{void-variable}, unless or until you set it again.
+ 
+ @code{makunbound} returns @var{symbol}.
+ 
+ @example
+ @group
+ (makunbound 'x)      ; @r{Make the global value}
+                      ;   @r{of @code{x} void.}
+      @result{} x
+ @end group
+ @group
+ x
+ @error{} Symbol's value as variable is void: x
+ @end group
+ @end example
+ 
+ If @var{symbol} is locally bound, @code{makunbound} affects the most
+ local existing binding.  This is the only way a symbol can have a void
+ local binding, since all the constructs that create local bindings
+ create them with values.  In this case, the voidness lasts at most as
+ long as the binding does; when the binding is removed due to exit from
+ the construct that made it, the previous or global binding is reexposed
+ as usual, and the variable is no longer void unless the newly reexposed
+ binding was void all along.
+ 
+ @smallexample
+ @group
+ (setq x 1)               ; @r{Put a value in the global binding.}
+      @result{} 1
+ (let ((x 2))             ; @r{Locally bind it.}
+   (makunbound 'x)        ; @r{Void the local binding.}
+   x)
+ @error{} Symbol's value as variable is void: x
+ @end group
+ @group
+ x                        ; @r{The global binding is unchanged.}
+      @result{} 1
+ 
+ (let ((x 2))             ; @r{Locally bind it.}
+   (let ((x 3))           ; @r{And again.}
+     (makunbound 'x)      ; @r{Void the innermost-local binding.}
+     x))                  ; @r{And refer: it's void.}
+ @error{} Symbol's value as variable is void: x
+ @end group
+ 
+ @group
+ (let ((x 2))
+   (let ((x 3))
+     (makunbound 'x))     ; @r{Void inner binding, then remove it.}
+   x)                     ; @r{Now outer @code{let} binding is visible.}
+      @result{} 2
+ @end group
+ @end smallexample
+ @end defun
+ 
+   A variable that has been made void with @code{makunbound} is
+ indistinguishable from one that has never received a value and has
+ always been void.
+ 
+   You can use the function @code{boundp} to test whether a variable is
+ currently void.
+ 
+ @defun boundp variable
+ @code{boundp} returns @code{t} if @var{variable} (a symbol) is not void;
+ more precisely, if its current binding is not void.  It returns
+ @code{nil} otherwise.
+ 
+ @smallexample
+ @group
+ (boundp 'abracadabra)          ; @r{Starts out void.}
+      @result{} nil
+ @end group
+ @group
+ (let ((abracadabra 5))         ; @r{Locally bind it.}
+   (boundp 'abracadabra))
+      @result{} t
+ @end group
+ @group
+ (boundp 'abracadabra)          ; @r{Still globally void.}
+      @result{} nil
+ @end group
+ @group
+ (setq abracadabra 5)           ; @r{Make it globally nonvoid.}
+      @result{} 5
+ @end group
+ @group
+ (boundp 'abracadabra)
+      @result{} t
+ @end group
+ @end smallexample
+ @end defun
+ 
+ @node Defining Variables
+ @section Defining Global Variables
+ @cindex variable definition
+ 
+   You may announce your intention to use a symbol as a global variable
+ with a @dfn{variable definition}: a special form, either @code{defconst}
+ or @code{defvar}.
+ 
+   In Emacs Lisp, definitions serve three purposes.  First, they inform
+ people who read the code that certain symbols are @emph{intended} to be
+ used a certain way (as variables).  Second, they inform the Lisp system
+ of these things, supplying a value and documentation.  Third, they
+ provide information to utilities such as @code{etags} and
+ @code{make-docfile}, which create data bases of the functions and
+ variables in a program.
+ 
+   The difference between @code{defconst} and @code{defvar} is primarily
+ a matter of intent, serving to inform human readers of whether programs
+ will change the variable.  Emacs Lisp does not restrict the ways in
+ which a variable can be used based on @code{defconst} or @code{defvar}
+ declarations.  However, it does make a difference for initialization:
+ @code{defconst} unconditionally initializes the variable, while
+ @code{defvar} initializes it only if it is void.
+ 
+   One would expect user option variables to be defined with
+ @code{defconst}, since programs do not change them.  Unfortunately, this
+ has bad results if the definition is in a library that is not preloaded:
+ @code{defconst} would override any prior value when the library is
+ loaded.  Users would like to be able to set user options in their init
+ files, and override the default values given in the definitions.  For
+ this reason, user options must be defined with @code{defvar}.
+ 
+ @defspec defvar symbol [value [doc-string]]
+ This special form defines @var{symbol} as a value and initializes it.
+ The definition informs a person reading your code that @var{symbol} is
+ used as a variable that programs are likely to set or change.  It is
+ also used for all user option variables except in the preloaded parts of
+ Emacs.  Note that @var{symbol} is not evaluated; the symbol to be
+ defined must appear explicitly in the @code{defvar}.
+ 
+ If @var{symbol} already has a value (i.e., it is not void), @var{value}
+ is not even evaluated, and @var{symbol}'s value remains unchanged.  If
+ @var{symbol} is void and @var{value} is specified, @code{defvar}
+ evaluates it and sets @var{symbol} to the result.  (If @var{value} is
+ omitted, the value of @var{symbol} is not changed in any case.)
+ 
+ When you evaluate a top-level @code{defvar} form with @kbd{C-M-x} in
+ Emacs Lisp mode (@code{eval-defun}), a special feature of
+ @code{eval-defun} evaluates it as a @code{defconst}.  The purpose of
+ this is to make sure the variable's value is reinitialized, when you ask
+ for it specifically.
+ 
+ If @var{symbol} has a buffer-local binding in the current buffer,
+ @code{defvar} sets the default value, not the local value.
+ @xref{Buffer-Local Variables}.
+ 
+ If the @var{doc-string} argument appears, it specifies the documentation
+ for the variable.  (This opportunity to specify documentation is one of
+ the main benefits of defining the variable.)  The documentation is
+ stored in the symbol's @code{variable-documentation} property.  The
+ Emacs help functions (@pxref{Documentation}) look for this property.
+ 
+ If the first character of @var{doc-string} is @samp{*}, it means that
+ this variable is considered a user option.  This lets users set the
+ variable conventiently using the commands @code{set-variable} and
+ @code{edit-options}.
+ 
+ For example, this form defines @code{foo} but does not set its value:
+ 
+ @example
+ @group
+ (defvar foo)
+      @result{} foo
+ @end group
+ @end example
+ 
+ The following example sets the value of @code{bar} to @code{23}, and
+ gives it a documentation string:
+ 
+ @example
+ @group
+ (defvar bar 23
+   "The normal weight of a bar.")
+      @result{} bar
+ @end group
+ @end example
+ 
+ The following form changes the documentation string for @code{bar},
+ making it a user option, but does not change the value, since @code{bar}
+ already has a value.  (The addition @code{(1+ 23)} is not even
+ performed.)
+ 
+ @example
+ @group
+ (defvar bar (1+ 23)
+   "*The normal weight of a bar.")
+      @result{} bar
+ @end group
+ @group
+ bar
+      @result{} 23
+ @end group
+ @end example
+ 
+ Here is an equivalent expression for the @code{defvar} special form:
+ 
+ @example
+ @group
+ (defvar @var{symbol} @var{value} @var{doc-string})
+ @equiv{}
+ (progn
+   (if (not (boundp '@var{symbol}))
+       (setq @var{symbol} @var{value}))
+   (put '@var{symbol} 'variable-documentation '@var{doc-string})
+   '@var{symbol})
+ @end group
+ @end example
+ 
+ The @code{defvar} form returns @var{symbol}, but it is normally used
+ at top level in a file where its value does not matter.
+ @end defspec
+ 
+ @defspec defconst symbol [value [doc-string]]
+ This special form defines @var{symbol} as a value and initializes it.
+ It informs a person reading your code that @var{symbol} has a global
+ value, established here, that will not normally be changed or locally
+ bound by the execution of the program.  The user, however, may be
+ welcome to change it.  Note that @var{symbol} is not evaluated; the
+ symbol to be defined must appear explicitly in the @code{defconst}.
+ 
+ @code{defconst} always evaluates @var{value} and sets the global value
+ of @var{symbol} to the result, provided @var{value} is given.  If
+ @var{symbol} has a buffer-local binding in the current buffer,
+ @code{defconst} sets the default value, not the local value.
+ 
+ @strong{Please note:} Don't use @code{defconst} for user option
+ variables in libraries that are not standardly preloaded.  The user
+ should be able to specify a value for such a variable in the
+ @file{.emacs} file, so that it will be in effect if and when the library
+ is loaded later.
+ 
+ Here, @code{pi} is a constant that presumably ought not to be changed
+ by anyone (attempts by the Indiana State Legislature notwithstanding).
+ As the second form illustrates, however, this is only advisory.
+ 
+ @example
+ @group
+ (defconst pi 3.1415 "Pi to five places.")
+      @result{} pi
+ @end group
+ @group
+ (setq pi 3)
+      @result{} pi
+ @end group
+ @group
+ pi
+      @result{} 3
+ @end group
+ @end example
+ @end defspec
+ 
+ @defun user-variable-p variable
+ @cindex user option
+ This function returns @code{t} if @var{variable} is a user option---a
+ variable intended to be set by the user for customization---and
+ @code{nil} otherwise.  (Variables other than user options exist for the
+ internal purposes of Lisp programs, and users need not know about them.)
+ 
+ User option variables are distinguished from other variables by the
+ first character of the @code{variable-documentation} property.  If the
+ property exists and is a string, and its first character is @samp{*},
+ then the variable is a user option.
+ @end defun
+ 
+   If a user option variable has a @code{variable-interactive} property,
+ the @code{set-variable} command uses that value to control reading the
+ new value for the variable.  The property's value is used as if it were
+ the argument to @code{interactive}.
+ 
+   @strong{Warning:} If the @code{defconst} and @code{defvar} special
+ forms are used while the variable has a local binding, they set the
+ local binding's value; the global binding is not changed.  This is not
+ what we really want.  To prevent it, use these special forms at top
+ level in a file, where normally no local binding is in effect, and make
+ sure to load the file before making a local binding for the variable.
+ 
+ @node Accessing Variables
+ @section Accessing Variable Values
+ 
+   The usual way to reference a variable is to write the symbol which
+ names it (@pxref{Symbol Forms}).  This requires you to specify the
+ variable name when you write the program.  Usually that is exactly what
+ you want to do.  Occasionally you need to choose at run time which
+ variable to reference; then you can use @code{symbol-value}.
+ 
+ @defun symbol-value symbol
+ This function returns the value of @var{symbol}.  This is the value in
+ the innermost local binding of the symbol, or its global value if it
+ has no local bindings.
+ 
+ @example
+ @group
+ (setq abracadabra 5)
+      @result{} 5
+ @end group
+ @group
+ (setq foo 9)
+      @result{} 9
+ @end group
+ 
+ @group
+ ;; @r{Here the symbol @code{abracadabra}}
+ ;;   @r{is the symbol whose value is examined.}
+ (let ((abracadabra 'foo))
+   (symbol-value 'abracadabra))
+      @result{} foo
+ @end group
+ 
+ @group
+ ;; @r{Here the value of @code{abracadabra},}
+ ;;   @r{which is @code{foo},}
+ ;;   @r{is the symbol whose value is examined.}
+ (let ((abracadabra 'foo))
+   (symbol-value abracadabra))
+      @result{} 9
+ @end group
+ 
+ @group
+ (symbol-value 'abracadabra)
+      @result{} 5
+ @end group
+ @end example
+ 
+ A @code{void-variable} error is signaled if @var{symbol} has neither a
+ local binding nor a global value.
+ @end defun
+ 
+ @node Setting Variables
+ @section How to Alter a Variable Value
+ 
+   The usual way to change the value of a variable is with the special
+ form @code{setq}.  When you need to compute the choice of variable at
+ run time, use the function @code{set}.
+ 
+ @defspec setq [symbol form]@dots{}
+ This special form is the most common method of changing a variable's
+ value.  Each @var{symbol} is given a new value, which is the result of
+ evaluating the corresponding @var{form}.  The most-local existing
+ binding of the symbol is changed.
+ 
+ @code{setq} does not evaluate @var{symbol}; it sets the symbol that you
+ write.  We say that this argument is @dfn{automatically quoted}.  The
+ @samp{q} in @code{setq} stands for ``quoted.''
+ 
+ The value of the @code{setq} form is the value of the last @var{form}.
+ 
+ @example
+ @group
+ (setq x (1+ 2))
+      @result{} 3
+ @end group
+ x                   ; @r{@code{x} now has a global value.}
+      @result{} 3
+ @group
+ (let ((x 5)) 
+   (setq x 6)        ; @r{The local binding of @code{x} is set.}
+   x)
+      @result{} 6
+ @end group
+ x                   ; @r{The global value is unchanged.}
+      @result{} 3
+ @end example
+ 
+ Note that the first @var{form} is evaluated, then the first
+ @var{symbol} is set, then the second @var{form} is evaluated, then the
+ second @var{symbol} is set, and so on:
+ 
+ @example
+ @group
+ (setq x 10          ; @r{Notice that @code{x} is set before}
+       y (1+ x))     ;   @r{the value of @code{y} is computed.}
+      @result{} 11             
+ @end group
+ @end example
+ @end defspec
+ 
+ @defun set symbol value
+ This function sets @var{symbol}'s value to @var{value}, then returns
+ @var{value}.  Since @code{set} is a function, the expression written for
+ @var{symbol} is evaluated to obtain the symbol to set.
+ 
+ The most-local existing binding of the variable is the binding that is
+ set; shadowed bindings are not affected.
+ 
+ @example
+ @group
+ (set one 1)
+ @error{} Symbol's value as variable is void: one
+ @end group
+ @group
+ (set 'one 1)
+      @result{} 1
+ @end group
+ @group
+ (set 'two 'one)
+      @result{} one
+ @end group
+ @group
+ (set two 2)         ; @r{@code{two} evaluates to symbol @code{one}.}
+      @result{} 2
+ @end group
+ @group
+ one                 ; @r{So it is @code{one} that was set.}
+      @result{} 2
+ (let ((one 1))      ; @r{This binding of @code{one} is set,}
+   (set 'one 3)      ;   @r{not the global value.}
+   one)
+      @result{} 3
+ @end group
+ @group
+ one
+      @result{} 2
+ @end group
+ @end example
+ 
+ If @var{symbol} is not actually a symbol, a @code{wrong-type-argument}
+ error is signaled.
+ 
+ @example
+ (set '(x y) 'z)
+ @error{} Wrong type argument: symbolp, (x y)
+ @end example
+ 
+ Logically speaking, @code{set} is a more fundamental primitive than
+ @code{setq}.  Any use of @code{setq} can be trivially rewritten to use
+ @code{set}; @code{setq} could even be defined as a macro, given the
+ availability of @code{set}.  However, @code{set} itself is rarely used;
+ beginners hardly need to know about it.  It is useful only for choosing
+ at run time which variable to set.  For example, the command
+ @code{set-variable}, which reads a variable name from the user and then
+ sets the variable, needs to use @code{set}.
+ 
+ @cindex CL note---@code{set} local
+ @quotation
+ @b{Common Lisp note:} In Common Lisp, @code{set} always changes the
+ symbol's special value, ignoring any lexical bindings.  In Emacs Lisp,
+ all variables and all bindings are (in effect) special, so @code{set}
+ always affects the most local existing binding.
+ @end quotation
+ @end defun
+ 
+   One other function for setting a variable is designed to add
+ an element to a list if it is not already present in the list.
+ 
+ @defun add-to-list symbol element
+ This function sets the variable @var{symbol} by consing @var{element}
+ onto the old value, if @var{element} is not already a member of that
+ value.  It returns the resulting list, whether updated or not.  The
+ value of @var{symbol} had better be a list already before the call.
+ 
+ The argument @var{symbol} is not implicitly quoted; @code{add-to-list}
+ is an ordinary function, like @code{set} and unlike @code{setq}.  Quote
+ the argument yourself if that is what you want.
+ 
+ Here's a scenario showing how to use @code{add-to-list}:
+ 
+ @example
+ (setq foo '(a b))
+      @result{} (a b)
+ 
+ (add-to-list 'foo 'c)     ;; @r{Add @code{c}.}
+      @result{} (c a b)
+ 
+ (add-to-list 'foo 'b)     ;; @r{No effect.}
+      @result{} (c a b)
+ 
+ foo                       ;; @r{@code{foo} was changed.}
+      @result{} (c a b)
+ @end example
+ @end defun
+ 
+   An equivalent expression for @code{(add-to-list '@var{var}
+ @var{value})} is this:
+ 
+ @example
+ (or (member @var{value} @var{var})
+     (setq @var{var} (cons @var{value} @var{var})))
+ @end example
+ 
+ @node Variable Scoping
+ @section Scoping Rules for Variable Bindings
+ 
+   A given symbol @code{foo} may have several local variable bindings,
+ established at different places in the Lisp program, as well as a global
+ binding.  The most recently established binding takes precedence over
+ the others.
+ 
+ @cindex scope
+ @cindex extent
+ @cindex dynamic scoping
+   Local bindings in Emacs Lisp have @dfn{indefinite scope} and
+ @dfn{dynamic extent}.  @dfn{Scope} refers to @emph{where} textually in
+ the source code the binding can be accessed.  Indefinite scope means
+ that any part of the program can potentially access the variable
+ binding.  @dfn{Extent} refers to @emph{when}, as the program is
+ executing, the binding exists.  Dynamic extent means that the binding
+ lasts as long as the activation of the construct that established it.
+ 
+   The combination of dynamic extent and indefinite scope is called
+ @dfn{dynamic scoping}.  By contrast, most programming languages use
+ @dfn{lexical scoping}, in which references to a local variable must be
+ located textually within the function or block that binds the variable.
+ 
+ @cindex CL note---special variables
+ @quotation
+ @b{Common Lisp note:} Variables declared ``special'' in Common Lisp
+ are dynamically scoped, like variables in Emacs Lisp.
+ @end quotation
+ 
+ @menu
+ * Scope::          Scope means where in the program a value is visible.
+                      Comparison with other languages.
+ * Extent::         Extent means how long in time a value exists.
+ * Impl of Scope::  Two ways to implement dynamic scoping.
+ * Using Scoping::  How to use dynamic scoping carefully and avoid problems.
+ @end menu
+ 
+ @node Scope
+ @subsection Scope
+ 
+   Emacs Lisp uses @dfn{indefinite scope} for local variable bindings.
+ This means that any function anywhere in the program text might access a
+ given binding of a variable.  Consider the following function
+ definitions:
+ 
+ @example
+ @group
+ (defun binder (x)   ; @r{@code{x} is bound in @code{binder}.}
+    (foo 5))         ; @r{@code{foo} is some other function.}
+ @end group
+ 
+ @group
+ (defun user ()      ; @r{@code{x} is used in @code{user}.}
+   (list x))
+ @end group
+ @end example
+ 
+   In a lexically scoped language, the binding of @code{x} in
+ @code{binder} would never be accessible in @code{user}, because
+ @code{user} is not textually contained within the function
+ @code{binder}.  However, in dynamically scoped Emacs Lisp, @code{user}
+ may or may not refer to the binding of @code{x} established in
+ @code{binder}, depending on circumstances:
+ 
+ @itemize @bullet
+ @item
+ If we call @code{user} directly without calling @code{binder} at all,
+ then whatever binding of @code{x} is found, it cannot come from
+ @code{binder}.
+ 
+ @item
+ If we define @code{foo} as follows and call @code{binder}, then the
+ binding made in @code{binder} will be seen in @code{user}:
+ 
+ @example
+ @group
+ (defun foo (lose)
+   (user))
+ @end group
+ @end example
+ 
+ @item
+ If we define @code{foo} as follows and call @code{binder}, then the
+ binding made in @code{binder} @emph{will not} be seen in @code{user}:
+ 
+ @example
+ (defun foo (x)
+   (user))
+ @end example
+ 
+ @noindent
+ Here, when @code{foo} is called by @code{binder}, it binds @code{x}.
+ (The binding in @code{foo} is said to @dfn{shadow} the one made in
+ @code{binder}.)  Therefore, @code{user} will access the @code{x} bound
+ by @code{foo} instead of the one bound by @code{binder}.
+ @end itemize
+ 
+ @node Extent
+ @subsection Extent
+ 
+   @dfn{Extent} refers to the time during program execution that a
+ variable name is valid.  In Emacs Lisp, a variable is valid only while
+ the form that bound it is executing.  This is called @dfn{dynamic
+ extent}.  ``Local'' or ``automatic'' variables in most languages,
+ including C and Pascal, have dynamic extent.
+ 
+   One alternative to dynamic extent is @dfn{indefinite extent}.  This
+ means that a variable binding can live on past the exit from the form
+ that made the binding.  Common Lisp and Scheme, for example, support
+ this, but Emacs Lisp does not.
+ 
+   To illustrate this, the function below, @code{make-add}, returns a
+ function that purports to add @var{n} to its own argument @var{m}.
+ This would work in Common Lisp, but it does not work as intended in
+ Emacs Lisp, because after the call to @code{make-add} exits, the
+ variable @code{n} is no longer bound to the actual argument 2.
+ 
+ @example
+ (defun make-add (n)
+     (function (lambda (m) (+ n m))))  ; @r{Return a function.}
+      @result{} make-add
+ (fset 'add2 (make-add 2))  ; @r{Define function @code{add2}}
+                            ;   @r{with @code{(make-add 2)}.}
+      @result{} (lambda (m) (+ n m))
+ (add2 4)                   ; @r{Try to add 2 to 4.}
+ @error{} Symbol's value as variable is void: n
+ @end example
+ 
+ @cindex closures not available
+   Some Lisp dialects have ``closures'', objects that are like functions
+ but record additional variable bindings.  Emacs Lisp does not have
+ closures.
+ 
+ @node Impl of Scope
+ @subsection Implementation of Dynamic Scoping
+ @cindex deep binding
+ 
+   A simple sample implementation (which is not how Emacs Lisp actually
+ works) may help you understand dynamic binding.  This technique is
+ called @dfn{deep binding} and was used in early Lisp systems.
+ 
+   Suppose there is a stack of bindings: variable-value pairs.  At entry
+ to a function or to a @code{let} form, we can push bindings on the stack
+ for the arguments or local variables created there.  We can pop those
+ bindings from the stack at exit from the binding construct.
+ 
+   We can find the value of a variable by searching the stack from top to
+ bottom for a binding for that variable; the value from that binding is
+ the value of the variable.  To set the variable, we search for the
+ current binding, then store the new value into that binding.
+ 
+   As you can see, a function's bindings remain in effect as long as it
+ continues execution, even during its calls to other functions.  That is
+ why we say the extent of the binding is dynamic.  And any other function
+ can refer to the bindings, if it uses the same variables while the
+ bindings are in effect.  That is why we say the scope is indefinite.
+ 
+ @cindex shallow binding
+   The actual implementation of variable scoping in GNU Emacs Lisp uses a
+ technique called @dfn{shallow binding}.  Each variable has a standard
+ place in which its current value is always found---the value cell of the
+ symbol.
+ 
+   In shallow binding, setting the variable works by storing a value in
+ the value cell.  Creating a new binding works by pushing the old value
+ (belonging to a previous binding) on a stack, and storing the local value
+ in the value cell.  Eliminating a binding works by popping the old value
+ off the stack, into the value cell.
+ 
+   We use shallow binding because it has the same results as deep
+ binding, but runs faster, since there is never a need to search for a
+ binding.
+ 
+ @node Using Scoping
+ @subsection Proper Use of Dynamic Scoping
+ 
+   Binding a variable in one function and using it in another is a
+ powerful technique, but if used without restraint, it can make programs
+ hard to understand.  There are two clean ways to use this technique:
+ 
+ @itemize @bullet
+ @item
+ Use or bind the variable only in a few related functions, written close
+ together in one file.  Such a variable is used for communication within
+ one program.
+ 
+ You should write comments to inform other programmers that they can see
+ all uses of the variable before them, and to advise them not to add uses
+ elsewhere.
+ 
+ @item
+ Give the variable a well-defined, documented meaning, and make all
+ appropriate functions refer to it (but not bind it or set it) wherever
+ that meaning is relevant.  For example, the variable
+ @code{case-fold-search} is defined as ``non-@code{nil} means ignore case
+ when searching''; various search and replace functions refer to it
+ directly or through their subroutines, but do not bind or set it.
+ 
+ Then you can bind the variable in other programs, knowing reliably what
+ the effect will be.
+ @end itemize
+ 
+   In either case, you should define the variable with @code{defvar}.
+ This helps other people understand your program by telling them to look
+ for inter-function usage.  It also avoids a warning from the byte
+ compiler.  Choose the variable's name to avoid name conflicts---don't
+ use short names like @code{x}.
+ 
+ @node Buffer-Local Variables
+ @section Buffer-Local Variables
+ @cindex variables, buffer-local
+ @cindex buffer-local variables
+ 
+   Global and local variable bindings are found in most programming
+ languages in one form or another.  Emacs also supports another, unusual
+ kind of variable binding: @dfn{buffer-local} bindings, which apply only
+ to one buffer.  Emacs Lisp is meant for programming editing commands,
+ and having different values for a variable in different buffers is an
+ important customization method.  (A few variables have bindings that
+ are local to a given X terminal; see @ref{Multiple Displays}.)
+ 
+ @menu
+ * Intro to Buffer-Local::      Introduction and concepts.
+ * Creating Buffer-Local::      Creating and destroying buffer-local bindings.
+ * Default Value::              The default value is seen in buffers
+                                  that don't have their own local values.
+ @end menu
+ 
+ @node Intro to Buffer-Local
+ @subsection Introduction to Buffer-Local Variables
+ 
+   A buffer-local variable has a buffer-local binding associated with a
+ particular buffer.  The binding is in effect when that buffer is
+ current; otherwise, it is not in effect.  If you set the variable while
+ a buffer-local binding is in effect, the new value goes in that binding,
+ so the global binding is unchanged; this means that the change is
+ visible in that buffer alone.
+ 
+   A variable may have buffer-local bindings in some buffers but not in
+ others.  The global binding is shared by all the buffers that don't have
+ their own bindings.  Thus, if you set the variable in a buffer that does
+ not have a buffer-local binding for it, the new value is visible in all
+ buffers except those with buffer-local bindings.  (Here we are assuming
+ that there are no @code{let}-style local bindings to complicate the issue.)
+ 
+   The most common use of buffer-local bindings is for major modes to change
+ variables that control the behavior of commands.  For example, C mode and
+ Lisp mode both set the variable @code{paragraph-start} to specify that only
+ blank lines separate paragraphs.  They do this by making the variable
+ buffer-local in the buffer that is being put into C mode or Lisp mode, and
+ then setting it to the new value for that mode.
+ 
+   The usual way to make a buffer-local binding is with
+ @code{make-local-variable}, which is what major mode commands use.  This
+ affects just the current buffer; all other buffers (including those yet to
+ be created) continue to share the global value.
+ 
+ @cindex automatically buffer-local
+   A more powerful operation is to mark the variable as
+ @dfn{automatically buffer-local} by calling
+ @code{make-variable-buffer-local}.  You can think of this as making the
+ variable local in all buffers, even those yet to be created.  More
+ precisely, the effect is that setting the variable automatically makes
+ the variable local to the current buffer if it is not already so.  All
+ buffers start out by sharing the global value of the variable as usual,
+ but any @code{setq} creates a buffer-local binding for the current
+ buffer.  The new value is stored in the buffer-local binding, leaving
+ the (default) global binding untouched.  The global value can no longer
+ be changed with @code{setq}; you need to use @code{setq-default} to do
+ that.
+ 
+   @strong{Warning:} When a variable has local values in one or more
+ buffers, you can get Emacs very confused by binding the variable with
+ @code{let}, changing to a different current buffer in which a different
+ binding is in effect, and then exiting the @code{let}.  This can
+ scramble the values of the global and local bindings.
+ 
+   To preserve your sanity, avoid that series of actions.  If you use
+ @code{save-excursion} around each piece of code that changes to a
+ different current buffer, you will not have this problem.  Here is an
+ example of what to avoid:
+ 
+ @example
+ @group
+ (setq foo 'b)
+ (set-buffer "a")
+ (make-local-variable 'foo)
+ @end group
+ (setq foo 'a)
+ (let ((foo 'temp))
+   (set-buffer "b")
+   @var{body}@dots{})
+ @group
+ foo @result{} 'a      ; @r{The old buffer-local value from buffer @samp{a}}
+                ;   @r{is now the default value.}
+ @end group
+ @group
+ (set-buffer "a")
+ foo @result{} 'temp   ; @r{The local value that should be gone}
+                ;   @r{is now the buffer-local value in buffer @samp{a}.}
+ @end group
+ @end example
+ 
+ @noindent
+ But @code{save-excursion} as shown here avoids the problem:
+ 
+ @example
+ @group
+ (let ((foo 'temp))
+   (save-excursion
+     (set-buffer "b")
+     @var{body}@dots{}))
+ @end group
+ @end example
+ 
+   Note that references to @code{foo} in @var{body} access the
+ buffer-local binding of buffer @samp{b}.
+ 
+   When a file specifies local variable values, these become buffer-local
+ values when you visit the file.  @xref{Auto Major Mode}.
+ 
+ @node Creating Buffer-Local
+ @subsection Creating and Deleting Buffer-Local Bindings
+ 
+ @deffn Command make-local-variable variable
+ This function creates a buffer-local binding in the current buffer for
+ @var{variable} (a symbol).  Other buffers are not affected.  The value
+ returned is @var{variable}.
+ 
+ @c Emacs 19 feature
+ The buffer-local value of @var{variable} starts out as the same value
+ @var{variable} previously had.  If @var{variable} was void, it remains
+ void.
+ 
+ @example
+ @group
+ ;; @r{In buffer @samp{b1}:}
+ (setq foo 5)                ; @r{Affects all buffers.}
+      @result{} 5
+ @end group
+ @group
+ (make-local-variable 'foo)  ; @r{Now it is local in @samp{b1}.}
+      @result{} foo
+ @end group
+ @group
+ foo                         ; @r{That did not change}
+      @result{} 5                   ;   @r{the value.}
+ @end group
+ @group
+ (setq foo 6)                ; @r{Change the value}
+      @result{} 6                   ;   @r{in @samp{b1}.}
+ @end group
+ @group
+ foo
+      @result{} 6
+ @end group
+ 
+ @group
+ ;; @r{In buffer @samp{b2}, the value hasn't changed.}
+ (save-excursion
+   (set-buffer "b2")
+   foo)
+      @result{} 5
+ @end group
+ @end example
+ 
+ Making a variable buffer-local within a @code{let}-binding for that
+ variable does not work.  This is because @code{let} does not distinguish
+ between different kinds of bindings; it knows only which variable the
+ binding was made for.
+ 
+ If the variable is terminal-local, this function signals an error.  Such
+ variables cannot have buffer-local bindings as well.  @xref{Multiple
+ Displays}.
+ 
+ @strong{Note:} do not use @code{make-local-variable} for a hook
+ variable.  Instead, use @code{make-local-hook}.  @xref{Hooks}.
+ @end deffn
+ 
+ @deffn Command make-variable-buffer-local variable
+ This function marks @var{variable} (a symbol) automatically
+ buffer-local, so that any subsequent attempt to set it will make it
+ local to the current buffer at the time.
+ 
+ The value returned is @var{variable}.
+ @end deffn
+ 
+ @defun local-variable-p variable &optional buffer
+ This returns @code{t} if @var{variable} is buffer-local in buffer
+ @var{buffer} (which defaults to the current buffer); otherwise,
+ @code{nil}.
+ @end defun
+ 
+ @defun buffer-local-variables &optional buffer
+ This function returns a list describing the buffer-local variables in
+ buffer @var{buffer}.  It returns an association list (@pxref{Association
+ Lists}) in which each association contains one buffer-local variable and
+ its value.  When a buffer-local variable is void in @var{buffer}, then
+ it appears directly in the resulting list.  If @var{buffer} is omitted,
+ the current buffer is used.
+ 
+ @example
+ @group
+ (make-local-variable 'foobar)
+ (makunbound 'foobar)
+ (make-local-variable 'bind-me)
+ (setq bind-me 69)
+ @end group
+ (setq lcl (buffer-local-variables))
+     ;; @r{First, built-in variables local in all buffers:}
+ @result{} ((mark-active . nil)
+     (buffer-undo-list nil)
+     (mode-name . "Fundamental")
+     @dots{}
+ @group
+     ;; @r{Next, non-built-in local variables.} 
+     ;; @r{This one is local and void:}
+     foobar
+     ;; @r{This one is local and nonvoid:}
+     (bind-me . 69))
+ @end group
+ @end example
+ 
+ Note that storing new values into the @sc{cdr}s of cons cells in this
+ list does @emph{not} change the local values of the variables.
+ @end defun
+ 
+ @deffn Command kill-local-variable variable
+ This function deletes the buffer-local binding (if any) for
+ @var{variable} (a symbol) in the current buffer.  As a result, the
+ global (default) binding of @var{variable} becomes visible in this
+ buffer.  Usually this results in a change in the value of
+ @var{variable}, since the global value is usually different from the
+ buffer-local value just eliminated.
+ 
+ If you kill the local binding of a variable that automatically becomes
+ local when set, this makes the global value visible in the current
+ buffer.  However, if you set the variable again, that will once again
+ create a local binding for it.
+ 
+ @code{kill-local-variable} returns @var{variable}.
+ 
+ This function is a command because it is sometimes useful to kill one
+ buffer-local variable interactively, just as it is useful to create
+ buffer-local variables interactively.
+ @end deffn
+ 
+ @defun kill-all-local-variables
+ This function eliminates all the buffer-local variable bindings of the
+ current buffer except for variables marked as ``permanent''.  As a
+ result, the buffer will see the default values of most variables.
+ 
+ This function also resets certain other information pertaining to the
+ buffer: it sets the local keymap to @code{nil}, the syntax table to the
+ value of @code{standard-syntax-table}, and the abbrev table to the value
+ of @code{fundamental-mode-abbrev-table}.
+ 
+ Every major mode command begins by calling this function, which has the
+ effect of switching to Fundamental mode and erasing most of the effects
+ of the previous major mode.  To ensure that this does its job, the
+ variables that major modes set should not be marked permanent.
+ 
+ @code{kill-all-local-variables} returns @code{nil}.
+ @end defun
+ 
+ @c Emacs 19 feature
+ @cindex permanent local variable
+ A local variable is @dfn{permanent} if the variable name (a symbol) has a
+ @code{permanent-local} property that is non-@code{nil}.  Permanent
+ locals are appropriate for data pertaining to where the file came from
+ or how to save it, rather than with how to edit the contents.
+ 
+ @node Default Value
+ @subsection The Default Value of a Buffer-Local Variable
+ @cindex default value
+ 
+   The global value of a variable with buffer-local bindings is also
+ called the @dfn{default} value, because it is the value that is in
+ effect except when specifically overridden.
+ 
+   The functions @code{default-value} and @code{setq-default} access and
+ change a variable's default value regardless of whether the current
+ buffer has a buffer-local binding.  For example, you could use
+ @code{setq-default} to change the default setting of
+ @code{paragraph-start} for most buffers; and this would work even when
+ you are in a C or Lisp mode buffer that has a buffer-local value for
+ this variable.
+ 
+ @c Emacs 19 feature
+   The special forms @code{defvar} and @code{defconst} also set the
+ default value (if they set the variable at all), rather than any local
+ value.
+ 
+ @defun default-value symbol
+ This function returns @var{symbol}'s default value.  This is the value
+ that is seen in buffers that do not have their own values for this
+ variable.  If @var{symbol} is not buffer-local, this is equivalent to
+ @code{symbol-value} (@pxref{Accessing Variables}).
+ @end defun
+ 
+ @c Emacs 19 feature
+ @defun default-boundp symbol
+ The function @code{default-boundp} tells you whether @var{symbol}'s
+ default value is nonvoid.  If @code{(default-boundp 'foo)} returns
+ @code{nil}, then @code{(default-value 'foo)} would get an error.
+ 
+ @code{default-boundp} is to @code{default-value} as @code{boundp} is to
+ @code{symbol-value}.
+ @end defun
+ 
+ @defspec setq-default symbol value
+ This sets the default value of @var{symbol} to @var{value}.  It does not
+ evaluate @var{symbol}, but does evaluate @var{value}.  The value of the
+ @code{setq-default} form is @var{value}.
+ 
+ If a @var{symbol} is not buffer-local for the current buffer, and is not
+ marked automatically buffer-local, @code{setq-default} has the same
+ effect as @code{setq}.  If @var{symbol} is buffer-local for the current
+ buffer, then this changes the value that other buffers will see (as long
+ as they don't have a buffer-local value), but not the value that the
+ current buffer sees.
+ 
+ @example
+ @group
+ ;; @r{In buffer @samp{foo}:}
+ (make-local-variable 'local)
+      @result{} local
+ @end group
+ @group
+ (setq local 'value-in-foo)
+      @result{} value-in-foo
+ @end group
+ @group
+ (setq-default local 'new-default)
+      @result{} new-default
+ @end group
+ @group
+ local
+      @result{} value-in-foo
+ @end group
+ @group
+ (default-value 'local)
+      @result{} new-default
+ @end group
+ 
+ @group
+ ;; @r{In (the new) buffer @samp{bar}:}
+ local
+      @result{} new-default
+ @end group
+ @group
+ (default-value 'local)
+      @result{} new-default
+ @end group
+ @group
+ (setq local 'another-default)
+      @result{} another-default
+ @end group
+ @group
+ (default-value 'local)
+      @result{} another-default
+ @end group
+ 
+ @group
+ ;; @r{Back in buffer @samp{foo}:}
+ local
+      @result{} value-in-foo
+ (default-value 'local)
+      @result{} another-default
+ @end group
+ @end example
+ @end defspec
+ 
+ @defun set-default symbol value
+ This function is like @code{setq-default}, except that @var{symbol} is
+ evaluated.
+ 
+ @example
+ @group
+ (set-default (car '(a b c)) 23)
+      @result{} 23
+ @end group
+ @group
+ (default-value 'a)
+      @result{} 23
+ @end group
+ @end example
+ @end defun
Index: emacs/man/elisp-windows.texi
diff -c /dev/null emacs/man/elisp-windows.texi:1.2
*** /dev/null	Fri Aug  2 21:00:33 1996
--- emacs/man/elisp-windows.texi	Thu Aug  1 00:23:43 1996
***************
*** 0 ****
--- 1,1747 ----
+ @c -*-texinfo-*-
+ @c This is part of the GNU Emacs Lisp Reference Manual.
+ @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
+ @c See the file elisp.texi for copying conditions.
+ @setfilename ../info/windows
+ @node Windows, Frames, Buffers, Top
+ @chapter Windows
+ 
+   This chapter describes most of the functions and variables related to
+ Emacs windows.  See @ref{Display}, for information on how text is
+ displayed in windows.
+ 
+ @menu
+ * Basic Windows::          Basic information on using windows.
+ * Splitting Windows::      Splitting one window into two windows.
+ * Deleting Windows::       Deleting a window gives its space to other windows.
+ * Selecting Windows::      The selected window is the one that you edit in.
+ * Cyclic Window Ordering:: Moving around the existing windows.
+ * Buffers and Windows::    Each window displays the contents of a buffer.
+ * Displaying Buffers::     Higher-lever functions for displaying a buffer
+                              and choosing a window for it.
+ * Choosing Window::	   How to choose a window for displaying a buffer.
+ * Window Point::           Each window has its own location of point.
+ * Window Start::           The display-start position controls which text
+                              is on-screen in the window. 
+ * Vertical Scrolling::     Moving text up and down in the window.
+ * Horizontal Scrolling::   Moving text sideways on the window.
+ * Size of Window::         Accessing the size of a window.
+ * Resizing Windows::       Changing the size of a window.
+ * Coordinates and Windows::Converting coordinates to windows.
+ * Window Configurations::  Saving and restoring the state of the screen.
+ @end menu
+ 
+ @node Basic Windows
+ @section Basic Concepts of Emacs Windows
+ @cindex window
+ @cindex selected window
+ 
+   A @dfn{window} in Emacs is the physical area of the screen in which a
+ buffer is displayed.  The term is also used to refer to a Lisp object that
+ represents that screen area in Emacs Lisp.  It should be
+ clear from the context which is meant.
+ 
+   Emacs groups windows into frames.  A frame represents an area of
+ screen available for Emacs to use.  Each frame always contains at least
+ one window, but you can subdivide it vertically or horizontally into
+ multiple nonoverlapping Emacs windows.
+ 
+   In each frame, at any time, one and only one window is designated as
+ @dfn{selected within the frame}.  The frame's cursor appears in that
+ window.  At ant time, one frame is the selected frame; and the window
+ selected within that frame is @dfn{the selected window}.  The selected
+ window's buffer is usually the current buffer (except when
+ @code{set-buffer} has been used).  @xref{Current Buffer}.
+ 
+   For practical purposes, a window exists only while it is displayed in
+ a frame.  Once removed from the frame, the window is effectively deleted
+ and should not be used, @emph{even though there may still be references
+ to it} from other Lisp objects.  Restoring a saved window configuration
+ is the only way for a window no longer on the screen to come back to
+ life.  (@xref{Deleting Windows}.)
+ 
+   Each window has the following attributes:
+ 
+ @itemize @bullet
+ @item
+ containing frame
+ 
+ @item 
+ window height
+ 
+ @item 
+ window width
+ 
+ @item 
+ window edges with respect to the screen or frame
+ 
+ @item 
+ the buffer it displays
+ 
+ @item 
+ position within the buffer at the upper left of the window
+ 
+ @item 
+ amount of horizontal scrolling, in columns
+ 
+ @item 
+ point
+ 
+ @item 
+ the mark
+ 
+ @item 
+ how recently the window was selected
+ @end itemize
+ 
+ @cindex multiple windows
+   Users create multiple windows so they can look at several buffers at
+ once.  Lisp libraries use multiple windows for a variety of reasons, but
+ most often to display related information.  In Rmail, for example, you
+ can move through a summary buffer in one window while the other window
+ shows messages one at a time as they are reached.
+ 
+   The meaning of ``window'' in Emacs is similar to what it means in the
+ context of general-purpose window systems such as X, but not identical.
+ The X Window System places X windows on the screen; Emacs uses one or
+ more X windows as frames, and subdivides them into
+ Emacs windows.  When you use Emacs on a character-only terminal, Emacs
+ treats the whole terminal screen as one frame.
+ 
+ @cindex terminal screen
+ @cindex screen of terminal
+ @cindex tiled windows
+   Most window systems support arbitrarily located overlapping windows.
+ In contrast, Emacs windows are @dfn{tiled}; they never overlap, and
+ together they fill the whole screen or frame.  Because of the way
+ in which Emacs creates new windows and resizes them, you can't create
+ every conceivable tiling of windows on an Emacs frame.  @xref{Splitting
+ Windows}, and @ref{Size of Window}.
+ 
+   @xref{Display}, for information on how the contents of the
+ window's buffer are displayed in the window.
+ 
+ @defun windowp object
+   This function returns @code{t} if @var{object} is a window.
+ @end defun
+ 
+ @node Splitting Windows
+ @section Splitting Windows
+ @cindex splitting windows
+ @cindex window splitting
+ 
+   The functions described here are the primitives used to split a window
+ into two windows.  Two higher level functions sometimes split a window,
+ but not always: @code{pop-to-buffer} and @code{display-buffer}
+ (@pxref{Displaying Buffers}).
+ 
+   The functions described here do not accept a buffer as an argument.
+ The two ``halves'' of the split window initially display the same buffer
+ previously visible in the window that was split.
+ 
+ @deffn Command split-window &optional window size horizontal
+ This function splits @var{window} into two windows.  The original
+ window @var{window} remains the selected window, but occupies only
+ part of its former screen area.  The rest is occupied by a newly created
+ window which is returned as the value of this function.
+ 
+   If @var{horizontal} is non-@code{nil}, then @var{window} splits into
+ two side by side windows.  The original window @var{window} keeps the
+ leftmost @var{size} columns, and gives the rest of the columns to the
+ new window.  Otherwise, it splits into windows one above the other, and
+ @var{window} keeps the upper @var{size} lines and gives the rest of the
+ lines to the new window.  The original window is therefore the
+ left-hand or upper of the two, and the new window is the right-hand or
+ lower.
+ 
+   If @var{window} is omitted or @code{nil}, then the selected window is
+ split.  If @var{size} is omitted or @code{nil}, then @var{window} is
+ divided evenly into two parts.  (If there is an odd line, it is
+ allocated to the new window.)  When @code{split-window} is called
+ interactively, all its arguments are @code{nil}.
+ 
+   The following example starts with one window on a screen that is 50
+ lines high by 80 columns wide; then the window is split.
+ 
+ @smallexample
+ @group
+ (setq w (selected-window))
+      @result{} #<window 8 on windows.texi>
+ (window-edges)          ; @r{Edges in order:}
+      @result{} (0 0 80 50)     ;   @r{left--top--right--bottom}
+ @end group
+ 
+ @group
+ ;; @r{Returns window created}
+ (setq w2 (split-window w 15))   
+      @result{} #<window 28 on windows.texi>
+ @end group
+ @group
+ (window-edges w2)
+      @result{} (0 15 80 50)    ; @r{Bottom window;}
+                         ;   @r{top is line 15}
+ @end group
+ @group
+ (window-edges w)
+      @result{} (0 0 80 15)     ; @r{Top window}
+ @end group
+ @end smallexample
+ 
+ The screen looks like this:
+ 
+ @smallexample
+ @group
+          __________ 
+         |          |  line 0  
+         |    w     |
+         |__________|
+         |          |  line 15
+         |    w2    |
+         |__________|
+                       line 50
+  column 0   column 80
+ @end group
+ @end smallexample
+ 
+ Next, the top window is split horizontally:
+ 
+ @smallexample
+ @group
+ (setq w3 (split-window w 35 t))
+      @result{} #<window 32 on windows.texi>
+ @end group
+ @group
+ (window-edges w3)
+      @result{} (35 0 80 15)  ; @r{Left edge at column 35}
+ @end group
+ @group
+ (window-edges w)
+      @result{} (0 0 35 15)   ; @r{Right edge at column 35}
+ @end group
+ @group
+ (window-edges w2)
+      @result{} (0 15 80 50)  ; @r{Bottom window unchanged}
+ @end group
+ @end smallexample
+ 
+ @need 3000
+ Now, the screen looks like this:
+ 
+ @smallexample
+ @group
+      column 35
+          __________ 
+         |   |      |  line 0  
+         | w |  w3  |
+         |___|______|
+         |          |  line 15
+         |    w2    |
+         |__________|
+                       line 50
+  column 0   column 80
+ @end group
+ @end smallexample
+ 
+ Normally, Emacs indicates the border between two side-by-side windows
+ with a scroll bar (@pxref{X Frame Parameters,Scroll Bars}) or @samp{|}
+ characters.  The display table can specify alternative border
+ characters; see @ref{Display Tables}.
+ @end deffn
+ 
+ @deffn Command split-window-vertically size
+ This function splits the selected window into two windows, one above
+ the other, leaving the selected window with @var{size} lines.
+ 
+ This function is simply an interface to @code{split-windows}.
+ Here is the complete function definition for it:
+ 
+ @smallexample
+ @group
+ (defun split-window-vertically (&optional arg)
+   "Split current window into two windows, one above the other."
+   (interactive "P")
+   (split-window nil (and arg (prefix-numeric-value arg))))
+ @end group
+ @end smallexample
+ @end deffn
+ 
+ @deffn Command split-window-horizontally size
+ This function splits the selected window into two windows
+ side-by-side, leaving the selected window with @var{size} columns.
+ 
+ This function is simply an interface to @code{split-windows}.  Here is
+ the complete definition for @code{split-window-horizontally} (except for
+ part of the documentation string):
+ 
+ @smallexample
+ @group
+ (defun split-window-horizontally (&optional arg)
+   "Split selected window into two windows, side by side..."
+   (interactive "P")
+   (split-window nil (and arg (prefix-numeric-value arg)) t))
+ @end group
+ @end smallexample
+ @end deffn
+ 
+ @defun one-window-p &optional no-mini all-frames
+ This function returns non-@code{nil} if there is only one window.  The
+ argument @var{no-mini}, if non-@code{nil}, means don't count the
+ minibuffer even if it is active; otherwise, the minibuffer window is
+ included, if active, in the total number of windows, which is compared
+ against one.
+ 
+ The argument @var{all-frames} specifies which frames to consider.  Here
+ are the possible values and their meanings:
+ 
+ @table @asis
+ @item @code{nil}
+ Count the windows in the selected frame, plus the minibuffer used
+ by that frame even if it lies in some other frame.
+ 
+ @item @code{t}
+ Count all windows in all existing frames.
+ 
+ @item @code{visible}
+ Count all windows in all visible frames.
+ 
+ @item 0
+ Count all windows in all visible or iconified frames.
+ 
+ @item anything else
+ Count precisely the windows in the selected frame, and no others.
+ @end table
+ @end defun
+ 
+ @node Deleting Windows
+ @section Deleting Windows
+ @cindex deleting windows
+ 
+ A window remains visible on its frame unless you @dfn{delete} it by
+ calling certain functions that delete windows.  A deleted window cannot
+ appear on the screen, but continues to exist as a Lisp object until
+ there are no references to it.  There is no way to cancel the deletion
+ of a window aside from restoring a saved window configuration
+ (@pxref{Window Configurations}).  Restoring a window configuration also
+ deletes any windows that aren't part of that configuration.
+ 
+   When you delete a window, the space it took up is given to one
+ adjacent sibling.  (In Emacs version 18, the space was divided evenly
+ among all the siblings.)
+ 
+ @c Emacs 19 feature
+ @defun window-live-p window
+ This function returns @code{nil} if @var{window} is deleted, and
+ @code{t} otherwise.
+ 
+ @strong{Warning:} Erroneous information or fatal errors may result from
+ using a deleted window as if it were live.
+ @end defun
+ 
+ @deffn Command delete-window &optional window
+ This function removes @var{window} from the display.  If @var{window}
+ is omitted, then the selected window is deleted.  An error is signaled
+ if there is only one window when @code{delete-window} is called.
+ 
+ This function returns @code{nil}.
+ 
+ When @code{delete-window} is called interactively, @var{window}
+ defaults to the selected window.
+ @end deffn
+ 
+ @deffn Command delete-other-windows &optional window
+ This function makes @var{window} the only window on its frame, by
+ deleting the other windows in that frame.  If @var{window} is omitted or
+ @code{nil}, then the selected window is used by default.
+ 
+ The result is @code{nil}.
+ @end deffn
+ 
+ @deffn Command delete-windows-on buffer &optional frame
+ This function deletes all windows showing @var{buffer}.  If there are
+ no windows showing @var{buffer}, it does nothing.
+ 
+ @code{delete-windows-on} operates frame by frame.  If a frame has
+ several windows showing different buffers, then those showing
+ @var{buffer} are removed, and the others expand to fill the space.  If
+ all windows in some frame are showing @var{buffer} (including the case
+ where there is only one window), then the frame reverts to having a
+ single window showing another buffer chosen with @code{other-buffer}.
+ @xref{The Buffer List}.
+ 
+ The argument @var{frame} controls which frames to operate on:
+ 
+ @itemize @bullet
+ @item
+ If it is @code{nil}, operate on the selected frame.
+ @item
+ If it is @code{t}, operate on all frames.
+ @item
+ If it is @code{visible}, operate on all visible frames.
+ @item 0
+ If it is 0, operate on all visible or iconified frames.
+ @item
+ If it is a frame, operate on that frame.
+ @end itemize
+ 
+ This function always returns @code{nil}.
+ @end deffn
+ 
+ @node Selecting Windows
+ @section Selecting Windows
+ @cindex selecting windows
+ 
+   When a window is selected, the buffer in the window becomes the current
+ buffer, and the cursor will appear in it.
+ 
+ @defun selected-window
+ This function returns the selected window.  This is the window in
+ which the cursor appears and to which many commands apply.
+ @end defun
+ 
+ @defun select-window window
+ This function makes @var{window} the selected window.  The cursor then
+ appears in @var{window} (on redisplay).  The buffer being displayed in
+ @var{window} is immediately designated the current buffer.
+ 
+ The return value is @var{window}.
+ 
+ @example
+ @group
+ (setq w (next-window))
+ (select-window w)
+      @result{} #<window 65 on windows.texi>
+ @end group
+ @end example
+ @end defun
+ 
+ @defmac save-selected-window forms@dots{}
+ This macro records the selected window, executes @var{forms}
+ in sequence, then restores the earlier selected window.
+ It does not save or restore anything about the sizes, arrangement
+ or contents of windows; therefore, if the @var{forms} change them,
+ the changes are permanent.
+ @end defmac
+ 
+ @cindex finding windows
+   The following functions choose one of the windows on the screen,
+ offering various criteria for the choice.
+ 
+ @defun get-lru-window &optional frame
+ This function returns the window least recently ``used'' (that is,
+ selected).  The selected window is always the most recently used window.
+ 
+ The selected window can be the least recently used window if it is the
+ only window.  A newly created window becomes the least recently used
+ window until it is selected.  A minibuffer window is never a candidate.
+ 
+ The argument @var{frame} controls which windows are considered.
+ 
+ @itemize @bullet
+ @item
+ If it is @code{nil}, consider windows on the selected frame.
+ @item
+ If it is @code{t}, consider windows on all frames.
+ @item
+ If it is @code{visible}, consider windows on all visible frames.
+ @item
+ If it is 0, consider windows on all visible or iconified frames.
+ @item
+ If it is a frame, consider windows on that frame.
+ @end itemize
+ @end defun
+ 
+ @defun get-largest-window &optional frame
+ This function returns the window with the largest area (height times
+ width).  If there are no side-by-side windows, then this is the window
+ with the most lines.  A minibuffer window is never a candidate.
+ 
+ If there are two windows of the same size, then the function returns
+ the window that is first in the cyclic ordering of windows (see
+ following section), starting from the selected window.
+ 
+ The argument @var{frame} controls which set of windows are
+ considered.  See @code{get-lru-window}, above.
+ @end defun
+ 
+ @node Cyclic Window Ordering
+ @comment  node-name,  next,  previous,  up
+ @section Cyclic Ordering of Windows
+ @cindex cyclic ordering of windows
+ @cindex ordering of windows, cyclic
+ @cindex window ordering, cyclic 
+ 
+   When you use the command @kbd{C-x o} (@code{other-window}) to select
+ the next window, it moves through all the windows on the screen in a
+ specific cyclic order.  For any given configuration of windows, this
+ order never varies.  It is called the @dfn{cyclic ordering of windows}.
+ 
+   This ordering generally goes from top to bottom, and from left to
+ right.  But it may go down first or go right first, depending on the
+ order in which the windows were split.
+ 
+   If the first split was vertical (into windows one above each other),
+ and then the subwindows were split horizontally, then the ordering is
+ left to right in the top of the frame, and then left to right in the
+ next lower part of the frame, and so on.  If the first split was
+ horizontal, the ordering is top to bottom in the left part, and so on.
+ In general, within each set of siblings at any level in the window tree,
+ the order is left to right, or top to bottom.
+ 
+ @defun next-window &optional window minibuf all-frames
+ @cindex minibuffer window
+ This function returns the window following @var{window} in the cyclic
+ ordering of windows.  This is the window that @kbd{C-x o} would select
+ if typed when @var{window} is selected.  If @var{window} is the only
+ window visible, then this function returns @var{window}.  If omitted,
+ @var{window} defaults to the selected window.
+ 
+ The value of the argument @var{minibuf} determines whether the
+ minibuffer is included in the window order.  Normally, when
+ @var{minibuf} is @code{nil}, the minibuffer is included if it is
+ currently active; this is the behavior of @kbd{C-x o}.  (The minibuffer
+ window is active while the minibuffer is in use.  @xref{Minibuffers}.)
+ 
+ If @var{minibuf} is @code{t}, then the cyclic ordering includes the
+ minibuffer window even if it is not active.
+ 
+ If @var{minibuf} is neither @code{t} nor @code{nil}, then the minibuffer
+ window is not included even if it is active.
+ 
+ The argument @var{all-frames} specifies which frames to consider.  Here
+ are the possible values and their meanings:
+ 
+ @table @asis
+ @item @code{nil}
+ Consider all the windows in @var{window}'s frame, plus the minibuffer
+ used by that frame even if it lies in some other frame.
+ 
+ @item @code{t}
+ Consider all windows in all existing frames.
+ 
+ @item @code{visible}
+ Consider all windows in all visible frames.  (To get useful results, you
+ must ensure @var{window} is in a visible frame.)
+ 
+ @item 0
+ Consider all windows in all visible or iconified frames.
+ 
+ @item anything else
+ Consider precisely the windows in @var{window}'s frame, and no others.
+ @end table
+ 
+ This example assumes there are two windows, both displaying the 
+ buffer @samp{windows.texi}:
+ 
+ @example
+ @group
+ (selected-window)
+      @result{} #<window 56 on windows.texi>
+ @end group
+ @group
+ (next-window (selected-window))
+      @result{} #<window 52 on windows.texi>
+ @end group
+ @group
+ (next-window (next-window (selected-window)))
+      @result{} #<window 56 on windows.texi>
+ @end group
+ @end example
+ @end defun
+ 
+ @defun previous-window &optional window minibuf all-frames
+ This function returns the window preceding @var{window} in the cyclic
+ ordering of windows.  The other arguments specify which windows to
+ include in the cycle, as in @code{next-window}.
+ @end defun
+ 
+ @deffn Command other-window count
+ This function selects the @var{count}th following window in the cyclic
+ order.  If count is negative, then it selects the @minus{}@var{count}th
+ preceding window.  It returns @code{nil}.
+ 
+ In an interactive call, @var{count} is the numeric prefix argument.
+ @end deffn
+ 
+ @c Emacs 19 feature
+ @defun walk-windows proc &optional minibuf all-frames
+ This function cycles through all windows, calling @code{proc}
+ once for each window with the window as its sole argument.
+ 
+ The optional arguments @var{minibuf} and @var{all-frames} specify the
+ set of windows to include in the scan.  See @code{next-window}, above,
+ for details.
+ @end defun
+ 
+ @node Buffers and Windows
+ @section Buffers and Windows
+ @cindex examining windows
+ @cindex windows, controlling precisely
+ @cindex buffers, controlled in windows
+ 
+   This section describes low-level functions to examine windows or to
+ display buffers in windows in a precisely controlled fashion.
+ @iftex
+ See the following section for
+ @end iftex
+ @ifinfo
+ @xref{Displaying Buffers}, for
+ @end ifinfo
+ related functions that find a window to use and specify a buffer for it.
+ The functions described there are easier to use than these, but they
+ employ heuristics in choosing or creating a window; use these functions
+ when you need complete control.
+ 
+ @defun set-window-buffer window buffer-or-name
+ This function makes @var{window} display @var{buffer-or-name} as its
+ contents.  It returns @code{nil}.
+ 
+ @example
+ @group
+ (set-window-buffer (selected-window) "foo")
+      @result{} nil
+ @end group
+ @end example
+ @end defun
+ 
+ @defun window-buffer &optional window
+ This function returns the buffer that @var{window} is displaying.  If
+ @var{window} is omitted, this function returns the buffer for the
+ selected window.
+ 
+ @example
+ @group
+ (window-buffer)
+      @result{} #<buffer windows.texi>
+ @end group
+ @end example
+ @end defun
+ 
+ @defun get-buffer-window buffer-or-name &optional all-frames
+ This function returns a window currently displaying
+ @var{buffer-or-name}, or @code{nil} if there is none.  If there are
+ several such windows, then the function returns the first one in the
+ cyclic ordering of windows, starting from the selected window.
+ @xref{Cyclic Window Ordering}.
+ 
+ The argument @var{all-frames} controls which windows to consider.
+ 
+ @itemize @bullet
+ @item
+ If it is @code{nil}, consider windows on the selected frame.
+ @item
+ If it is @code{t}, consider windows on all frames.
+ @item
+ If it is @code{visible}, consider windows on all visible frames.
+ @item
+ If it is 0, consider windows on all visible or iconified frames.
+ @item
+ If it is a frame, consider windows on that frame.
+ @end itemize
+ @end defun
+ 
+ @node Displaying Buffers
+ @section Displaying Buffers in Windows
+ @cindex switching to a buffer
+ @cindex displaying a buffer
+ 
+   In this section we describe convenient functions that choose a window
+ automatically and use it to display a specified buffer.  These functions
+ can also split an existing window in certain circumstances.  We also
+ describe variables that parameterize the heuristics used for choosing a
+ window.
+ @iftex
+ See the preceding section for
+ @end iftex
+ @ifinfo
+ @xref{Buffers and Windows}, for
+ @end ifinfo
+ low-level functions that give you more precise control.
+ 
+   Do not use the functions in this section in order to make a buffer
+ current so that a Lisp program can access or modify it; they are too
+ drastic for that purpose, since they change the display of buffers in
+ windows, which is gratuitous and will surprise the user.  Instead, use
+ @code{set-buffer} (@pxref{Current Buffer}) and @code{save-excursion}
+ (@pxref{Excursions}), which designate buffers as current for programmed
+ access without affecting the display of buffers in windows.
+ 
+ @deffn Command switch-to-buffer buffer-or-name &optional norecord
+ This function makes @var{buffer-or-name} the current buffer, and also
+ displays the buffer in the selected window.  This means that a human can
+ see the buffer and subsequent keyboard commands will apply to it.
+ Contrast this with @code{set-buffer}, which makes @var{buffer-or-name}
+ the current buffer but does not display it in the selected window.
+ @xref{Current Buffer}.
+ 
+ If @var{buffer-or-name} does not identify an existing buffer, then a new
+ buffer by that name is created.  The major mode for the new buffer is
+ set according to the variable @code{default-major-mode}.  @xref{Auto
+ Major Mode}.
+ 
+ Normally the specified buffer is put at the front of the buffer list.
+ This affects the operation of @code{other-buffer}.  However, if
+ @var{norecord} is non-@code{nil}, this is not done.  @xref{The Buffer
+ List}.
+ 
+ The @code{switch-to-buffer} function is often used interactively, as
+ the binding of @kbd{C-x b}.  It is also used frequently in programs.  It
+ always returns @code{nil}.
+ @end deffn
+ 
+ @deffn Command switch-to-buffer-other-window buffer-or-name
+ This function makes @var{buffer-or-name} the current buffer and
+ displays it in a window not currently selected.  It then selects that
+ window.  The handling of the buffer is the same as in
+ @code{switch-to-buffer}.
+ 
+ The currently selected window is absolutely never used to do the job.
+ If it is the only window, then it is split to make a distinct window for
+ this purpose.  If the selected window is already displaying the buffer,
+ then it continues to do so, but another window is nonetheless found to
+ display it in as well.
+ @end deffn
+ 
+ @defun pop-to-buffer buffer-or-name &optional other-window
+ This function makes @var{buffer-or-name} the current buffer and
+ switches to it in some window, preferably not the window previously
+ selected.  The ``popped-to'' window becomes the selected window within
+ its frame.
+ 
+ If the variable @code{pop-up-frames} is non-@code{nil},
+ @code{pop-to-buffer} looks for a window in any visible frame already
+ displaying the buffer; if there is one, it returns that window and makes
+ it be selected within its frame.  If there is none, it creates a new
+ frame and displays the buffer in it.
+ 
+ If @code{pop-up-frames} is @code{nil}, then @code{pop-to-buffer}
+ operates entirely within the selected frame.  (If the selected frame has
+ just a minibuffer, @code{pop-to-buffer} operates within the most
+ recently selected frame that was not just a minibuffer.)
+ 
+ If the variable @code{pop-up-windows} is non-@code{nil}, windows may
+ be split to create a new window that is different from the original
+ window.  For details, see @ref{Choosing Window}.
+ 
+ If @var{other-window} is non-@code{nil}, @code{pop-to-buffer} finds or
+ creates another window even if @var{buffer-or-name} is already visible
+ in the selected window.  Thus @var{buffer-or-name} could end up
+ displayed in two windows.  On the other hand, if @var{buffer-or-name} is
+ already displayed in the selected window and @var{other-window} is
+ @code{nil}, then the selected window is considered sufficient display
+ for @var{buffer-or-name}, so that nothing needs to be done.
+ 
+ All the variables that affect @code{display-buffer} affect
+ @code{pop-to-buffer} as well.  @xref{Choosing Window}.
+ 
+ If @var{buffer-or-name} is a string that does not name an existing
+ buffer, a buffer by that name is created.  The major mode for the new
+ buffer is set according to the variable @code{default-major-mode}.
+ @xref{Auto Major Mode}.
+ @end defun
+ 
+ @deffn Command replace-buffer-in-windows buffer
+ This function replaces @var{buffer} with some other buffer in all
+ windows displaying it.  The other buffer used is chosen with
+ @code{other-buffer}.  In the usual applications of this function, you
+ don't care which other buffer is used; you just want to make sure that
+ @var{buffer} is no longer displayed.
+ 
+ This function returns @code{nil}.
+ @end deffn
+ 
+ @node Choosing Window
+ @section Choosing a Window for Display
+ 
+   This section describes the basic facility that chooses a window to
+ display a buffer in---@code{display-buffer}.  All the higher-level
+ functions and commands use this subroutine.  Here we describe how to use
+ @code{display-buffer} and how to customize it.
+ 
+ @deffn Command display-buffer buffer-or-name &optional not-this-window
+ This command makes @var{buffer-or-name} appear in some window, like
+ @code{pop-to-buffer}, but it does not select that window and does not
+ make the buffer current.  The identity of the selected window is
+ unaltered by this function.
+ 
+ If @var{not-this-window} is non-@code{nil}, it means to display the
+ specified buffer in a window other than the selected one, even if it is
+ already on display in the selected window.  This can cause the buffer to
+ appear in two windows at once.  Otherwise, if @var{buffer-or-name} is
+ already being displayed in any window, that is good enough, so this
+ function does nothing.
+ 
+ @code{display-buffer} returns the window chosen to display
+ @var{buffer-or-name}.
+ 
+ Precisely how @code{display-buffer} finds or creates a window depends on
+ the variables described below.
+ @end deffn
+ 
+ @defopt pop-up-windows
+ This variable controls whether @code{display-buffer} makes new windows.
+ If it is non-@code{nil} and there is only one window, then that window
+ is split.  If it is @code{nil}, then @code{display-buffer} does not
+ split the single window, but uses it whole.
+ @end defopt
+ 
+ @defopt split-height-threshold
+ This variable determines when @code{display-buffer} may split a window,
+ if there are multiple windows.  @code{display-buffer} always splits the
+ largest window if it has at least this many lines.  If the largest
+ window is not this tall, it is split only if it is the sole window and
+ @code{pop-up-windows} is non-@code{nil}.
+ @end defopt
+ 
+ @c Emacs 19 feature
+ @defopt pop-up-frames
+ This variable controls whether @code{display-buffer} makes new frames.
+ If it is non-@code{nil}, @code{display-buffer} looks for an existing
+ window already displaying the desired buffer, on any visible frame.  If
+ it finds one, it returns that window.  Otherwise it makes a new frame.
+ The variables @code{pop-up-windows} and @code{split-height-threshold} do
+ not matter if @code{pop-up-frames} is non-@code{nil}.
+ 
+ If @code{pop-up-frames} is @code{nil}, then @code{display-buffer} either
+ splits a window or reuses one.
+ 
+ @xref{Frames}, for more information.
+ @end defopt
+ 
+ @c Emacs 19 feature
+ @defvar pop-up-frame-function
+ This variable specifies how to make a new frame if @code{pop-up-frames}
+ is non-@code{nil}.
+ 
+ Its value should be a function of no arguments.  When
+ @code{display-buffer} makes a new frame, it does so by calling that
+ function, which should return a frame.  The default value of the
+ variable is a function that creates a frame using parameters from
+ @code{pop-up-frame-alist}.
+ @end defvar
+ 
+ @defvar pop-up-frame-alist
+ This variable holds an alist specifying frame parameters used when
+ @code{display-buffer} makes a new frame.  @xref{Frame Parameters}, for
+ more information about frame parameters.
+ @end defvar
+ 
+ @defvar special-display-buffer-names
+ A list of buffer names for buffers that should be displayed specially.
+ If the buffer's name is in this list, @code{display-buffer} handles the
+ buffer specially.
+ 
+ By default, special display means to give the buffer a dedicated frame.
+ 
+ If an element is a list, instead of a string, then the @sc{car} of the
+ list is the buffer name, and the rest of the list says how to create the
+ frame.  There are two possibilities for the rest of the list.  It can be
+ an alist, specifying frame parameters, or it can contain a function and
+ arguments to give to it.  (The function's first argument is always the
+ buffer to be displayed; the arguments from the list come after that.)
+ @end defvar
+ 
+ @defvar special-display-regexps
+ A list of regular expressions that specify buffers that should be
+ displayed specially.  If the buffer's name matches any of the regular
+ expressions in this list, @code{display-buffer} handles the buffer
+ specially.
+ 
+ By default, special display means to give the buffer a dedicated frame.
+ 
+ If an element is a list, instead of a string, then the @sc{car} of the
+ list is the regular expression, and the rest of the list says how to
+ create the frame.  See above, under @code{special-display-buffer-names}.
+ @end defvar
+ 
+ @defvar special-display-function
+ This variable holds the function to call to display a buffer specially.
+ It receives the buffer as an argument, and should return the window in
+ which it is displayed.
+ 
+ The default value of this variable is
+ @code{special-display-popup-frame}.
+ @end defvar
+ 
+ @defun special-display-popup-frame buffer
+ This function makes @var{buffer} visible in a frame of its own.  If
+ @var{buffer} is already displayed in a window in some frame, it makes
+ the frame visible and raises it, to use that window.  Otherwise, it
+ creates a frame that will be dedicated to @var{buffer}.
+ 
+ This function uses an existing window displaying @var{buffer} whether or
+ not it is in a frame of its own; but if you set up the above variables
+ in your init file, before @var{buffer} was created, then presumably the
+ window was previously made by this function.
+ @end defun
+ 
+ @defopt special-display-frame-alist
+ This variable holds frame parameters for
+ @code{special-display-popup-frame} to use when it creates a frame.
+ @end defopt
+ 
+ @defvar same-window-buffer-names
+ A list of buffer names for buffers that should be displayed in the
+ selected window.  If the buffer's name is in this list,
+ @code{display-buffer} handles the buffer by switching to it in the
+ selected window.
+ @end defvar
+ 
+ @defvar same-window-regexps
+ A list of regular expressions that specify buffers that should be
+ displayed in the selected window.  If the buffer's name matches any of
+ the regular expressions in this list, @code{display-buffer} handles the
+ buffer by switching to it in the selected window.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @defvar display-buffer-function
+ This variable is the most flexible way to customize the behavior of
+ @code{display-buffer}.  If it is non-@code{nil}, it should be a function
+ that @code{display-buffer} calls to do the work.  The function should
+ accept two arguments, the same two arguments that @code{display-buffer}
+ received.  It should choose or create a window, display the specified
+ buffer, and then return the window.
+ 
+ This hook takes precedence over all the other options and hooks
+ described above.
+ @end defvar
+ 
+ @c Emacs 19 feature
+ @cindex dedicated window
+ A window can be marked as ``dedicated'' to its buffer.  Then
+ @code{display-buffer} does not try to use that window.
+ 
+ @defun window-dedicated-p window
+ This function returns @code{t} if @var{window} is marked as dedicated;
+ otherwise @code{nil}.
+ @end defun
+ 
+ @defun set-window-dedicated-p window flag
+ This function marks @var{window} as dedicated if @var{flag} is
+ non-@code{nil}, and nondedicated otherwise.
+ @end defun
+ 
+ @node Window Point
+ @section Windows and Point
+ @cindex window position
+ @cindex window point
+ @cindex position in window
+ @cindex point in window
+ 
+   Each window has its own value of point, independent of the value of
+ point in other windows displaying the same buffer.  This makes it useful
+ to have multiple windows showing one buffer.
+ 
+ @itemize @bullet
+ @item
+ The window point is established when a window is first created; it is
+ initialized from the buffer's point, or from the window point of another
+ window opened on the buffer if such a window exists.
+ 
+ @item
+ Selecting a window sets the value of point in its buffer to the window's
+ value of point.  Conversely, deselecting a window sets the window's
+ value of point from that of the buffer.  Thus, when you switch between
+ windows that display a given buffer, the point value for the selected
+ window is in effect in the buffer, while the point values for the other
+ windows are stored in those windows.
+ 
+ @item
+ As long as the selected window displays the current buffer, the window's
+ point and the buffer's point always move together; they remain equal.
+ 
+ @item
+ @xref{Positions}, for more details on buffer positions.
+ @end itemize
+ 
+   As far as the user is concerned, point is where the cursor is, and
+ when the user switches to another buffer, the cursor jumps to the
+ position of point in that buffer.
+ 
+ @defun window-point window
+ This function returns the current position of point in @var{window}.
+ For a nonselected window, this is the value point would have (in that
+ window's buffer) if that window were selected.
+ 
+ When @var{window} is the selected window and its buffer is also the
+ current buffer, the value returned is the same as point in that buffer.
+ 
+ Strictly speaking, it would be more correct to return the
+ ``top-level'' value of point, outside of any @code{save-excursion}
+ forms.  But that value is hard to find.
+ @end defun
+ 
+ @defun set-window-point window position
+ This function positions point in @var{window} at position
+ @var{position} in @var{window}'s buffer.
+ @end defun
+ 
+ @node Window Start
+ @section The Window Start Position
+ 
+   Each window contains a marker used to keep track of a buffer position
+ that specifies where in the buffer display should start.  This position
+ is called the @dfn{display-start} position of the window (or just the
+ @dfn{start}).  The character after this position is the one that appears
+ at the upper left corner of the window.  It is usually, but not
+ inevitably, at the beginning of a text line.
+ 
+ @defun window-start &optional window
+ @cindex window top line
+ This function returns the display-start position of window
+ @var{window}.  If @var{window} is @code{nil}, the selected window is
+ used.  For example, 
+ 
+ @example
+ @group
+ (window-start)
+      @result{} 7058
+ @end group
+ @end example
+ 
+ When you create a window, or display a different buffer in it, the
+ display-start position is set to a display-start position recently used
+ for the same buffer, or 1 if the buffer doesn't have any.
+ 
+ For a realistic example, see the description of @code{count-lines} in
+ @ref{Text Lines}.
+ @end defun
+ 
+ @defun window-end &optional window
+ This function returns the position of the end of the display in window
+ @var{window}.  If @var{window} is @code{nil}, the selected window is
+ used.
+ 
+ Simply changing the buffer text or moving point does not update the
+ value that @code{window-end} returns.  The value is updated only when
+ Emacs redisplays and redisplay actually finishes.
+ 
+ If the last redisplay of @var{window} was preempted, and did not finish,
+ Emacs does not know the position of the end of display in that window.
+ In that case, this function returns a value that is not correct.  In a
+ future version, @code{window-end} will return @code{nil} in that case.
+ @ignore
+ in that case, this function returns @code{nil}.  You can compute where
+ the end of the window @emph{would} have been, if redisplay had finished,
+ like this:
+ 
+ @example
+ (save-excursion
+   (goto-char (window-start window))
+   (vertical-motion (1- (window-height window))
+                    window)
+   (point))
+ @end example
+ @end ignore
+ @end defun
+ 
+ @defun set-window-start window position &optional noforce
+ This function sets the display-start position of @var{window} to
+ @var{position} in @var{window}'s buffer.  It returns @var{position}.
+ 
+ The display routines insist that the position of point be visible when a
+ buffer is displayed.  Normally, they change the display-start position
+ (that is, scroll the window) whenever necessary to make point visible.
+ However, if you specify the start position with this function using
+ @code{nil} for @var{noforce}, it means you want display to start at
+ @var{position} even if that would put the location of point off the
+ screen.  If this does place point off screen, the display routines move
+ point to the left margin on the middle line in the window.
+ 
+ For example, if point @w{is 1} and you set the start of the window @w{to
+ 2}, then point would be ``above'' the top of the window.  The display
+ routines will automatically move point if it is still 1 when redisplay
+ occurs.  Here is an example:
+ 
+ @example
+ @group
+ ;; @r{Here is what @samp{foo} looks like before executing}
+ ;;   @r{the @code{set-window-start} expression.}
+ @end group
+ 
+ @group
+ ---------- Buffer: foo ----------
+ @point{}This is the contents of buffer foo.
+ 2
+ 3
+ 4
+ 5
+ 6
+ ---------- Buffer: foo ----------
+ @end group
+ 
+ @group
+ (set-window-start
+  (selected-window)
+  (1+ (window-start)))
+ @result{} 2
+ @end group
+ 
+ @group
+ ;; @r{Here is what @samp{foo} looks like after executing}
+ ;;   @r{the @code{set-window-start} expression.}
+ ---------- Buffer: foo ----------
+ his is the contents of buffer foo.
+ 2
+ 3
+ @point{}4
+ 5
+ 6
+ ---------- Buffer: foo ----------
+ @end group
+ @end example
+ 
+ If @var{noforce} is non-@code{nil}, and @var{position} would place point
+ off screen at the next redisplay, then redisplay computes a new window-start
+ position that works well with point, and thus @var{position} is not used.
+ @end defun
+ 
+ @defun pos-visible-in-window-p &optional position window
+ This function returns @code{t} if @var{position} is within the range
+ of text currently visible on the screen in @var{window}.  It returns
+ @code{nil} if @var{position} is scrolled vertically out of view.  The
+ argument @var{position} defaults to the current position of point;
+ @var{window}, to the selected window.  Here is an example:
+ 
+ @example
+ @group
+ (or (pos-visible-in-window-p
+      (point) (selected-window))
+     (recenter 0))
+ @end group
+ @end example
+ 
+ The @code{pos-visible-in-window-p} function considers only vertical
+ scrolling.  If @var{position} is out of view only because @var{window}
+ has been scrolled horizontally, @code{pos-visible-in-window-p} returns
+ @code{t}.  @xref{Horizontal Scrolling}.
+ @end defun
+ 
+ @node Vertical Scrolling
+ @section Vertical Scrolling
+ @cindex vertical scrolling
+ @cindex scrolling vertically
+ 
+   Vertical scrolling means moving the text up or down in a window.  It
+ works by changing the value of the window's display-start location.  It
+ may also change the value of @code{window-point} to keep it on the
+ screen.
+ 
+   In the commands @code{scroll-up} and @code{scroll-down}, the directions
+ ``up'' and ``down'' refer to the motion of the text in the buffer at which
+ you are looking through the window.  Imagine that the text is
+ written on a long roll of paper and that the scrolling commands move the
+ paper up and down.  Thus, if you are looking at text in the middle of a
+ buffer and repeatedly call @code{scroll-down}, you will eventually see
+ the beginning of the buffer.
+ 
+   Some people have urged that the opposite convention be used: they
+ imagine that the window moves over text that remains in place.  Then
+ ``down'' commands would take you to the end of the buffer.  This view is
+ more consistent with the actual relationship between windows and the
+ text in the buffer, but it is less like what the user sees.  The
+ position of a window on the terminal does not move, and short scrolling
+ commands clearly move the text up or down on the screen.  We have chosen
+ names that fit the user's point of view.
+ 
+   The scrolling functions (aside from @code{scroll-other-window}) have
+ unpredictable results if the current buffer is different from the buffer
+ that is displayed in the selected window.  @xref{Current Buffer}.
+ 
+ @deffn Command scroll-up &optional count
+ This function scrolls the text in the selected window upward
+ @var{count} lines.  If @var{count} is negative, scrolling is actually
+ downward.
+ 
+ If @var{count} is @code{nil} (or omitted), then the length of scroll
+ is @code{next-screen-context-lines} lines less than the usable height of
+ the window (not counting its mode line).
+ 
+ @code{scroll-up} returns @code{nil}.
+ @end deffn
+ 
+ @deffn Command scroll-down &optional count
+ This function scrolls the text in the selected window downward
+ @var{count} lines.  If @var{count} is negative, scrolling is actually
+ upward.
+ 
+ If @var{count} is omitted or @code{nil}, then the length of the scroll
+ is @code{next-screen-context-lines} lines less than the usable height of
+ the window (not counting its mode line).
+ 
+ @code{scroll-down} returns @code{nil}.
+ @end deffn
+ 
+ @deffn Command scroll-other-window &optional count
+ This function scrolls the text in another window upward @var{count}
+ lines.  Negative values of @var{count}, or @code{nil}, are handled
+ as in @code{scroll-up}.
+ 
+ You can specify a buffer to scroll with the variable
+ @code{other-window-scroll-buffer}.  When the selected window is the
+ minibuffer, the next window is normally the one at the top left corner.
+ You can specify a different window to scroll with the variable
+ @code{minibuffer-scroll-window}.  This variable has no effect when any
+ other window is selected.  @xref{Minibuffer Misc}.
+ 
+ When the minibuffer is active, it is the next window if the selected
+ window is the one at the bottom right corner.  In this case,
+ @code{scroll-other-window} attempts to scroll the minibuffer.  If the
+ minibuffer contains just one line, it has nowhere to scroll to, so the
+ line reappears after the echo area momentarily displays the message
+ ``Beginning of buffer''.
+ @end deffn
+ 
+ @c Emacs 19 feature
+ @defvar other-window-scroll-buffer
+ If this variable is non-@code{nil}, it tells @code{scroll-other-window}
+ which buffer to scroll.
+ @end defvar
+ 
+ @defopt scroll-step
+ This variable controls how scrolling is done automatically when point
+ moves off the screen.  If the value is zero, then redisplay scrolls the
+ text to center point vertically in the window.  If the value is a
+ positive integer @var{n}, then redisplay brings point back on screen by
+ scrolling @var{n} lines in either direction, if possible; otherwise, it
+ centers point.  The default value is zero.
+ @end defopt
+ 
+ @defopt next-screen-context-lines
+ The value of this variable is the number of lines of continuity to
+ retain when scrolling by full screens.  For example, @code{scroll-up}
+ with an argument of @code{nil} scrolls so that this many lines at the
+ bottom of the window appear instead at the top.  The default value is
+ @code{2}.
+ @end defopt
+ 
+ @deffn Command recenter &optional count
+ @cindex centering point
+ This function scrolls the selected window to put the text where point
+ is located at a specified vertical position within the window.
+ 
+ If @var{count} is a nonnegative number, it puts the line containing
+ point @var{count} lines down from the top of the window.  If @var{count}
+ is a negative number, then it counts upward from the bottom of the
+ window, so that @minus{}1 stands for the last usable line in the window.
+ If @var{count} is a non-@code{nil} list, then it stands for the line in
+ the middle of the window.
+ 
+ If @var{count} is @code{nil}, @code{recenter} puts the line containing
+ point in the middle of the window, then clears and redisplays the entire
+ selected frame.
+ 
+ When @code{recenter} is called interactively, @var{count} is the raw
+ prefix argument.  Thus, typing @kbd{C-u} as the prefix sets the
+ @var{count} to a non-@code{nil} list, while typing @kbd{C-u 4} sets
+ @var{count} to 4, which positions the current line four lines from the
+ top.
+ 
+ With an argument of zero, @code{recenter} positions the current line at
+ the top of the window.  This action is so handy that some people make a
+ separate key binding to do this.  For example,
+ 
+ @example
+ @group
+ (defun line-to-top-of-window ()
+   "Scroll current line to top of window.
+ Replaces three keystroke sequence C-u 0 C-l."
+   (interactive) 
+   (recenter 0))
+ 
+ (global-set-key [kp-multiply] 'line-to-top-of-window)  
+ @end group
+ @end example
+ @end deffn
+ 
+ @node Horizontal Scrolling
+ @section Horizontal Scrolling
+ @cindex horizontal scrolling
+ 
+   Because we read English first from top to bottom and second from left
+ to right, horizontal scrolling is not like vertical scrolling.  Vertical
+ scrolling involves selection of a contiguous portion of text to display.
+ Horizontal scrolling causes part of each line to go off screen.  The
+ amount of horizontal scrolling is therefore specified as a number of
+ columns rather than as a position in the buffer.  It has nothing to do
+ with the display-start position returned by @code{window-start}.
+ 
+   Usually, no horizontal scrolling is in effect; then the leftmost
+ column is at the left edge of the window.  In this state, scrolling to
+ the right is meaningless, since there is no data to the left of the
+ screen to be revealed by it; so this is not allowed.  Scrolling to the
+ left is allowed; it scrolls the first columns of text off the edge of
+ the window and can reveal additional columns on the right that were
+ truncated before.  Once a window has a nonzero amount of leftward
+ horizontal scrolling, you can scroll it back to the right, but only so
+ far as to reduce the net horizontal scroll to zero.  There is no limit
+ to how far left you can scroll, but eventually all the text will
+ disappear off the left edge.
+ 
+ @deffn Command scroll-left count
+ This function scrolls the selected window @var{count} columns to the
+ left (or to the right if @var{count} is negative).  The return value is
+ the total amount of leftward horizontal scrolling in effect after the
+ change---just like the value returned by @code{window-hscroll} (below).
+ @end deffn
+ 
+ @deffn Command scroll-right count
+ This function scrolls the selected window @var{count} columns to the
+ right (or to the left if @var{count} is negative).  The return value is
+ the total amount of leftward horizontal scrolling in effect after the
+ change---just like the value returned by @code{window-hscroll} (below).
+ 
+ Once you scroll a window as far right as it can go, back to its normal
+ position where the total leftward scrolling is zero, attempts to scroll
+ any farther right have no effect.
+ @end deffn
+ 
+ @defun window-hscroll &optional window
+ This function returns the total leftward horizontal scrolling of
+ @var{window}---the number of columns by which the text in @var{window}
+ is scrolled left past the left margin.
+ 
+ The value is never negative.  It is zero when no horizontal scrolling
+ has been done in @var{window} (which is usually the case).
+ 
+ If @var{window} is @code{nil}, the selected window is used.
+ 
+ @example
+ @group
+ (window-hscroll)
+      @result{} 0
+ @end group
+ @group
+ (scroll-left 5)
+      @result{} 5
+ @end group
+ @group
+ (window-hscroll)
+      @result{} 5
+ @end group
+ @end example
+ @end defun
+ 
+ @defun set-window-hscroll window columns
+ This function sets the number of columns from the left margin that
+ @var{window} is scrolled to the value of @var{columns}.  The argument
+ @var{columns} should be zero or positive; if not, it is taken as zero.
+ 
+ The value returned is @var{columns}.
+ 
+ @example
+ @group
+ (set-window-hscroll (selected-window) 10)
+      @result{} 10
+ @end group
+ @end example
+ @end defun
+ 
+   Here is how you can determine whether a given position @var{position}
+ is off the screen due to horizontal scrolling:
+ 
+ @example
+ @group
+ (defun hscroll-on-screen (window position)
+   (save-excursion 
+     (goto-char position)
+     (and 
+      (>= (- (current-column) (window-hscroll window)) 0)
+      (< (- (current-column) (window-hscroll window))
+         (window-width window)))))
+ @end group
+ @end example
+ 
+ @node Size of Window
+ @section The Size of a Window
+ @cindex window size
+ @cindex size of window
+ 
+   An Emacs window is rectangular, and its size information consists of
+ the height (the number of lines) and the width (the number of character
+ positions in each line).  The mode line is included in the height.  But
+ the width does not count the scroll bar or the column of @samp{|}
+ characters that separates side-by-side windows.
+ 
+   The following three functions return size information about a window:
+ 
+ @defun window-height &optional window
+ This function returns the number of lines in @var{window}, including
+ its mode line.  If @var{window} fills its entire frame, this is one less
+ than the value of @code{frame-height} on that frame (since the last line
+ is always reserved for the minibuffer).
+ 
+ If @var{window} is @code{nil}, the function uses the selected window.
+ 
+ @example
+ @group
+ (window-height)
+      @result{} 23
+ @end group
+ @group
+ (split-window-vertically)
+      @result{} #<window 4 on windows.texi>
+ @end group
+ @group
+ (window-height)
+      @result{} 11
+ @end group
+ @end example
+ @end defun
+ 
+ @defun window-width &optional window
+ This function returns the number of columns in @var{window}.  If
+ @var{window} fills its entire frame, this is the same as the value of
+ @code{frame-width} on that frame.  The width does not include the
+ window's scroll bar or the column of @samp{|} characters that separates
+ side-by-side windows.
+ 
+ If @var{window} is @code{nil}, the function uses the selected window.
+ 
+ @example
+ @group
+ (window-width)
+      @result{} 80
+ @end group
+ @end example
+ @end defun
+ 
+ @defun window-edges &optional window
+ This function returns a list of the edge coordinates of @var{window}.
+ If @var{window} is @code{nil}, the selected window is used.
+ 
+ The order of the list is @code{(@var{left} @var{top} @var{right}
+ @var{bottom})}, all elements relative to 0, 0 at the top left corner of
+ the frame.  The element @var{right} of the value is one more than the
+ rightmost column used by @var{window}, and @var{bottom} is one more than
+ the bottommost row used by @var{window} and its mode-line.
+ 
+ When you have side-by-side windows, the right edge value for a window
+ with a neighbor on the right includes the width of the separator between
+ the window and that neighbor.  This separator may be a column of
+ @samp{|} characters or it may be a scroll bar.  Since the width of the
+ window does not include this separator, the width does not equal the
+ difference between the right and left edges in this case.
+ 
+ Here is the result obtained on a typical 24-line terminal with just one
+ window:
+ 
+ @example
+ @group
+ (window-edges (selected-window))
+      @result{} (0 0 80 23)
+ @end group
+ @end example
+ 
+ @noindent
+ The bottom edge is at line 23 because the last line is the echo area.
+ 
+ If @var{window} is at the upper left corner of its frame, @var{right}
+ and @var{bottom} are the same as the values returned by
+ @code{(window-width)} and @code{(window-height)} respectively, and
+ @var{top} and @var{bottom} are zero.  For example, the edges of the
+ following window are @w{@samp{0 0 5 8}}.  Assuming that the frame has
+ more than 8 columns, the last column of the window (column 7) holds a
+ border rather than text.  The last row (row 4) holds the mode line,
+ shown here with @samp{xxxxxxxxx}.
+ 
+ @example
+ @group
+            0    
+            _______
+         0 |       | 
+           |       |   
+           |       | 
+           |       | 
+           xxxxxxxxx  4
+ 
+                   7  
+ @end group
+ @end example
+ 
+ When there are side-by-side windows, any window not at the right edge of
+ its frame has a separator in its last column or columns.  The separator
+ counts as one or two columns in the width of the window.  A window never
+ includes a separator on its left, since that belongs to the window to
+ the left.
+ 
+ In the following example, let's suppose that the frame is 7
+ columns wide.  Then the edges of the left window are @w{@samp{0 0 4 3}}
+ and the edges of the right window are @w{@samp{4 0 7 3}}.
+ 
+ @example
+ @group
+            ___ ___
+           |   |   |    
+           |   |   |    
+           xxxxxxxxx 
+ 
+            0  34  7
+ @end group
+ @end example
+ @end defun
+ 
+ @node Resizing Windows
+ @section Changing the Size of a Window
+ @cindex window resizing
+ @cindex changing window size
+ @cindex window size, changing
+ 
+   The window size functions fall into two classes: high-level commands
+ that change the size of windows and low-level functions that access
+ window size.  Emacs does not permit overlapping windows or gaps between
+ windows, so resizing one window affects other windows.
+ 
+ @deffn Command enlarge-window size &optional horizontal
+ This function makes the selected window @var{size} lines taller,
+ stealing lines from neighboring windows.  It takes the lines from one
+ window at a time until that window is used up, then takes from another.
+ If a window from which lines are stolen shrinks below
+ @code{window-min-height} lines, that window disappears.
+ 
+ If @var{horizontal} is non-@code{nil}, this function makes
+ @var{window} wider by @var{size} columns, stealing columns instead of
+ lines.  If a window from which columns are stolen shrinks below
+ @code{window-min-width} columns, that window disappears.
+ 
+ If the requested size would exceed that of the window's frame, then the
+ function makes the window occupy the entire height (or width) of the
+ frame.
+ 
+ If @var{size} is negative, this function shrinks the window by
+ @minus{}@var{size} lines or columns.  If that makes the window smaller
+ than the minimum size (@code{window-min-height} and
+ @code{window-min-width}), @code{enlarge-window} deletes the window.
+ 
+ @code{enlarge-window} returns @code{nil}.  
+ @end deffn
+ 
+ @deffn Command enlarge-window-horizontally columns
+ This function makes the selected window @var{columns} wider.
+ It could be defined as follows:
+ 
+ @example
+ @group
+ (defun enlarge-window-horizontally (columns)
+   (enlarge-window columns t))
+ @end group
+ @end example
+ @end deffn
+ 
+ @deffn Command shrink-window size &optional horizontal
+ This function is like @code{enlarge-window} but negates the argument
+ @var{size}, making the selected window smaller by giving lines (or
+ columns) to the other windows.  If the window shrinks below
+ @code{window-min-height} or @code{window-min-width}, then it disappears.
+ 
+ If @var{size} is negative, the window is enlarged by @minus{}@var{size}
+ lines or columns.
+ @end deffn
+ 
+ @deffn Command shrink-window-horizontally columns
+ This function makes the selected window @var{columns} narrower.
+ It could be defined as follows:
+ 
+ @example
+ @group
+ (defun shrink-window-horizontally (columns)
+   (shrink-window columns t))
+ @end group
+ @end example
+ @end deffn
+ 
+ @cindex minimum window size
+   The following two variables constrain the window-size-changing
+ functions to a minimum height and width.
+ 
+ @defopt window-min-height
+ The value of this variable determines how short a window may become
+ before it is automatically deleted.  Making a window smaller than
+ @code{window-min-height} automatically deletes it, and no window may be
+ created shorter than this.  The absolute minimum height is two (allowing
+ one line for the mode line, and one line for the buffer display).
+ Actions that change window sizes reset this variable to two if it is
+ less than two.  The default value is 4.
+ @end defopt
+ 
+ @defopt window-min-width
+ The value of this variable determines how narrow a window may become
+ before it automatically deleted.  Making a window smaller than
+ @code{window-min-width} automatically deletes it, and no window may be
+ created narrower than this.  The absolute minimum width is one; any
+ value below that is ignored.  The default value is 10.
+ @end defopt
+ 
+ @defvar window-size-change-functions
+ This variable holds a list of functions to be called if the size of any
+ window changes for any reason.  The functions are called just once per
+ redisplay, and just once for each frame on which size changes have
+ occurred.
+ 
+ Each function receives the frame as its sole argument.  There is no
+ direct way to find out which windows changed size, or precisely how;
+ however, if your size-change function keeps track, after each change, of
+ the windows that interest you, you can figure out what has changed by
+ comparing the old size data with the new.
+ 
+ Creating or deleting windows counts as a size change, and therefore
+ causes these functions to be called.  Changing the frame size also
+ counts, because it changes the sizes of the existing windows.
+ 
+ It is not a good idea to use @code{save-window-excursion} in these
+ functions, because that always counts as a size change, and it would
+ cause these functions to be called over and over.  In most cases,
+ @code{save-selected-window} is what you need here.
+ @end defvar
+ 
+ @node Coordinates and Windows
+ @section Coordinates and Windows
+ 
+ This section describes how to relate screen coordinates to windows.
+ 
+ @defun window-at x y &optional frame
+ This function returns the window containing the specified cursor
+ position in the frame @var{frame}.  The coordinates @var{x} and @var{y}
+ are measured in characters and count from the top left corner of the
+ frame.  If they are out of range, @code{window-at} returns @code{nil}.
+ 
+ If you omit @var{frame}, the selected frame is used.
+ @end defun
+ 
+ @defun coordinates-in-window-p coordinates window
+ This function checks whether a particular frame position falls within
+ the window @var{window}.
+ 
+ @need 3000
+ The argument @var{coordinates} is a cons cell of this form:
+ 
+ @example
+ (@var{x} . @var{y})
+ @end example
+ 
+ @noindent
+ The coordinates @var{x} and @var{y} are measured in characters, and
+ count from the top left corner of the screen or frame.
+ 
+ The value of @code{coordinates-in-window-p} is non-@code{nil} if the
+ coordinates are inside @var{window}.  The value also indicates what part
+ of the window the position is in, as follows:
+ 
+ @table @code
+ @item (@var{relx} . @var{rely})
+ The coordinates are inside @var{window}.  The numbers @var{relx} and
+ @var{rely} are the equivalent window-relative coordinates for the
+ specified position, counting from 0 at the top left corner of the
+ window.
+ 
+ @item mode-line
+ The coordinates are in the mode line of @var{window}.
+ 
+ @item vertical-split
+ The coordinates are in the vertical line between @var{window} and its
+ neighbor to the right.  This value occurs only if the window doesn't 
+ have a scroll bar; positions in a scroll bar are considered outside the
+ window.
+ 
+ @item nil
+ The coordinates are not in any part of @var{window}.
+ @end table
+ 
+ The function @code{coordinates-in-window-p} does not require a frame as
+ argument because it always uses the frame that @var{window} is on.
+ @end defun
+ 
+ @node Window Configurations
+ @section Window Configurations
+ @cindex window configurations
+ @cindex saving window information
+ 
+   A @dfn{window configuration} records the entire layout of a
+ frame---all windows, their sizes, which buffers they contain, what part
+ of each buffer is displayed, and the values of point and the mark.  You
+ can bring back an entire previous layout by restoring a window
+ configuration previously saved.
+ 
+   If you want to record all frames instead of just one, use a frame
+ configuration instead of a window configuration.  @xref{Frame
+ Configurations}.
+ 
+ @defun current-window-configuration
+ This function returns a new object representing Emacs's current window
+ configuration, namely the number of windows, their sizes and current
+ buffers, which window is the selected window, and for each window the
+ displayed buffer, the display-start position, and the positions of point
+ and the mark.  An exception is made for point in the current buffer,
+ whose value is not saved.
+ @end defun
+ 
+ @defun set-window-configuration configuration
+ This function restores the configuration of Emacs's windows and
+ buffers to the state specified by @var{configuration}.  The argument
+ @var{configuration} must be a value that was previously returned by
+ @code{current-window-configuration}.
+ 
+ This function always counts as a window size change and triggers
+ execution of the @code{window-size-change-functions}.  (It doesn't know
+ how to tell whether the new configuration actually differs from the old
+ one.)
+ 
+ Here is a way of using this function to get the same effect
+ as @code{save-window-excursion}:
+ 
+ @example
+ @group
+ (let ((config (current-window-configuration)))
+   (unwind-protect
+       (progn (split-window-vertically nil)
+              @dots{})
+     (set-window-configuration config)))
+ @end group
+ @end example
+ @end defun
+ 
+ @defspec save-window-excursion forms@dots{}
+ This special form records the window configuration, executes @var{forms}
+ in sequence, then restores the earlier window configuration.  The window
+ configuration includes the value of point and the portion of the buffer
+ that is visible.  It also includes the choice of selected window.
+ However, it does not include the value of point in the current buffer;
+ use @code{save-excursion} if you wish to preserve that.
+ 
+ Don't use this construct when @code{save-selected-window} is all you need.
+ 
+ Exit from @code{save-window-excursion} always triggers execution of the
+ @code{window-size-change-functions}.  (It doesn't know how to tell
+ whether the restored configuration actually differs from the one in
+ effect at the end of the @var{forms}.)
+ 
+ The return value is the value of the final form in @var{forms}.
+ For example:
+ 
+ @example
+ @group
+ (split-window)
+      @result{} #<window 25 on control.texi>
+ @end group
+ @group
+ (setq w (selected-window))
+      @result{} #<window 19 on control.texi>
+ @end group
+ @group
+ (save-window-excursion
+   (delete-other-windows w)
+   (switch-to-buffer "foo")
+   'do-something)
+      @result{} do-something
+      ;; @r{The screen is now split again.}
+ @end group
+ @end example
+ @end defspec
+ 
+ @defun window-configuration-p object
+ This function returns @code{t} if @var{object} is a window configuration.
+ @end defun
+ 
+   Primitives to look inside of window configurations would make sense,
+ but none are implemented.  It is not clear they are useful enough to be
+ worth implementing.
Index: emacs/man/elisp.texi
diff -c /dev/null emacs/man/elisp.texi:1.2
*** /dev/null	Fri Aug  2 21:00:55 1996
--- emacs/man/elisp.texi	Thu Aug  1 00:23:45 1996
***************
*** 0 ****
--- 1,923 ----
+ \input texinfo  @c -*-texinfo-*-
+ @c %**start of header
+ @setfilename ../info/elisp.info
+ @smallbook
+ @settitle GNU Emacs Lisp Reference Manual
+ @c %**end of header
+ 
+ @ifinfo
+ This version is the edition 2.4 of the GNU Emacs Lisp
+ Reference Manual.  It corresponds to Emacs Version 19.29.
+ @c Please REMEMBER to update edition number in *four* places in this file
+ @c                 and also in *one* place in intro.texi
+ 
+ Published by the Free Software Foundation
+ 675 Massachusetts Avenue
+ Cambridge, MA 02139 USA
+ 
+ Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. 
+ 
+ Permission is granted to make and distribute verbatim copies of this
+ manual provided the copyright notice and this permission notice are
+ preserved on all copies.
+ 
+ @ignore
+ Permission is granted to process this file through TeX and print the
+ results, provided the printed document carries copying permission notice
+ identical to this one except for the removal of this paragraph (this
+ paragraph not being relevant to the printed manual).
+ 
+ @end ignore
+ Permission is granted to copy and distribute modified versions of this
+ manual under the conditions for verbatim copying, provided that the
+ entire resulting derived work is distributed under the terms of a
+ permission notice identical to this one.
+ 
+ Permission is granted to copy and distribute translations of this manual
+ into another language, under the above conditions for modified versions,
+ except that this permission notice may be stated in a translation
+ approved by the Foundation.
+ 
+ Permission is granted to copy and distribute modified versions of this
+ manual under the conditions for verbatim copying, provided also that the
+ section entitled ``GNU General Public License'' is included exactly as
+ in the original, and provided that the entire resulting derived work is
+ distributed under the terms of a permission notice identical to this
+ one.
+ 
+ Permission is granted to copy and distribute translations of this manual
+ into another language, under the above conditions for modified versions,
+ except that the section entitled ``GNU General Public License'' may be
+ included in a translation approved by the Free Software Foundation
+ instead of in the original English.
+ @end ifinfo
+ 
+ @c Combine indices.
+ @synindex cp fn
+ @syncodeindex vr fn
+ @syncodeindex ky fn
+ @syncodeindex pg fn
+ @syncodeindex tp fn
+ 
+ @setchapternewpage odd
+ @finalout
+ 
+ @titlepage
+ @title GNU Emacs Lisp Reference Manual
+ @subtitle GNU Emacs Version 19
+ @subtitle for Unix Users
+ @c The edition number appears in several places in this file
+ @c and also in the file intro.texi.
+ @subtitle Revision 2.4, June 1995
+ 
+ @author by Bil Lewis, Dan LaLiberte, Richard Stallman
+ @author and the GNU Manual Group
+ @page
+ @vskip 0pt plus 1filll
+ Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. 
+ 
+ @sp 2
+ Edition 2.4 @*
+ Revised for Emacs Version 19.29,@*
+ June, 1995.@*
+ @sp 2
+ ISBN 1-882114-71-X
+ 
+ @sp 2
+ Published by the Free Software Foundation @*
+ 675 Massachusetts Avenue @*
+ Cambridge, MA 02139 USA
+ 
+ Permission is granted to make and distribute verbatim copies of this
+ manual provided the copyright notice and this permission notice are
+ preserved on all copies.
+ 
+ Permission is granted to copy and distribute modified versions of this
+ manual under the conditions for verbatim copying, provided also that the
+ section entitled ``GNU General Public License'' is included
+ exactly as in the original, and provided that the entire resulting
+ derived work is distributed under the terms of a permission notice
+ identical to this one.
+ 
+ Permission is granted to copy and distribute translations of this manual
+ into another language, under the above conditions for modified versions,
+ except that the section entitled ``GNU General Public License'' may be
+ included in a translation approved by the Free Software Foundation
+ instead of in the original English.
+ 
+ Cover art by Etienne Suvasa.
+ @end titlepage
+ @page
+ 
+ @node Top, Copying, (dir), (dir)
+ 
+ @ifinfo
+ This Info file contains edition 2.4 of the GNU Emacs Lisp
+ Reference Manual, corresponding to GNU Emacs version 19.29.
+ @end ifinfo
+ 
+ @menu
+ * Copying::                 Conditions for copying and changing GNU Emacs.
+ * Introduction::            Introduction and conventions used.
+ 
+ * Lisp Data Types::         Data types of objects in Emacs Lisp.
+ * Numbers::                 Numbers and arithmetic functions.
+ * Strings and Characters::  Strings, and functions that work on them.
+ * Lists::                   Lists, cons cells, and related functions.
+ * Sequences Arrays Vectors::  Lists, strings and vectors are called sequences.
+                                 Certain functions act on any kind of sequence.
+                                 The description of vectors is here as well.
+ * Symbols::                 Symbols represent names, uniquely.
+ 
+ * Evaluation::              How Lisp expressions are evaluated.
+ * Control Structures::      Conditionals, loops, nonlocal exits.
+ * Variables::               Using symbols in programs to stand for values.
+ * Functions::               A function is a Lisp program
+                               that can be invoked from other functions.
+ * Macros::                  Macros are a way to extend the Lisp language.
+ 
+ * Loading::                 Reading files of Lisp code into Lisp.
+ * Byte Compilation::        Compilation makes programs run faster.
+ * Debugging::               Tools and tips for debugging Lisp programs.
+ 
+ * Read and Print::          Converting Lisp objects to text and back.
+ * Minibuffers::             Using the minibuffer to read input.
+ * Command Loop::            How the editor command loop works,
+                               and how you can call its subroutines.
+ * Keymaps::                 Defining the bindings from keys to commands.
+ * Modes::                   Defining major and minor modes.
+ * Documentation::           Writing and using documentation strings.
+ 
+ * Files::                   Accessing files.
+ * Backups and Auto-Saving:: Controlling how backups and auto-save
+                               files are made.
+ * Buffers::                 Creating and using buffer objects.
+ * Windows::                 Manipulating windows and displaying buffers.
+ * Frames::		    Making multiple X windows.
+ * Positions::               Buffer positions and motion functions.
+ * Markers::                 Markers represent positions and update
+                               automatically when the text is changed.
+ 
+ * Text::                    Examining and changing text in buffers.
+ * Searching and Matching::  Searching buffers for strings or regexps.
+ * Syntax Tables::           The syntax table controls word and list parsing.
+ * Abbrevs::                 How Abbrev mode works, and its data structures.
+ 
+ * Processes::               Running and communicating with subprocesses.
+ * System Interface::        Getting the user id, system type, environment
+                               variables, and other such things.
+ * Display::	            Parameters controlling screen usage.
+                               The bell.  Waiting for input.
+ * Calendar::		    Customizing the calendar and diary.
+ 
+ Appendices
+ 
+ * Tips::                    Advice for writing Lisp programs.
+ * GNU Emacs Internals::     Building and dumping Emacs;
+                               internal data structures.
+ * Standard Errors::         List of all error symbols.
+ * Standard Buffer-Local Variables::  List of variables local in all buffers.
+ * Standard Keymaps::        List of standard keymaps.
+ * Standard Hooks::          List of standard hook variables.
+ 
+ * Index::                   Index including concepts, functions, variables,
+                               and other terms.
+ 
+       --- The Detailed Node Listing ---
+ 
+ Here are other nodes that are inferiors of those already listed,
+ mentioned here so you can get to them in one step:
+ 
+ Introduction
+ 
+ * Caveats::                 Flaws and a request for help.
+ * Lisp History::            Emacs Lisp is descended from Maclisp.
+ * Conventions::             How the manual is formatted.
+ * Acknowledgements::        The authors, editors, and sponsors of this manual.
+ 
+ Conventions
+ 
+ * Some Terms::              Explanation of terms we use in this manual.
+ * nil and t::               How the symbols @code{nil} and @code{t} are used.
+ * Evaluation Notation::     The format we use for examples of evaluation.
+ * Printing Notation::       The format we use for examples that print output.
+ * Error Messages::          The format we use for examples of errors.
+ * Buffer Text Notation::    The format we use for buffer contents in examples.
+ * Format of Descriptions::  Notation for describing functions, variables, etc.
+ 
+ Format of Descriptions
+ 
+ * A Sample Function Description::       
+ * A Sample Variable Description::   
+ 
+ Lisp Data Types
+ 
+ * Printed Representation::  How Lisp objects are represented as text.
+ * Comments::                Comments and their formatting conventions.
+ * Programming Types::       Types found in all Lisp systems.
+ * Editing Types::           Types specific to Emacs.
+ * Type Predicates::         Tests related to types.
+ * Equality Predicates::     Tests of equality between any two objects.
+ 
+ Programming Types
+ 
+ * Integer Type::        Numbers without fractional parts.
+ * Floating Point Type:: Numbers with fractional parts and with a large range.
+ * Character Type::      The representation of letters, numbers and
+                         control characters.
+ * Sequence Type::       Both lists and arrays are classified as sequences.
+ * Cons Cell Type::      Cons cells, and lists (which are made from cons cells).
+ * Array Type::          Arrays include strings and vectors.
+ * String Type::         An (efficient) array of characters.
+ * Vector Type::         One-dimensional arrays.
+ * Symbol Type::         A multi-use object that refers to a function,
+                         variable, property list, or itself.
+ * Function Type::       A piece of executable code you can call from elsewhere.
+ * Macro Type::          A method of expanding an expression into another
+                           expression, more fundamental but less pretty.
+ * Primitive Function Type::     A function written in C, callable from Lisp.
+ * Byte-Code Type::      A function written in Lisp, then compiled.
+ * Autoload Type::       A type used for automatically loading seldom-used
+                         functions.
+ 
+ List Type
+ 
+ * Dotted Pair Notation::    An alternative syntax for lists.
+ * Association List Type::   A specially constructed list.
+ 
+ Editing Types
+ 
+ * Buffer Type::             The basic object of editing.
+ * Window Type::             What makes buffers visible.
+ * Window Configuration Type::Save what the screen looks like.
+ * Marker Type::             A position in a buffer.
+ * Process Type::            A process running on the underlying OS.
+ * Stream Type::             Receive or send characters.
+ * Keymap Type::             What function a keystroke invokes.
+ * Syntax Table Type::       What a character means.
+ 
+ Numbers
+ 
+ * Integer Basics::            Representation and range of integers.
+ * Float Basics::	      Representation and range of floating point.
+ * Predicates on Numbers::     Testing for numbers.
+ * Comparison of Numbers::     Equality and inequality predicates.
+ * Arithmetic Operations::     How to add, subtract, multiply and divide.
+ * Bitwise Operations::        Logical and, or, not, shifting.
+ * Numeric Conversions::	      Converting float to integer and vice versa.
+ * Math Functions::            Trig, exponential and logarithmic functions.
+ * Random Numbers::            Obtaining random integers, predictable or not.
+ 
+ Strings and Characters
+ 
+ * String Basics::           Basic properties of strings and characters.
+ * Predicates for Strings::  Testing whether an object is a string or char.
+ * Creating Strings::        Functions to allocate new strings.
+ * Text Comparison::         Comparing characters or strings.
+ * String Conversion::       Converting characters or strings and vice versa.
+ * Formatting Strings::      @code{format}: Emacs's analog of @code{printf}.
+ * Character Case::          Case conversion functions.
+ 
+ Lists
+ 
+ * Cons Cells::              How lists are made out of cons cells.
+ * Lists as Boxes::          Graphical notation to explain lists.
+ * List-related Predicates:: Is this object a list?  Comparing two lists.
+ * List Elements::           Extracting the pieces of a list.
+ * Building Lists::          Creating list structure.
+ * Modifying Lists::         Storing new pieces into an existing list.
+ * Sets And Lists::          A list can represent a finite mathematical set.
+ * Association Lists::       A list can represent a finite relation or mapping.
+ 
+ Modifying Existing List Structure
+ 
+ * Setcar::                  Replacing an element in a list.
+ * Setcdr::                  Replacing part of the list backbone.
+                               This can be used to remove or add elements.
+ * Rearrangement::           Reordering the elements in a list; combining lists.
+ 
+ Sequences, Arrays, and Vectors
+ 
+ * Sequence Functions::      Functions that accept any kind of sequence.
+ * Arrays::                  Characteristics of arrays in Emacs Lisp.
+ * Array Functions::         Functions specifically for arrays.
+ * Vectors::                 Functions specifically for vectors.
+ 
+ Symbols
+ 
+ * Symbol Components::       Symbols have names, values, function definitions
+                               and property lists.
+ * Definitions::             A definition says how a symbol will be used.
+ * Creating Symbols::        How symbols are kept unique.
+ * Property Lists::          Each symbol has a property list
+                               for recording miscellaneous information.
+ 
+ Evaluation
+ 
+ * Intro Eval::              Evaluation in the scheme of things.
+ * Eval::                    How to invoke the Lisp interpreter explicitly.
+ * Forms::                   How various sorts of objects are evaluated.
+ * Quoting::                 Avoiding evaluation (to put constants in 
+                               the program).
+ 
+ Kinds of Forms
+ 
+ * Self-Evaluating Forms::   Forms that evaluate to themselves.
+ * Symbol Forms::            Symbols evaluate as variables.
+ * Classifying Lists::       How to distinguish various sorts of list forms.
+ * Function Forms::          Forms that call functions.
+ * Macro Forms::             Forms that call macros.
+ * Special Forms::           ``Special forms'' are idiosyncratic primitives,
+                               most of them extremely important.
+ * Autoloading::             Functions set up to load files
+                               containing their real definitions.
+ 
+ Control Structures
+ 
+ * Sequencing::              Evaluation in textual order.
+ * Conditionals::            @code{if}, @code{cond}.
+ * Combining Conditions::    @code{and}, @code{or}, @code{not}.
+ * Iteration::               @code{while} loops.
+ * Nonlocal Exits::          Jumping out of a sequence.
+ 
+ Nonlocal Exits
+ 
+ * Catch and Throw::         Nonlocal exits for the program's own purposes.
+ * Examples of Catch::       Showing how such nonlocal exits can be written.
+ * Errors::                  How errors are signaled and handled.
+ * Cleanups::                Arranging to run a cleanup form if an
+                               error happens.
+ 
+ Errors
+ 
+ * Signaling Errors::        How to report an error.
+ * Processing of Errors::    What Emacs does when you report an error.
+ * Handling Errors::         How you can trap errors and continue execution.
+ * Error Symbols::           How errors are classified for trapping them.
+ 
+ Variables
+ 
+ * Global Variables::        Variable values that exist permanently, everywhere.
+ * Constant Variables::      Certain "variables" have values that never change.
+ * Local Variables::         Variable values that exist only temporarily.
+ * Void Variables::          Symbols that lack values.
+ * Defining Variables::      A definition says a symbol is used as a variable.
+ * Accessing Variables::     Examining values of variables whose names
+                               are known only at run time.
+ * Setting Variables::       Storing new values in variables.
+ * Variable Scoping::        How Lisp chooses among local and global values.
+ * Buffer-Local Variables::  Variable values in effect only in one buffer.
+ 
+ Scoping Rules for Variable Bindings
+ 
+ * Scope::                   Scope means where in the program a value 
+                               is visible.  Comparison with other languages.
+ * Extent::                  Extent means how long in time a value exists.
+ * Impl of Scope::           Two ways to implement dynamic scoping.
+ * Using Scoping::           How to use dynamic scoping carefully and 
+                               avoid problems.
+ 
+ Buffer-Local Variables
+ 
+ * Intro to Buffer-Local::   Introduction and concepts.
+ * Creating Buffer-Local::   Creating and destroying buffer-local bindings.
+ * Default Value::           The default value is seen in buffers
+                               that don't have their own local values.
+ 
+ Functions
+ 
+ * What Is a Function::      Lisp functions vs primitives; terminology.
+ * Lambda Expressions::      How functions are expressed as Lisp objects.
+ * Function Names::          A symbol can serve as the name of a function.
+ * Defining Functions::      Lisp expressions for defining functions.
+ * Calling Functions::       How to use an existing function.
+ * Mapping Functions::       Applying a function to each element of a list, etc.
+ * Anonymous Functions::     Lambda-expressions are functions with no names.    
+ * Function Cells::          Accessing or setting the function definition
+                               of a symbol.
+ * Related Topics::          Cross-references to specific Lisp primitives
+                               that have a special bearing on how 
+                               functions work.
+ 
+ Lambda Expressions
+ 
+ * Lambda Components::       The parts of a lambda expression.
+ * Simple Lambda::           A simple example.
+ * Argument List::           Details and special features of argument lists.
+ * Function Documentation::  How to put documentation in a function.
+ 
+ Macros
+ 
+ * Simple Macro::            A basic example.
+ * Expansion::               How, when and why macros are expanded.
+ * Compiling Macros::        How macros are expanded by the compiler.
+ * Defining Macros::         How to write a macro definition.
+ * Backquote::               Easier construction of list structure.
+ * Problems with Macros::    Don't evaluate the macro arguments too many times.
+                               Don't hide the user's variables.
+ 
+ Loading
+ 
+ * How Programs Do Loading:: The @code{load} function and others.
+ * Autoload::                Setting up a function to autoload.
+ * Named Features::          Loading a library if it isn't already loaded.
+ * Repeated Loading::        Precautions about loading a file twice.
+ 
+ Byte Compilation
+ 
+ * Compilation Functions::   Byte compilation functions.
+ * Disassembly::             Disassembling byte-code; how to read byte-code.
+ 
+ Debugging Lisp Programs
+ 
+ * Debugger::                How the Emacs Lisp debugger is implemented.
+ * Syntax Errors::           How to find syntax errors.
+ * Compilation Errors::      How to find errors that show up in 
+                               byte compilation.
+ * Edebug::                  A source-level Emacs Lisp debugger.
+                                 
+ The Lisp Debugger
+ 
+ * Error Debugging::         Entering the debugger when an error happens.
+ * Function Debugging::      Entering it when a certain function is called.
+ * Explicit Debug::          Entering it at a certain point in the program.
+ * Using Debugger::          What the debugger does; what you see while in it.
+ * Debugger Commands::       Commands used while in the debugger.
+ * Invoking the Debugger::   How to call the function @code{debug}.
+ * Internals of Debugger::   Subroutines of the debugger, and global variables.
+ 
+ Debugging Invalid Lisp Syntax
+ 
+ * Excess Open::             How to find a spurious open paren or missing close.
+ * Excess Close::            How to find a spurious close paren or missing open.
+ 
+ Reading and Printing Lisp Objects
+ 
+ * Streams Intro::           Overview of streams, reading and printing.
+ * Input Streams::           Various data types that can be used as 
+                               input streams.
+ * Input Functions::         Functions to read Lisp objects from text.
+ * Output Streams::          Various data types that can be used as 
+                               output streams.
+ * Output Functions::        Functions to print Lisp objects as text.
+ 
+ Minibuffers
+ 
+ * Intro to Minibuffers::    Basic information about minibuffers.
+ * Text from Minibuffer::    How to read a straight text string.
+ * Object from Minibuffer::  How to read a Lisp object or expression.
+ * Completion::              How to invoke and customize completion.
+ * Yes-or-No Queries::       Asking a question with a simple answer.
+ * Minibuffer Misc::         Various customization hooks and variables.
+ 
+ Completion
+ 
+ * Basic Completion::        Low-level functions for completing strings.
+                               (These are too low level to use the minibuffer.)
+ * Minibuffer Completion::   Invoking the minibuffer with completion.
+ * Completion Commands::     Minibuffer commands that do completion.
+ * High-Level Completion::   Convenient special cases of completion
+                               (reading buffer name, file name, etc.)
+ * Reading File Names::      Using completion to read file names.
+ * Programmed Completion::   Finding the completions for a given file name.
+ 
+ Command Loop
+ 
+ * Command Overview::    How the command loop reads commands.
+ * Defining Commands::   Specifying how a function should read arguments.
+ * Interactive Call::    Calling a command, so that it will read arguments.
+ * Command Loop Info::   Variables set by the command loop for you to examine.
+ * Input Events::	What input looks like when you read it.
+ * Reading Input::       How to read input events from the keyboard or mouse.
+ * Waiting::             Waiting for user input or elapsed time.
+ * Quitting::            How @kbd{C-g} works.  How to catch or defer quitting.
+ * Prefix Command Arguments::    How the commands to set prefix args work.
+ * Recursive Editing::   Entering a recursive edit,
+                           and why you usually shouldn't.
+ * Disabling Commands::  How the command loop handles disabled commands.
+ * Command History::     How the command history is set up, and how accessed.
+ * Keyboard Macros::     How keyboard macros are implemented.
+ 
+ Defining Commands
+ 
+ * Using Interactive::       General rules for @code{interactive}.
+ * Interactive Codes::       The standard letter-codes for reading arguments
+                               in various ways.
+ * Interactive Examples::    Examples of how to read interactive arguments.
+ 
+ Keymaps
+ 
+ * Keymap Terminology::        	Definitions of terms pertaining to keymaps.
+ * Format of Keymaps::		What a keymap looks like as a Lisp object.
+ * Creating Keymaps:: 		Functions to create and copy keymaps.
+ * Inheritance and Keymaps::	How one keymap can inherit the bindings
+ 				  of another keymap.
+ * Prefix Keys::                 Defining a key with a keymap as its definition.
+ * Menu Keymaps::		A keymap can define a menu for X windows
+ 				  or for use from the terminal.
+ * Active Keymaps::	        Each buffer has a local keymap
+                                   to override the standard (global) bindings.
+ 				Each minor mode can also override them.
+ * Key Lookup::                  How extracting elements from keymaps works.
+ * Functions for Key Lookup::    How to request key lookup.
+ * Changing Key Bindings::       Redefining a key in a keymap.
+ * Key Binding Commands::        Interactive interfaces for redefining keys.
+ * Scanning Keymaps::            Looking through all keymaps, for printing help.
+ 
+ Major and Minor Modes
+ 
+ * Major Modes::             Defining major modes.
+ * Minor Modes::             Defining minor modes.
+ * Mode Line Format::        Customizing the text that appears in the mode line.
+ * Hooks::                   How to use hooks; how to write code that 
+                               provides hooks.
+ 
+ Major Modes
+ 
+ * Major Mode Conventions::  Coding conventions for keymaps, etc.
+ * Example Major Modes::     Text mode and Lisp modes.
+ * Auto Major Mode::         How Emacs chooses the major mode automatically.
+ * Mode Help::               Finding out how to use a mode.
+ 
+ Minor Modes
+ 
+ * Minor Mode Conventions::  Tips for writing a minor mode.
+ * Keymaps and Minor Modes:: How a minor mode can have its own keymap.
+ 
+ Mode Line Format
+ 
+ * Mode Line Data::          The data structure that controls the mode line.
+ * Mode Line Variables::     Variables used in that data structure.
+ * %-Constructs::            Putting information into a mode line.
+ 
+ Documentation
+ 
+ * Documentation Basics::    Good style for doc strings.
+                               Where to put them.  How Emacs stores them.
+ * Accessing Documentation:: How Lisp programs can access doc strings.
+ * Keys in Documentation::   Substituting current key bindings.
+ * Describing Characters::   Making printable descriptions of
+                               non-printing characters and key sequences.
+ * Help Functions::          Subroutines used by Emacs help facilities.
+ 
+ Files
+ 
+ * Visiting Files::          Reading files into Emacs buffers for editing.
+ * Saving Buffers::          Writing changed buffers back into files.
+ * Reading from Files::      Reading files into other buffers.
+ * Writing to Files::        Writing new files from parts of buffers.
+ * File Locks::              Locking and unlocking files, to prevent
+                                 simultaneous editing by two people.
+ * Information about Files::   Testing existence, accessibility, size of files.
+ * Contents of Directories::   Getting a list of the files in a directory.
+ * Changing File Attributes::  Renaming files, changing protection, etc.
+ * File Names::                Decomposing and expanding file names.
+ 
+ Visiting Files
+ 
+ * Visiting Functions::      The usual interface functions for visiting.
+ * Subroutines of Visiting:: Lower-level subroutines that they use.
+ 
+ Information about Files
+ 
+ * Testing Accessibility::   Is a given file readable?  Writable?
+ * Kinds of Files::          Is it a directory?  A link?
+ * File Attributes::         How large is it?  Any other names?  Etc.
+ 
+ File Names
+ 
+ * File Name Components::    The directory part of a file name, and the rest.
+ * Directory Names::         A directory's name as a directory
+                               is different from its name as a file.
+ * Relative File Names::     Some file names are relative to a 
+                               current directory.
+ * File Name Expansion::     Converting relative file names to absolute ones.
+ * Unique File Names::       Generating names for temporary files.
+ * File Name Completion::    Finding the completions for a given file name.
+ 
+ Backups and Auto-Saving
+ 
+ * Backup Files::            How backup files are made; how their names 
+                               are chosen.
+ * Auto-Saving::             How auto-save files are made; how their
+                               names are chosen.
+ * Reverting::               @code{revert-buffer}, and how to customize 
+                               what it does.
+ 
+ Backup Files
+ 
+ * Making Backups::          How Emacs makes backup files, and when.
+ * Rename or Copy::          Two alternatives: renaming the old file 
+                               or copying it.
+ * Numbered Backups::        Keeping multiple backups for each source file.
+ * Backup Names::            How backup file names are computed; customization.
+ 
+ Buffers
+ 
+ * Buffer Basics::           What is a buffer?
+ * Buffer Names::            Accessing and changing buffer names.
+ * Buffer File Name::        The buffer file name indicates which file
+                               is visited.
+ * Buffer Modification::     A buffer is @dfn{modified} if it needs to be saved.
+ * Modification Time::       Determining whether the visited file was changed
+                               ``behind Emacs's back''.
+ * Read Only Buffers::       Modifying text is not allowed in a
+                               read-only buffer.
+ * The Buffer List::         How to look at all the existing buffers.
+ * Creating Buffers::        Functions that create buffers.
+ * Killing Buffers::         Buffers exist until explicitly killed.
+ * Current Buffer::          Designating a buffer as current
+                               so primitives will access its contents.
+ 
+ Windows
+ 
+ * Basic Windows::           Basic information on using windows.
+ * Splitting Windows::       Splitting one window into two windows.
+ * Deleting Windows::        Deleting a window gives its space to other windows.
+ * Selecting Windows::       The selected window is the one that you edit in.
+ * Cyclic Window Ordering::  Moving around the existing windows.
+ * Buffers and Windows::     Each window displays the contents of a buffer.
+ * Displaying Buffers::      Higher-lever functions for displaying a buffer
+                               and choosing a window for it.
+ * Window Point::            Each window has its own location of point.
+ * Window Start::            The display-start position controls which text
+                               is on-screen in the window. 
+ * Vertical Scrolling::      Moving text up and down in the window.
+ * Horizontal Scrolling::    Moving text sideways on the window.
+ * Size of Window::          Accessing the size of a window.
+ * Resizing Windows::        Changing the size of a window.
+ * Window Configurations::   Saving and restoring the state of the screen.
+ 
+ Frames
+ 
+ * Creating Frames::	    Creating additional frames.
+ * Multiple Displays::       Creating frames on other X displays.
+ * Frame Parameters::	    Controlling frame size, position, font, etc.
+ * Frame Titles::            Automatic updating of frame titles.
+ * Deleting Frames::	    Frames last until explicitly deleted.
+ * Finding All Frames::	    How to examine all existing frames.
+ * Frames and Windows::	    A frame contains windows;
+ 			      display of text always works through windows.
+ * Minibuffers and Frames::  How a frame finds the minibuffer to use.
+ * Input Focus::		    Specifying the selected frame.
+ * Visibility of Frames::    Frames may be visible or invisible, or icons.
+ * Raising and Lowering::    Raising a frame makes it hide other X windows;
+ 			      lowering it makes the others hide them.
+ * Frame Configurations::    Saving the state of all frames.
+ * Mouse Tracking::	    Getting events that say when the mouse moves.
+ * Mouse Position::	    Asking where the mouse is, or moving it.
+ * Pop-Up Menus::	    Displaying a menu for the user to select from.
+ * Dialog Boxes::            Displaying a box to ask yes or no.
+ * Pointer Shapes::          Specifying the shape of the mouse pointer.
+ * X Selections::	    Transferring text to and from other X clients.
+ * Color Names::	            Getting the definitions of color names.
+ * Resources::		    Getting resource values from the server.
+ * Server Data::		    Getting info about the X server.
+ 
+ Positions
+ 
+ * Point::                   The special position where editing takes place.
+ * Motion::                  Changing point.
+ * Excursions::              Temporary motion and buffer changes.
+ * Narrowing::               Restricting editing to a portion of the buffer.
+ 
+ Motion
+ 
+ * Character Motion::        Moving in terms of characters.
+ * Word Motion::             Moving in terms of words.
+ * Buffer End Motion::       Moving to the beginning or end of the buffer.
+ * Text Lines::              Moving in terms of lines of text.
+ * Screen Lines::            Moving in terms of lines as displayed.
+ * List Motion::             Moving by parsing lists and sexps.
+ * Skipping Characters::     Skipping characters belonging to a certain set.
+ 
+ Markers
+ 
+ * Overview of Markers::     The components of a marker, and how it relocates.
+ * Predicates on Markers::   Testing whether an object is a marker.
+ * Creating Markers::        Making empty markers or markers at certain places.
+ * Information from Markers::  Finding the marker's buffer or character
+                                 position. 
+ * Changing Markers::        Moving the marker to a new buffer or position.
+ * The Mark::                How ``the mark'' is implemented with a marker.
+ * The Region::              How to access ``the region''.
+ 
+ Text
+ 
+ * Near Point::              Examining text in the vicinity of point.
+ * Buffer Contents::         Examining text in a general fashion.
+ * Insertion::               Adding new text to a buffer.
+ * Commands for Insertion::  User-level commands to insert text.
+ * Deletion::                Removing text from a buffer.
+ * User-Level Deletion::     User-level commands to delete text.
+ * The Kill Ring::           Where removed text sometimes is saved for
+                               later use.
+ * Undo::                    Undoing changes to the text of a buffer.
+ * Auto Filling::            How auto-fill mode is implemented to break lines.
+ * Filling::                 Functions for explicit filling.
+ * Margins::                 How to specify margins for filling commands.
+ * Sorting::                 Functions for sorting parts of the buffer.
+ * Indentation::             Functions to insert or adjust indentation.
+ * Columns::                 Computing horizontal positions, and using them.
+ * Case Changes::            Case conversion of parts of the buffer.
+ * Substitution::            Replacing a given character wherever it appears.
+ * Registers::               How registers are implemented.  Accessing
+                               the text or position stored in a register.
+                               
+ The Kill Ring
+ 
+ * Kill Ring Concepts::      What text looks like in the kill ring.
+ * Kill Functions::          Functions that kill text.
+ * Yank Commands::           Commands that access the kill ring.
+ * Low-Level Kill Ring::	    Functions and variables for kill ring access.
+ * Internals of Kill Ring::  Variables that hold kill-ring data.
+ 
+ Indentation
+ 
+ * Primitive Indent::        Functions used to count and insert indentation.
+ * Mode-Specific Indent::    Customize indentation for different modes.
+ * Region Indent::           Indent all the lines in a region.
+ * Relative Indent::         Indent the current line based on previous lines.
+ * Indent Tabs::             Adjustable, typewriter-like tab stops.
+ * Motion by Indent::        Move to first non-blank character.
+ 
+ Searching and Matching
+ 
+ * String Search::           Search for an exact match.
+ * Regular Expressions::     Describing classes of strings.
+ * Regexp Search::           Searching for a match for a regexp.
+ * Match Data::              Finding out which part of the text matched
+                               various parts of a regexp, after regexp search.
+ * Saving Match Data::       Saving and restoring this information.
+ * Standard Regexps::        Useful regexps for finding sentences, pages,...
+ * Searching and Case::      Case-independent or case-significant searching.
+ 
+ Regular Expressions
+ 
+ * Syntax of Regexps::       Rules for writing regular expressions.
+ * Regexp Example::          Illustrates regular expression syntax.
+ 
+ Syntax Tables
+ 
+ * Syntax Descriptors::      How characters are classified.
+ * Syntax Table Functions::  How to create, examine and alter syntax tables.
+ * Parsing Expressions::     Parsing balanced expressions
+                               using the syntax table.
+ * Standard Syntax Tables::  Syntax tables used by various major modes.
+ * Syntax Table Internals::  How syntax table information is stored.
+ 
+ Syntax Descriptors
+ 
+ * Syntax Class Table::      Table of syntax classes.
+ * Syntax Flags::            Additional flags each character can have.
+ 
+ Abbrevs And Abbrev Expansion
+ 
+ * Abbrev Mode::             Setting up Emacs for abbreviation.
+ * Tables: Abbrev Tables.    Creating and working with abbrev tables.
+ * Defining Abbrevs::        Specifying abbreviations and their expansions.
+ * Files: Abbrev Files.      Saving abbrevs in files.
+ * Expansion: Abbrev Expansion.  Controlling expansion; expansion subroutines.
+ * Standard Abbrev Tables::  Abbrev tables used by various major modes.
+ 
+ Processes
+ 
+ * Subprocess Creation::     Functions that start subprocesses.
+ * Synchronous Processes::   Details of using synchronous subprocesses.
+ * Asynchronous Processes::  Starting up an asynchronous subprocess.
+ * Deleting Processes::      Eliminating an asynchronous subprocess.
+ * Process Information::     Accessing run-status and other attributes.
+ * Input to Processes::      Sending input to an asynchronous subprocess.
+ * Signals to Processes::    Stopping, continuing or interrupting
+                               an asynchronous subprocess.
+ * Output from Processes::   Collecting output from an asynchronous subprocess.
+ * Sentinels::               Sentinels run when process run-status changes.
+ * Network::                 Opening network connections.
+ 
+ Receiving Output from Processes
+ 
+ * Process Buffers::         If no filter, output is put in a buffer.
+ * Filter Functions::        Filter functions accept output from the process.
+ * Accepting Output::        How to wait until process output arrives.
+ 
+ Operating System Interface
+ 
+ * Starting Up::             Customizing Emacs start-up processing.
+ * Getting Out::             How exiting works (permanent or temporary).
+ * System Environment::      Distinguish the name and kind of system.
+ * Terminal Input::          Recording terminal input for debugging.
+ * Terminal Output::         Recording terminal output for debugging.
+ * Flow Control::            How to turn output flow control on or off.
+ * Batch Mode::              Running Emacs without terminal interaction.
+ 
+ Starting Up Emacs
+ 
+ * Start-up Summary::        Sequence of actions Emacs performs at start-up.
+ * Init File::               Details on reading the init file (@file{.emacs}).
+ * Terminal-Specific::       How the terminal-specific Lisp file is read.
+ * Command Line Arguments::  How command line arguments are processed,
+                               and how you can customize them.
+ 
+ Getting out of Emacs
+ 
+ * Killing Emacs::           Exiting Emacs irreversibly.
+ * Suspending Emacs::        Exiting Emacs reversibly.
+ 
+ Emacs Display
+ 
+ * Refresh Screen::          Clearing the screen and redrawing everything on it.
+ * Truncation::              Folding or wrapping long text lines.
+ * The Echo Area::           Where messages are displayed.
+ * Selective Display::       Hiding part of the buffer text.
+ * Overlay Arrow::           Display of an arrow to indicate position.
+ * Temporary Displays::      Displays that go away automatically.
+ * Waiting::                 Forcing display update and waiting for user.
+ * Blinking::                How Emacs shows the matching open parenthesis.
+ * Usual Display::	    How control characters are displayed.
+ * Beeping::                 Audible signal to the user.
+ * Window Systems::          Which window system is being used.
+ 
+ GNU Emacs Internals
+ 
+ * Building Emacs::          How to preload Lisp libraries into Emacs.
+ * Pure Storage::            A kludge to make preloaded Lisp functions sharable.
+ * Garbage Collection::      Reclaiming space for Lisp objects no longer used.
+ * Object Internals::        Data formats of buffers, windows, processes.
+ * Writing Emacs Primitives::  Writing C code for Emacs.
+ 
+ Object Internals
+ 
+ * Buffer Internals::        Components of a buffer structure.
+ * Window Internals::        Components of a window structure.
+ * Process Internals::       Components of a process structure.
+ @end menu
+ 
+ @include elisp-intro.texi
+ @include elisp-objects.texi
+ @include elisp-numbers.texi
+ @include elisp-strings.texi
+ 
+ @include elisp-lists.texi
+ @include elisp-sequences.texi
+ @include elisp-symbols.texi
+ @include elisp-eval.texi
+ 
+ @include elisp-control.texi
+ @include elisp-variables.texi
+ @include elisp-functions.texi
+ @include elisp-macros.texi
+ 
+ @include elisp-loading.texi
+ @include elisp-compile.texi
+ @include elisp-debugging.texi
+ @include elisp-streams.texi
+ 
+ @include elisp-minibuf.texi
+ @include elisp-commands.texi
+ @include elisp-keymaps.texi
+ @include elisp-modes.texi
+ 
+ @include elisp-help.texi
+ @include elisp-files.texi
+ @include elisp-backups.texi
+ @include elisp-buffers.texi
+ 
+ @include elisp-windows.texi
+ @include elisp-frames.texi
+ @include elisp-positions.texi
+ @include elisp-markers.texi
+ @include elisp-text.texi
+ 
+ @include elisp-searching.texi
+ @include elisp-syntax.texi
+ @include elisp-abbrevs.texi
+ 
+ @include elisp-processes.texi
+ @include elisp-os.texi
+ @include elisp-display.texi
+ @include elisp-calendar.texi
+ 
+ @c MOVE to Emacs Manual:  include misc-modes.texi
+ 
+ @c appendices
+ 
+ @c  REMOVE this:  include non-hacker.texi
+ 
+ @include elisp-tips.texi
+ @include elisp-internals.texi
+ @include elisp-errors.texi
+ @include elisp-locals.texi
+ @include elisp-maps.texi
+ @include elisp-hooks.texi
+ 
+ @include elisp-index.texi
+ 
+ @c Print the tables of contents
+ @summarycontents
+ @contents
+ @c That's all
+ 
+ @bye
+ 
+ 
+ These words prevent "local variables" above from confusing Emacs.
Index: emacs/man/emacs-back-cover.texi
diff -c /dev/null emacs/man/emacs-back-cover.texi:1.1
*** /dev/null	Fri Aug  2 21:01:14 1996
--- emacs/man/emacs-back-cover.texi	Fri Jul 19 05:06:24 1996
***************
*** 0 ****
--- 1,77 ----
+ \input rotate
+ 
+ \font\title=ptmb at20pt
+ \font\body=ptmr at12pt
+ \font\file=pcrr at12pt
+ \font\cite=ptmro at12pt
+ \font\price=ptmr at10pt
+ 
+ \baselineskip=13pt
+ \parskip=13pt
+ \parindent=0pt
+ 
+ \nopagenumbers
+ 
+ \hyphenpenalty=10000
+ \exhyphenpenalty=10000
+ 
+ \hsize=7in
+ \vsize=9.25in
+ 
+ \voffset=-1in
+ \hoffset=-1in
+ 
+ \hbox to7in{%
+   \vbox to9.25in{
+     \hsize=6in
+     \leftskip=.75in
+     \rightskip=.25in
+ 
+     \vskip1.5in
+ 
+     \title
+     \hfil GNU Emacs\hfil
+ 
+     \body
+     GNU Emacs is the premier text editor and programming environment for
+     workstations and high-end PCs.  This manual tells you how to get
+     started with Emacs, how to write simple messages as well as complex
+     documents, and how to use special modes for editing, compiling, and
+     debugging programs.  It also explains how to handle multiple files and
+     directories and multiple windows, and how to customize your environment.
+ 
+     GNU Emacs provides autosave, multiple undos and redos, transparent
+     access to remote file systems, multiple backups, support for version
+     control systems, and a Lisp interpreter.  In addition, Emacs integrates
+     {\file make}, {\file grep}, {\file diff}, and other utilities into a single
+     environment.  There are modes for programming in over a dozen different
+     languages.  Emacs not only works with plain character terminals but also
+     is fully integrated with the X Window System.
+ 
+     Emacs includes an on-line, easy to follow tutorial and a built-in help
+     system that describes all of Emacs's features.
+ 
+     This is the 9th Edition of the {\cite GNU Emacs Manual}.  It is written
+     by Richard M.{} Stallman, who wrote the original Emacs.  This edition
+     describes the new features and improvements in version 19, but can also
+     be used with the older version 18.
+ 
+     \vfil
+ 
+     \leftskip=0pt
+     \rightskip=0pt
+ 
+     \parfillskip=0pt\hfil%
+     ISBN 1-882114-03-5
+ 
+     \vskip.5in
+   }%
+   \setbox0=\vbox to1in{
+     \vfil\hskip.5in
+     {\price FSF $\bullet$ US\$25.00 $\bullet$ Printed in USA}
+     \vskip.5in
+   }%
+   \rotl0%
+ }
+ 
+ \eject\bye
Index: emacs/man/emacs.aux
diff -c emacs/man/emacs.aux:1.1.1.2 emacs/man/emacs.aux:removed
*** emacs/man/emacs.aux:1.1.1.2	Mon Jul 22 01:54:43 1996
--- emacs/man/emacs.aux	Fri Aug  2 21:01:16 1996
***************
*** 1,1305 ****
- 'xrdef {Distrib-title}{Distribution}
- 'xrdef {Distrib-pg}{3}
- 'xrdef {Distrib-snt}{}
- 'xrdef {Copying-title}{GNU GENERAL PUBLIC LICENSE}
- 'xrdef {Copying-pg}{5}
- 'xrdef {Copying-snt}{}
- 'xrdef {Intro-title}{Introduction}
- 'xrdef {Intro-pg}{13}
- 'xrdef {Intro-snt}{}
- 'xrdef {Screen-title}{The Organization of the Screen}
- 'xrdef {Screen-pg}{15}
- 'xrdef {Screen-snt}{Chapter'tie1}
- 'xrdef {Point-title}{Point}
- 'xrdef {Point-pg}{15}
- 'xrdef {Point-snt}{Section'tie1.1}
- 'xrdef {Echo Area-title}{The Echo Area}
- 'xrdef {Echo Area-pg}{16}
- 'xrdef {Echo Area-snt}{Section'tie1.2}
- 'xrdef {Mode Line-title}{The Mode Line}
- 'xrdef {Mode Line-pg}{17}
- 'xrdef {Mode Line-snt}{Section'tie1.3}
- 'xrdef {User Input-title}{Kinds of User Input}
- 'xrdef {User Input-pg}{19}
- 'xrdef {User Input-snt}{Section'tie2.1}
- 'xrdef {Keys-title}{Keys}
- 'xrdef {Keys-pg}{20}
- 'xrdef {Keys-snt}{Section'tie2.2}
- 'xrdef {Commands-title}{Keys and Commands}
- 'xrdef {Commands-pg}{21}
- 'xrdef {Commands-snt}{Section'tie2.3}
- 'xrdef {Text Characters-title}{Character Set for Text}
- 'xrdef {Text Characters-pg}{22}
- 'xrdef {Text Characters-snt}{Section'tie2.4}
- 'xrdef {Entering Emacs-title}{Entering and Exiting Emacs}
- 'xrdef {Entering Emacs-pg}{23}
- 'xrdef {Entering Emacs-snt}{Chapter'tie3}
- 'xrdef {Exiting-title}{Exiting Emacs}
- 'xrdef {Exiting-pg}{24}
- 'xrdef {Exiting-snt}{Section'tie3.1}
- 'xrdef {Basic-title}{Basic Editing Commands}
- 'xrdef {Basic-pg}{27}
- 'xrdef {Basic-snt}{Chapter'tie4}
- 'xrdef {Inserting Text-title}{Inserting Text}
- 'xrdef {Inserting Text-pg}{27}
- 'xrdef {Inserting Text-snt}{Section'tie4.1}
- 'xrdef {Moving Point-title}{Changing the Location of Point}
- 'xrdef {Moving Point-pg}{28}
- 'xrdef {Moving Point-snt}{Section'tie4.2}
- 'xrdef {Erasing-title}{Erasing Text}
- 'xrdef {Erasing-pg}{29}
- 'xrdef {Erasing-snt}{Section'tie4.3}
- 'xrdef {Undo-title}{Undoing Changes}
- 'xrdef {Undo-pg}{30}
- 'xrdef {Undo-snt}{Section'tie4.4}
- 'xrdef {Basic Files-title}{Files}
- 'xrdef {Basic Files-pg}{31}
- 'xrdef {Basic Files-snt}{Section'tie4.5}
- 'xrdef {Basic Help-title}{Help}
- 'xrdef {Basic Help-pg}{32}
- 'xrdef {Basic Help-snt}{Section'tie4.6}
- 'xrdef {Blank Lines-title}{Blank Lines}
- 'xrdef {Blank Lines-pg}{32}
- 'xrdef {Blank Lines-snt}{Section'tie4.7}
- 'xrdef {Continuation Lines-title}{Continuation Lines}
- 'xrdef {Continuation Lines-pg}{33}
- 'xrdef {Continuation Lines-snt}{Section'tie4.8}
- 'xrdef {Position Info-title}{Cursor Position Information}
- 'xrdef {Position Info-pg}{33}
- 'xrdef {Position Info-snt}{Section'tie4.9}
- 'xrdef {Arguments-title}{Numeric Arguments}
- 'xrdef {Arguments-pg}{35}
- 'xrdef {Arguments-snt}{Section'tie4.10}
- 'xrdef {Minibuffer-title}{The Minibuffer}
- 'xrdef {Minibuffer-pg}{37}
- 'xrdef {Minibuffer-snt}{Chapter'tie5}
- 'xrdef {Minibuffer File-title}{Minibuffers for File Names}
- 'xrdef {Minibuffer File-pg}{37}
- 'xrdef {Minibuffer File-snt}{Section'tie5.1}
- 'xrdef {Minibuffer Edit-title}{Editing in the Minibuffer}
- 'xrdef {Minibuffer Edit-pg}{38}
- 'xrdef {Minibuffer Edit-snt}{Section'tie5.2}
- 'xrdef {Completion-title}{Completion}
- 'xrdef {Completion-pg}{39}
- 'xrdef {Completion-snt}{Section'tie5.3}
- 'xrdef {Completion Example-title}{Completion Example}
- 'xrdef {Completion Example-pg}{39}
- 'xrdef {Completion Example-snt}{Section'tie5.3.1}
- 'xrdef {Completion Commands-title}{Completion Commands}
- 'xrdef {Completion Commands-pg}{40}
- 'xrdef {Completion Commands-snt}{Section'tie5.3.2}
- 'xrdef {Strict Completion-title}{Strict Completion}
- 'xrdef {Strict Completion-pg}{41}
- 'xrdef {Strict Completion-snt}{Section'tie5.3.3}
- 'xrdef {Completion Options-title}{Completion Options}
- 'xrdef {Completion Options-pg}{41}
- 'xrdef {Completion Options-snt}{Section'tie5.3.4}
- 'xrdef {Minibuffer History-title}{Minibuffer History}
- 'xrdef {Minibuffer History-pg}{42}
- 'xrdef {Minibuffer History-snt}{Section'tie5.4}
- 'xrdef {Repetition-title}{Repeating Minibuffer Commands}
- 'xrdef {Repetition-pg}{43}
- 'xrdef {Repetition-snt}{Section'tie5.5}
- 'xrdef {M-x-title}{Running Commands by Name}
- 'xrdef {M-x-pg}{45}
- 'xrdef {M-x-snt}{Chapter'tie6}
- 'xrdef {Help-title}{Help}
- 'xrdef {Help-pg}{47}
- 'xrdef {Help-snt}{Chapter'tie7}
- 'xrdef {Key Help-title}{Documentation for a Key}
- 'xrdef {Key Help-pg}{48}
- 'xrdef {Key Help-snt}{Section'tie7.1}
- 'xrdef {Name Help-title}{Help by Command or Variable Name}
- 'xrdef {Name Help-pg}{48}
- 'xrdef {Name Help-snt}{Section'tie7.2}
- 'xrdef {Apropos-title}{Apropos}
- 'xrdef {Apropos-pg}{49}
- 'xrdef {Apropos-snt}{Section'tie7.3}
- 'xrdef {Library Keywords-title}{Keyword Search for Lisp Libraries}
- 'xrdef {Library Keywords-pg}{50}
- 'xrdef {Library Keywords-snt}{Section'tie7.4}
- 'xrdef {Misc Help-title}{Other Help Commands}
- 'xrdef {Misc Help-pg}{52}
- 'xrdef {Misc Help-snt}{Section'tie7.5}
- 'xrdef {Mark-title}{The Mark and the Region}
- 'xrdef {Mark-pg}{55}
- 'xrdef {Mark-snt}{Chapter'tie8}
- 'xrdef {Setting Mark-title}{Setting the Mark}
- 'xrdef {Setting Mark-pg}{55}
- 'xrdef {Setting Mark-snt}{Section'tie8.1}
- 'xrdef {Transient Mark-title}{Transient Mark Mode}
- 'xrdef {Transient Mark-pg}{56}
- 'xrdef {Transient Mark-snt}{Section'tie8.2}
- 'xrdef {Using Region-title}{Operating on the Region}
- 'xrdef {Using Region-pg}{57}
- 'xrdef {Using Region-snt}{Section'tie8.3}
- 'xrdef {Marking Objects-title}{Commands to Mark Textual Objects}
- 'xrdef {Marking Objects-pg}{58}
- 'xrdef {Marking Objects-snt}{Section'tie8.4}
- 'xrdef {Mark Ring-title}{The Mark Ring}
- 'xrdef {Mark Ring-pg}{59}
- 'xrdef {Mark Ring-snt}{Section'tie8.5}
- 'xrdef {Global Mark Ring-title}{The Global Mark Ring}
- 'xrdef {Global Mark Ring-pg}{59}
- 'xrdef {Global Mark Ring-snt}{Section'tie8.6}
- 'xrdef {Killing-title}{Deletion and Killing}
- 'xrdef {Killing-pg}{61}
- 'xrdef {Killing-snt}{Section'tie9.1}
- 'xrdef {Deletion-title}{Deletion}
- 'xrdef {Deletion-pg}{61}
- 'xrdef {Deletion-snt}{Section'tie9.1.1}
- 'xrdef {Killing by Lines-title}{Killing by Lines}
- 'xrdef {Killing by Lines-pg}{62}
- 'xrdef {Killing by Lines-snt}{Section'tie9.1.2}
- 'xrdef {Other Kill Commands-title}{Other Kill Commands}
- 'xrdef {Other Kill Commands-pg}{63}
- 'xrdef {Other Kill Commands-snt}{Section'tie9.1.3}
- 'xrdef {Yanking-title}{Yanking}
- 'xrdef {Yanking-pg}{63}
- 'xrdef {Yanking-snt}{Section'tie9.2}
- 'xrdef {Kill Ring-title}{The Kill Ring}
- 'xrdef {Kill Ring-pg}{64}
- 'xrdef {Kill Ring-snt}{Section'tie9.2.1}
- 'xrdef {Appending Kills-title}{Appending Kills}
- 'xrdef {Appending Kills-pg}{64}
- 'xrdef {Appending Kills-snt}{Section'tie9.2.2}
- 'xrdef {Earlier Kills-title}{Yanking Earlier Kills}
- 'xrdef {Earlier Kills-pg}{65}
- 'xrdef {Earlier Kills-snt}{Section'tie9.2.3}
- 'xrdef {Accumulating Text-title}{Accumulating Text}
- 'xrdef {Accumulating Text-pg}{66}
- 'xrdef {Accumulating Text-snt}{Section'tie9.3}
- 'xrdef {Rectangles-title}{Rectangles}
- 'xrdef {Rectangles-pg}{67}
- 'xrdef {Rectangles-snt}{Section'tie9.4}
- 'xrdef {Registers-title}{Registers}
- 'xrdef {Registers-pg}{71}
- 'xrdef {Registers-snt}{Chapter'tie10}
- 'xrdef {RegPos-title}{Saving Positions in Registers}
- 'xrdef {RegPos-pg}{71}
- 'xrdef {RegPos-snt}{Section'tie10.1}
- 'xrdef {RegText-title}{Saving Text in Registers}
- 'xrdef {RegText-pg}{71}
- 'xrdef {RegText-snt}{Section'tie10.2}
- 'xrdef {RegRect-title}{Saving Rectangles in Registers}
- 'xrdef {RegRect-pg}{72}
- 'xrdef {RegRect-snt}{Section'tie10.3}
- 'xrdef {RegConfig-title}{Saving Window Configurations in Registers}
- 'xrdef {RegConfig-pg}{72}
- 'xrdef {RegConfig-snt}{Section'tie10.4}
- 'xrdef {RegFiles-title}{Keeping File Names in Registers}
- 'xrdef {RegFiles-pg}{72}
- 'xrdef {RegFiles-snt}{Section'tie10.5}
- 'xrdef {Bookmarks-title}{Bookmarks}
- 'xrdef {Bookmarks-pg}{73}
- 'xrdef {Bookmarks-snt}{Section'tie10.6}
- 'xrdef {Display-title}{Controlling the Display}
- 'xrdef {Display-pg}{75}
- 'xrdef {Display-snt}{Chapter'tie11}
- 'xrdef {Scrolling-title}{Scrolling}
- 'xrdef {Scrolling-pg}{75}
- 'xrdef {Scrolling-snt}{Section'tie11.1}
- 'xrdef {Horizontal Scrolling-title}{Horizontal Scrolling}
- 'xrdef {Horizontal Scrolling-pg}{76}
- 'xrdef {Horizontal Scrolling-snt}{Section'tie11.2}
- 'xrdef {Selective Display-title}{Selective Display}
- 'xrdef {Selective Display-pg}{77}
- 'xrdef {Selective Display-snt}{Section'tie11.3}
- 'xrdef {European Display-title}{European Character Set Display}
- 'xrdef {European Display-pg}{77}
- 'xrdef {European Display-snt}{Section'tie11.4}
- 'xrdef {Optional Mode Line-title}{Optional Mode Line Features}
- 'xrdef {Optional Mode Line-pg}{79}
- 'xrdef {Optional Mode Line-snt}{Section'tie11.5}
- 'xrdef {Display Vars-title}{Variables Controlling Display}
- 'xrdef {Display Vars-pg}{79}
- 'xrdef {Display Vars-snt}{Section'tie11.6}
- 'xrdef {Search-title}{Searching and Replacement}
- 'xrdef {Search-pg}{83}
- 'xrdef {Search-snt}{Chapter'tie12}
- 'xrdef {Incremental Search-title}{Incremental Search}
- 'xrdef {Incremental Search-pg}{83}
- 'xrdef {Incremental Search-snt}{Section'tie12.1}
- 'xrdef {Nonincremental Search-title}{Nonincremental Search}
- 'xrdef {Nonincremental Search-pg}{86}
- 'xrdef {Nonincremental Search-snt}{Section'tie12.2}
- 'xrdef {Word Search-title}{Word Search}
- 'xrdef {Word Search-pg}{86}
- 'xrdef {Word Search-snt}{Section'tie12.3}
- 'xrdef {Regexp Search-title}{Regular Expression Search}
- 'xrdef {Regexp Search-pg}{87}
- 'xrdef {Regexp Search-snt}{Section'tie12.4}
- 'xrdef {Regexps-title}{Syntax of Regular Expressions}
- 'xrdef {Regexps-pg}{88}
- 'xrdef {Regexps-snt}{Section'tie12.5}
- 'xrdef {Search Case-title}{Searching and Case}
- 'xrdef {Search Case-pg}{92}
- 'xrdef {Search Case-snt}{Section'tie12.6}
- 'xrdef {Replace-title}{Replacement Commands}
- 'xrdef {Replace-pg}{93}
- 'xrdef {Replace-snt}{Section'tie12.7}
- 'xrdef {Unconditional Replace-title}{Unconditional Replacement}
- 'xrdef {Unconditional Replace-pg}{93}
- 'xrdef {Unconditional Replace-snt}{Section'tie12.7.1}
- 'xrdef {Regexp Replace-title}{Regexp Replacement}
- 'xrdef {Regexp Replace-pg}{93}
- 'xrdef {Regexp Replace-snt}{Section'tie12.7.2}
- 'xrdef {Replacement and Case-title}{Replace Commands and Case}
- 'xrdef {Replacement and Case-pg}{94}
- 'xrdef {Replacement and Case-snt}{Section'tie12.7.3}
- 'xrdef {Query Replace-title}{Query Replace}
- 'xrdef {Query Replace-pg}{94}
- 'xrdef {Query Replace-snt}{Section'tie12.7.4}
- 'xrdef {Other Repeating Search-title}{Other Search-and-Loop Commands}
- 'xrdef {Other Repeating Search-pg}{96}
- 'xrdef {Other Repeating Search-snt}{Section'tie12.8}
- 'xrdef {Fixit-title}{Commands for Fixing Typos}
- 'xrdef {Fixit-pg}{97}
- 'xrdef {Fixit-snt}{Chapter'tie13}
- 'xrdef {Kill Errors-title}{Killing Your Mistakes}
- 'xrdef {Kill Errors-pg}{97}
- 'xrdef {Kill Errors-snt}{Section'tie13.1}
- 'xrdef {Transpose-title}{Transposing Text}
- 'xrdef {Transpose-pg}{97}
- 'xrdef {Transpose-snt}{Section'tie13.2}
- 'xrdef {Fixing Case-title}{Case Conversion}
- 'xrdef {Fixing Case-pg}{98}
- 'xrdef {Fixing Case-snt}{Section'tie13.3}
- 'xrdef {Spelling-title}{Checking and Correcting Spelling}
- 'xrdef {Spelling-pg}{99}
- 'xrdef {Spelling-snt}{Section'tie13.4}
- 'xrdef {Files-title}{File Handling}
- 'xrdef {Files-pg}{103}
- 'xrdef {Files-snt}{Chapter'tie14}
- 'xrdef {File Names-title}{File Names}
- 'xrdef {File Names-pg}{103}
- 'xrdef {File Names-snt}{Section'tie14.1}
- 'xrdef {Visiting-title}{Visiting Files}
- 'xrdef {Visiting-pg}{104}
- 'xrdef {Visiting-snt}{Section'tie14.2}
- 'xrdef {Saving-title}{Saving Files}
- 'xrdef {Saving-pg}{107}
- 'xrdef {Saving-snt}{Section'tie14.3}
- 'xrdef {Backup-title}{Backup Files}
- 'xrdef {Backup-pg}{109}
- 'xrdef {Backup-snt}{Section'tie14.3.1}
- 'xrdef {Backup Names-title}{Single or Numbered Backups}
- 'xrdef {Backup Names-pg}{109}
- 'xrdef {Backup Names-snt}{Section'tie14.3.1.1}
- 'xrdef {Backup Deletion-title}{Automatic Deletion of Backups}
- 'xrdef {Backup Deletion-pg}{110}
- 'xrdef {Backup Deletion-snt}{Section'tie14.3.1.2}
- 'xrdef {Backup Copying-title}{Copying vs.\spacefactor =1000  Renaming}
- 'xrdef {Backup Copying-pg}{110}
- 'xrdef {Backup Copying-snt}{Section'tie14.3.1.3}
- 'xrdef {Interlocking-title}{Protection against Simultaneous Editing}
- 'xrdef {Interlocking-pg}{111}
- 'xrdef {Interlocking-snt}{Section'tie14.3.2}
- 'xrdef {Reverting-title}{Reverting a Buffer}
- 'xrdef {Reverting-pg}{112}
- 'xrdef {Reverting-snt}{Section'tie14.4}
- 'xrdef {Auto Save-title}{Auto-Saving: Protection Against Disasters}
- 'xrdef {Auto Save-pg}{113}
- 'xrdef {Auto Save-snt}{Section'tie14.5}
- 'xrdef {Auto Save Files-title}{Auto-Save Files}
- 'xrdef {Auto Save Files-pg}{113}
- 'xrdef {Auto Save Files-snt}{Section'tie14.5.1}
- 'xrdef {Auto Save Control-title}{Controlling Auto-Saving}
- 'xrdef {Auto Save Control-pg}{114}
- 'xrdef {Auto Save Control-snt}{Section'tie14.5.2}
- 'xrdef {Recover-title}{Recovering Data from Auto-Saves}
- 'xrdef {Recover-pg}{115}
- 'xrdef {Recover-snt}{Section'tie14.5.3}
- 'xrdef {File Aliases-title}{File Name Aliases}
- 'xrdef {File Aliases-pg}{115}
- 'xrdef {File Aliases-snt}{Section'tie14.6}
- 'xrdef {Version Control-title}{Version Control}
- 'xrdef {Version Control-pg}{116}
- 'xrdef {Version Control-snt}{Section'tie14.7}
- 'xrdef {Version Systems-title}{Supported Version Control Systems}
- 'xrdef {Version Systems-pg}{116}
- 'xrdef {Version Systems-snt}{Section'tie14.7.1}
- 'xrdef {VC Concepts-title}{Concepts of Version Control}
- 'xrdef {VC Concepts-pg}{117}
- 'xrdef {VC Concepts-snt}{Section'tie14.7.2}
- 'xrdef {Editing with VC-title}{Editing with Version Control}
- 'xrdef {Editing with VC-pg}{117}
- 'xrdef {Editing with VC-snt}{Section'tie14.7.3}
- 'xrdef {Check-Out-title}{Check-Out}
- 'xrdef {Check-Out-pg}{118}
- 'xrdef {Check-Out-snt}{Section'tie14.7.3.1}
- 'xrdef {Check-In-title}{Check-In}
- 'xrdef {Check-In-pg}{118}
- 'xrdef {Check-In-snt}{Section'tie14.7.3.2}
- 'xrdef {Registering-title}{Registering a File for Version Control}
- 'xrdef {Registering-pg}{119}
- 'xrdef {Registering-snt}{Section'tie14.7.3.3}
- 'xrdef {Version Control Undo-title}{Undoing Version Control Actions}
- 'xrdef {Version Control Undo-pg}{119}
- 'xrdef {Version Control Undo-snt}{Section'tie14.7.3.4}
- 'xrdef {VC Mode Line-title}{The VC Mode Line}
- 'xrdef {VC Mode Line-pg}{120}
- 'xrdef {VC Mode Line-snt}{Section'tie14.7.3.5}
- 'xrdef {CVS and VC-title}{Using VC with CVS}
- 'xrdef {CVS and VC-pg}{120}
- 'xrdef {CVS and VC-snt}{Section'tie14.7.3.6}
- 'xrdef {Log Entries-title}{Log Entries}
- 'xrdef {Log Entries-pg}{120}
- 'xrdef {Log Entries-snt}{Section'tie14.7.4}
- 'xrdef {Change Logs and VC-title}{Change Logs and VC}
- 'xrdef {Change Logs and VC-pg}{121}
- 'xrdef {Change Logs and VC-snt}{Section'tie14.7.5}
- 'xrdef {Old Versions-title}{Examining And Comparing Old Versions}
- 'xrdef {Old Versions-pg}{122}
- 'xrdef {Old Versions-snt}{Section'tie14.7.6}
- 'xrdef {Branches-title}{Multiple Branches of a File}
- 'xrdef {Branches-pg}{123}
- 'xrdef {Branches-snt}{Section'tie14.7.7}
- 'xrdef {Switching Branches-title}{Switching between Branches}
- 'xrdef {Switching Branches-pg}{124}
- 'xrdef {Switching Branches-snt}{Section'tie14.7.7.1}
- 'xrdef {Creating Branches-title}{Creating New Branches}
- 'xrdef {Creating Branches-pg}{124}
- 'xrdef {Creating Branches-snt}{Section'tie14.7.7.2}
- 'xrdef {Multi-User Branching-title}{Multi-User Branching}
- 'xrdef {Multi-User Branching-pg}{124}
- 'xrdef {Multi-User Branching-snt}{Section'tie14.7.7.3}
- 'xrdef {Status in VC-title}{VC Status Commands}
- 'xrdef {Status in VC-pg}{125}
- 'xrdef {Status in VC-snt}{Section'tie14.7.8}
- 'xrdef {Renaming and VC-title}{Renaming VC Work Files and Master Files}
- 'xrdef {Renaming and VC-pg}{126}
- 'xrdef {Renaming and VC-snt}{Section'tie14.7.9}
- 'xrdef {Snapshots-title}{Snapshots}
- 'xrdef {Snapshots-pg}{126}
- 'xrdef {Snapshots-snt}{Section'tie14.7.10}
- 'xrdef {Making Snapshots-title}{Making and Using Snapshots}
- 'xrdef {Making Snapshots-pg}{126}
- 'xrdef {Making Snapshots-snt}{Section'tie14.7.10.1}
- 'xrdef {Snapshot Caveats-title}{Snapshot Caveats}
- 'xrdef {Snapshot Caveats-pg}{127}
- 'xrdef {Snapshot Caveats-snt}{Section'tie14.7.10.2}
- 'xrdef {Version Headers-title}{Inserting Version Control Headers}
- 'xrdef {Version Headers-pg}{127}
- 'xrdef {Version Headers-snt}{Section'tie14.7.11}
- 'xrdef {Customizing VC-title}{Customizing VC}
- 'xrdef {Customizing VC-pg}{129}
- 'xrdef {Customizing VC-snt}{Section'tie14.7.12}
- 'xrdef {Directories-title}{File Directories}
- 'xrdef {Directories-pg}{130}
- 'xrdef {Directories-snt}{Section'tie14.8}
- 'xrdef {Comparing Files-title}{Comparing Files}
- 'xrdef {Comparing Files-pg}{130}
- 'xrdef {Comparing Files-snt}{Section'tie14.9}
- 'xrdef {Misc File Ops-title}{Miscellaneous File Operations}
- 'xrdef {Misc File Ops-pg}{131}
- 'xrdef {Misc File Ops-snt}{Section'tie14.10}
- 'xrdef {Buffers-title}{Using Multiple Buffers}
- 'xrdef {Buffers-pg}{133}
- 'xrdef {Buffers-snt}{Chapter'tie15}
- 'xrdef {Select Buffer-title}{Creating and Selecting Buffers}
- 'xrdef {Select Buffer-pg}{133}
- 'xrdef {Select Buffer-snt}{Section'tie15.1}
- 'xrdef {List Buffers-title}{Listing Existing Buffers}
- 'xrdef {List Buffers-pg}{134}
- 'xrdef {List Buffers-snt}{Section'tie15.2}
- 'xrdef {Misc Buffer-title}{Miscellaneous Buffer Operations}
- 'xrdef {Misc Buffer-pg}{135}
- 'xrdef {Misc Buffer-snt}{Section'tie15.3}
- 'xrdef {Kill Buffer-title}{Killing Buffers}
- 'xrdef {Kill Buffer-pg}{136}
- 'xrdef {Kill Buffer-snt}{Section'tie15.4}
- 'xrdef {Several Buffers-title}{Operating on Several Buffers}
- 'xrdef {Several Buffers-pg}{136}
- 'xrdef {Several Buffers-snt}{Section'tie15.5}
- 'xrdef {Indirect Buffers-title}{Indirect Buffers}
- 'xrdef {Indirect Buffers-pg}{138}
- 'xrdef {Indirect Buffers-snt}{Section'tie15.6}
- 'xrdef {Windows-title}{Multiple Windows}
- 'xrdef {Windows-pg}{141}
- 'xrdef {Windows-snt}{Chapter'tie16}
- 'xrdef {Basic Window-title}{Concepts of Emacs Windows}
- 'xrdef {Basic Window-pg}{141}
- 'xrdef {Basic Window-snt}{Section'tie16.1}
- 'xrdef {Split Window-title}{Splitting Windows}
- 'xrdef {Split Window-pg}{142}
- 'xrdef {Split Window-snt}{Section'tie16.2}
- 'xrdef {Other Window-title}{Using Other Windows}
- 'xrdef {Other Window-pg}{142}
- 'xrdef {Other Window-snt}{Section'tie16.3}
- 'xrdef {Pop Up Window-title}{Displaying in Another Window}
- 'xrdef {Pop Up Window-pg}{143}
- 'xrdef {Pop Up Window-snt}{Section'tie16.4}
- 'xrdef {Force Same Window-title}{Forcing Display in the Same Window}
- 'xrdef {Force Same Window-pg}{144}
- 'xrdef {Force Same Window-snt}{Section'tie16.5}
- 'xrdef {Change Window-title}{Deleting and Rearranging Windows}
- 'xrdef {Change Window-pg}{145}
- 'xrdef {Change Window-snt}{Section'tie16.6}
- 'xrdef {Frames-title}{Frames and X Windows}
- 'xrdef {Frames-pg}{147}
- 'xrdef {Frames-snt}{Chapter'tie17}
- 'xrdef {Mouse Commands-title}{Mouse Commands for Editing}
- 'xrdef {Mouse Commands-pg}{147}
- 'xrdef {Mouse Commands-snt}{Section'tie17.1}
- 'xrdef {Secondary Selection-title}{Secondary Selection}
- 'xrdef {Secondary Selection-pg}{149}
- 'xrdef {Secondary Selection-snt}{Section'tie17.2}
- 'xrdef {Mouse References-title}{Following References with the Mouse}
- 'xrdef {Mouse References-pg}{150}
- 'xrdef {Mouse References-snt}{Section'tie17.3}
- 'xrdef {Menu Mouse Clicks-title}{Mouse Clicks for Menus}
- 'xrdef {Menu Mouse Clicks-pg}{150}
- 'xrdef {Menu Mouse Clicks-snt}{Section'tie17.4}
- 'xrdef {Mode Line Mouse-title}{Mode Line Mouse Commands}
- 'xrdef {Mode Line Mouse-pg}{151}
- 'xrdef {Mode Line Mouse-snt}{Section'tie17.5}
- 'xrdef {Creating Frames-title}{Creating Frames}
- 'xrdef {Creating Frames-pg}{151}
- 'xrdef {Creating Frames-snt}{Section'tie17.6}
- 'xrdef {Multiple Displays-title}{Multiple Displays}
- 'xrdef {Multiple Displays-pg}{152}
- 'xrdef {Multiple Displays-snt}{Section'tie17.7}
- 'xrdef {Special Buffer Frames-title}{Special Buffer Frames}
- 'xrdef {Special Buffer Frames-pg}{152}
- 'xrdef {Special Buffer Frames-snt}{Section'tie17.8}
- 'xrdef {Frame Parameters-title}{Setting Frame Parameters}
- 'xrdef {Frame Parameters-pg}{153}
- 'xrdef {Frame Parameters-snt}{Section'tie17.9}
- 'xrdef {Scroll Bars-title}{Scroll Bars}
- 'xrdef {Scroll Bars-pg}{155}
- 'xrdef {Scroll Bars-snt}{Section'tie17.10}
- 'xrdef {Menu Bars-title}{Menu Bars}
- 'xrdef {Menu Bars-pg}{155}
- 'xrdef {Menu Bars-snt}{Section'tie17.11}
- 'xrdef {Faces-title}{Using Multiple Typefaces}
- 'xrdef {Faces-pg}{156}
- 'xrdef {Faces-snt}{Section'tie17.12}
- 'xrdef {Modifying Faces-title}{Modifying Faces}
- 'xrdef {Modifying Faces-pg}{157}
- 'xrdef {Modifying Faces-snt}{Section'tie17.13}
- 'xrdef {Misc X-title}{Miscellaneous X Window Features}
- 'xrdef {Misc X-pg}{158}
- 'xrdef {Misc X-snt}{Section'tie17.14}
- 'xrdef {Major Modes-title}{Major Modes}
- 'xrdef {Major Modes-pg}{161}
- 'xrdef {Major Modes-snt}{Chapter'tie18}
- 'xrdef {Choosing Modes-title}{How Major Modes are Chosen}
- 'xrdef {Choosing Modes-pg}{161}
- 'xrdef {Choosing Modes-snt}{Section'tie18.1}
- 'xrdef {Indentation-title}{Indentation}
- 'xrdef {Indentation-pg}{165}
- 'xrdef {Indentation-snt}{Chapter'tie19}
- 'xrdef {Indentation Commands-title}{Indentation Commands and Techniques}
- 'xrdef {Indentation Commands-pg}{165}
- 'xrdef {Indentation Commands-snt}{Section'tie19.1}
- 'xrdef {Tab Stops-title}{Tab Stops}
- 'xrdef {Tab Stops-pg}{167}
- 'xrdef {Tab Stops-snt}{Section'tie19.2}
- 'xrdef {Just Spaces-title}{Tabs vs. Spaces}
- 'xrdef {Just Spaces-pg}{167}
- 'xrdef {Just Spaces-snt}{Section'tie19.3}
- 'xrdef {Text-title}{Commands for Human Languages}
- 'xrdef {Text-pg}{169}
- 'xrdef {Text-snt}{Chapter'tie20}
- 'xrdef {Words-title}{Words}
- 'xrdef {Words-pg}{169}
- 'xrdef {Words-snt}{Section'tie20.1}
- 'xrdef {Sentences-title}{Sentences}
- 'xrdef {Sentences-pg}{171}
- 'xrdef {Sentences-snt}{Section'tie20.2}
- 'xrdef {Paragraphs-title}{Paragraphs}
- 'xrdef {Paragraphs-pg}{172}
- 'xrdef {Paragraphs-snt}{Section'tie20.3}
- 'xrdef {Pages-title}{Pages}
- 'xrdef {Pages-pg}{173}
- 'xrdef {Pages-snt}{Section'tie20.4}
- 'xrdef {Filling-title}{Filling Text}
- 'xrdef {Filling-pg}{174}
- 'xrdef {Filling-snt}{Section'tie20.5}
- 'xrdef {Auto Fill-title}{Auto Fill Mode}
- 'xrdef {Auto Fill-pg}{174}
- 'xrdef {Auto Fill-snt}{Section'tie20.5.1}
- 'xrdef {Fill Commands-title}{Explicit Fill Commands}
- 'xrdef {Fill Commands-pg}{175}
- 'xrdef {Fill Commands-snt}{Section'tie20.5.2}
- 'xrdef {Fill Prefix-title}{The Fill Prefix}
- 'xrdef {Fill Prefix-pg}{176}
- 'xrdef {Fill Prefix-snt}{Section'tie20.5.3}
- 'xrdef {Case-title}{Case Conversion Commands}
- 'xrdef {Case-pg}{178}
- 'xrdef {Case-snt}{Section'tie20.6}
- 'xrdef {Text Mode-title}{Text Mode}
- 'xrdef {Text Mode-pg}{179}
- 'xrdef {Text Mode-snt}{Section'tie20.7}
- 'xrdef {Outline Mode-title}{Outline Mode}
- 'xrdef {Outline Mode-pg}{179}
- 'xrdef {Outline Mode-snt}{Section'tie20.8}
- 'xrdef {Outline Format-title}{Format of Outlines}
- 'xrdef {Outline Format-pg}{180}
- 'xrdef {Outline Format-snt}{Section'tie20.8.1}
- 'xrdef {Outline Motion-title}{Outline Motion Commands}
- 'xrdef {Outline Motion-pg}{181}
- 'xrdef {Outline Motion-snt}{Section'tie20.8.2}
- 'xrdef {Outline Visibility-title}{Outline Visibility Commands}
- 'xrdef {Outline Visibility-pg}{182}
- 'xrdef {Outline Visibility-snt}{Section'tie20.8.3}
- 'xrdef {Outline Views-title}{Viewing One Outline in Multiple Views}
- 'xrdef {Outline Views-pg}{183}
- 'xrdef {Outline Views-snt}{Section'tie20.8.4}
- 'xrdef {TeX Mode-title}{\TeX{} Mode}
- 'xrdef {TeX Mode-pg}{184}
- 'xrdef {TeX Mode-snt}{Section'tie20.9}
- 'xrdef {TeX Editing-title}{\TeX{} Editing Commands}
- 'xrdef {TeX Editing-pg}{184}
- 'xrdef {TeX Editing-snt}{Section'tie20.9.1}
- 'xrdef {LaTeX Editing-title}{La\TeX{} Editing Commands}
- 'xrdef {LaTeX Editing-pg}{186}
- 'xrdef {LaTeX Editing-snt}{Section'tie20.9.2}
- 'xrdef {TeX Print-title}{\TeX{} Printing Commands}
- 'xrdef {TeX Print-pg}{186}
- 'xrdef {TeX Print-snt}{Section'tie20.9.3}
- 'xrdef {TeX Distrib-title}{Unix \TeX{} Distribution}
- 'xrdef {TeX Distrib-pg}{189}
- 'xrdef {TeX Distrib-snt}{Section'tie20.9.4}
- 'xrdef {Nroff Mode-title}{Nroff Mode}
- 'xrdef {Nroff Mode-pg}{189}
- 'xrdef {Nroff Mode-snt}{Section'tie20.10}
- 'xrdef {Formatted Text-title}{Editing Formatted Text}
- 'xrdef {Formatted Text-pg}{190}
- 'xrdef {Formatted Text-snt}{Section'tie20.11}
- 'xrdef {Requesting Formatted Text-title}{Requesting to Edit Formatted Text}
- 'xrdef {Requesting Formatted Text-pg}{190}
- 'xrdef {Requesting Formatted Text-snt}{Section'tie20.11.1}
- 'xrdef {Hard and Soft Newlines-title}{Hard and Soft Newlines}
- 'xrdef {Hard and Soft Newlines-pg}{191}
- 'xrdef {Hard and Soft Newlines-snt}{Section'tie20.11.2}
- 'xrdef {Editing Format Info-title}{Editing Format Information}
- 'xrdef {Editing Format Info-pg}{192}
- 'xrdef {Editing Format Info-snt}{Section'tie20.11.3}
- 'xrdef {Format Faces-title}{Faces in Formatted Text}
- 'xrdef {Format Faces-pg}{192}
- 'xrdef {Format Faces-snt}{Section'tie20.11.4}
- 'xrdef {Format Colors-title}{Colors in Formatted Text}
- 'xrdef {Format Colors-pg}{193}
- 'xrdef {Format Colors-snt}{Section'tie20.11.5}
- 'xrdef {Format Indentation-title}{Indentation in Formatted Text}
- 'xrdef {Format Indentation-pg}{194}
- 'xrdef {Format Indentation-snt}{Section'tie20.11.6}
- 'xrdef {Format Justification-title}{Justification in Formatted Text}
- 'xrdef {Format Justification-pg}{195}
- 'xrdef {Format Justification-snt}{Section'tie20.11.7}
- 'xrdef {Format Properties-title}{Setting Other Text Properties}
- 'xrdef {Format Properties-pg}{196}
- 'xrdef {Format Properties-snt}{Section'tie20.11.8}
- 'xrdef {Forcing Enriched Mode-title}{Forcing Enriched Mode}
- 'xrdef {Forcing Enriched Mode-pg}{196}
- 'xrdef {Forcing Enriched Mode-snt}{Section'tie20.11.9}
- 'xrdef {Programs-title}{Editing Programs}
- 'xrdef {Programs-pg}{199}
- 'xrdef {Programs-snt}{Chapter'tie21}
- 'xrdef {Program Modes-title}{Major Modes for Programming Languages}
- 'xrdef {Program Modes-pg}{199}
- 'xrdef {Program Modes-snt}{Section'tie21.1}
- 'xrdef {Lists-title}{Lists and Sexps}
- 'xrdef {Lists-pg}{200}
- 'xrdef {Lists-snt}{Section'tie21.2}
- 'xrdef {List Commands-title}{List And Sexp Commands}
- 'xrdef {List Commands-pg}{201}
- 'xrdef {List Commands-snt}{Section'tie21.3}
- 'xrdef {Defuns-title}{Defuns}
- 'xrdef {Defuns-pg}{202}
- 'xrdef {Defuns-snt}{Section'tie21.4}
- 'xrdef {Program Indent-title}{Indentation for Programs}
- 'xrdef {Program Indent-pg}{203}
- 'xrdef {Program Indent-snt}{Section'tie21.5}
- 'xrdef {Basic Indent-title}{Basic Program Indentation Commands}
- 'xrdef {Basic Indent-pg}{203}
- 'xrdef {Basic Indent-snt}{Section'tie21.5.1}
- 'xrdef {Multi-line Indent-title}{Indenting Several Lines}
- 'xrdef {Multi-line Indent-pg}{204}
- 'xrdef {Multi-line Indent-snt}{Section'tie21.5.2}
- 'xrdef {Lisp Indent-title}{Customizing Lisp Indentation}
- 'xrdef {Lisp Indent-pg}{205}
- 'xrdef {Lisp Indent-snt}{Section'tie21.5.3}
- 'xrdef {C Indent-title}{Customizing C Indentation}
- 'xrdef {C Indent-pg}{206}
- 'xrdef {C Indent-snt}{Section'tie21.5.4}
- 'xrdef {Matching-title}{Automatic Display Of Matching Parentheses}
- 'xrdef {Matching-pg}{209}
- 'xrdef {Matching-snt}{Section'tie21.6}
- 'xrdef {Comments-title}{Manipulating Comments}
- 'xrdef {Comments-pg}{210}
- 'xrdef {Comments-snt}{Section'tie21.7}
- 'xrdef {Comment Commands-title}{Comment Commands}
- 'xrdef {Comment Commands-pg}{210}
- 'xrdef {Comment Commands-snt}{Section'tie21.7.1}
- 'xrdef {Multi-Line Comments-title}{Multiple Lines of Comments}
- 'xrdef {Multi-Line Comments-pg}{211}
- 'xrdef {Multi-Line Comments-snt}{Section'tie21.7.2}
- 'xrdef {Options for Comments-title}{Options Controlling Comments}
- 'xrdef {Options for Comments-pg}{212}
- 'xrdef {Options for Comments-snt}{Section'tie21.7.3}
- 'xrdef {Balanced Editing-title}{Editing Without Unbalanced Parentheses}
- 'xrdef {Balanced Editing-pg}{213}
- 'xrdef {Balanced Editing-snt}{Section'tie21.8}
- 'xrdef {Symbol Completion-title}{Completion for Symbol Names}
- 'xrdef {Symbol Completion-pg}{213}
- 'xrdef {Symbol Completion-snt}{Section'tie21.9}
- 'xrdef {Documentation-title}{Documentation Commands}
- 'xrdef {Documentation-pg}{214}
- 'xrdef {Documentation-snt}{Section'tie21.10}
- 'xrdef {Change Log-title}{Change Logs}
- 'xrdef {Change Log-pg}{214}
- 'xrdef {Change Log-snt}{Section'tie21.11}
- 'xrdef {Tags-title}{Tags Tables}
- 'xrdef {Tags-pg}{216}
- 'xrdef {Tags-snt}{Section'tie21.12}
- 'xrdef {Tag Syntax-title}{Source File Tag Syntax}
- 'xrdef {Tag Syntax-pg}{216}
- 'xrdef {Tag Syntax-snt}{Section'tie21.12.1}
- 'xrdef {Create Tags Table-title}{Creating Tags Tables}
- 'xrdef {Create Tags Table-pg}{217}
- 'xrdef {Create Tags Table-snt}{Section'tie21.12.2}
- 'xrdef {Select Tags Table-title}{Selecting a Tags Table}
- 'xrdef {Select Tags Table-pg}{219}
- 'xrdef {Select Tags Table-snt}{Section'tie21.12.3}
- 'xrdef {Find Tag-title}{Finding a Tag}
- 'xrdef {Find Tag-pg}{220}
- 'xrdef {Find Tag-snt}{Section'tie21.12.4}
- 'xrdef {Tags Search-title}{Searching and Replacing with Tags Tables}
- 'xrdef {Tags Search-pg}{221}
- 'xrdef {Tags Search-snt}{Section'tie21.12.5}
- 'xrdef {Tags Stepping-title}{Stepping Through a Tags Table}
- 'xrdef {Tags Stepping-pg}{222}
- 'xrdef {Tags Stepping-snt}{Section'tie21.12.6}
- 'xrdef {List Tags-title}{Tags Table Inquiries}
- 'xrdef {List Tags-pg}{222}
- 'xrdef {List Tags-snt}{Section'tie21.12.7}
- 'xrdef {Emerge-title}{Merging Files with Emerge}
- 'xrdef {Emerge-pg}{223}
- 'xrdef {Emerge-snt}{Section'tie21.13}
- 'xrdef {Overview of Emerge-title}{Overview of Emerge}
- 'xrdef {Overview of Emerge-pg}{223}
- 'xrdef {Overview of Emerge-snt}{Section'tie21.13.1}
- 'xrdef {Submodes of Emerge-title}{Submodes of Emerge}
- 'xrdef {Submodes of Emerge-pg}{224}
- 'xrdef {Submodes of Emerge-snt}{Section'tie21.13.2}
- 'xrdef {State of Difference-title}{State of a Difference}
- 'xrdef {State of Difference-pg}{225}
- 'xrdef {State of Difference-snt}{Section'tie21.13.3}
- 'xrdef {Merge Commands-title}{Merge Commands}
- 'xrdef {Merge Commands-pg}{226}
- 'xrdef {Merge Commands-snt}{Section'tie21.13.4}
- 'xrdef {Exiting Emerge-title}{Exiting Emerge}
- 'xrdef {Exiting Emerge-pg}{227}
- 'xrdef {Exiting Emerge-snt}{Section'tie21.13.5}
- 'xrdef {Combining in Emerge-title}{Combining the Two Versions}
- 'xrdef {Combining in Emerge-pg}{228}
- 'xrdef {Combining in Emerge-snt}{Section'tie21.13.6}
- 'xrdef {Fine Points of Emerge-title}{Fine Points of Emerge}
- 'xrdef {Fine Points of Emerge-pg}{228}
- 'xrdef {Fine Points of Emerge-snt}{Section'tie21.13.7}
- 'xrdef {C Mode-title}{C Mode}
- 'xrdef {C Mode-pg}{228}
- 'xrdef {C Mode-snt}{Section'tie21.14}
- 'xrdef {Fortran-title}{Fortran Mode}
- 'xrdef {Fortran-pg}{230}
- 'xrdef {Fortran-snt}{Section'tie21.15}
- 'xrdef {Fortran Motion-title}{Motion Commands}
- 'xrdef {Fortran Motion-pg}{230}
- 'xrdef {Fortran Motion-snt}{Section'tie21.15.1}
- 'xrdef {Fortran Indent-title}{Fortran Indentation}
- 'xrdef {Fortran Indent-pg}{230}
- 'xrdef {Fortran Indent-snt}{Section'tie21.15.2}
- 'xrdef {ForIndent Commands-title}{Fortran Indentation Commands}
- 'xrdef {ForIndent Commands-pg}{231}
- 'xrdef {ForIndent Commands-snt}{Section'tie21.15.2.1}
- 'xrdef {ForIndent Cont-title}{Continuation Lines}
- 'xrdef {ForIndent Cont-pg}{231}
- 'xrdef {ForIndent Cont-snt}{Section'tie21.15.2.2}
- 'xrdef {ForIndent Num-title}{Line Numbers}
- 'xrdef {ForIndent Num-pg}{232}
- 'xrdef {ForIndent Num-snt}{Section'tie21.15.2.3}
- 'xrdef {ForIndent Conv-title}{Syntactic Conventions}
- 'xrdef {ForIndent Conv-pg}{232}
- 'xrdef {ForIndent Conv-snt}{Section'tie21.15.2.4}
- 'xrdef {ForIndent Vars-title}{Variables for Fortran Indentation}
- 'xrdef {ForIndent Vars-pg}{233}
- 'xrdef {ForIndent Vars-snt}{Section'tie21.15.2.5}
- 'xrdef {Fortran Comments-title}{Fortran Comments}
- 'xrdef {Fortran Comments-pg}{234}
- 'xrdef {Fortran Comments-snt}{Section'tie21.15.3}
- 'xrdef {Fortran Autofill-title}{Fortran Auto Fill Mode}
- 'xrdef {Fortran Autofill-pg}{235}
- 'xrdef {Fortran Autofill-snt}{Section'tie21.15.4}
- 'xrdef {Fortran Columns-title}{Checking Columns in Fortran}
- 'xrdef {Fortran Columns-pg}{236}
- 'xrdef {Fortran Columns-snt}{Section'tie21.15.5}
- 'xrdef {Fortran Abbrev-title}{Fortran Keyword Abbrevs}
- 'xrdef {Fortran Abbrev-pg}{236}
- 'xrdef {Fortran Abbrev-snt}{Section'tie21.15.6}
- 'xrdef {Asm Mode-title}{Asm Mode}
- 'xrdef {Asm Mode-pg}{237}
- 'xrdef {Asm Mode-snt}{Section'tie21.16}
- 'xrdef {Building-title}{Compiling and Testing Programs}
- 'xrdef {Building-pg}{239}
- 'xrdef {Building-snt}{Chapter'tie22}
- 'xrdef {Compilation-title}{Running Compilations under Emacs}
- 'xrdef {Compilation-pg}{239}
- 'xrdef {Compilation-snt}{Section'tie22.1}
- 'xrdef {Debuggers-title}{Running Debuggers Under Emacs}
- 'xrdef {Debuggers-pg}{241}
- 'xrdef {Debuggers-snt}{Section'tie22.2}
- 'xrdef {Starting GUD-title}{Starting GUD}
- 'xrdef {Starting GUD-pg}{241}
- 'xrdef {Starting GUD-snt}{Section'tie22.2.1}
- 'xrdef {Debugger Operation-title}{Debugger Operation}
- 'xrdef {Debugger Operation-pg}{242}
- 'xrdef {Debugger Operation-snt}{Section'tie22.2.2}
- 'xrdef {Commands of GUD-title}{Commands of GUD}
- 'xrdef {Commands of GUD-pg}{243}
- 'xrdef {Commands of GUD-snt}{Section'tie22.2.3}
- 'xrdef {GUD Customization-title}{GUD Customization}
- 'xrdef {GUD Customization-pg}{244}
- 'xrdef {GUD Customization-snt}{Section'tie22.2.4}
- 'xrdef {Executing Lisp-title}{Executing Lisp Expressions}
- 'xrdef {Executing Lisp-pg}{245}
- 'xrdef {Executing Lisp-snt}{Section'tie22.3}
- 'xrdef {Lisp Libraries-title}{Libraries of Lisp Code for Emacs}
- 'xrdef {Lisp Libraries-pg}{246}
- 'xrdef {Lisp Libraries-snt}{Section'tie22.4}
- 'xrdef {Lisp Eval-title}{Evaluating Emacs-Lisp Expressions}
- 'xrdef {Lisp Eval-pg}{247}
- 'xrdef {Lisp Eval-snt}{Section'tie22.5}
- 'xrdef {Lisp Interaction-title}{Lisp Interaction Buffers}
- 'xrdef {Lisp Interaction-pg}{249}
- 'xrdef {Lisp Interaction-snt}{Section'tie22.6}
- 'xrdef {External Lisp-title}{Running an External Lisp}
- 'xrdef {External Lisp-pg}{249}
- 'xrdef {External Lisp-snt}{Section'tie22.7}
- 'xrdef {Abbrevs-title}{Abbrevs}
- 'xrdef {Abbrevs-pg}{251}
- 'xrdef {Abbrevs-snt}{Chapter'tie23}
- 'xrdef {Abbrev Concepts-title}{Abbrev Concepts}
- 'xrdef {Abbrev Concepts-pg}{251}
- 'xrdef {Abbrev Concepts-snt}{Section'tie23.1}
- 'xrdef {Defining Abbrevs-title}{Defining Abbrevs}
- 'xrdef {Defining Abbrevs-pg}{251}
- 'xrdef {Defining Abbrevs-snt}{Section'tie23.2}
- 'xrdef {Expanding Abbrevs-title}{Controlling Abbrev Expansion}
- 'xrdef {Expanding Abbrevs-pg}{252}
- 'xrdef {Expanding Abbrevs-snt}{Section'tie23.3}
- 'xrdef {Editing Abbrevs-title}{Examining and Editing Abbrevs}
- 'xrdef {Editing Abbrevs-pg}{254}
- 'xrdef {Editing Abbrevs-snt}{Section'tie23.4}
- 'xrdef {Saving Abbrevs-title}{Saving Abbrevs}
- 'xrdef {Saving Abbrevs-pg}{254}
- 'xrdef {Saving Abbrevs-snt}{Section'tie23.5}
- 'xrdef {Dynamic Abbrevs-title}{Dynamic Abbrev Expansion}
- 'xrdef {Dynamic Abbrevs-pg}{255}
- 'xrdef {Dynamic Abbrevs-snt}{Section'tie23.6}
- 'xrdef {Picture-title}{Editing Pictures}
- 'xrdef {Picture-pg}{257}
- 'xrdef {Picture-snt}{Chapter'tie24}
- 'xrdef {Basic Picture-title}{Basic Editing in Picture Mode}
- 'xrdef {Basic Picture-pg}{257}
- 'xrdef {Basic Picture-snt}{Section'tie24.1}
- 'xrdef {Insert in Picture-title}{Controlling Motion after Insert}
- 'xrdef {Insert in Picture-pg}{258}
- 'xrdef {Insert in Picture-snt}{Section'tie24.2}
- 'xrdef {Tabs in Picture-title}{Picture Mode Tabs}
- 'xrdef {Tabs in Picture-pg}{259}
- 'xrdef {Tabs in Picture-snt}{Section'tie24.3}
- 'xrdef {Rectangles in Picture-title}{Picture Mode Rectangle Commands}
- 'xrdef {Rectangles in Picture-pg}{259}
- 'xrdef {Rectangles in Picture-snt}{Section'tie24.4}
- 'xrdef {Sending Mail-title}{Sending Mail}
- 'xrdef {Sending Mail-pg}{261}
- 'xrdef {Sending Mail-snt}{Chapter'tie25}
- 'xrdef {Mail Format-title}{The Format of the Mail Buffer}
- 'xrdef {Mail Format-pg}{261}
- 'xrdef {Mail Format-snt}{Section'tie25.1}
- 'xrdef {Mail Headers-title}{Mail Header Fields}
- 'xrdef {Mail Headers-pg}{262}
- 'xrdef {Mail Headers-snt}{Section'tie25.2}
- 'xrdef {Mail Aliases-title}{Mail Aliases}
- 'xrdef {Mail Aliases-pg}{264}
- 'xrdef {Mail Aliases-snt}{Section'tie25.3}
- 'xrdef {Mail Mode-title}{Mail Mode}
- 'xrdef {Mail Mode-pg}{265}
- 'xrdef {Mail Mode-snt}{Section'tie25.4}
- 'xrdef {Distracting NSA-title}{Distracting the NSA}
- 'xrdef {Distracting NSA-pg}{268}
- 'xrdef {Distracting NSA-snt}{Section'tie25.5}
- 'xrdef {Rmail-title}{Reading Mail with Rmail}
- 'xrdef {Rmail-pg}{269}
- 'xrdef {Rmail-snt}{Chapter'tie26}
- 'xrdef {Rmail Basics-title}{Basic Concepts of Rmail}
- 'xrdef {Rmail Basics-pg}{269}
- 'xrdef {Rmail Basics-snt}{Section'tie26.1}
- 'xrdef {Rmail Scrolling-title}{Scrolling Within a Message}
- 'xrdef {Rmail Scrolling-pg}{270}
- 'xrdef {Rmail Scrolling-snt}{Section'tie26.2}
- 'xrdef {Rmail Motion-title}{Moving Among Messages}
- 'xrdef {Rmail Motion-pg}{270}
- 'xrdef {Rmail Motion-snt}{Section'tie26.3}
- 'xrdef {Rmail Deletion-title}{Deleting Messages}
- 'xrdef {Rmail Deletion-pg}{271}
- 'xrdef {Rmail Deletion-snt}{Section'tie26.4}
- 'xrdef {Rmail Inbox-title}{Rmail Files and Inboxes}
- 'xrdef {Rmail Inbox-pg}{272}
- 'xrdef {Rmail Inbox-snt}{Section'tie26.5}
- 'xrdef {Rmail Files-title}{Multiple Rmail Files}
- 'xrdef {Rmail Files-pg}{274}
- 'xrdef {Rmail Files-snt}{Section'tie26.6}
- 'xrdef {Rmail Output-title}{Copying Messages Out to Files}
- 'xrdef {Rmail Output-pg}{275}
- 'xrdef {Rmail Output-snt}{Section'tie26.7}
- 'xrdef {Rmail Labels-title}{Labels}
- 'xrdef {Rmail Labels-pg}{276}
- 'xrdef {Rmail Labels-snt}{Section'tie26.8}
- 'xrdef {Rmail Reply-title}{Sending Replies}
- 'xrdef {Rmail Reply-pg}{278}
- 'xrdef {Rmail Reply-snt}{Section'tie26.9}
- 'xrdef {Rmail Summary-title}{Summaries}
- 'xrdef {Rmail Summary-pg}{280}
- 'xrdef {Rmail Summary-snt}{Section'tie26.10}
- 'xrdef {Rmail Make Summary-title}{Making Summaries}
- 'xrdef {Rmail Make Summary-pg}{280}
- 'xrdef {Rmail Make Summary-snt}{Section'tie26.10.1}
- 'xrdef {Rmail Summary Edit-title}{Editing in Summaries}
- 'xrdef {Rmail Summary Edit-pg}{281}
- 'xrdef {Rmail Summary Edit-snt}{Section'tie26.10.2}
- 'xrdef {Rmail Sorting-title}{Sorting the Rmail File}
- 'xrdef {Rmail Sorting-pg}{282}
- 'xrdef {Rmail Sorting-snt}{Section'tie26.11}
- 'xrdef {Rmail Display-title}{Display of Messages}
- 'xrdef {Rmail Display-pg}{283}
- 'xrdef {Rmail Display-snt}{Section'tie26.12}
- 'xrdef {Rmail Editing-title}{Editing Within a Message}
- 'xrdef {Rmail Editing-pg}{283}
- 'xrdef {Rmail Editing-snt}{Section'tie26.13}
- 'xrdef {Rmail Digest-title}{Digest Messages}
- 'xrdef {Rmail Digest-pg}{284}
- 'xrdef {Rmail Digest-snt}{Section'tie26.14}
- 'xrdef {Out of Rmail-title}{Converting an Rmail File to Inbox Format}
- 'xrdef {Out of Rmail-pg}{284}
- 'xrdef {Out of Rmail-snt}{Section'tie26.15}
- 'xrdef {Rmail Rot13-title}{Reading Rot13 Messages}
- 'xrdef {Rmail Rot13-pg}{284}
- 'xrdef {Rmail Rot13-snt}{Section'tie26.16}
- 'xrdef {Dired-title}{Dired, the Directory Editor}
- 'xrdef {Dired-pg}{287}
- 'xrdef {Dired-snt}{Chapter'tie27}
- 'xrdef {Dired Enter-title}{Entering Dired}
- 'xrdef {Dired Enter-pg}{287}
- 'xrdef {Dired Enter-snt}{Section'tie27.1}
- 'xrdef {Dired Commands-title}{Commands in the Dired Buffer}
- 'xrdef {Dired Commands-pg}{287}
- 'xrdef {Dired Commands-snt}{Section'tie27.2}
- 'xrdef {Dired Deletion-title}{Deleting Files with Dired}
- 'xrdef {Dired Deletion-pg}{287}
- 'xrdef {Dired Deletion-snt}{Section'tie27.3}
- 'xrdef {Flagging Many Files-title}{Flagging Many Files}
- 'xrdef {Flagging Many Files-pg}{288}
- 'xrdef {Flagging Many Files-snt}{Section'tie27.4}
- 'xrdef {Dired Visiting-title}{Visiting Files in Dired}
- 'xrdef {Dired Visiting-pg}{289}
- 'xrdef {Dired Visiting-snt}{Section'tie27.5}
- 'xrdef {Marks vs Flags-title}{Dired Marks vs. Flags}
- 'xrdef {Marks vs Flags-pg}{290}
- 'xrdef {Marks vs Flags-snt}{Section'tie27.6}
- 'xrdef {Operating on Files-title}{Operating on Files}
- 'xrdef {Operating on Files-pg}{291}
- 'xrdef {Operating on Files-snt}{Section'tie27.7}
- 'xrdef {Shell Commands in Dired-title}{Shell Commands in Dired}
- 'xrdef {Shell Commands in Dired-pg}{293}
- 'xrdef {Shell Commands in Dired-snt}{Section'tie27.8}
- 'xrdef {Transforming File Names-title}{Transforming File Names in Dired}
- 'xrdef {Transforming File Names-pg}{294}
- 'xrdef {Transforming File Names-snt}{Section'tie27.9}
- 'xrdef {Comparison in Dired-title}{File Comparison with Dired}
- 'xrdef {Comparison in Dired-pg}{295}
- 'xrdef {Comparison in Dired-snt}{Section'tie27.10}
- 'xrdef {Subdirectories in Dired-title}{Subdirectories in Dired}
- 'xrdef {Subdirectories in Dired-pg}{295}
- 'xrdef {Subdirectories in Dired-snt}{Section'tie27.11}
- 'xrdef {Subdirectory Motion-title}{Moving Over Subdirectories}
- 'xrdef {Subdirectory Motion-pg}{296}
- 'xrdef {Subdirectory Motion-snt}{Section'tie27.12}
- 'xrdef {Hiding Subdirectories-title}{Hiding Subdirectories}
- 'xrdef {Hiding Subdirectories-pg}{296}
- 'xrdef {Hiding Subdirectories-snt}{Section'tie27.13}
- 'xrdef {Dired Updating-title}{Updating the Dired Buffer}
- 'xrdef {Dired Updating-pg}{296}
- 'xrdef {Dired Updating-snt}{Section'tie27.14}
- 'xrdef {Dired and Find-title}{Dired and \code {find}}
- 'xrdef {Dired and Find-pg}{297}
- 'xrdef {Dired and Find-snt}{Section'tie27.15}
- 'xrdef {Calendar/Diary-title}{The Calendar and the Diary}
- 'xrdef {Calendar/Diary-pg}{299}
- 'xrdef {Calendar/Diary-snt}{Chapter'tie28}
- 'xrdef {Calendar Motion-title}{Movement in the Calendar}
- 'xrdef {Calendar Motion-pg}{299}
- 'xrdef {Calendar Motion-snt}{Section'tie28.1}
- 'xrdef {Calendar Unit Motion-title}{Motion by Standard Lengths of Time}
- 'xrdef {Calendar Unit Motion-pg}{299}
- 'xrdef {Calendar Unit Motion-snt}{Section'tie28.1.1}
- 'xrdef {Move to Beginning or End-title}{Beginning or End of Week, Month or Year}
- 'xrdef {Move to Beginning or End-pg}{300}
- 'xrdef {Move to Beginning or End-snt}{Section'tie28.1.2}
- 'xrdef {Specified Dates-title}{Specified Dates}
- 'xrdef {Specified Dates-pg}{301}
- 'xrdef {Specified Dates-snt}{Section'tie28.1.3}
- 'xrdef {Scroll Calendar-title}{Scrolling in the Calendar}
- 'xrdef {Scroll Calendar-pg}{301}
- 'xrdef {Scroll Calendar-snt}{Section'tie28.2}
- 'xrdef {Counting Days-title}{Counting Days}
- 'xrdef {Counting Days-pg}{302}
- 'xrdef {Counting Days-snt}{Section'tie28.3}
- 'xrdef {General Calendar-title}{Miscellaneous Calendar Commands}
- 'xrdef {General Calendar-pg}{302}
- 'xrdef {General Calendar-snt}{Section'tie28.4}
- 'xrdef {Holidays-title}{Holidays}
- 'xrdef {Holidays-pg}{303}
- 'xrdef {Holidays-snt}{Section'tie28.5}
- 'xrdef {Sunrise/Sunset-title}{Times of Sunrise and Sunset}
- 'xrdef {Sunrise/Sunset-pg}{304}
- 'xrdef {Sunrise/Sunset-snt}{Section'tie28.6}
- 'xrdef {Lunar Phases-title}{Phases of the Moon}
- 'xrdef {Lunar Phases-pg}{305}
- 'xrdef {Lunar Phases-snt}{Section'tie28.7}
- 'xrdef {Other Calendars-title}{Conversion To and From Other Calendars}
- 'xrdef {Other Calendars-pg}{306}
- 'xrdef {Other Calendars-snt}{Section'tie28.8}
- 'xrdef {Calendar Systems-title}{Supported Calendar Systems}
- 'xrdef {Calendar Systems-pg}{306}
- 'xrdef {Calendar Systems-snt}{Section'tie28.8.1}
- 'xrdef {To Other Calendar-title}{Converting To Other Calendars}
- 'xrdef {To Other Calendar-pg}{307}
- 'xrdef {To Other Calendar-snt}{Section'tie28.8.2}
- 'xrdef {From Other Calendar-title}{Converting From Other Calendars}
- 'xrdef {From Other Calendar-pg}{307}
- 'xrdef {From Other Calendar-snt}{Section'tie28.8.3}
- 'xrdef {Mayan Calendar-title}{Converting from the Mayan Calendar}
- 'xrdef {Mayan Calendar-pg}{308}
- 'xrdef {Mayan Calendar-snt}{Section'tie28.8.4}
- 'xrdef {Diary-title}{The Diary}
- 'xrdef {Diary-pg}{309}
- 'xrdef {Diary-snt}{Section'tie28.9}
- 'xrdef {Diary Commands-title}{Commands Displaying Diary Entries}
- 'xrdef {Diary Commands-pg}{310}
- 'xrdef {Diary Commands-snt}{Section'tie28.9.1}
- 'xrdef {Format of Diary File-title}{The Diary File}
- 'xrdef {Format of Diary File-pg}{311}
- 'xrdef {Format of Diary File-snt}{Section'tie28.9.2}
- 'xrdef {Date Formats-title}{Date Formats}
- 'xrdef {Date Formats-pg}{312}
- 'xrdef {Date Formats-snt}{Section'tie28.9.3}
- 'xrdef {Adding to Diary-title}{Commands to Add to the Diary}
- 'xrdef {Adding to Diary-pg}{313}
- 'xrdef {Adding to Diary-snt}{Section'tie28.9.4}
- 'xrdef {Special Diary Entries-title}{Special Diary Entries}
- 'xrdef {Special Diary Entries-pg}{314}
- 'xrdef {Special Diary Entries-snt}{Section'tie28.9.5}
- 'xrdef {Appointments-title}{Appointments}
- 'xrdef {Appointments-pg}{316}
- 'xrdef {Appointments-snt}{Section'tie28.10}
- 'xrdef {Daylight Savings-title}{Daylight Savings Time}
- 'xrdef {Daylight Savings-pg}{317}
- 'xrdef {Daylight Savings-snt}{Section'tie28.11}
- 'xrdef {GNUS-title}{GNUS}
- 'xrdef {GNUS-pg}{319}
- 'xrdef {GNUS-snt}{Section'tie29.1}
- 'xrdef {Buffers of GNUS-title}{GNUS's Three Buffers}
- 'xrdef {Buffers of GNUS-pg}{319}
- 'xrdef {Buffers of GNUS-snt}{Section'tie29.1.1}
- 'xrdef {GNUS Startup-title}{When GNUS Starts Up}
- 'xrdef {GNUS Startup-pg}{319}
- 'xrdef {GNUS Startup-snt}{Section'tie29.1.2}
- 'xrdef {Summary of GNUS-title}{Summary of GNUS Commands}
- 'xrdef {Summary of GNUS-pg}{320}
- 'xrdef {Summary of GNUS-snt}{Section'tie29.1.3}
- 'xrdef {Shell-title}{Running Shell Commands from Emacs}
- 'xrdef {Shell-pg}{322}
- 'xrdef {Shell-snt}{Section'tie29.2}
- 'xrdef {Single Shell-title}{Single Shell Commands}
- 'xrdef {Single Shell-pg}{322}
- 'xrdef {Single Shell-snt}{Section'tie29.2.1}
- 'xrdef {Interactive Shell-title}{Interactive Inferior Shell}
- 'xrdef {Interactive Shell-pg}{323}
- 'xrdef {Interactive Shell-snt}{Section'tie29.2.2}
- 'xrdef {Shell Mode-title}{Shell Mode}
- 'xrdef {Shell Mode-pg}{324}
- 'xrdef {Shell Mode-snt}{Section'tie29.2.3}
- 'xrdef {Shell History-title}{Shell Command History}
- 'xrdef {Shell History-pg}{327}
- 'xrdef {Shell History-snt}{Section'tie29.2.4}
- 'xrdef {Shell Ring-title}{Shell History Ring}
- 'xrdef {Shell Ring-pg}{327}
- 'xrdef {Shell Ring-snt}{Section'tie29.2.4.1}
- 'xrdef {Shell History Copying-title}{Shell History Copying}
- 'xrdef {Shell History Copying-pg}{328}
- 'xrdef {Shell History Copying-snt}{Section'tie29.2.4.2}
- 'xrdef {History References-title}{Shell History References}
- 'xrdef {History References-pg}{328}
- 'xrdef {History References-snt}{Section'tie29.2.4.3}
- 'xrdef {Shell Options-title}{Shell Mode Options}
- 'xrdef {Shell Options-pg}{329}
- 'xrdef {Shell Options-snt}{Section'tie29.2.5}
- 'xrdef {Remote Host-title}{Remote Host Shell}
- 'xrdef {Remote Host-pg}{330}
- 'xrdef {Remote Host-snt}{Section'tie29.2.6}
- 'xrdef {Emacs Server-title}{Using Emacs as a Server}
- 'xrdef {Emacs Server-pg}{330}
- 'xrdef {Emacs Server-snt}{Section'tie29.3}
- 'xrdef {Hardcopy-title}{Hardcopy Output}
- 'xrdef {Hardcopy-pg}{331}
- 'xrdef {Hardcopy-snt}{Section'tie29.4}
- 'xrdef {Postscript-title}{Postscript Hardcopy}
- 'xrdef {Postscript-pg}{332}
- 'xrdef {Postscript-snt}{Section'tie29.5}
- 'xrdef {Sorting-title}{Sorting Text}
- 'xrdef {Sorting-pg}{333}
- 'xrdef {Sorting-snt}{Section'tie29.6}
- 'xrdef {Narrowing-title}{Narrowing}
- 'xrdef {Narrowing-pg}{335}
- 'xrdef {Narrowing-snt}{Section'tie29.7}
- 'xrdef {Two-Column-title}{Two-Column Editing}
- 'xrdef {Two-Column-pg}{336}
- 'xrdef {Two-Column-snt}{Section'tie29.8}
- 'xrdef {Editing Binary Files-title}{Editing Binary Files}
- 'xrdef {Editing Binary Files-pg}{338}
- 'xrdef {Editing Binary Files-snt}{Section'tie29.9}
- 'xrdef {Saving Emacs Sessions-title}{Saving Emacs Sessions}
- 'xrdef {Saving Emacs Sessions-pg}{338}
- 'xrdef {Saving Emacs Sessions-snt}{Section'tie29.10}
- 'xrdef {Recursive Edit-title}{Recursive Editing Levels}
- 'xrdef {Recursive Edit-pg}{339}
- 'xrdef {Recursive Edit-snt}{Section'tie29.11}
- 'xrdef {Emulation-title}{Emulation}
- 'xrdef {Emulation-pg}{340}
- 'xrdef {Emulation-snt}{Section'tie29.12}
- 'xrdef {Dissociated Press-title}{Dissociated Press}
- 'xrdef {Dissociated Press-pg}{341}
- 'xrdef {Dissociated Press-snt}{Section'tie29.13}
- 'xrdef {Amusements-title}{Other Amusements}
- 'xrdef {Amusements-pg}{342}
- 'xrdef {Amusements-snt}{Section'tie29.14}
- 'xrdef {Customization-title}{Customization}
- 'xrdef {Customization-pg}{343}
- 'xrdef {Customization-snt}{Chapter'tie30}
- 'xrdef {Minor Modes-title}{Minor Modes}
- 'xrdef {Minor Modes-pg}{343}
- 'xrdef {Minor Modes-snt}{Section'tie30.1}
- 'xrdef {Variables-title}{Variables}
- 'xrdef {Variables-pg}{345}
- 'xrdef {Variables-snt}{Section'tie30.2}
- 'xrdef {Examining-title}{Examining and Setting Variables}
- 'xrdef {Examining-pg}{346}
- 'xrdef {Examining-snt}{Section'tie30.2.1}
- 'xrdef {Edit Options-title}{Editing Variable Values}
- 'xrdef {Edit Options-pg}{346}
- 'xrdef {Edit Options-snt}{Section'tie30.2.2}
- 'xrdef {Hooks-title}{Hooks}
- 'xrdef {Hooks-pg}{347}
- 'xrdef {Hooks-snt}{Section'tie30.2.3}
- 'xrdef {Locals-title}{Local Variables}
- 'xrdef {Locals-pg}{348}
- 'xrdef {Locals-snt}{Section'tie30.2.4}
- 'xrdef {File Variables-title}{Local Variables in Files}
- 'xrdef {File Variables-pg}{350}
- 'xrdef {File Variables-snt}{Section'tie30.2.5}
- 'xrdef {Keyboard Macros-title}{Keyboard Macros}
- 'xrdef {Keyboard Macros-pg}{352}
- 'xrdef {Keyboard Macros-snt}{Section'tie30.3}
- 'xrdef {Basic Kbd Macro-title}{Basic Use}
- 'xrdef {Basic Kbd Macro-pg}{353}
- 'xrdef {Basic Kbd Macro-snt}{Section'tie30.3.1}
- 'xrdef {Save Kbd Macro-title}{Naming and Saving Keyboard Macros}
- 'xrdef {Save Kbd Macro-pg}{354}
- 'xrdef {Save Kbd Macro-snt}{Section'tie30.3.2}
- 'xrdef {Kbd Macro Query-title}{Executing Macros with Variations}
- 'xrdef {Kbd Macro Query-pg}{354}
- 'xrdef {Kbd Macro Query-snt}{Section'tie30.3.3}
- 'xrdef {Key Bindings-title}{Customizing Key Bindings}
- 'xrdef {Key Bindings-pg}{355}
- 'xrdef {Key Bindings-snt}{Section'tie30.4}
- 'xrdef {Keymaps-title}{Keymaps}
- 'xrdef {Keymaps-pg}{355}
- 'xrdef {Keymaps-snt}{Section'tie30.4.1}
- 'xrdef {Prefix Keymaps-title}{Prefix Keymaps}
- 'xrdef {Prefix Keymaps-pg}{356}
- 'xrdef {Prefix Keymaps-snt}{Section'tie30.4.2}
- 'xrdef {Local Keymaps-title}{Local Keymaps}
- 'xrdef {Local Keymaps-pg}{357}
- 'xrdef {Local Keymaps-snt}{Section'tie30.4.3}
- 'xrdef {Minibuffer Maps-title}{Minibuffer Keymaps}
- 'xrdef {Minibuffer Maps-pg}{358}
- 'xrdef {Minibuffer Maps-snt}{Section'tie30.4.4}
- 'xrdef {Rebinding-title}{Changing Key Bindings Interactively}
- 'xrdef {Rebinding-pg}{359}
- 'xrdef {Rebinding-snt}{Section'tie30.4.5}
- 'xrdef {Init Rebinding-title}{Rebinding Keys in Your Init File}
- 'xrdef {Init Rebinding-pg}{360}
- 'xrdef {Init Rebinding-snt}{Section'tie30.4.6}
- 'xrdef {Function Keys-title}{Rebinding Function Keys}
- 'xrdef {Function Keys-pg}{361}
- 'xrdef {Function Keys-snt}{Section'tie30.4.7}
- 'xrdef {Named ASCII Chars-title}{Named ASCII Control Characters}
- 'xrdef {Named ASCII Chars-pg}{362}
- 'xrdef {Named ASCII Chars-snt}{Section'tie30.4.8}
- 'xrdef {Mouse Buttons-title}{Rebinding Mouse Buttons}
- 'xrdef {Mouse Buttons-pg}{363}
- 'xrdef {Mouse Buttons-snt}{Section'tie30.4.9}
- 'xrdef {Disabling-title}{Disabling Commands}
- 'xrdef {Disabling-pg}{365}
- 'xrdef {Disabling-snt}{Section'tie30.4.10}
- 'xrdef {Keyboard Translations-title}{Keyboard Translations}
- 'xrdef {Keyboard Translations-pg}{365}
- 'xrdef {Keyboard Translations-snt}{Section'tie30.5}
- 'xrdef {Syntax-title}{The Syntax Table}
- 'xrdef {Syntax-pg}{366}
- 'xrdef {Syntax-snt}{Section'tie30.6}
- 'xrdef {Init File-title}{The Init File, \file {~/.emacs}}
- 'xrdef {Init File-pg}{366}
- 'xrdef {Init File-snt}{Section'tie30.7}
- 'xrdef {Init Syntax-title}{Init File Syntax}
- 'xrdef {Init Syntax-pg}{367}
- 'xrdef {Init Syntax-snt}{Section'tie30.7.1}
- 'xrdef {Init Examples-title}{Init File Examples}
- 'xrdef {Init Examples-pg}{368}
- 'xrdef {Init Examples-snt}{Section'tie30.7.2}
- 'xrdef {Terminal Init-title}{Terminal-specific Initialization}
- 'xrdef {Terminal Init-pg}{370}
- 'xrdef {Terminal Init-snt}{Section'tie30.7.3}
- 'xrdef {Find Init-title}{How Emacs Finds Your Init File}
- 'xrdef {Find Init-pg}{370}
- 'xrdef {Find Init-snt}{Section'tie30.7.4}
- 'xrdef {Quitting-title}{Quitting and Aborting}
- 'xrdef {Quitting-pg}{373}
- 'xrdef {Quitting-snt}{Section'tie31.1}
- 'xrdef {Lossage-title}{Dealing with Emacs Trouble}
- 'xrdef {Lossage-pg}{374}
- 'xrdef {Lossage-snt}{Section'tie31.2}
- 'xrdef {DEL Gets Help-title}{If \key {DEL} Fails to Delete}
- 'xrdef {DEL Gets Help-pg}{374}
- 'xrdef {DEL Gets Help-snt}{Section'tie31.2.1}
- 'xrdef {Stuck Recursive-title}{Recursive Editing Levels}
- 'xrdef {Stuck Recursive-pg}{375}
- 'xrdef {Stuck Recursive-snt}{Section'tie31.2.2}
- 'xrdef {Screen Garbled-title}{Garbage on the Screen}
- 'xrdef {Screen Garbled-pg}{375}
- 'xrdef {Screen Garbled-snt}{Section'tie31.2.3}
- 'xrdef {Text Garbled-title}{Garbage in the Text}
- 'xrdef {Text Garbled-pg}{375}
- 'xrdef {Text Garbled-snt}{Section'tie31.2.4}
- 'xrdef {Unasked-for Search-title}{Spontaneous Entry to Incremental Search}
- 'xrdef {Unasked-for Search-pg}{375}
- 'xrdef {Unasked-for Search-snt}{Section'tie31.2.5}
- 'xrdef {Memory Full-title}{Running out of Memory}
- 'xrdef {Memory Full-pg}{376}
- 'xrdef {Memory Full-snt}{Section'tie31.2.6}
- 'xrdef {Emergency Escape-title}{Emergency Escape}
- 'xrdef {Emergency Escape-pg}{376}
- 'xrdef {Emergency Escape-snt}{Section'tie31.2.7}
- 'xrdef {Total Frustration-title}{Help for Total Frustration}
- 'xrdef {Total Frustration-pg}{377}
- 'xrdef {Total Frustration-snt}{Section'tie31.2.8}
- 'xrdef {Bugs-title}{Reporting Bugs}
- 'xrdef {Bugs-pg}{377}
- 'xrdef {Bugs-snt}{Section'tie31.3}
- 'xrdef {Bug Criteria-title}{When Is There a Bug}
- 'xrdef {Bug Criteria-pg}{378}
- 'xrdef {Bug Criteria-snt}{Section'tie31.3.1}
- 'xrdef {Understanding Bug Reporting-title}{Understanding Bug Reporting}
- 'xrdef {Understanding Bug Reporting-pg}{379}
- 'xrdef {Understanding Bug Reporting-snt}{Section'tie31.3.2}
- 'xrdef {Checklist-title}{Checklist for Bug Reports}
- 'xrdef {Checklist-pg}{379}
- 'xrdef {Checklist-snt}{Section'tie31.3.3}
- 'xrdef {Sending Patches-title}{Sending Patches for GNU Emacs}
- 'xrdef {Sending Patches-pg}{385}
- 'xrdef {Sending Patches-snt}{Section'tie31.3.4}
- 'xrdef {Service-title}{How To Get Help with GNU Emacs}
- 'xrdef {Service-pg}{386}
- 'xrdef {Service-snt}{Section'tie31.4}
- 'xrdef {Command Arguments-title}{Command Line Arguments}
- 'xrdef {Command Arguments-pg}{389}
- 'xrdef {Command Arguments-snt}{Appendix'tie'char65{}}
- 'xrdef {Action Arguments-title}{Action Arguments}
- 'xrdef {Action Arguments-pg}{389}
- 'xrdef {Action Arguments-snt}{Section'tie'char65.1}
- 'xrdef {Initial Options-title}{Initial Options}
- 'xrdef {Initial Options-pg}{390}
- 'xrdef {Initial Options-snt}{Section'tie'char65.2}
- 'xrdef {Command Example-title}{Command Argument Example}
- 'xrdef {Command Example-pg}{391}
- 'xrdef {Command Example-snt}{Section'tie'char65.3}
- 'xrdef {Resume Arguments-title}{Resuming Emacs with Arguments}
- 'xrdef {Resume Arguments-pg}{392}
- 'xrdef {Resume Arguments-snt}{Section'tie'char65.4}
- 'xrdef {Environment-title}{Environment Variables}
- 'xrdef {Environment-pg}{392}
- 'xrdef {Environment-snt}{Section'tie'char65.5}
- 'xrdef {General Variables-title}{General Variables}
- 'xrdef {General Variables-pg}{393}
- 'xrdef {General Variables-snt}{Section'tie'char65.5.1}
- 'xrdef {Misc Variables-title}{Misc Variables}
- 'xrdef {Misc Variables-pg}{395}
- 'xrdef {Misc Variables-snt}{Section'tie'char65.5.2}
- 'xrdef {Display X-title}{Specifying the Display Name}
- 'xrdef {Display X-pg}{395}
- 'xrdef {Display X-snt}{Section'tie'char65.6}
- 'xrdef {Font X-title}{Font Specification Options}
- 'xrdef {Font X-pg}{396}
- 'xrdef {Font X-snt}{Section'tie'char65.7}
- 'xrdef {Colors X-title}{Window Color Options}
- 'xrdef {Colors X-pg}{398}
- 'xrdef {Colors X-snt}{Section'tie'char65.8}
- 'xrdef {Window Size X-title}{Options for Window Geometry}
- 'xrdef {Window Size X-pg}{398}
- 'xrdef {Window Size X-snt}{Section'tie'char65.9}
- 'xrdef {Borders X-title}{Internal and External Borders}
- 'xrdef {Borders X-pg}{399}
- 'xrdef {Borders X-snt}{Section'tie'char65.10}
- 'xrdef {Icons X-title}{Icons}
- 'xrdef {Icons X-pg}{400}
- 'xrdef {Icons X-snt}{Section'tie'char65.11}
- 'xrdef {Resources X-title}{X Resources}
- 'xrdef {Resources X-pg}{401}
- 'xrdef {Resources X-snt}{Section'tie'char65.12}
- 'xrdef {Lucid Resources-title}{Lucid Menu X Resources}
- 'xrdef {Lucid Resources-pg}{404}
- 'xrdef {Lucid Resources-snt}{Section'tie'char65.13}
- 'xrdef {Motif Resources-title}{Motif Menu X Resources}
- 'xrdef {Motif Resources-pg}{404}
- 'xrdef {Motif Resources-snt}{Section'tie'char65.14}
- 'xrdef {Antinews-title}{Emacs 19.28 Antinews}
- 'xrdef {Antinews-pg}{407}
- 'xrdef {Antinews-snt}{Appendix'tie'char66{}}
- 'xrdef {MS-DOS-title}{MS-DOS Issues}
- 'xrdef {MS-DOS-pg}{409}
- 'xrdef {MS-DOS-snt}{Appendix'tie'char67{}}
- 'xrdef {Manifesto-title}{The GNU Manifesto}
- 'xrdef {Manifesto-pg}{411}
- 'xrdef {Manifesto-snt}{}
- 'xrdef {Top-title}{What's GNU? Gnu's Not Unix!}
- 'xrdef {Top-pg}{411}
- 'xrdef {Top-snt}{}
- 'xrdef {Glossary-title}{Glossary}
- 'xrdef {Glossary-pg}{421}
- 'xrdef {Glossary-snt}{}
- 'xrdef {Key Index-title}{Key (Character) Index}
- 'xrdef {Key Index-pg}{441}
- 'xrdef {Key Index-snt}{}
- 'xrdef {Command Index-title}{Command and Function Index}
- 'xrdef {Command Index-pg}{449}
- 'xrdef {Command Index-snt}{}
- 'xrdef {Variable Index-title}{Variable Index}
- 'xrdef {Variable Index-pg}{459}
- 'xrdef {Variable Index-snt}{}
- 'xrdef {Concept Index-title}{Concept Index}
- 'xrdef {Concept Index-pg}{463}
- 'xrdef {Concept Index-snt}{}
--- 0 ----
Index: emacs/man/emacs.cps
diff -c emacs/man/emacs.cps:1.1.1.2 emacs/man/emacs.cps:removed
*** emacs/man/emacs.cps:1.1.1.2	Mon Jul 22 01:54:47 1996
--- emacs/man/emacs.cps	Fri Aug  2 21:01:39 1996
***************
*** 1,632 ****
- \initial {*}
- \entry {\samp {*Messages*} buffer}{17}
- \initial {.}
- \entry {\file {.mailrc} file}{264}
- \initial {/}
- \entry {// in file name}{38}
- \initial {A}
- \entry {A and B buffers (Emerge)}{223}
- \entry {Abbrev mode}{251}
- \entry {abbrevs}{251}
- \entry {aborting recursive edit}{374}
- \entry {accented characters}{77}
- \entry {accessible portion}{335}
- \entry {accumulating scattered text}{66}
- \entry {action options (command line)}{389}
- \entry {againformation}{341}
- \entry {alarm clock}{316}
- \entry {appending kills in the ring}{64}
- \entry {appointment notification}{316}
- \entry {apropos}{49}
- \entry {arguments (command line)}{389}
- \entry {arguments, numeric}{35}
- \entry {arguments, prefix}{35}
- \entry {arrow keys}{28}
- \entry {ASCII}{19}
- \entry {Asm mode}{237}
- \entry {astronomical day numbers}{306}
- \entry {attribute (Rmail)}{276}
- \entry {Auto Fill mode}{174}
- \entry {Auto Save mode}{113}
- \entry {Auto-Lower mode}{153}
- \entry {Auto-Raise mode}{153}
- \entry {autoload}{247}
- \entry {Awk mode}{199}
- \initial {B}
- \entry {back end (version control)}{116}
- \entry {backtrace for bug reports}{382}
- \entry {backup file}{109}
- \entry {base buffer}{138}
- \entry {batch mode}{391}
- \entry {binding}{21}
- \entry {blank lines}{32}
- \entry {blank lines in programs}{211}
- \entry {body lines (Outline mode)}{180}
- \entry {bold font}{157}
- \entry {bookmarks}{73}
- \entry {borders (X Windows)}{399}
- \entry {boredom}{342}
- \entry {branch (version control)}{123}
- \entry {buffer menu}{136}
- \entry {buffers}{133}
- \entry {buggestion}{342}
- \entry {bugs}{377}
- \entry {building programs}{239}
- \entry {button down events}{363}
- \entry {byte code}{247}
- \initial {C}
- \entry {C editing}{199}
- \entry {C mode}{228}
- \entry {C-}{19}
- \entry {C{\tt\char43}{\tt\char43} mode}{199}
- \entry {calendar}{299}
- \entry {calendar, first day of week}{300}
- \entry {capitalizing words}{178}
- \entry {case conversion}{178}
- \entry {centering}{176}
- \entry {change buffers}{133}
- \entry {change log}{214}
- \entry {Change Log mode}{215}
- \entry {changes, undoing}{30}
- \entry {character set (keyboard)}{19}
- \entry {characters (in text)}{22}
- \entry {checking in files}{117}
- \entry {checking out files}{117}
- \entry {checking spelling}{99}
- \entry {choosing a major mode}{161}
- \entry {click events}{363}
- \entry {collision}{111}
- \entry {color of window (X Windows)}{398}
- \entry {colors}{153}
- \entry {colors and faces}{158}
- \entry {columns (and rectangles)}{67}
- \entry {columns (indentation)}{165}
- \entry {columns, splitting}{336}
- \entry {Comint mode}{326}
- \entry {command}{21}
- \entry {command history}{43}
- \entry {command line arguments}{389}
- \entry {comments}{210}
- \entry {committing a change (CVS)}{120}
- \entry {comparing files}{130}
- \entry {compilation errors}{239}
- \entry {Compilation mode}{240}
- \entry {complete}{42}
- \entry {complete key}{20}
- \entry {completion}{39}
- \entry {completion (symbol names)}{213}
- \entry {completion in Lisp}{213}
- \entry {completion using tags}{213}
- \entry {conflict (CVS)}{120}
- \entry {connecting to remote host}{330}
- \entry {continuation line}{33}
- \entry {Control}{19}
- \entry {control characters}{19}
- \entry {Control-Meta}{200}
- \entry {converting text to upper or lower case}{178}
- \entry {copying files}{132}
- \entry {copying text}{63}
- \entry {correcting spelling}{99}
- \entry {crashes}{113}
- \entry {creating files}{105}
- \entry {creating frames}{151}
- \entry {current buffer}{133}
- \entry {cursor}{15}
- \entry {cursor location}{34}
- \entry {cursor motion}{28}
- \entry {customization}{343}
- \entry {customizing Lisp indentation}{205}
- \entry {cut buffer}{149}
- \entry {cutting and X}{148}
- \entry {cutting text}{61}
- \entry {CVS}{116}
- \entry {CVS (with VC)}{120}
- \initial {D}
- \entry {day of year}{302}
- \entry {daylight savings time}{317}
- \entry {DBX}{241}
- \entry {debuggers}{241}
- \entry {default argument}{37}
- \entry {default-frame-alist}{152}
- \entry {defining keyboard macros}{352}
- \entry {defuns}{202}
- \entry {deleting blank lines}{32}
- \entry {deleting characters and lines}{29}
- \entry {deleting files (in Dired)}{287}
- \entry {deletion}{61}
- \entry {deletion (of files)}{132}
- \entry {deletion (Rmail)}{271}
- \entry {desktop}{338}
- \entry {developediment}{342}
- \entry {diary}{309}
- \entry {diary file}{311}
- \entry {digest message}{284}
- \entry {directory header lines}{296}
- \entry {directory listing}{130}
- \entry {Dired}{287}
- \entry {Dired sorting}{297}
- \entry {disabled command}{365}
- \entry {\code {DISPLAY} environment variable}{395}
- \entry {display name (X Windows)}{395}
- \entry {display table}{22}
- \entry {doctor}{377}
- \entry {double clicks}{363}
- \entry {double slash in file name}{38}
- \entry {down events}{363}
- \entry {drag events}{363}
- \entry {drastic changes}{112}
- \entry {dribble file}{381}
- \initial {E}
- \entry {echo area}{16}
- \entry {editing binary files}{338}
- \entry {editing in Picture mode}{257}
- \entry {editing level, recursive}{339}
- \entry {\code {EDITOR} environment variable}{330}
- \entry {EDT}{340}
- \entry {Eliza}{377}
- \entry {Emacs as a server}{330}
- \entry {Emacs initialization file}{366}
- \entry {Emacs-Lisp mode}{247}
- \entry {emacsclient}{330}
- \entry {Emerge}{223}
- \entry {emulating other editors}{340}
- \entry {Enriched mode}{190}
- \entry {entering Emacs}{23}
- \entry {environment}{322}
- \entry {erasing characters and lines}{29}
- \entry {error log}{239}
- \entry {error message in the echo area}{16}
- \entry {\key {ESC} replacing \key {META} key}{19}
- \entry {\code {ESHELL} environment variable}{323}
- \entry {\code {etags} program}{217}
- \entry {European character set}{77}
- \entry {exiting}{24}
- \entry {exiting recursive edit}{339}
- \entry {expanding subdirectories in Dired}{295}
- \entry {expansion (of abbrevs)}{251}
- \entry {expansion of C macros}{229}
- \entry {expression}{200}
- \entry {expunging (Dired)}{288}
- \entry {expunging (Rmail)}{271}
- \initial {F}
- \entry {faces}{156}
- \entry {file dates}{111}
- \entry {file directory}{130}
- \entry {file names}{103}
- \entry {file truenames}{116}
- \entry {files}{103}
- \entry {files, visiting and saving}{105}
- \entry {fill prefix}{176}
- \entry {filling text}{174}
- \entry {\code {find} and Dired}{297}
- \entry {finding strings within text}{83}
- \entry {flagging files (in Dired)}{287}
- \entry {flow control}{376}
- \entry {font name (X Windows)}{396}
- \entry {Font-Lock mode}{157}
- \entry {fonts and faces}{157}
- \entry {formatted text}{190}
- \entry {formfeed}{173}
- \entry {Fortran continuation lines}{231}
- \entry {Fortran mode}{230}
- \entry {forwarding a message}{279}
- \entry {frames}{147}
- \entry {French Revolutionary calendar}{306}
- \entry {FTP}{104}
- \entry {function}{21}
- \entry {function definition}{21}
- \entry {function key}{356}
- \initial {G}
- \entry {GDB}{241}
- \entry {geometry (X Windows)}{398}
- \entry {getting help with keys}{32}
- \entry {global keymap}{355}
- \entry {global mark ring}{59}
- \entry {global substitution}{93}
- \entry {{\smallcaps gnus}}{319}
- \entry {Go Moku}{342}
- \entry {graphic characters}{27}
- \entry {Gregorian calendar}{306}
- \entry {growing minibuffer}{38}
- \entry {GUD library}{241}
- \initial {H}
- \entry {hard newline}{191}
- \entry {hardcopy}{331}
- \entry {head version}{124}
- \entry {header (\TeX{} mode)}{188}
- \entry {header line (Dired)}{296}
- \entry {headers (of mail message)}{262}
- \entry {heading lines (Outline mode)}{180}
- \entry {Hebrew calendar}{306}
- \entry {height of minibuffer}{38}
- \entry {help}{47}
- \entry {Hexl mode}{338}
- \entry {hiding in Dired (Dired)}{296}
- \entry {highlighting region}{56}
- \entry {history of commands}{43}
- \entry {history of minibuffer input}{42}
- \entry {history reference}{328}
- \entry {holidays}{303}
- \entry {hook}{347}
- \entry {horizontal scrolling}{76}
- \initial {I}
- \entry {Icomplete mode}{42}
- \entry {Icon mode}{199}
- \entry {icons (X Windows)}{400}
- \entry {ignoriginal}{342}
- \entry {in-situ subdirectory (Dired)}{295}
- \entry {inbox file}{272}
- \entry {incremental search}{83}
- \entry {indentation}{165}
- \entry {indentation for comments}{210}
- \entry {indentation for programs}{203}
- \entry {Indented Text mode}{179}
- \entry {indirect buffer}{138}
- \entry {indirect buffers and outlines}{184}
- \entry {inferior process}{239}
- \entry {Info}{52}
- \entry {init file}{366}
- \entry {initial options (command line)}{389}
- \entry {initial-frame-alist}{152}
- \entry {input event}{20}
- \entry {input with the keyboard}{19}
- \entry {inserted subdirectory (Dired)}{295}
- \entry {inserting blank lines}{32}
- \entry {insertion}{27}
- \entry {inverse video and faces}{158}
- \entry {invisible lines}{179}
- \entry {Islamic calendar}{306}
- \entry {ISO Accents mode}{78}
- \entry {ISO commercial calendar}{306}
- \entry {ISO Latin-1 character set}{77}
- \entry {\code {iso-syntax} library}{77}
- \entry {\code {iso-transl} library}{78}
- \entry {\code {ispell} program}{100}
- \entry {italic font}{157}
- \initial {J}
- \entry {Julian calendar}{306}
- \entry {Julian day numbers}{306}
- \entry {justification}{175}
- \initial {K}
- \entry {key}{20}
- \entry {key bindings}{355}
- \entry {key rebinding, permanent}{366}
- \entry {key rebinding, this session}{359}
- \entry {key sequence}{20}
- \entry {keyboard input}{19}
- \entry {keyboard macro}{352}
- \entry {keyboard translations}{365}
- \entry {keymap}{355}
- \entry {kill ring}{63}
- \entry {killing buffers}{136}
- \entry {killing characters and lines}{29}
- \entry {killing Emacs}{24}
- \entry {killing rectangular areas of text}{67}
- \entry {killing text}{61}
- \initial {L}
- \entry {label (Rmail)}{276}
- \entry {La\TeX{} mode}{184}
- \entry {leaving Emacs}{24}
- \entry {libraries}{246}
- \entry {line number commands}{34}
- \entry {Line Number mode}{79}
- \entry {line wrapping}{33}
- \entry {Lisp editing}{199}
- \entry {Lisp mode}{199}
- \entry {Lisp string syntax}{367}
- \entry {Lisp symbol completion}{213}
- \entry {list}{200}
- \entry {listing current buffers}{134}
- \entry {loading Lisp code}{246}
- \entry {local keymap}{357}
- \entry {local variables}{348}
- \entry {local variables in files}{350}
- \entry {location of point}{34}
- \entry {locking and version control}{117}
- \entry {locking files}{111}
- \entry {log entry}{120}
- \initial {M}
- \entry {M-}{19}
- \entry {macro expansion in C}{229}
- \entry {mail}{261}
- \entry {mail (on mode line)}{79}
- \entry {mail aliases}{264}
- \entry {\code {MAIL} environment variable}{272}
- \entry {Mail mode}{265}
- \entry {\code {MAILHOST} environment variable}{273}
- \entry {mailrc file}{264}
- \entry {major modes}{161}
- \entry {make}{239}
- \entry {Makefile mode}{199}
- \entry {making pictures out of text characters}{257}
- \entry {manipulating paragraphs}{172}
- \entry {manipulating sentences}{171}
- \entry {manipulating text}{169}
- \entry {manuals, on-line}{52}
- \entry {mark}{55}
- \entry {mark ring}{59}
- \entry {marking in Dired}{290}
- \entry {marking sections of text}{58}
- \entry {Markov chain}{342}
- \entry {master file}{117}
- \entry {matching parentheses}{209}
- \entry {Mayan calendar}{306}
- \entry {Mayan calendar round}{309}
- \entry {Mayan haab calendar}{309}
- \entry {Mayan long count}{309}
- \entry {Mayan tzolkin calendar}{309}
- \entry {memory full}{376}
- \entry {Menu Bar mode}{155}
- \entry {merge buffer (Emerge)}{223}
- \entry {merging files}{223}
- \entry {message}{261}
- \entry {message number}{269}
- \entry {messages saved from echo area}{17}
- \entry {Meta}{19}
- \entry {Meta commands and words}{169}
- \entry {minibuffer}{37}
- \entry {minibuffer history}{42}
- \entry {minibuffer keymaps}{358}
- \entry {minor mode keymap}{357}
- \entry {minor modes}{343}
- \entry {mistakes, correcting}{97}
- \entry {mode hook}{200}
- \entry {mode line}{17}
- \entry {mode, Abbrev}{251}
- \entry {mode, Auto Fill}{174}
- \entry {mode, Auto Save}{113}
- \entry {mode, C}{228}
- \entry {mode, Comint}{326}
- \entry {mode, Compilation}{240}
- \entry {mode, Emacs-Lisp}{247}
- \entry {mode, Enriched}{190}
- \entry {mode, Fortran}{230}
- \entry {mode, Indented Text}{179}
- \entry {mode, La\TeX{}}{184}
- \entry {mode, Line Number}{79}
- \entry {mode, major}{161}
- \entry {mode, Menu Bar}{155}
- \entry {mode, minor}{343}
- \entry {mode, Outline}{179}
- \entry {mode, Overwrite}{344}
- \entry {mode, Scroll Bar}{155}
- \entry {mode, Shell}{324}
- \entry {mode, Sli\TeX{}}{184}
- \entry {mode, \TeX{}}{184}
- \entry {mode, Text}{179}
- \entry {mode, Transient Mark}{56}
- \entry {modified (buffer)}{105}
- \entry {moon, phases of}{305}
- \entry {mouse}{356}
- \entry {mouse button events}{363}
- \entry {mouse buttons (what they do)}{147}
- \entry {\code {movemail} program}{272}
- \entry {movement}{28}
- \entry {moving inside the calendar}{299}
- \entry {moving point}{28}
- \entry {moving text}{63}
- \entry {moving the cursor}{28}
- \entry {MS-DOG}{409}
- \entry {MS-DOS}{409}
- \entry {multiple displays}{152}
- \entry {multiple views of outline}{183}
- \entry {multiple windows in Emacs}{141}
- \entry {mustatement}{342}
- \initial {N}
- \entry {named configurations (RCS)}{127}
- \entry {narrowing}{335}
- \entry {newline}{27}
- \entry {newlines, hard and soft}{191}
- \entry {NFS and quitting}{373}
- \entry {nonincremental search}{86}
- \entry {\code {noutline}}{183}
- \entry {nroff}{189}
- \entry {NSA}{268}
- \entry {numeric arguments}{35}
- \initial {O}
- \entry {on-line manuals}{52}
- \entry {operating on files in Dired}{291}
- \entry {operations on a marked region}{57}
- \entry {option}{345}
- \entry {options (command line)}{389}
- \entry {other editors}{340}
- \entry {out of memory}{376}
- \entry {Outline mode}{179}
- \entry {outline with multiple views}{183}
- \entry {outragedy}{342}
- \entry {Overwrite mode}{344}
- \initial {P}
- \entry {pages}{173}
- \entry {paragraphs}{172}
- \entry {\code {paren} library}{209}
- \entry {parentheses}{209}
- \entry {parts of the screen}{15}
- \entry {pasting}{63}
- \entry {pasting and X}{148}
- \entry {patches, sending}{385}
- \entry {per-buffer variables}{348}
- \entry {Perl mode}{199}
- \entry {Perldb}{241}
- \entry {phases of the moon}{305}
- \entry {Picture mode and rectangles}{259}
- \entry {pictures}{257}
- \entry {point}{15}
- \entry {point location}{34}
- \entry {POP inboxes}{273}
- \entry {prefix arguments}{35}
- \entry {prefix key}{20}
- \entry {preprocessor highlighting}{229}
- \entry {presidentagon}{341}
- \entry {primary Rmail file}{269}
- \entry {primary selection}{149}
- \entry {program building}{239}
- \entry {program editing}{199}
- \entry {prompt}{37}
- \entry {properbose}{342}
- \entry {puzzles}{342}
- \initial {Q}
- \entry {query replace}{94}
- \entry {quitting}{373}
- \entry {quitting (in search)}{84}
- \entry {quitting Emacs}{24}
- \entry {quoting}{27}
- \initial {R}
- \entry {RCS}{116}
- \entry {read-only buffer}{135}
- \entry {reading mail}{269}
- \entry {reading netnews}{319}
- \entry {rebinding keys, permanently}{366}
- \entry {rebinding keys, this session}{359}
- \entry {rebinding major mode keys}{358}
- \entry {rebinding mouse buttons}{363}
- \entry {rectangle}{67}
- \entry {rectangles and Picture mode}{259}
- \entry {recursive editing level}{339}
- \entry {regexp}{87}
- \entry {regexp syntax}{88}
- \entry {region}{55}
- \entry {\code {region} face}{157}
- \entry {region highlighting}{56, 157}
- \entry {registered file}{117}
- \entry {registers}{71}
- \entry {regular expression}{87}
- \entry {remote file access}{104}
- \entry {remote host}{330}
- \entry {replacement}{93}
- \entry {reply to a message}{278}
- \entry {\code {REPLYTO} environment variable}{263}
- \entry {reporting bugs}{379}
- \entry {Resize-Minibuffer mode}{38}
- \entry {resources}{401}
- \entry {restriction}{335}
- \entry {retrying a failed message}{279}
- \entry {Rlogin}{330}
- \entry {Rmail}{269}
- \entry {rot13 code}{284}
- \entry {running Lisp functions}{239}
- \initial {S}
- \entry {saved echo area messages}{17}
- \entry {saving}{105}
- \entry {saving keyboard macros}{354}
- \entry {saving sessions}{338}
- \entry {SCCS}{116}
- \entry {Scheme mode}{199}
- \entry {screen}{15}
- \entry {Scroll Bar mode}{155}
- \entry {scrolling}{75}
- \entry {scrolling in the calendar}{301}
- \entry {SDB}{241}
- \entry {search-and-replace commands}{93}
- \entry {searching}{83}
- \entry {secondary selection}{149}
- \entry {selected buffer}{133}
- \entry {selected window}{141}
- \entry {selecting buffers in other windows}{143}
- \entry {selection, primary}{149}
- \entry {selective display}{179}
- \entry {self-documentation}{47}
- \entry {sending mail}{261}
- \entry {sending patches for GNU Emacs}{385}
- \entry {sentences}{171}
- \entry {server}{330}
- \entry {server (using Emacs as)}{330}
- \entry {setting a mark}{55}
- \entry {setting variables}{346}
- \entry {sexp}{200}
- \entry {shell commands}{322}
- \entry {shell commands, Dired}{293}
- \entry {\code {SHELL} environment variable}{323}
- \entry {Shell mode}{324}
- \entry {simultaneous editing}{111}
- \entry {size of minibuffer}{38}
- \entry {slashes repeated in file name}{38}
- \entry {Sli\TeX{} mode}{184}
- \entry {snapshots and version control}{126}
- \entry {soft newline}{191}
- \entry {sorting}{333}
- \entry {sorting Dired buffer}{297}
- \entry {spelling, checking and correcting}{99}
- \entry {splitting columns}{336}
- \entry {starting Emacs}{23}
- \entry {startup (command line arguments)}{389}
- \entry {startup (init file)}{366}
- \entry {string substitution}{93}
- \entry {string syntax}{367}
- \entry {subdirectories in Dired}{295}
- \entry {subscribe newsgroups}{320}
- \entry {subshell}{322}
- \entry {subtree (Outline mode)}{183}
- \entry {summary (Rmail)}{280}
- \entry {sunrise and sunset}{304}
- \entry {suspending}{24}
- \entry {switch buffers}{133}
- \entry {switches (command line)}{389}
- \entry {syntax table}{366}
- \initial {T}
- \entry {tab stops}{167}
- \entry {tables, indentation for}{167}
- \entry {tags completion}{213}
- \entry {tags table}{216}
- \entry {Tcl mode}{199}
- \entry {techniquitous}{342}
- \entry {television}{64}
- \entry {Telnet}{330}
- \entry {\code {TERM} environment variable}{381}
- \entry {termscript file}{381}
- \entry {\TeX{} mode}{184}
- \entry {TEXEDIT environment variable}{330}
- \entry {\code {TEXINPUTS} environment variable}{187}
- \entry {text}{169}
- \entry {Text mode}{179}
- \entry {time (on mode line)}{79}
- \entry {top level}{17}
- \entry {tower of Hanoi}{342}
- \entry {Transient Mark mode}{56}
- \entry {transposition}{202}
- \entry {triple clicks}{363}
- \entry {truenames of files}{116}
- \entry {truncation}{33}
- \entry {trunk (version control)}{123}
- \entry {two-column editing}{336}
- \entry {typos, fixing}{97}
- \initial {U}
- \entry {undeletion (Rmail)}{272}
- \entry {underlining and faces}{158}
- \entry {undigestify}{284}
- \entry {undo}{30}
- \entry {undo limit}{31}
- \entry {unsubscribe newsgroups}{320}
- \entry {userenced}{342}
- \entry {using tab stops in making tables}{167}
- \initial {V}
- \entry {variable}{345}
- \entry {version control}{116}
- \entry {\code {VERSION{\_}CONTROL} environment variable}{109}
- \entry {vi}{340}
- \entry {View mode}{131}
- \entry {viewing}{131}
- \entry {views of an outline}{183}
- \entry {visiting}{105}
- \entry {visiting files}{104}
- \initial {W}
- \entry {weeks, which day they start on}{300}
- \entry {widening}{335}
- \entry {windows in Emacs}{141}
- \entry {word processing}{190}
- \entry {word search}{86}
- \entry {words}{169}
- \entry {words, case conversion}{178}
- \entry {work file}{117}
- \entry {wrapping}{33}
- \entry {WYSIWYG}{190}
- \initial {X}
- \entry {X cutting and pasting}{148}
- \entry {X pasting and cutting}{148}
- \entry {XDB}{241}
- \entry {xon-xoff}{376}
- \initial {Y}
- \entry {yahrzeits}{308}
- \entry {yanking}{63}
- \entry {yanking previous kills}{65}
- \initial {Z}
- \entry {Zippy}{342}
--- 0 ----
Index: emacs/man/emacs.fns
diff -c emacs/man/emacs.fns:1.1.1.2 emacs/man/emacs.fns:removed
*** emacs/man/emacs.fns:1.1.1.2	Mon Jul 22 01:54:49 1996
--- emacs/man/emacs.fns	Fri Aug  2 21:01:48 1996
***************
*** 1,862 ****
- \initial {A}
- \entry {\code {abbrev-mode}}{251}
- \entry {\code {abbrev-prefix-mark}}{253}
- \entry {\code {abort-recursive-edit}}{374}
- \entry {\code {add-change-log-entry-other-window}}{214}
- \entry {\code {add-global-abbrev}}{252}
- \entry {\code {add-mode-abbrev}}{252}
- \entry {\code {add-name-to-file}}{132}
- \entry {\code {american-calendar}}{313}
- \entry {\code {append-next-kill}}{65}
- \entry {\code {append-to-buffer}}{66}
- \entry {\code {append-to-file}}{66}
- \entry {\code {appt-add}}{316}
- \entry {\code {appt-delete}}{316}
- \entry {\code {appt-make-list}}{316}
- \entry {\code {apropos}}{50}
- \entry {\code {ask-user-about-lock}}{111}
- \entry {\code {auto-fill-mode}}{174}
- \entry {\code {auto-lower-mode}}{153}
- \entry {\code {auto-raise-mode}}{153}
- \entry {\code {auto-save-mode}}{114}
- \initial {B}
- \entry {\code {back-to-indentation}}{165}
- \entry {\code {backward-char}}{28}
- \entry {\code {backward-delete-char-untabify}}{200}
- \entry {\code {backward-kill-sentence}}{171}
- \entry {\code {backward-kill-sexp}}{201}
- \entry {\code {backward-kill-word}}{170}
- \entry {\code {backward-list}}{201}
- \entry {\code {backward-page}}{173}
- \entry {\code {backward-paragraph}}{172}
- \entry {\code {backward-sentence}}{171}
- \entry {\code {backward-sexp}}{201}
- \entry {\code {backward-text-line}}{189}
- \entry {\code {backward-up-list}}{202}
- \entry {\code {backward-word}}{170}
- \entry {\code {beginning-of-buffer}}{28}
- \entry {\code {beginning-of-defun}}{202}
- \entry {\code {beginning-of-fortran-subprogram}}{230}
- \entry {\code {beginning-of-line}}{28}
- \entry {\code {binary-overwrite-mode}}{344}
- \entry {\code {blackbox}}{342}
- \entry {\code {bookmark-delete}}{74}
- \entry {\code {bookmark-insert}}{74}
- \entry {\code {bookmark-jump}}{73}
- \entry {\code {bookmark-load}}{74}
- \entry {\code {bookmark-locale}}{74}
- \entry {\code {bookmark-save}}{73}
- \entry {\code {bookmark-set}}{73}
- \entry {\code {bookmark-write}}{74}
- \entry {\code {buffer-menu}}{137}
- \initial {C}
- \entry {\code {c-backslash-region}}{229}
- \entry {\code {c-backward-conditional}}{229}
- \entry {\code {c-beginning-of-statement}}{228}
- \entry {\code {c-end-of-statement}}{228}
- \entry {\code {c-fill-paragraph}}{229}
- \entry {\code {c-forward-conditional}}{229}
- \entry {\code {c-indent-line}}{204}
- \entry {\code {c-macro-expand}}{229}
- \entry {\code {c-up-conditional}}{229}
- \entry {\code {calendar}}{299}
- \entry {\code {calendar-backward-day}}{299}
- \entry {\code {calendar-backward-month}}{300}
- \entry {\code {calendar-backward-week}}{299}
- \entry {\code {calendar-beginning-of-month}}{300}
- \entry {\code {calendar-beginning-of-week}}{300}
- \entry {\code {calendar-beginning-of-year}}{300}
- \entry {\code {calendar-count-days-region}}{302}
- \entry {\code {calendar-cursor-holidays}}{303}
- \entry {\code {calendar-end-of-month}}{300}
- \entry {\code {calendar-end-of-week}}{300}
- \entry {\code {calendar-end-of-year}}{300}
- \entry {\code {calendar-forward-day}}{299}
- \entry {\code {calendar-forward-month}}{300}
- \entry {\code {calendar-forward-week}}{299}
- \entry {\code {calendar-forward-year}}{300}
- \entry {\code {calendar-goto-astro-day-number}}{307}
- \entry {\code {calendar-goto-date}}{301}
- \entry {\code {calendar-goto-french-date}}{307}
- \entry {\code {calendar-goto-hebrew-date}}{307}
- \entry {\code {calendar-goto-islamic-date}}{307}
- \entry {\code {calendar-goto-iso-date}}{307}
- \entry {\code {calendar-goto-julian-date}}{307}
- \entry {\code {calendar-goto-mayan-long-count-date}}{309}
- \entry {\code {calendar-goto-today}}{301}
- \entry {\code {calendar-next-calendar-round-date}}{309}
- \entry {\code {calendar-next-haab-date}}{309}
- \entry {\code {calendar-next-tzolkin-date}}{309}
- \entry {\code {calendar-other-month}}{301}
- \entry {\code {calendar-phases-of-moon}}{305}
- \entry {\code {calendar-previous-haab-date}}{309}
- \entry {\code {calendar-previous-tzolkin-date}}{309}
- \entry {\code {calendar-print-astro-day-number}}{307}
- \entry {\code {calendar-print-day-of-year}}{302}
- \entry {\code {calendar-print-french-date}}{307}
- \entry {\code {calendar-print-hebrew-date}}{307}
- \entry {\code {calendar-print-islamic-date}}{307}
- \entry {\code {calendar-print-iso-date}}{307}
- \entry {\code {calendar-print-julian-date}}{307}
- \entry {\code {calendar-print-mayan-date}}{307}
- \entry {\code {calendar-sunrise-sunset}}{304}
- \entry {\code {calendar-unmark}}{303}
- \entry {\code {call-last-kbd-macro}}{353}
- \entry {\code {capitalize-word}}{178}
- \entry {\code {center-line}}{176}
- \entry {\code {change-log-mode}}{215}
- \entry {\code {choose-completion}}{41}
- \entry {\code {clear-rectangle}}{68}
- \entry {\code {comint-bol}}{325}
- \entry {\code {comint-continue-subjob}}{326}
- \entry {\code {comint-copy-old-input}}{328}
- \entry {\code {comint-delchar-or-maybe-eof}}{325}
- \entry {\code {comint-dynamic-complete}}{324}
- \entry {\code {comint-dynamic-complete-variable}}{329}
- \entry {\code {comint-dynamic-list-filename\dots {}}}{325}
- \entry {\code {comint-dynamic-list-input-ring}}{325}
- \entry {\code {comint-interrupt-subjob}}{325}
- \entry {\code {comint-kill-input}}{325}
- \entry {\code {comint-kill-output}}{325}
- \entry {\code {comint-magic-space}}{328}
- \entry {\code {comint-next-input}}{327}
- \entry {\code {comint-next-matching-input}}{327}
- \entry {\code {comint-next-prompt}}{328}
- \entry {\code {comint-previous-input}}{327}
- \entry {\code {comint-previous-matching-input}}{327}
- \entry {\code {comint-previous-prompt}}{328}
- \entry {\code {comint-quit-subjob}}{325}
- \entry {\code {comint-run}}{326}
- \entry {\code {comint-send-input}}{324}
- \entry {\code {comint-show-maximum-output}}{325}
- \entry {\code {comint-show-output}}{325}
- \entry {\code {comint-stop-subjob}}{325}
- \entry {\code {comint-strip-ctrl-m}}{326}
- \entry {\code {comint-truncate-buffer}}{326}
- \entry {\code {command-apropos}}{49}
- \entry {\code {comment-region}}{211}
- \entry {\code {compare-windows}}{131}
- \entry {\code {compile}}{239}
- \entry {\code {compile-goto-error}}{240}
- \entry {\code {complete-tag}}{213}
- \entry {\code {copy-file}}{132}
- \entry {\code {copy-to-buffer}}{66}
- \entry {\code {copy-to-register}}{71}
- \entry {\code {count-lines-page}}{173}
- \entry {\code {count-lines-region}}{34}
- \entry {\code {count-matches}}{96}
- \entry {\code {count-text-lines}}{189}
- \entry {\code {cpp-highlight-buffer}}{229}
- \initial {D}
- \entry {\code {dabbrev-completion}}{255}
- \entry {\code {dabbrev-expand}}{255}
- \entry {\code {dbx}}{242}
- \entry {\code {debug{\_}print}}{383}
- \entry {\code {default-value}}{349}
- \entry {\code {define-abbrevs}}{255}
- \entry {\code {define-key}}{360}
- \entry {\code {define-mail-abbrev}}{265}
- \entry {\code {define-mail-alias}}{264}
- \entry {\code {delete-backward-char}}{61}
- \entry {\code {delete-blank-lines}}{32}
- \entry {\code {delete-char}}{61}
- \entry {\code {delete-file}}{132}
- \entry {\code {delete-frame}}{159}
- \entry {\code {delete-horizontal-space}}{62}
- \entry {\code {delete-indentation}}{166}
- \entry {\code {delete-matching-lines}}{96}
- \entry {\code {delete-non-matching-lines}}{96}
- \entry {\code {delete-other-windows}}{145}
- \entry {\code {delete-rectangle}}{68}
- \entry {\code {delete-window}}{145}
- \entry {\code {describe-bindings}}{52}
- \entry {\code {describe-copying}}{52}
- \entry {\code {describe-distribution}}{52}
- \entry {\code {describe-function}}{48}
- \entry {\code {describe-key}}{48}
- \entry {\code {describe-key-briefly}}{48}
- \entry {\code {describe-mode}}{52}
- \entry {\code {describe-no-warranty}}{52}
- \entry {\code {describe-project}}{52}
- \entry {\code {describe-syntax}}{366}
- \entry {\code {desktop-save}}{338}
- \entry {\code {diary}}{311}
- \entry {\code {diary-anniversary}}{314}
- \entry {\code {diary-block}}{315}
- \entry {\code {diary-cyclic}}{315}
- \entry {\code {diary-float}}{315}
- \entry {\code {diff}}{130}
- \entry {\code {diff-backup}}{131}
- \entry {\code {digit-argument}}{35}
- \entry {\code {dired}}{287}
- \entry {\code {dired-backup-diff}}{295}
- \entry {\code {dired-change-marks}}{290}
- \entry {\code {dired-create-directory}}{293}
- \entry {\code {dired-diff}}{295}
- \entry {\code {dired-display-file}}{289}
- \entry {\code {dired-do-byte-compile}}{292}
- \entry {\code {dired-do-chgrp}}{292}
- \entry {\code {dired-do-chmod}}{292}
- \entry {\code {dired-do-chown}}{292}
- \entry {\code {dired-do-compress}}{292}
- \entry {\code {dired-do-copy}}{291}
- \entry {\code {dired-do-copy-regexp}}{294}
- \entry {\code {dired-do-hardlink}}{292}
- \entry {\code {dired-do-hardlink-regexp}}{294}
- \entry {\code {dired-do-kill-lines}}{297}
- \entry {\code {dired-do-load}}{292}
- \entry {\code {dired-do-print}}{292}
- \entry {\code {dired-do-query-replace}}{292}
- \entry {\code {dired-do-redisplay}}{297}
- \entry {\code {dired-do-rename}}{291}
- \entry {\code {dired-do-rename-regexp}}{294}
- \entry {\code {dired-do-search}}{292}
- \entry {\code {dired-do-shell-command}}{293}
- \entry {\code {dired-do-symlink}}{292}
- \entry {\code {dired-do-symlink-regexp}}{294}
- \entry {\code {dired-downcase}}{294}
- \entry {\code {dired-expunge}}{288}
- \entry {\code {dired-find-file}}{289}
- \entry {\code {dired-find-file-other-window}}{289}
- \entry {\code {dired-flag-auto-save-files}}{288}
- \entry {\code {dired-flag-backup-files}}{288}
- \entry {\code {dired-flag-clean-directory}}{288}
- \entry {\code {dired-flag-files-regexp}}{289}
- \entry {\code {dired-hide-all}}{296}
- \entry {\code {dired-hide-subdir}}{296}
- \entry {\code {dired-mark}}{290}
- \entry {\code {dired-mark-directories}}{290}
- \entry {\code {dired-mark-executables}}{290}
- \entry {\code {dired-mark-files-regexp}}{291}
- \entry {\code {dired-mark-symlinks}}{290}
- \entry {\code {dired-maybe-insert-subdir}}{295}
- \entry {\code {dired-mouse-find-file-other-window}}{289}
- \entry {\code {dired-next-subdir}}{296}
- \entry {\code {dired-other-frame}}{287}
- \entry {\code {dired-other-window}}{287}
- \entry {\code {dired-prev-subdir}}{296}
- \entry {\code {dired-sort-toggle-or-edit}}{297}
- \entry {\code {dired-tree-down}}{296}
- \entry {\code {dired-tree-up}}{296}
- \entry {\code {dired-unmark-all-files}}{290}
- \entry {\code {dired-upcase}}{294}
- \entry {\code {dired-view-file}}{290}
- \entry {\code {dirs}}{324}
- \entry {\code {disable-command}}{365}
- \entry {\code {display-time}}{79}
- \entry {\code {dissociated-press}}{341}
- \entry {\code {do-auto-save}}{114}
- \entry {\code {doctor}}{377}
- \entry {\code {down-list}}{202}
- \entry {\code {downcase-region}}{178}
- \entry {\code {downcase-word}}{178}
- \entry {\code {dunnet}}{342}
- \initial {E}
- \entry {\code {edit-abbrevs}}{254}
- \entry {\code {edit-kbd-macro}}{353}
- \entry {\code {edit-options}}{347}
- \entry {\code {edit-picture}}{257}
- \entry {\code {edit-tab-stops}}{167}
- \entry {\code {edit-tab-stops-note-changes}}{167}
- \entry {\code {edt-emulation-off}}{340}
- \entry {\code {edt-emulation-on}}{340}
- \entry {\code {electric-nroff-mode}}{189}
- \entry {\code {emacs-lisp-mode}}{247}
- \entry {\code {emacs-version}}{379}
- \entry {\code {emerge-auto-advance-mode}}{225}
- \entry {\code {emerge-buffers}}{223}
- \entry {\code {emerge-buffers-with-ancestor}}{223}
- \entry {\code {emerge-files}}{223}
- \entry {\code {emerge-files-with-ancestor}}{223}
- \entry {\code {emerge-skip-prefers-mode}}{225}
- \entry {\code {enable-command}}{365}
- \entry {\code {enable-flow-control}}{376}
- \entry {\code {enable-flow-control-on}}{376}
- \entry {\code {enable-local-eval}}{351}
- \entry {\code {enable-local-variables}}{351}
- \entry {\code {end-kbd-macro}}{353}
- \entry {\code {end-of-buffer}}{28}
- \entry {\code {end-of-defun}}{202}
- \entry {\code {end-of-fortran-subprogram}}{230}
- \entry {\code {end-of-line}}{28}
- \entry {\code {enlarge-window}}{145}
- \entry {\code {enlarge-window-horizontally}}{145}
- \entry {\code {enriched-mode}}{190}
- \entry {\code {european-calendar}}{313}
- \entry {\code {eval-current-buffer}}{248}
- \entry {\code {eval-defun}}{248}
- \entry {\code {eval-expression}}{248}
- \entry {\code {eval-last-sexp}}{248}
- \entry {\code {eval-region}}{248}
- \entry {\code {exchange-point-and-mark}}{56}
- \entry {\code {execute-extended-command}}{45}
- \entry {\code {exit-calendar}}{302}
- \entry {\code {exit-recursive-edit}}{339}
- \entry {\code {expand-abbrev}}{253}
- \entry {\code {expand-region-abbrevs}}{253}
- \initial {F}
- \entry {\code {facemenu-remove-all}}{192}
- \entry {\code {facemenu-remove-props}}{192}
- \entry {\code {facemenu-set-background}}{194}
- \entry {\code {facemenu-set-bold}}{192}
- \entry {\code {facemenu-set-bold-italic}}{192}
- \entry {\code {facemenu-set-default}}{192}
- \entry {\code {facemenu-set-face}}{193}
- \entry {\code {facemenu-set-foreground}}{194}
- \entry {\code {facemenu-set-italic}}{192}
- \entry {\code {facemenu-set-underline}}{192}
- \entry {\code {fill-c{\tt\char43}{\tt\char43}-comment}}{229}
- \entry {\code {fill-individual-paragraphs}}{177}
- \entry {\code {fill-nonuniform-paragraphs}}{177}
- \entry {\code {fill-paragraph}}{175}
- \entry {\code {fill-region}}{175}
- \entry {\code {fill-region-as-paragraph}}{175}
- \entry {\code {find-alternate-file}}{106}
- \entry {\code {find-dired}}{298}
- \entry {\code {find-file}}{105}
- \entry {\code {find-file-other-frame}}{106}
- \entry {\code {find-file-other-window}}{106}
- \entry {\code {find-file-read-only}}{106}
- \entry {\code {find-file-read-only-other-frame}}{152}
- \entry {\code {find-grep-dired}}{298}
- \entry {\code {find-name-dired}}{297}
- \entry {\code {find-tag}}{220}
- \entry {\code {find-tag-other-frame}}{220}
- \entry {\code {find-tag-other-window}}{220}
- \entry {\code {find-tag-regexp}}{221}
- \entry {\code {finder-by-keyword}}{50}
- \entry {\code {flush-lines}}{96}
- \entry {\code {font-lock-mode}}{157}
- \entry {\code {fortran-auto-fill-mode}}{235}
- \entry {\code {fortran-column-ruler}}{236}
- \entry {\code {fortran-comment-region}}{235}
- \entry {\code {fortran-indent-line}}{231}
- \entry {\code {fortran-indent-new-line}}{231}
- \entry {\code {fortran-indent-subprogram}}{231}
- \entry {\code {fortran-mode}}{230}
- \entry {\code {fortran-next-statement}}{230}
- \entry {\code {fortran-previous-statement}}{230}
- \entry {\code {fortran-split-line}}{231}
- \entry {\code {fortran-window-create}}{236}
- \entry {\code {forward-char}}{28}
- \entry {\code {forward-list}}{201}
- \entry {\code {forward-page}}{173}
- \entry {\code {forward-paragraph}}{172}
- \entry {\code {forward-sentence}}{171}
- \entry {\code {forward-sexp}}{201}
- \entry {\code {forward-text-line}}{189}
- \entry {\code {forward-word}}{170}
- \entry {\code {frame-configuration-to-register}}{72}
- \initial {G}
- \entry {\code {gdb}}{242}
- \entry {\code {global-set-key}}{359}
- \entry {\code {global-unset-key}}{359}
- \entry {\code {gnus}}{319}
- \entry {\code {gnus-group-exit}}{320}
- \entry {\code {gnus-group-kill-group}}{321}
- \entry {\code {gnus-group-list-all-groups}}{320}
- \entry {\code {gnus-group-list-groups}}{320}
- \entry {\code {gnus-group-next-group}}{321}
- \entry {\code {gnus-group-next-unread-group}}{321}
- \entry {\code {gnus-group-prev-group}}{321}
- \entry {\code {gnus-group-prev-unread-group}}{321}
- \entry {\code {gnus-group-read-group}}{321}
- \entry {\code {gnus-group-suspend}}{320}
- \entry {\code {gnus-group-unsubscribe-current-group}}{320}
- \entry {\code {gnus-summary-isearch-article}}{321}
- \entry {\code {gnus-summary-next-same-subject}}{322}
- \entry {\code {gnus-summary-next-subject}}{321}
- \entry {\code {gnus-summary-next-unread-article}}{321}
- \entry {\code {gnus-summary-prev-page}}{321}
- \entry {\code {gnus-summary-prev-same-subject}}{322}
- \entry {\code {gnus-summary-prev-subject}}{321}
- \entry {\code {gnus-summary-prev-unread-article}}{321}
- \entry {\code {gnus-summary-search-article-forward}}{321}
- \entry {\code {gnus-summary-sort-by-author}}{321}
- \entry {\code {gnus-summary-sort-by-date}}{321}
- \entry {\code {gnus-summary-sort-by-number}}{321}
- \entry {\code {gnus-summary-sort-by-subject}}{321}
- \entry {\code {gomoku}}{342}
- \entry {\code {goto-char}}{28}
- \entry {\code {goto-line}}{28}
- \entry {\code {grep}}{240}
- \entry {\code {gud-cont}}{244}
- \entry {\code {gud-def}}{245}
- \entry {\code {gud-down}}{244}
- \entry {\code {gud-finish}}{244}
- \entry {\code {gud-gdb-complete-command}}{244}
- \entry {\code {gud-next}}{243}
- \entry {\code {gud-refresh}}{243}
- \entry {\code {gud-remove}}{244}
- \entry {\code {gud-step}}{243}
- \entry {\code {gud-stepi}}{243}
- \entry {\code {gud-tbreak}}{244}
- \entry {\code {gud-up}}{244}
- \initial {H}
- \entry {\code {hanoi}}{342}
- \entry {\code {help-with-tutorial}}{27}
- \entry {\code {hide-body}}{183}
- \entry {\code {hide-entry}}{183}
- \entry {\code {hide-leaves}}{183}
- \entry {\code {hide-other}}{183}
- \entry {\code {hide-sublevels}}{183}
- \entry {\code {hide-subtree}}{183}
- \entry {\code {holidays}}{303}
- \initial {I}
- \entry {\code {iconify-or-deiconify-frame}}{159}
- \entry {\code {increase-left-margin}}{194}
- \entry {\code {indent-c-exp}}{204}
- \entry {\code {indent-for-comment}}{210}
- \entry {\code {indent-new-comment-line}}{211}
- \entry {\code {indent-region}}{166}
- \entry {\code {indent-relative}}{166}
- \entry {\code {indent-rigidly}}{166}
- \entry {\code {indent-sexp}}{204}
- \entry {\code {indented-text-mode}}{179}
- \entry {\code {info}}{52}
- \entry {\code {Info-goto-emacs-command-node}}{52}
- \entry {\code {Info-goto-emacs-key-command-node}}{52}
- \entry {\code {insert-abbrevs}}{255}
- \entry {\code {insert-anniversary-diary-entry}}{314}
- \entry {\code {insert-block-diary-entry}}{315}
- \entry {\code {insert-cyclic-diary-entry}}{315}
- \entry {\code {insert-diary-entry}}{314}
- \entry {\code {insert-file}}{131}
- \entry {\code {insert-kbd-macro}}{354}
- \entry {\code {insert-monthly-diary-entry}}{314}
- \entry {\code {insert-parentheses}}{213}
- \entry {\code {insert-register}}{71}
- \entry {\code {insert-weekly-diary-entry}}{314}
- \entry {\code {insert-yearly-diary-entry}}{314}
- \entry {\code {inverse-add-global-abbrev}}{252}
- \entry {\code {inverse-add-mode-abbrev}}{252}
- \entry {\code {invert-face}}{158}
- \entry {\code {isearch-backward}}{85}
- \entry {\code {isearch-backward-regexp}}{87}
- \entry {\code {isearch-forward}}{83}
- \entry {\code {isearch-forward-regexp}}{87}
- \entry {\code {iso-accents-mode}}{78}
- \entry {\code {ispell-buffer}}{99}
- \entry {\code {ispell-complete-word}}{100}
- \entry {\code {ispell-kill-ispell}}{100}
- \entry {\code {ispell-message}}{267}
- \entry {\code {ispell-region}}{99}
- \entry {\code {ispell-word}}{99}
- \initial {J}
- \entry {\code {jump-to-register}}{71}
- \entry {\code {just-one-space}}{62}
- \initial {K}
- \entry {\code {kbd-macro-query}}{354}
- \entry {\code {keep-lines}}{96}
- \entry {\code {keyboard-escape-quit}}{374}
- \entry {\code {keyboard-translate}}{365}
- \entry {\code {kill-all-abbrevs}}{252}
- \entry {\code {kill-buffer}}{136}
- \entry {\code {kill-comment}}{211}
- \entry {\code {kill-compilation}}{240}
- \entry {\code {kill-line}}{62}
- \entry {\code {kill-local-variable}}{349}
- \entry {\code {kill-rectangle}}{68}
- \entry {\code {kill-region}}{63}
- \entry {\code {kill-ring-save}}{64}
- \entry {\code {kill-sentence}}{171}
- \entry {\code {kill-sexp}}{201}
- \entry {\code {kill-some-buffers}}{136}
- \entry {\code {kill-word}}{170}
- \initial {L}
- \entry {\code {latex-mode}}{184}
- \entry {\code {line-number-mode}}{79}
- \entry {\code {lisp-complete-symbol}}{213}
- \entry {\code {lisp-eval-defun}}{249}
- \entry {\code {lisp-indent-line}}{204}
- \entry {\code {lisp-interaction-mode}}{249}
- \entry {\code {lisp-mode}}{249}
- \entry {\code {list-abbrevs}}{254}
- \entry {\code {list-bookmarks}}{73}
- \entry {\code {list-buffers}}{134}
- \entry {\code {list-calendar-holidays}}{303}
- \entry {\code {list-colors-display}}{158}
- \entry {\code {list-command-history}}{43}
- \entry {\code {list-directory}}{130}
- \entry {\code {list-faces-display}}{156}
- \entry {\code {list-matching-lines}}{96}
- \entry {\code {list-options}}{347}
- \entry {\code {list-tags}}{222}
- \entry {\code {list-text-properties-at}}{192}
- \entry {\code {list-yahrzeit-dates}}{308}
- \entry {\code {load}}{246}
- \entry {\code {load-file}}{246}
- \entry {\code {load-library}}{246}
- \entry {\code {local-set-key}}{359}
- \entry {\code {local-unset-key}}{359}
- \entry {\code {lpr-buffer}}{332}
- \entry {\code {lpr-region}}{332}
- \initial {M}
- \entry {\code {mail}}{261}
- \entry {\code {mail-bcc}}{266}
- \entry {\code {mail-cc}}{266}
- \entry {\code {mail-fcc}}{266}
- \entry {\code {mail-fill-yanked-message}}{267}
- \entry {\code {mail-interactive-insert-alias}}{265}
- \entry {\code {mail-other-frame}}{261}
- \entry {\code {mail-other-window}}{261}
- \entry {\code {mail-send}}{266}
- \entry {\code {mail-send-and-exit}}{266}
- \entry {\code {mail-signature}}{266}
- \entry {\code {mail-subject}}{266}
- \entry {\code {mail-text}}{266}
- \entry {\code {mail-to}}{266}
- \entry {\code {mail-yank-original}}{267}
- \entry {\code {make-face-bold}}{157}
- \entry {\code {make-face-bold-italic}}{157}
- \entry {\code {make-face-italic}}{157}
- \entry {\code {make-face-unbold}}{157}
- \entry {\code {make-face-unitalic}}{157}
- \entry {\code {make-frame}}{151}
- \entry {\code {make-frame-on-display}}{152}
- \entry {\code {make-indirect-buffer}}{138}
- \entry {\code {make-local-variable}}{348}
- \entry {\code {make-symbolic-link}}{132}
- \entry {\code {make-variable-buffer-local}}{348}
- \entry {\code {Man-fontify-manpage}}{214}
- \entry {\code {manual-entry}}{214}
- \entry {\code {mark-calendar-holidays}}{303}
- \entry {\code {mark-defun}}{202}
- \entry {\code {mark-diary-entries}}{311}
- \entry {\code {mark-fortran-subprogram}}{230}
- \entry {\code {mark-page}}{173}
- \entry {\code {mark-paragraph}}{172}
- \entry {\code {mark-sexp}}{202}
- \entry {\code {mark-whole-buffer}}{58}
- \entry {\code {mark-word}}{170}
- \entry {\code {minibuffer-complete}}{39}
- \entry {\code {minibuffer-complete-word}}{40}
- \entry {\code {modify-face}}{158}
- \entry {\code {mouse-choose-completion}}{40}
- \entry {\code {mouse-save-then-click}}{147}
- \entry {\code {mouse-secondary-save-then-kill}}{149}
- \entry {\code {mouse-set-point}}{147}
- \entry {\code {mouse-set-region}}{147}
- \entry {\code {mouse-set-secondary}}{149}
- \entry {\code {mouse-start-secondary}}{149}
- \entry {\code {mouse-yank-at-click}}{147}
- \entry {\code {mouse-yank-secondary}}{149}
- \entry {\code {move-over-close-and-reindent}}{213}
- \entry {\code {move-to-window-line}}{28}
- \entry {\code {mpuz}}{342}
- \initial {N}
- \entry {\code {name-last-kbd-macro}}{354}
- \entry {\code {narrow-to-page}}{336}
- \entry {\code {narrow-to-region}}{336}
- \entry {\code {negative-argument}}{35}
- \entry {\code {newline}}{28}
- \entry {\code {newline-and-indent}}{204}
- \entry {\code {next-completion}}{41}
- \entry {\code {next-error}}{240}
- \entry {\code {next-file}}{222}
- \entry {\code {next-history-element}}{42}
- \entry {\code {next-line}}{28}
- \entry {\code {next-matching-history-element}}{43}
- \entry {\code {normal-mode}}{163}
- \entry {\code {not-modified}}{108}
- \entry {\code {nroff-mode}}{189}
- \initial {O}
- \entry {\code {occur}}{96}
- \entry {\code {open-dribble-file}}{381}
- \entry {\code {open-line}}{32}
- \entry {\code {open-rectangle}}{68}
- \entry {\code {open-termscript}}{381}
- \entry {\code {other-window}}{143}
- \entry {\code {outline-backward-same-level}}{182}
- \entry {\code {outline-forward-same-level}}{182}
- \entry {\code {outline-minor-mode}}{179}
- \entry {\code {outline-mode}}{179}
- \entry {\code {outline-next-visible-heading}}{182}
- \entry {\code {outline-previous-visible-heading}}{182}
- \entry {\code {outline-up-heading}}{182}
- \entry {\code {overwrite-mode}}{344}
- \initial {P}
- \entry {\code {perldb}}{242}
- \entry {\code {phases-of-moon}}{305}
- \entry {\code {picture-backward-clear-column}}{258}
- \entry {\code {picture-backward-column}}{257}
- \entry {\code {picture-clear-column}}{258}
- \entry {\code {picture-clear-line}}{258}
- \entry {\code {picture-clear-rectangle}}{260}
- \entry {\code {picture-clear-rectangle-to-register}}{260}
- \entry {\code {picture-forward-column}}{257}
- \entry {\code {picture-motion}}{259}
- \entry {\code {picture-motion-reverse}}{259}
- \entry {\code {picture-move-down}}{257}
- \entry {\code {picture-move-up}}{257}
- \entry {\code {picture-movement-down}}{258}
- \entry {\code {picture-movement-left}}{258}
- \entry {\code {picture-movement-ne}}{258}
- \entry {\code {picture-movement-nw}}{258}
- \entry {\code {picture-movement-right}}{258}
- \entry {\code {picture-movement-se}}{258}
- \entry {\code {picture-movement-sw}}{258}
- \entry {\code {picture-movement-up}}{258}
- \entry {\code {picture-newline}}{258}
- \entry {\code {picture-open-line}}{258}
- \entry {\code {picture-set-tab-stops}}{259}
- \entry {\code {picture-tab}}{259}
- \entry {\code {picture-tab-search}}{259}
- \entry {\code {picture-yank-rectangle}}{260}
- \entry {\code {picture-yank-rectangle-from-register}}{260}
- \entry {\code {plain-tex-mode}}{184}
- \entry {\code {point-to-register}}{71}
- \entry {\code {prepend-to-buffer}}{66}
- \entry {\code {previous-completion}}{41}
- \entry {\code {previous-history-element}}{42}
- \entry {\code {previous-line}}{28}
- \entry {\code {previous-matching-history-element}}{43}
- \entry {\code {print-buffer}}{332}
- \entry {\code {print-region}}{332}
- \entry {\code {ps-print-buffer}}{333}
- \entry {\code {ps-print-buffer-with-faces}}{333}
- \entry {\code {ps-print-region}}{333}
- \entry {\code {ps-print-region-with-faces}}{333}
- \entry {\code {ps-spool-buffer}}{333}
- \entry {\code {ps-spool-buffer-with-faces}}{333}
- \entry {\code {ps-spool-region}}{333}
- \entry {\code {ps-spool-region-with-faces}}{333}
- \initial {Q}
- \entry {\code {query-replace}}{94}
- \entry {\code {query-replace-regexp}}{94}
- \entry {\code {quietly-read-abbrev-file}}{255}
- \entry {\code {quoted-insert}}{27}
- \initial {R}
- \entry {\code {re-search-backward}}{87}
- \entry {\code {re-search-forward}}{87}
- \entry {\code {read-abbrev-file}}{255}
- \entry {\code {recenter}}{75}
- \entry {\code {recover-file}}{115}
- \entry {\code {recover-session}}{115}
- \entry {\code {redraw-calendar}}{302}
- \entry {\code {rename-buffer}}{135}
- \entry {\code {rename-file}}{132}
- \entry {\code {repeat-complex-command}}{43}
- \entry {\code {replace-regexp}}{93}
- \entry {\code {replace-string}}{93}
- \entry {\code {reposition-window}}{76}
- \entry {\code {resize-minibuffer-mode}}{38}
- \entry {\code {revert-buffer}}{112}
- \entry {\code {revert-buffer \r {(Dired)}}}{297}
- \entry {\code {rlogin}}{330}
- \entry {\code {rmail}}{269}
- \entry {\code {rmail-add-label}}{277}
- \entry {\code {rmail-beginning-of-message}}{270}
- \entry {\code {rmail-bury}}{269}
- \entry {\code {rmail-continue}}{279}
- \entry {\code {rmail-delete-backward}}{272}
- \entry {\code {rmail-delete-forward}}{272}
- \entry {\code {rmail-edit-current-message}}{284}
- \entry {\code {rmail-expunge}}{272}
- \entry {\code {rmail-first-message}}{271}
- \entry {\code {rmail-forward}}{279}
- \entry {\code {rmail-get-new-mail}}{274}
- \entry {\code {rmail-input}}{274}
- \entry {\code {rmail-kill-label}}{277}
- \entry {\code {rmail-last-message}}{271}
- \entry {\code {rmail-mail}}{279}
- \entry {\code {rmail-next-labeled-message}}{277}
- \entry {\code {rmail-next-message}}{271}
- \entry {\code {rmail-next-undeleted-message}}{271}
- \entry {\code {rmail-output}}{275}
- \entry {\code {rmail-output-to-rmail-file}}{275}
- \entry {\code {rmail-previous-labeled-message}}{277}
- \entry {\code {rmail-previous-message}}{271}
- \entry {\code {rmail-previous-undeleted-message}}{271}
- \entry {\code {rmail-quit}}{269}
- \entry {\code {rmail-reply}}{278}
- \entry {\code {rmail-resend}}{279}
- \entry {\code {rmail-retry-failure}}{279}
- \entry {\code {rmail-save}}{269}
- \entry {\code {rmail-search}}{271}
- \entry {\code {rmail-show-message}}{271}
- \entry {\code {rmail-summary}}{280}
- \entry {\code {rmail-summary-by-labels}}{280}
- \entry {\code {rmail-summary-by-recipients}}{280}
- \entry {\code {rmail-summary-by-topic}}{280}
- \entry {\code {rmail-summary-quit}}{282}
- \entry {\code {rmail-summary-wipe}}{282}
- \entry {\code {rmail-toggle-header}}{283}
- \entry {\code {rmail-undelete-previous-message}}{272}
- \entry {\code {rot13-other-window}}{285}
- \entry {\code {run-lisp}}{249}
- \initial {S}
- \entry {\code {save-buffer}}{107}
- \entry {\code {save-buffers-kill-emacs}}{24}
- \entry {\code {save-some-buffers}}{107}
- \entry {\code {scroll-bar-mode}}{155}
- \entry {\code {scroll-calendar-left}}{301}
- \entry {\code {scroll-calendar-left-three-months}}{301}
- \entry {\code {scroll-calendar-right}}{301}
- \entry {\code {scroll-calendar-right-three-months}}{301}
- \entry {\code {scroll-down}}{75}
- \entry {\code {scroll-left}}{76}
- \entry {\code {scroll-other-window}}{143}
- \entry {\code {scroll-right}}{76}
- \entry {\code {scroll-up}}{75}
- \entry {\code {sdb}}{242}
- \entry {\code {search-backward}}{86}
- \entry {\code {search-forward}}{86}
- \entry {\code {self-insert}}{28}
- \entry {\code {send-invisible}}{326}
- \entry {\code {server-edit}}{331}
- \entry {\code {set-background-color}}{153}
- \entry {\code {set-border-color}}{153}
- \entry {\code {set-comment-column}}{212}
- \entry {\code {set-cursor-color}}{153}
- \entry {\code {set-default-font}}{154}
- \entry {\code {set-face-background}}{158}
- \entry {\code {set-face-font}}{157}
- \entry {\code {set-face-foreground}}{158}
- \entry {\code {set-face-underline-p}}{158}
- \entry {\code {set-fill-column}}{176}
- \entry {\code {set-fill-prefix}}{176}
- \entry {\code {set-foreground-color}}{153}
- \entry {\code {set-goal-column}}{29}
- \entry {\code {set-justification-center}}{196}
- \entry {\code {set-justification-full}}{196}
- \entry {\code {set-justification-left}}{196}
- \entry {\code {set-justification-none}}{196}
- \entry {\code {set-justification-right}}{196}
- \entry {\code {set-mark-command}}{55}
- \entry {\code {set-mouse-color}}{153}
- \entry {\code {set-rmail-inbox-list}}{274}
- \entry {\code {set-selective-display}}{77}
- \entry {\code {set-variable}}{346}
- \entry {\code {set-visited-file-name}}{108}
- \entry {\code {setq-default}}{349}
- \entry {\code {shell}}{323}
- \entry {\code {shell-backward-command}}{325}
- \entry {\code {shell-command}}{322}
- \entry {\code {shell-command-on-region}}{322}
- \entry {\code {shell-forward-command}}{325}
- \entry {\code {shell-pushd-dextract}}{329}
- \entry {\code {shell-pushd-dunique}}{329}
- \entry {\code {shell-pushd-tohome}}{329}
- \entry {\code {show-all}}{183}
- \entry {\code {show-all-diary-entries}}{311}
- \entry {\code {show-branches}}{183}
- \entry {\code {show-children}}{183}
- \entry {\code {show-entry}}{183}
- \entry {\code {show-subtree}}{183}
- \entry {\code {slitex-mode}}{184}
- \entry {\code {sort-columns}}{335}
- \entry {\code {sort-fields}}{333}
- \entry {\code {sort-lines}}{333}
- \entry {\code {sort-numeric-fields}}{333}
- \entry {\code {sort-pages}}{333}
- \entry {\code {sort-paragraphs}}{333}
- \entry {\code {split-line}}{166}
- \entry {\code {split-window-horizontally}}{142}
- \entry {\code {split-window-vertically}}{142}
- \entry {\code {spook}}{268}
- \entry {\code {standard-display-european}}{77}
- \entry {\code {start-kbd-macro}}{353}
- \entry {\code {string-rectangle}}{69}
- \entry {\code {substitute-key-definition}}{360}
- \entry {\code {sunrise-sunset}}{304}
- \entry {\code {super-apropos}}{50}
- \entry {\code {suspend-emacs}}{24}
- \entry {\code {switch-to-buffer}}{133}
- \entry {\code {switch-to-buffer-other-frame}}{133}
- \entry {\code {switch-to-buffer-other-window}}{133}
- \entry {\code {switch-to-completions}}{40}
- \initial {T}
- \entry {\code {tab-to-tab-stop}}{167}
- \entry {\code {tabify}}{167}
- \entry {\code {tags-apropos}}{222}
- \entry {\code {tags-loop-continue}}{221}
- \entry {\code {tags-query-replace}}{221}
- \entry {\code {tags-search}}{221}
- \entry {\code {tc-associate-buffer}}{337}
- \entry {\code {tc-dissociate}}{337}
- \entry {\code {tc-merge}}{337}
- \entry {\code {tc-recenter}}{337}
- \entry {\code {tc-scroll-down}}{337}
- \entry {\code {tc-scroll-up}}{337}
- \entry {\code {tc-split}}{337}
- \entry {\code {tc-two-columns}}{336}
- \entry {\code {telnet}}{330}
- \entry {\code {tex-bibtex-file}}{188}
- \entry {\code {tex-buffer}}{187}
- \entry {\code {tex-close-latex-block}}{186}
- \entry {\code {tex-file}}{188}
- \entry {\code {tex-insert-braces}}{185}
- \entry {\code {tex-insert-quote}}{185}
- \entry {\code {tex-kill-job}}{187}
- \entry {\code {tex-latex-block}}{186}
- \entry {\code {tex-mode}}{184}
- \entry {\code {tex-print}}{187}
- \entry {\code {tex-recenter-output-buffer}}{187}
- \entry {\code {tex-region}}{188}
- \entry {\code {tex-show-print-queue}}{187}
- \entry {\code {tex-terminate-paragraph}}{185}
- \entry {\code {tex-view}}{187}
- \entry {\code {text-mode}}{179}
- \entry {\code {toggle-scroll-bar}}{155}
- \entry {\code {top-level}}{374}
- \entry {\code {transient-mark-mode}}{56}
- \entry {\code {transpose-chars}}{98}
- \entry {\code {transpose-lines}}{98}
- \entry {\code {transpose-sexps}}{98, 202}
- \entry {\code {transpose-words}}{98, 170}
- \entry {\code {turn-on-font-lock}}{157}
- \initial {U}
- \entry {\code {undigestify-rmail-message}}{284}
- \entry {\code {undo}}{30}
- \entry {\code {universal-argument}}{35}
- \entry {\code {untabify}}{167}
- \entry {\code {up-list}}{185}
- \entry {\code {upcase-region}}{178}
- \entry {\code {upcase-word}}{178}
- \initial {V}
- \entry {\code {validate-tex-region}}{185}
- \entry {\code {vc-cancel-version}}{119}
- \entry {\code {vc-create-snapshot}}{126}
- \entry {\code {vc-diff}}{123}
- \entry {\code {vc-directory}}{125}
- \entry {\code {vc-insert-headers}}{127}
- \entry {\code {vc-print-log}}{125}
- \entry {\code {vc-register}}{119}
- \entry {\code {vc-rename-file}}{126}
- \entry {\code {vc-retrieve-snapshot}}{126}
- \entry {\code {vc-revert-buffer}}{119}
- \entry {\code {vc-toggle-read-only}}{135}
- \entry {\code {vc-update-change-log}}{121}
- \entry {\code {vc-version-other-window}}{123}
- \entry {\code {vi-mode}}{340}
- \entry {\code {view-buffer}}{135}
- \entry {\code {view-diary-entries}}{310}
- \entry {\code {view-emacs-news}}{52}
- \entry {\code {view-file}}{131}
- \entry {\code {view-lossage}}{52}
- \entry {\code {view-register}}{71}
- \entry {\code {vip-mode}}{341}
- \entry {\code {viper-mode}}{340}
- \entry {\code {visit-tags-table}}{219}
- \initial {W}
- \entry {\code {what-cursor-position}}{34}
- \entry {\code {what-line}}{34}
- \entry {\code {what-page}}{34}
- \entry {\code {where-is}}{49}
- \entry {\code {widen}}{336}
- \entry {\code {window-configuration-to-register}}{72}
- \entry {\code {word-search-backward}}{87}
- \entry {\code {word-search-forward}}{87}
- \entry {\code {write-abbrev-file}}{255}
- \entry {\code {write-file}}{108}
- \entry {\code {write-region}}{131}
- \initial {X}
- \entry {\code {xdb}}{242}
- \initial {Y}
- \entry {\code {yank}}{64}
- \entry {\code {yank-pop}}{65}
- \entry {\code {yank-rectangle}}{68}
- \entry {\code {yow}}{342}
- \initial {Z}
- \entry {\code {zap-to-char}}{63}
--- 0 ----
Index: emacs/man/emacs.kys
diff -c emacs/man/emacs.kys:1.1.1.2 emacs/man/emacs.kys:removed
*** emacs/man/emacs.kys:1.1.1.2	Mon Jul 22 01:54:51 1996
--- emacs/man/emacs.kys	Fri Aug  2 21:02:02 1996
***************
*** 1,604 ****
- \initial {!}
- \entry {\code {! \r {(Dired)}}}{293}
- \initial {#}
- \entry {\code {# \r {(Dired)}}}{288}
- \initial {$}
- \entry {\code {$ \r {(Dired)}}}{296}
- \initial {%}
- \entry {\code {% C \r {(Dired)}}}{294}
- \entry {\code {% d \r {(Dired)}}}{289}
- \entry {\code {% H \r {(Dired)}}}{294}
- \entry {\code {% l \r {(Dired)}}}{294}
- \entry {\code {% m \r {(Dired)}}}{291}
- \entry {\code {% R \r {(Dired)}}}{294}
- \entry {\code {% S \r {(Dired)}}}{294}
- \entry {\code {% u \r {(Dired)}}}{294}
- \initial {*}
- \entry {\code {* \r {(Dired)}}}{290}
- \initial {.}
- \entry {\code {. \r {(Calendar mode)}}}{301}
- \entry {\code {. \r {(Dired)}}}{288}
- \entry {\code {. \r {(Rmail)}}}{270}
- \initial {/}
- \entry {\code {/ \r {(Dired)}}}{290}
- \initial {=}
- \entry {\code {= \r {(Dired)}}}{295}
- \initial {{\tt\char'042}}
- \entry {\code {{\tt\char'042} \r {(\TeX{} mode)}}}{185}
- \initial {{\tt\char'100}}
- \entry {\code {{\tt\char'100} \r {(Dired)}}}{290}
- \initial {{\tt\char'176}}
- \entry {\code {{\tt\char'176} \r {(Dired)}}}{288}
- \initial {{\tt\char43}}
- \entry {\code {{\tt\char43} \r {(Dired)}}}{293}
- \initial {{\tt\gtr}}
- \entry {\code {{\tt\gtr} \r {(Rmail)}}}{271}
- \initial {{\tt\less}}
- \entry {\code {{\tt\less} \r {(Rmail)}}}{271}
- \initial {A}
- \entry {\code {a \r {(Calendar mode)}}}{303}
- \entry {\code {A \r {(Dired)}}}{292}
- \entry {\code {a \r {(Rmail)}}}{277}
- \initial {B}
- \entry {\code {B \r {(Dired)}}}{292}
- \entry {\code {b \r {(Rmail)}}}{269}
- \entry {\code {\key {BOTTOM}}}{28}
- \initial {C}
- \entry {\code {c \r {(Dired)}}}{290}
- \entry {\code {C \r {(Dired)}}}{291}
- \entry {\code {c \r {(Rmail)}}}{279}
- \entry {\code {C-]}}{374}
- \entry {\code {C-{\_}}}{30}
- \entry {\code {C-{\tt\char'100}}}{56}
- \entry {\code {C-a}}{28}
- \entry {\code {C-a \r {(Calendar mode)}}}{300}
- \entry {\code {C-b}}{28}
- \entry {\code {C-b \r {(Calendar mode)}}}{299}
- \entry {\code {C-c ' \r {(Picture mode)}}}{258}
- \entry {\code {C-c . \r {(Picture mode)}}}{258}
- \entry {\code {C-c / \r {(Picture mode)}}}{258}
- \entry {\code {C-c ; \r {(Fortran mode)}}}{235}
- \entry {\code {C-c ` \r {(Picture mode)}}}{258}
- \entry {\code {C-c {\tt\char'100} \r {(Outline minor mode)}}}{180}
- \entry {\code {C-c {\tt\char'173} \r {(\TeX{} mode)}}}{185}
- \entry {\code {C-c {\tt\char'175} \r {(\TeX{} mode)}}}{185}
- \entry {\code {C-c {\tt\gtr} \r {(GUD)}}}{244}
- \entry {\code {C-c {\tt\gtr} \r {(Picture mode)}}}{258}
- \entry {\code {C-c {\tt\hat} \r {(Picture mode)}}}{258}
- \entry {\code {C-c {\tt\indexbackslash } \r {(Picture mode)}}}{258}
- \entry {\code {C-c {\tt\less} \r {(GUD)}}}{244}
- \entry {\code {C-c {\tt\less} \r {(Picture mode)}}}{258}
- \entry {\code {C-c C-{\tt\indexbackslash } \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-a \r {(Mail mode)}}}{265}
- \entry {\code {C-c C-a \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-a \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-b \r {(Outline mode)}}}{182}
- \entry {\code {C-c C-b \r {(Picture mode)}}}{259}
- \entry {\code {C-c C-b \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-b \r {(\TeX{} mode)}}}{187}
- \entry {\code {C-c C-c \r {(Edit Abbrevs)}}}{254}
- \entry {\code {C-c C-c \r {(Edit Tab Stops)}}}{167}
- \entry {\code {C-c C-c \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-c \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-c \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-d \r {(GUD)}}}{244}
- \entry {\code {C-c C-d \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-d \r {(Picture mode)}}}{258}
- \entry {\code {C-c C-e \r {(La\TeX{} mode)}}}{186}
- \entry {\code {C-c C-e \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-e \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-f \r {(GUD)}}}{244}
- \entry {\code {C-c C-f \r {(Outline mode)}}}{182}
- \entry {\code {C-c C-f \r {(Picture mode)}}}{259}
- \entry {\code {C-c C-f \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-f \r {(\TeX{} mode)}}}{188}
- \entry {\code {C-c C-f C-b \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-f C-c \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-f C-f \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-f C-s \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-f C-t \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-i \r {(GUD)}}}{243}
- \entry {\code {C-c C-i \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-k \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-k \r {(Picture mode)}}}{260}
- \entry {\code {C-c C-k \r {(\TeX{} mode)}}}{187}
- \entry {\code {C-c C-l \r {(Calendar mode)}}}{302}
- \entry {\code {C-c C-l \r {(GUD)}}}{243}
- \entry {\code {C-c C-l \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-l \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-l \r {(\TeX{} mode)}}}{187}
- \entry {\code {C-c C-n \r {(C mode)}}}{229}
- \entry {\code {C-c C-n \r {(Fortran mode)}}}{230}
- \entry {\code {C-c C-n \r {(GUD)}}}{243}
- \entry {\code {C-c C-n \r {(Outline mode)}}}{182}
- \entry {\code {C-c C-n \r {(Shell mode)}}}{328}
- \entry {\code {C-c C-o \r {(La\TeX{} mode)}}}{186}
- \entry {\code {C-c C-o \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-o \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-p \r {(C mode)}}}{229}
- \entry {\code {C-c C-p \r {(Fortran mode)}}}{230}
- \entry {\code {C-c C-p \r {(Outline mode)}}}{182}
- \entry {\code {C-c C-p \r {(Shell mode)}}}{328}
- \entry {\code {C-c C-p \r {(\TeX{} mode)}}}{187}
- \entry {\code {C-c C-q \r {(Mail mode)}}}{267}
- \entry {\code {C-c C-q \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-q \r {(\TeX{} mode)}}}{187}
- \entry {\code {C-c C-r \r {(Fortran mode)}}}{236}
- \entry {\code {C-c C-r \r {(GUD)}}}{244}
- \entry {\code {C-c C-r \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-r \r {(\TeX{} mode)}}}{188}
- \entry {\code {C-c C-s \r {(GUD)}}}{243}
- \entry {\code {C-c C-s \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-s \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-t \r {(GUD)}}}{244}
- \entry {\code {C-c C-t \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-t \r {(Outline mode)}}}{183}
- \entry {\code {C-c C-u \r {(C mode)}}}{229}
- \entry {\code {C-c C-u \r {(Outline mode)}}}{182}
- \entry {\code {C-c C-u \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-v \r {(\TeX{} mode)}}}{187}
- \entry {\code {C-c C-w \r {(Fortran mode)}}}{236}
- \entry {\code {C-c C-w \r {(Mail mode)}}}{266}
- \entry {\code {C-c C-w \r {(Picture mode)}}}{260}
- \entry {\code {C-c C-w \r {(Shell mode)}}}{325}
- \entry {\code {C-c C-x \r {(Picture mode)}}}{260}
- \entry {\code {C-c C-y \r {(Mail mode)}}}{267}
- \entry {\code {C-c C-y \r {(Picture mode)}}}{260}
- \entry {\code {C-c C-z \r {(Shell mode)}}}{325}
- \entry {\code {C-c \key {RET} \r {(Shell mode)}}}{328}
- \entry {\code {C-c TAB \r {(Picture mode)}}}{259}
- \entry {\code {C-c TAB \r {(\TeX{} mode)}}}{188}
- \entry {\code {C-d}}{61}
- \entry {\code {C-d \r {(Rmail)}}}{272}
- \entry {\code {C-d \r {(Shell mode)}}}{325}
- \entry {\code {C-e}}{28}
- \entry {\code {C-e \r {(Calendar mode)}}}{300}
- \entry {\code {C-f}}{28}
- \entry {\code {C-f \r {(Calendar mode)}}}{299}
- \entry {\code {C-g}}{37, 373}
- \entry {\code {C-h a}}{49}
- \entry {\code {C-h b}}{52}
- \entry {\code {C-h c}}{48}
- \entry {\code {C-h C-c}}{52}
- \entry {\code {C-h C-d}}{52}
- \entry {\code {C-h C-f}}{52}
- \entry {\code {C-h C-k}}{52}
- \entry {\code {C-h C-p}}{52}
- \entry {\code {C-h C-w}}{52}
- \entry {\code {C-h f}}{48}
- \entry {\code {C-h i}}{52}
- \entry {\code {C-h k}}{48}
- \entry {\code {C-h l}}{52}
- \entry {\code {C-h m}}{52}
- \entry {\code {C-h n}}{52}
- \entry {\code {C-h p}}{50}
- \entry {\code {C-h s}}{366}
- \entry {\code {C-h t}}{27}
- \entry {\code {C-h w}}{49}
- \entry {\code {C-k}}{62}
- \entry {\code {C-k \r {(GNUS)}}}{321}
- \entry {\code {C-l}}{75}
- \entry {\code {C-M-.}}{221}
- \entry {\code {C-M-/}}{255}
- \entry {\code {C-M-{\tt\char'100}}}{202}
- \entry {\code {C-M-{\tt\indexbackslash }}}{166}
- \entry {\code {C-M-a}}{202}
- \entry {\code {C-M-a \r {(Fortran mode)}}}{230}
- \entry {\code {C-M-b}}{201}
- \entry {\code {C-M-c}}{339}
- \entry {\code {C-M-d}}{202}
- \entry {\code {C-M-d \r {(Dired)}}}{296}
- \entry {\code {C-M-\key {DEL}}}{201}
- \entry {\code {C-M-e}}{202}
- \entry {\code {C-M-e \r {(Fortran mode)}}}{230}
- \entry {\code {C-M-f}}{201}
- \entry {\code {C-M-h}}{202}
- \entry {\code {C-M-h \r {(Fortran mode)}}}{230}
- \entry {\code {C-M-k}}{201}
- \entry {\code {C-M-l}}{76}
- \entry {\code {C-M-l \r {(Rmail)}}}{280}
- \entry {\code {C-M-l \r {(Shell mode)}}}{325}
- \entry {\code {C-M-n}}{201}
- \entry {\code {C-M-n \r {(Dired)}}}{296}
- \entry {\code {C-M-n \r {(GNUS Summary mode)}}}{322}
- \entry {\code {C-M-n \r {(Rmail)}}}{277}
- \entry {\code {C-M-o}}{166}
- \entry {\code {C-M-p}}{201}
- \entry {\code {C-M-p \r {(Dired)}}}{296}
- \entry {\code {C-M-p \r {(GNUS Summary mode)}}}{322}
- \entry {\code {C-M-p \r {(Rmail)}}}{277}
- \entry {\code {C-M-q}}{204}
- \entry {\code {C-M-q \r {(Fortran mode)}}}{231}
- \entry {\code {C-M-r}}{87}
- \entry {\code {C-M-r \r {(Rmail)}}}{280}
- \entry {\code {C-M-s}}{87}
- \entry {\code {C-M-t}}{98, 202}
- \entry {\code {C-M-t \r {(Rmail)}}}{280}
- \entry {\code {C-M-u}}{202}
- \entry {\code {C-M-u \r {(Dired)}}}{296}
- \entry {\code {C-M-v}}{143}
- \entry {\code {C-M-w}}{65}
- \entry {\code {C-M-x \r {(Emacs-Lisp mode)}}}{248}
- \entry {\code {C-M-x \r {(Lisp mode)}}}{249}
- \entry {\code {C-Mouse-1}}{154}
- \entry {\code {C-Mouse-2 \r {(scroll bar)}}}{142}
- \entry {\code {C-Mouse-3}}{150}
- \entry {\code {C-n}}{28}
- \entry {\code {C-n \r {(Calendar mode)}}}{299}
- \entry {\code {C-n \r {(Dired)}}}{287}
- \entry {\code {C-n \r {(GNUS Group mode)}}}{321}
- \entry {\code {C-n \r {(GNUS Summary mode)}}}{321}
- \entry {\code {C-o}}{32}
- \entry {\code {C-o \r {(Dired)}}}{289}
- \entry {\code {C-o \r {(Rmail)}}}{275}
- \entry {\code {C-p}}{28}
- \entry {\code {C-p \r {(Calendar mode)}}}{299}
- \entry {\code {C-p \r {(Dired)}}}{287}
- \entry {\code {C-p \r {(GNUS Group mode)}}}{321}
- \entry {\code {C-p \r {(GNUS Summary mode)}}}{321}
- \entry {\code {C-q}}{27}
- \entry {\code {C-r}}{85}
- \entry {\code {C-s}}{83}
- \entry {\code {C-SPC}}{55}
- \entry {\code {C-t}}{28, 98}
- \entry {\code {C-u}}{35}
- \entry {\code {C-u - C-x ;}}{211}
- \entry {\code {C-u C-{\tt\char'100}}}{59}
- \entry {\code {C-u C-SPC}}{59}
- \entry {\code {C-u C-x C-q}}{118}
- \entry {\code {C-u TAB}}{204}
- \entry {\code {C-v}}{75}
- \entry {\code {C-v \r {(Calendar mode)}}}{301}
- \entry {\code {C-w}}{63}
- \entry {\code {C-x #}}{331}
- \entry {\code {C-x $}}{77}
- \entry {\code {C-x (}}{353}
- \entry {\code {C-x )}}{353}
- \entry {\code {C-x .}}{176}
- \entry {\code {C-x ;}}{212}
- \entry {\code {C-x =}}{34}
- \entry {\code {C-x [}}{173}
- \entry {\code {C-x [ \r {(Calendar mode)}}}{300}
- \entry {\code {C-x ]}}{173}
- \entry {\code {C-x ] \r {(Calendar mode)}}}{300}
- \entry {\code {C-x `}}{240}
- \entry {\code {C-x {\tt\char'175}}}{145}
- \entry {\code {C-x {\tt\gtr}}}{76}
- \entry {\code {C-x {\tt\gtr} \r {(Calendar mode)}}}{301}
- \entry {\code {C-x {\tt\hat}}}{145}
- \entry {\code {C-x {\tt\less}}}{76}
- \entry {\code {C-x {\tt\less} \r {(Calendar mode)}}}{301}
- \entry {\code {C-x 0}}{145}
- \entry {\code {C-x 1}}{145}
- \entry {\code {C-x 2}}{142}
- \entry {\code {C-x 3}}{142}
- \entry {\code {C-x 4}}{143}
- \entry {\code {C-x 4 .}}{220}
- \entry {\code {C-x 4 a}}{214}
- \entry {\code {C-x 4 b}}{133}
- \entry {\code {C-x 4 d}}{287}
- \entry {\code {C-x 4 f}}{106}
- \entry {\code {C-x 4 m}}{261}
- \entry {\code {C-x 5}}{151}
- \entry {\code {C-x 5 .}}{220}
- \entry {\code {C-x 5 0}}{159}
- \entry {\code {C-x 5 2}}{151}
- \entry {\code {C-x 5 b}}{133}
- \entry {\code {C-x 5 d}}{287}
- \entry {\code {C-x 5 f}}{106}
- \entry {\code {C-x 5 m}}{261}
- \entry {\code {C-x 5 r}}{152}
- \entry {\code {C-x 6 1}}{337}
- \entry {\code {C-x 6 2}}{336}
- \entry {\code {C-x 6 b}}{337}
- \entry {\code {C-x 6 C-l}}{337}
- \entry {\code {C-x 6 d}}{337}
- \entry {\code {C-x 6 \key {DEL}}}{337}
- \entry {\code {C-x 6 s}}{337}
- \entry {\code {C-x 6 \key {SPC}}}{337}
- \entry {\code {C-x 8}}{78}
- \entry {\code {C-x a g}}{252}
- \entry {\code {C-x a i g}}{252}
- \entry {\code {C-x a i l}}{252}
- \entry {\code {C-x a l}}{252}
- \entry {\code {C-x b}}{133}
- \entry {\code {C-x C-a \r {(GUD)}}}{243}
- \entry {\code {C-x C-b}}{134}
- \entry {\code {C-x C-c}}{24}
- \entry {\code {C-x C-d}}{130}
- \entry {\code {C-x C-e}}{248}
- \entry {\code {C-x C-f}}{105}
- \entry {\code {C-x C-k}}{353}
- \entry {\code {C-x C-l}}{178}
- \entry {\code {C-x C-n}}{29}
- \entry {\code {C-x C-o}}{32}
- \entry {\code {C-x C-p}}{173}
- \entry {\code {C-x C-q}}{135}
- \entry {\code {C-x C-q \r {(version control)}}}{118}
- \entry {\code {C-x C-r}}{106}
- \entry {\code {C-x C-s}}{107}
- \entry {\code {C-x C-t}}{98}
- \entry {\code {C-x C-u}}{178}
- \entry {\code {C-x C-v}}{106}
- \entry {\code {C-x C-w}}{108}
- \entry {\code {C-x C-x}}{56}
- \entry {\code {C-x C-z}}{249}
- \entry {\code {C-x d}}{287}
- \entry {\code {C-x DEL}}{171}
- \entry {\code {C-x e}}{353}
- \entry {\code {C-x ESC ESC}}{43}
- \entry {\code {C-x f}}{176}
- \entry {\code {C-x h}}{58}
- \entry {\code {C-x k}}{136}
- \entry {\code {C-x l}}{173}
- \entry {\code {C-x m}}{261}
- \entry {\code {C-x n n}}{336}
- \entry {\code {C-x n p}}{336}
- \entry {\code {C-x n w}}{336}
- \entry {\code {C-x o}}{143}
- \entry {\code {C-x q}}{354}
- \entry {\code {C-x r b}}{73}
- \entry {\code {C-x r d}}{68}
- \entry {\code {C-x r f}}{72}
- \entry {\code {C-x r i}}{71}
- \entry {\code {C-x r j}}{71}
- \entry {\code {C-x r k}}{68}
- \entry {\code {C-x r l}}{73}
- \entry {\code {C-x r m}}{73}
- \entry {\code {C-x r o}}{68}
- \entry {\code {C-x r s}}{71}
- \entry {\code {C-x r \key {SPC}}}{71}
- \entry {\code {C-x r w}}{72}
- \entry {\code {C-x r y}}{68}
- \entry {\code {C-x s}}{107}
- \entry {\code {C-x \key {SPC}}}{243}
- \entry {\code {C-x TAB}}{166}
- \entry {\code {C-x \key {TAB} \r {(Enriched mode)}}}{194}
- \entry {\code {C-x u}}{30}
- \entry {\code {C-x v =}}{123}
- \entry {\code {C-x v {\tt\char'176}}}{123}
- \entry {\code {C-x v a}}{121}
- \entry {\code {C-x v c}}{119}
- \entry {\code {C-x v d}}{125}
- \entry {\code {C-x v h}}{127}
- \entry {\code {C-x v i}}{119}
- \entry {\code {C-x v l}}{125}
- \entry {\code {C-x v r}}{126}
- \entry {\code {C-x v s}}{126}
- \entry {\code {C-x v u}}{119}
- \entry {\code {C-y}}{64}
- \entry {\code {C-z}}{24}
- \entry {\code {C-z \r {(X windows)}}}{159}
- \initial {D}
- \entry {\code {d \r {(Calendar mode)}}}{310}
- \entry {\code {d \r {(Dired)}}}{288}
- \entry {\code {d \r {(Rmail)}}}{272}
- \entry {\code {DEL}}{61}
- \entry {\code {DEL \r {(and major modes)}}}{161}
- \entry {\code {\key {DEL} \r {(Dired)}}}{288}
- \entry {\code {DEL \r {(GNUS)}}}{321}
- \entry {\code {DEL \r {(programming modes)}}}{200}
- \entry {\code {DEL \r {(Rmail)}}}{270}
- \initial {E}
- \entry {\code {e \r {(Rmail)}}}{284}
- \entry {\code {\key {ESC} \key {ESC} \key {ESC}}}{374}
- \initial {F}
- \entry {\code {f \r {(Dired)}}}{289}
- \entry {\code {f \r {(Rmail)}}}{279}
- \initial {G}
- \entry {\code {g \r {(Dired)}}}{297}
- \entry {\code {G \r {(Dired)}}}{292}
- \entry {\code {g \r {(Rmail)}}}{274}
- \entry {\code {g \var {char} \r {(Calendar mode)}}}{307}
- \entry {\code {g d \r {(Calendar mode)}}}{301}
- \entry {\code {g m \r {(Calendar mode)}}}{309}
- \initial {H}
- \entry {\code {h \r {(Calendar mode)}}}{303}
- \entry {\code {H \r {(Dired)}}}{292}
- \entry {\code {h \r {(Rmail)}}}{280}
- \entry {\code {Help}}{47}
- \initial {I}
- \entry {\code {i \r {(Dired)}}}{295}
- \entry {\code {i \r {(Rmail)}}}{274}
- \entry {\code {i a \r {(Calendar mode)}}}{314}
- \entry {\code {i b \r {(Calendar mode)}}}{315}
- \entry {\code {i c \r {(Calendar mode)}}}{315}
- \entry {\code {i d \r {(Calendar mode)}}}{314}
- \entry {\code {i m \r {(Calendar mode)}}}{314}
- \entry {\code {i w \r {(Calendar mode)}}}{314}
- \entry {\code {i y \r {(Calendar mode)}}}{314}
- \initial {J}
- \entry {\code {j \r {(Rmail)}}}{271}
- \initial {K}
- \entry {\code {k \r {(Dired)}}}{297}
- \entry {\code {k \r {(Rmail)}}}{277}
- \initial {L}
- \entry {\code {l \r {(Dired)}}}{297}
- \entry {\code {L \r {(Dired)}}}{292}
- \entry {\code {l \r {(GNUS Group mode)}}}{320}
- \entry {\code {L \r {(GNUS Group mode)}}}{320}
- \entry {\code {l \r {(Rmail)}}}{280}
- \entry {\code {\key {LEFT}}}{28}
- \entry {\code {LFD}}{204}
- \entry {\code {LFD \r {(and major modes)}}}{161}
- \entry {\code {LFD \r {(Fortran mode)}}}{231}
- \entry {\code {LFD \r {(\TeX{} mode)}}}{185}
- \initial {M}
- \entry {\code {m \r {(Calendar mode)}}}{311}
- \entry {\code {M \r {(Calendar mode)}}}{305}
- \entry {\code {m \r {(Dired)}}}{290}
- \entry {\code {M \r {(Dired)}}}{292}
- \entry {\code {m \r {(Rmail)}}}{279}
- \entry {\code {M-!}}{322}
- \entry {\code {M-$}}{99}
- \entry {\code {M-$ \r {(Dired)}}}{296}
- \entry {\code {M-%}}{94}
- \entry {\code {M-'}}{253}
- \entry {\code {M-(}}{213}
- \entry {\code {M-)}}{213}
- \entry {\code {M-,}}{221}
- \entry {\code {M-\r {-}}}{35}
- \entry {\code {M-\r {-} M-c}}{98}
- \entry {\code {M-\r {-} M-l}}{98}
- \entry {\code {M-\r {-} M-u}}{98}
- \entry {\code {M-.}}{220}
- \entry {\code {M-/}}{255}
- \entry {\code {M-:}}{248}
- \entry {\code {M-;}}{210}
- \entry {\code {M-=}}{34}
- \entry {\code {M-= \r {(Calendar mode)}}}{302}
- \entry {\code {M-= \r {(Dired)}}}{295}
- \entry {\code {M-? \r {(Nroff mode)}}}{189}
- \entry {\code {M-? \r {(Shell mode)}}}{325}
- \entry {\code {M-{\tt\char'100}}}{170}
- \entry {\code {M-{\tt\char'173}}}{172}
- \entry {\code {M-{\tt\char'173} \r {(Calendar mode)}}}{300}
- \entry {\code {M-{\tt\char'174}}}{322}
- \entry {\code {M-{\tt\char'175}}}{172}
- \entry {\code {M-{\tt\char'175} \r {(Calendar mode)}}}{300}
- \entry {\code {M-{\tt\char'176}}}{108}
- \entry {\code {M-{\tt\gtr}}}{28}
- \entry {\code {M-{\tt\gtr} \r {(Calendar mode)}}}{300}
- \entry {\code {M-{\tt\hat}}}{166}
- \entry {\code {M-{\tt\indexbackslash }}}{62}
- \entry {\code {M-{\tt\less}}}{28}
- \entry {\code {M-{\tt\less} \r {(Calendar mode)}}}{300}
- \entry {\code {M-1}}{35}
- \entry {\code {M-a}}{171}
- \entry {\code {M-a \r {(C mode)}}}{228}
- \entry {\code {M-a \r {(Calendar mode)}}}{300}
- \entry {\code {M-b}}{170}
- \entry {\code {M-c}}{178}
- \entry {\code {M-d}}{170}
- \entry {\code {M-DEL}}{170}
- \entry {\code {M-\key {DEL} \r {(Dired)}}}{290}
- \entry {\code {M-Drag-Mouse-1}}{149}
- \entry {\code {M-e}}{171}
- \entry {\code {M-e \r {(C mode)}}}{228}
- \entry {\code {M-e \r {(Calendar mode)}}}{300}
- \entry {\code {M-f}}{170}
- \entry {\code {M-g b \r {(Enriched mode)}}}{192}
- \entry {\code {M-g d \r {(Enriched mode)}}}{192}
- \entry {\code {M-g i \r {(Enriched mode)}}}{192}
- \entry {\code {M-g l \r {(Enriched mode)}}}{192}
- \entry {\code {M-g o \r {(Enriched mode)}}}{193}
- \entry {\code {M-g u \r {(Enriched mode)}}}{192}
- \entry {\code {M-h}}{172}
- \entry {\code {M-i}}{167}
- \entry {\code {M-j c \r {(Enriched mode)}}}{196}
- \entry {\code {M-j f \r {(Enriched mode)}}}{196}
- \entry {\code {M-j l \r {(Enriched mode)}}}{196}
- \entry {\code {M-j r \r {(Enriched mode)}}}{196}
- \entry {\code {M-j u \r {(Enriched mode)}}}{196}
- \entry {\code {M-k}}{171}
- \entry {\code {M-l}}{178}
- \entry {\code {M-LFD}}{211}
- \entry {\code {M-LFD \r {(Fortran mode)}}}{231}
- \entry {\code {M-m}}{165}
- \entry {\code {M-m \r {(Rmail)}}}{279}
- \entry {\code {M-Mouse-1}}{149}
- \entry {\code {M-Mouse-2}}{149}
- \entry {\code {M-Mouse-3}}{149}
- \entry {\code {M-n \r {(minibuffer history)}}}{42}
- \entry {\code {M-n \r {(Nroff mode)}}}{189}
- \entry {\code {M-n \r {(Rmail)}}}{271}
- \entry {\code {M-n \r {(Shell mode)}}}{327}
- \entry {\code {M-p \r {(minibuffer history)}}}{42}
- \entry {\code {M-p \r {(Nroff mode)}}}{189}
- \entry {\code {M-p \r {(Rmail)}}}{271}
- \entry {\code {M-p \r {(Shell mode)}}}{327}
- \entry {\code {M-q}}{175}
- \entry {\code {M-q \r {(C mode)}}}{229}
- \entry {\code {M-r}}{28}
- \entry {\code {M-r \r {(minibuffer history)}}}{43}
- \entry {\code {M-r \r {(Shell mode)}}}{327}
- \entry {\code {M-S \r {(Enriched mode)}}}{196}
- \entry {\code {M-s \r {(GNUS Summary mode)}}}{321}
- \entry {\code {M-s \r {(minibuffer history)}}}{43}
- \entry {\code {M-s \r {(Rmail)}}}{271}
- \entry {\code {M-s \r {(Shell mode)}}}{327}
- \entry {\code {M-s \r {(Text mode)}}}{176}
- \entry {\code {M-SPC}}{62}
- \entry {\code {M-t}}{98, 170}
- \entry {\code {M-TAB}}{213}
- \entry {\code {M-TAB \r {(Picture mode)}}}{259}
- \entry {\code {M-TAB \r {(Text mode)}}}{179}
- \entry {\code {M-u}}{178}
- \entry {\code {M-v}}{75}
- \entry {\code {M-v \r {(Calendar mode)}}}{301}
- \entry {\code {M-w}}{64}
- \entry {\code {M-x}}{45}
- \entry {\code {M-y}}{65}
- \entry {\code {M-z}}{63}
- \entry {\code {Mouse-1}}{147}
- \entry {\code {Mouse-2}}{147}
- \entry {\code {Mouse-2 \r {(selection)}}}{150}
- \entry {\code {Mouse-3}}{147}
- \initial {N}
- \entry {\code {n \r {(GNUS)}}}{321}
- \entry {\code {n \r {(Rmail)}}}{271}
- \entry {\code {\key {NEXT}}}{75}
- \initial {O}
- \entry {\code {o \r {(Calendar mode)}}}{301}
- \entry {\code {o \r {(Dired)}}}{289}
- \entry {\code {O \r {(Dired)}}}{292}
- \entry {\code {o \r {(Rmail)}}}{275}
- \initial {P}
- \entry {\code {p \r {(Calendar mode)}}}{307}
- \entry {\code {P \r {(Dired)}}}{292}
- \entry {\code {p \r {(GNUS)}}}{321}
- \entry {\code {p \r {(Rmail)}}}{271}
- \entry {\code {p d \r {(Calendar mode)}}}{302}
- \entry {\code {\key {PRIOR}}}{75}
- \initial {Q}
- \entry {\code {q \r {(Calendar mode)}}}{302}
- \entry {\code {Q \r {(Dired)}}}{292}
- \entry {\code {q \r {(GNUS Group mode)}}}{320}
- \entry {\code {q \r {(Rmail summary)}}}{282}
- \entry {\code {q \r {(Rmail)}}}{269}
- \initial {R}
- \entry {\code {R \r {(Dired)}}}{291}
- \entry {\code {r \r {(Rmail)}}}{278}
- \entry {\code {RET}}{27}
- \entry {\code {\key {RET} \r {(Dired)}}}{289}
- \entry {\code {\key {RET} \r {(Occur mode)}}}{96}
- \entry {\code {\key {RET} \r {(Shell mode)}}}{324}
- \entry {\code {\key {RIGHT}}}{28}
- \initial {S}
- \entry {\code {s \r {(Calendar mode)}}}{311}
- \entry {\code {S \r {(Calendar mode)}}}{304}
- \entry {\code {s \r {(Dired)}}}{297}
- \entry {\code {S \r {(Dired)}}}{292}
- \entry {\code {s \r {(GNUS Summary mode)}}}{321}
- \entry {\code {s \r {(Rmail)}}}{269}
- \entry {\code {SPC}}{40}
- \entry {\code {SPC \r {(Calendar mode)}}}{302}
- \entry {\code {\key {SPC} \r {(Dired)}}}{287}
- \entry {\code {SPC \r {(GNUS)}}}{321}
- \entry {\code {SPC \r {(Rmail)}}}{270}
- \initial {T}
- \entry {\code {t \r {(Rmail)}}}{283}
- \entry {\code {TAB}}{165}
- \entry {\code {TAB \r {(and major modes)}}}{161}
- \entry {\code {TAB \r {(completion)}}}{39}
- \entry {\code {\key {TAB} \r {(GUD)}}}{244}
- \entry {\code {TAB \r {(Indented Text mode)}}}{179}
- \entry {\code {TAB \r {(programming modes)}}}{204}
- \entry {\code {\key {TAB} \r {(Shell mode)}}}{324}
- \entry {\code {\key {TOP}}}{28}
- \initial {U}
- \entry {\code {u \r {(Calendar mode)}}}{303}
- \entry {\code {u \r {(Dired)}}}{288}
- \entry {\code {u \r {(GNUS Group mode)}}}{320}
- \entry {\code {u \r {(Rmail)}}}{272}
- \initial {V}
- \entry {\code {v \r {(Dired)}}}{290}
- \initial {W}
- \entry {\code {w \r {(Rmail summary)}}}{282}
- \initial {X}
- \entry {\code {x \r {(Calendar mode)}}}{303}
- \entry {\code {x \r {(Dired)}}}{288}
- \entry {\code {x \r {(Rmail)}}}{272}
- \initial {Z}
- \entry {\code {Z \r {(Dired)}}}{292}
- \entry {\code {z \r {(GNUS Group mode)}}}{320}
--- 0 ----
Index: emacs/man/emacs.texi
diff -c emacs/man/emacs.texi:1.1.1.2 emacs/man/emacs.texi:1.3
*** emacs/man/emacs.texi:1.1.1.2	Mon Jul 22 01:53:39 1996
--- emacs/man/emacs.texi	Wed Jul 31 01:36:42 1996
***************
*** 47,53 ****
  @c
  @setchapternewpage odd
  @settitle GNU Emacs Manual
! @setfilename ../info/emacs
  @synindex pg cp
  @c
  @c in general, keep the following line commented out, unless doing a
--- 47,53 ----
  @c
  @setchapternewpage odd
  @settitle GNU Emacs Manual
! @setfilename ../info/emacs.info
  @synindex pg cp
  @c
  @c in general, keep the following line commented out, unless doing a
***************
*** 187,193 ****
  * Files::	      All about handling files.
  * Buffers::	      Multiple buffers; editing several files at once.
  * Windows::	      Viewing two pieces of text at once.
! * Frames::	      Running the same Emacs session in multiple X windows.
  
  Advanced Features
  * Major Modes::	      Text mode vs. Lisp mode vs. C mode ...
--- 187,193 ----
  * Files::	      All about handling files.
  * Buffers::	      Multiple buffers; editing several files at once.
  * Windows::	      Viewing two pieces of text at once.
! * Frames::	      Running the same Emacs session in multiple GUI windows.
  
  Advanced Features
  * Major Modes::	      Text mode vs. Lisp mode vs. C mode ...
***************
*** 397,403 ****
  * Pop Up Window::      Finding a file or buffer in another window.
  * Change Window::      Deleting windows and changing their sizes.
  
! Frames and X Windows
  
  * Mouse Commands::     Moving, cutting, and pasting, with the mouse.
  * Secondary Selection::Cutting without altering point and mark.
--- 397,403 ----
  * Pop Up Window::      Finding a file or buffer in another window.
  * Change Window::      Deleting windows and changing their sizes.
  
! Frames and GUI Windows
  
  * Mouse Commands::     Moving, cutting, and pasting, with the mouse.
  * Secondary Selection::Cutting without altering point and mark.
Index: emacs/man/emacs.vrs
diff -c emacs/man/emacs.vrs:1.1.1.2 emacs/man/emacs.vrs:removed
*** emacs/man/emacs.vrs:1.1.1.2	Mon Jul 22 01:54:53 1996
--- emacs/man/emacs.vrs	Fri Aug  2 21:02:15 1996
***************
*** 1,311 ****
- \initial {A}
- \entry {\code {abbrev-all-caps}}{253}
- \entry {\code {abbrev-file-name}}{255}
- \entry {\code {abbrev-mode}}{251}
- \entry {\code {adaptive-fill-mode}}{175}
- \entry {\code {appt-display-diary}}{316}
- \entry {\code {appt-issue-message}}{316}
- \entry {\code {auto-mode-alist}}{162}
- \entry {\code {auto-save-default}}{114}
- \entry {\code {auto-save-interval}}{114}
- \entry {\code {auto-save-timeout}}{114}
- \entry {\code {auto-save-visited-file-name}}{114}
- \initial {B}
- \entry {\code {backup-by-copying}}{111}
- \entry {\code {backup-by-copying-when-linked}}{111}
- \entry {\code {backup-by-copying-when-mismatch}}{111}
- \entry {\code {baud-rate}}{81}
- \entry {\code {blink-matching-delay}}{209}
- \entry {\code {blink-matching-paren}}{209}
- \entry {\code {blink-matching-paren-distance}}{209}
- \entry {\code {bookmark-save-flag}}{73}
- \entry {\code {bookmark-search-size}}{74}
- \entry {\code {buffer-read-only}}{135}
- \initial {C}
- \entry {\code {c-argdecl-indent}}{208}
- \entry {\code {c-auto-newline}}{206}
- \entry {\code {c-brace-imaginary-offset}}{207}
- \entry {\code {c-brace-offset}}{208}
- \entry {\code {c-continued-statement-offset}}{208}
- \entry {\code {c-indent-level}}{207}
- \entry {\code {c-label-offset}}{208}
- \entry {\code {c-mode-hook}}{200}
- \entry {\code {c-mode-map}}{357}
- \entry {\code {c-tab-always-indent}}{206}
- \entry {\code {calendar-daylight-savings-ends}}{317}
- \entry {\code {calendar-daylight-savings-ends-time}}{317}
- \entry {\code {calendar-daylight-savings-starts}}{317}
- \entry {\code {calendar-daylight-time-offset}}{317}
- \entry {\code {calendar-daylight-time-zone-name}}{304}
- \entry {\code {calendar-latitude}}{304}
- \entry {\code {calendar-location-name}}{304}
- \entry {\code {calendar-longitude}}{304}
- \entry {\code {calendar-standard-time-zone-name}}{304}
- \entry {\code {calendar-time-zone}}{304}
- \entry {\code {calendar-week-start-day}}{300}
- \entry {\code {case-fold-search}}{92}
- \entry {\code {case-replace}}{94}
- \entry {\code {comint-completion-addsuffix}}{329}
- \entry {\code {comint-completion-autolist}}{329}
- \entry {\code {comint-completion-fignore}}{324}
- \entry {\code {comint-completion-recexact}}{329}
- \entry {\code {comint-input-autoexpand}}{328}
- \entry {\code {comint-input-ignoredups}}{329}
- \entry {\code {comint-prompt-regexp}}{328}
- \entry {\code {comint-scroll-show-maximum-output}}{329}
- \entry {\code {comint-scroll-to-bottom-on-input}}{329}
- \entry {\code {comint-scroll-to-bottom-on-output}}{329}
- \entry {\code {command-history}}{44}
- \entry {\code {command-line-args}}{390}
- \entry {\code {comment-column}}{212}
- \entry {\code {comment-end}}{212}
- \entry {\code {comment-indent-function}}{212}
- \entry {\code {comment-line-start}}{235}
- \entry {\code {comment-line-start-skip}}{235}
- \entry {\code {comment-multi-line}}{212}
- \entry {\code {comment-start}}{212}
- \entry {\code {comment-start-skip}}{212}
- \entry {\code {compare-ignore-case}}{131}
- \entry {\code {compile-command}}{239}
- \entry {\code {completion-auto-help}}{42}
- \entry {\code {completion-ignored-extensions}}{41}
- \entry {\code {ctl-arrow}}{80}
- \entry {\code {ctl-x-4-map}}{357}
- \entry {\code {ctl-x-map}}{357}
- \initial {D}
- \entry {\code {dabbrev-abbrev-skip-leading-regexp}}{256}
- \entry {\code {dbx-mode-hook}}{244}
- \entry {\code {default-directory}}{103}
- \entry {\code {default-justification}}{196}
- \entry {\code {default-major-mode}}{162}
- \entry {\code {delete-auto-save-files}}{114}
- \entry {\code {delete-old-versions}}{110}
- \entry {\code {desktop-files-not-to-save}}{338}
- \entry {\code {diary-file}}{311}
- \entry {\code {diary-hook}}{316}
- \entry {\code {diff-switches}}{130}
- \entry {\code {dired-chown-program}}{292}
- \entry {\code {dired-copy-preserve-time}}{291}
- \entry {\code {dired-kept-versions}}{289}
- \entry {\code {dired-listing-switches}}{287}
- \entry {\code {double-click-time}}{364}
- \initial {E}
- \entry {\code {echo-keystrokes}}{80}
- \entry {\code {emacs-lisp-mode-hook}}{200}
- \entry {\code {emerge-combine-versions-template}}{228}
- \entry {\code {emerge-startup-hook}}{228}
- \entry {\code {enable-recursive-minibuffers}}{39}
- \entry {\code {enriched-default-right-margin}}{195}
- \entry {\code {enriched-fill-after-visiting}}{191}
- \entry {\code {enriched-translations}}{191}
- \entry {\code {esc-map}}{357}
- \entry {\code {european-calendar-style}}{313}
- \entry {\code {explicit-shell-file-name}}{323}
- \initial {F}
- \entry {\code {file-name-handler-alist}}{104}
- \entry {\code {fill-column}}{176}
- \entry {\code {fill-prefix}}{177}
- \entry {\code {find-file-existing-other-name}}{115}
- \entry {\code {find-file-hooks}}{106}
- \entry {\code {find-file-not-found-hooks}}{106}
- \entry {\code {find-file-run-dired}}{106}
- \entry {\code {find-file-visit-truename}}{116}
- \entry {\code {find-ls-option}}{298}
- \entry {\code {font-lock-display-type}}{157}
- \entry {\code {fortran-analyze-depth}}{232}
- \entry {\code {fortran-break-before-delimiters}}{235}
- \entry {\code {fortran-check-all-num\dots {}}}{233}
- \entry {\code {fortran-column-ruler}}{236}
- \entry {\code {fortran-comment-indent-char}}{235}
- \entry {\code {fortran-comment-indent-style}}{234}
- \entry {\code {fortran-comment-line-extra-indent}}{234}
- \entry {\code {fortran-comment-region}}{235}
- \entry {\code {fortran-continuation-indent}}{233}
- \entry {\code {fortran-continuation-string}}{231}
- \entry {\code {fortran-do-indent}}{233}
- \entry {\code {fortran-electric-line-number}}{232}
- \entry {\code {fortran-if-indent}}{233}
- \entry {\code {fortran-line-number-indent}}{232}
- \entry {\code {fortran-minimum-statement-indent\dots {}}}{233}
- \entry {\code {fortran-structure-indent}}{233}
- \entry {\code {fortran-tab-mode-default}}{232}
- \initial {G}
- \entry {\code {gdb-mode-hook}}{244}
- \entry {\code {gud-xdb-directories}}{242}
- \initial {H}
- \entry {\code {help-map}}{357}
- \initial {I}
- \entry {\code {indent-tabs-mode}}{167}
- \entry {\code {indent-tabs-mode \r {(Fortran mode)}}}{231}
- \entry {\code {inferior-lisp-program}}{249}
- \entry {\code {initial-major-mode}}{23}
- \entry {\code {insert-default-directory}}{103}
- \entry {\code {interpreter-mode-alist}}{162}
- \entry {\code {inverse-video}}{80}
- \entry {\code {isearch-mode-map}}{85}
- \entry {\code {ispell-dictionary}}{101}
- \initial {K}
- \entry {\code {kept-new-versions}}{110}
- \entry {\code {kept-old-versions}}{110}
- \entry {\code {kill-buffer-hook}}{136}
- \entry {\code {kill-ring}}{66}
- \entry {\code {kill-ring-max}}{66}
- \entry {\code {kill-whole-line}}{62}
- \initial {L}
- \entry {\code {latex-block-names}}{186}
- \entry {\code {latex-mode-hook}}{188}
- \entry {\code {latex-run-command}}{187}
- \entry {\code {line-number-display-limit}}{79}
- \entry {\code {lisp-body-indent}}{205}
- \entry {\code {lisp-indent-offset}}{205}
- \entry {\code {lisp-interaction-mode-hook}}{200}
- \entry {\code {lisp-mode-hook}}{200}
- \entry {\code {lisp-mode-map}}{357}
- \entry {\code {list-directory-brief-switches}}{130}
- \entry {\code {list-directory-verbose-switches}}{130}
- \entry {\code {load-path}}{247}
- \entry {\code {lpr-header-switches}}{332}
- \entry {\code {lpr-switches}}{332}
- \initial {M}
- \entry {\code {mail-abbrevs}}{265}
- \entry {\code {mail-aliases}}{264}
- \entry {\code {mail-archive-file-name}}{263}
- \entry {\code {mail-default-reply-to}}{263}
- \entry {\code {mail-from-style}}{263}
- \entry {\code {mail-header-separator}}{262}
- \entry {\code {mail-mode-hook}}{267}
- \entry {\code {mail-personal-alias-file}}{264}
- \entry {\code {mail-self-blind}}{262}
- \entry {\code {mail-setup-hook}}{267}
- \entry {\code {mail-signature}}{266}
- \entry {\code {mail-yank-prefix}}{267}
- \entry {\code {make-backup-files}}{109}
- \entry {\code {Man-fontify-manpage-flag}}{214}
- \entry {\code {mark-ring}}{59}
- \entry {\code {mark-ring-max}}{59}
- \entry {\code {message-log-max}}{17}
- \entry {\code {minibuffer-local-completion-map}}{358}
- \entry {\code {minibuffer-local-map}}{358}
- \entry {\code {minibuffer-local-must-match-map}}{358}
- \entry {\code {minibuffer-local-ns-map}}{358}
- \entry {\code {mode-line-inverse-video}}{79}
- \entry {\code {mode-specific-map}}{357}
- \entry {\code {mouse-yank-at-point}}{148}
- \entry {\code {muddle-mode-hook}}{200}
- \initial {N}
- \entry {\code {next-line-add-newlines}}{29}
- \entry {\code {next-screen-context-lines}}{76}
- \entry {\code {no-redraw-on-reenter}}{80}
- \entry {\code {nroff-mode-hook}}{190}
- \initial {O}
- \entry {\code {outline-level}}{181}
- \entry {\code {outline-minor-mode-prefix}}{179}
- \entry {\code {outline-mode-hook}}{180}
- \entry {\code {outline-regexp}}{181}
- \initial {P}
- \entry {\code {page-delimiter}}{173}
- \entry {\code {paragraph-separate}}{172}
- \entry {\code {paragraph-start}}{172}
- \entry {\code {parens-dont-require-spaces}}{213}
- \entry {\code {perldb-mode-hook}}{244}
- \entry {\code {picture-mode-hook}}{257}
- \entry {\code {picture-tab-chars}}{259}
- \entry {\code {plain-tex-mode-hook}}{188}
- \entry {\code {ps-lpr-command}}{333}
- \entry {\code {ps-lpr-switches}}{333}
- \entry {\code {ps-print-color-p}}{333}
- \entry {\code {ps-print-header}}{333}
- \initial {R}
- \entry {\code {require-final-newline}}{108}
- \entry {\code {rlogin-explicit-args}}{330}
- \entry {\code {rmail-delete-after-output}}{275}
- \entry {\code {rmail-dont-reply-to-names}}{278}
- \entry {\code {rmail-edit-mode-hook}}{284}
- \entry {\code {rmail-highlighted-headers}}{283}
- \entry {\code {rmail-ignored-headers}}{283}
- \entry {\code {rmail-mail-new-frame}}{279}
- \entry {\code {rmail-output-file-alist}}{276}
- \entry {\code {rmail-primary-inbox-list}}{272}
- \entry {\code {rmail-redisplay-summary}}{282}
- \entry {\code {rmail-retry-ignored-headers}}{279}
- \entry {\code {rmail-secondary-file-directory}}{274}
- \entry {\code {rmail-secondary-file-regexp}}{274}
- \entry {\code {rmail-summary-window-size}}{281}
- \initial {S}
- \entry {\code {same-window-buffer-names}}{144}
- \entry {\code {same-window-regexps}}{144}
- \entry {\code {save-abbrevs}}{255}
- \entry {\code {scheme-mode-hook}}{200}
- \entry {\code {scroll-step}}{76}
- \entry {\code {sdb-mode-hook}}{244}
- \entry {\code {search-slow-speed}}{85}
- \entry {\code {search-slow-window-lines}}{85}
- \entry {\code {selective-display-ellipses}}{77}
- \entry {\code {sentence-end}}{171}
- \entry {\code {sentence-end-double-space}}{176}
- \entry {\code {server-temp-file-regexp}}{331}
- \entry {\code {server-window}}{331}
- \entry {\code {shell-cd-regexp}}{323}
- \entry {\code {shell-command-execonly}}{329}
- \entry {\code {shell-command-regexp}}{325}
- \entry {\code {shell-completion-fignore}}{324}
- \entry {\code {shell-file-name}}{322}
- \entry {\code {shell-input-ring-file-name}}{327}
- \entry {\code {shell-popd-regexp}}{323}
- \entry {\code {shell-prompt-pattern}}{324, 328}
- \entry {\code {shell-pushd-regexp}}{323}
- \entry {\code {shell-set-directory-error-hook}}{324}
- \entry {\code {slitex-mode-hook}}{188}
- \entry {\code {slitex-run-command}}{187}
- \entry {\code {sort-fold-case}}{335}
- \entry {\code {special-display-buffer-names}}{152}
- \entry {\code {special-display-frame-alist}}{153}
- \entry {\code {special-display-regexps}}{153}
- \entry {\code {split-window-keep-point}}{142}
- \entry {\code {standard-indent}}{195}
- \initial {T}
- \entry {\code {tab-stop-list}}{167}
- \entry {\code {tab-width}}{80}
- \entry {\code {tags-file-name}}{219}
- \entry {\code {tags-table-list}}{219}
- \entry {\code {term-file-prefix}}{370}
- \entry {\code {term-setup-hook}}{370}
- \entry {\code {tex-bibtex-command}}{188}
- \entry {\code {tex-default-mode}}{184}
- \entry {\code {tex-directory}}{187}
- \entry {\code {tex-dvi-print-command}}{187}
- \entry {\code {tex-dvi-view-command}}{187}
- \entry {\code {tex-mode-hook}}{188}
- \entry {\code {tex-run-command}}{187}
- \entry {\code {tex-shell-hook}}{188}
- \entry {\code {tex-show-queue-command}}{187}
- \entry {\code {text-mode-hook}}{179}
- \entry {\code {track-eol}}{29}
- \entry {\code {truncate-lines}}{33}
- \entry {\code {truncate-partial-width-windows}}{142}
- \initial {U}
- \entry {\code {undo-limit}}{31}
- \entry {\code {undo-strong-limit}}{31}
- \entry {\code {user-mail-address}}{368}
- \initial {V}
- \entry {\code {vc-command-messages}}{129}
- \entry {\code {vc-comment-alist}}{128}
- \entry {\code {vc-consult-headers}}{127}
- \entry {\code {vc-default-back-end}}{119}
- \entry {\code {vc-header-alist}}{128}
- \entry {\code {vc-initial-comment}}{119}
- \entry {\code {vc-keep-workfiles}}{129}
- \entry {\code {vc-log-mode-hook}}{121}
- \entry {\code {vc-make-backup-files}}{129}
- \entry {\code {vc-mistrust-permissions}}{129}
- \entry {\code {vc-path}}{129}
- \entry {\code {vc-static-header-alist}}{128}
- \entry {\code {vc-suppress-confirm}}{129}
- \entry {\code {version-control}}{109}
- \entry {\code {visible-bell}}{80}
- \initial {W}
- \entry {\code {window-min-height}}{145}
- \entry {\code {window-min-width}}{145}
- \initial {X}
- \entry {\code {x-cut-buffer-max}}{149}
- \entry {\code {xdb-mode-hook}}{244}
--- 0 ----
Index: emacs/man/forms.aux
diff -c emacs/man/forms.aux:1.1.1.1 emacs/man/forms.aux:removed
*** emacs/man/forms.aux:1.1.1.1	Fri Jul 19 01:55:59 1996
--- emacs/man/forms.aux	Fri Aug  2 21:02:31 1996
***************
*** 1,36 ****
- 'xrdef {Forms Example-title}{Forms Example}
- 'xrdef {Forms Example-pg}{3}
- 'xrdef {Forms Example-snt}{Chapter'tie1}
- 'xrdef {Entering and Exiting Forms Mode-title}{Entering and Exiting Forms Mode}
- 'xrdef {Entering and Exiting Forms Mode-pg}{5}
- 'xrdef {Entering and Exiting Forms Mode-snt}{Chapter'tie2}
- 'xrdef {Forms Commands-title}{Forms Commands}
- 'xrdef {Forms Commands-pg}{7}
- 'xrdef {Forms Commands-snt}{Chapter'tie3}
- 'xrdef {Data File Format-title}{Data File Format}
- 'xrdef {Data File Format-pg}{9}
- 'xrdef {Data File Format-snt}{Chapter'tie4}
- 'xrdef {Control File Format-title}{Control File Format}
- 'xrdef {Control File Format-pg}{11}
- 'xrdef {Control File Format-snt}{Chapter'tie5}
- 'xrdef {Format Description-title}{The Format Description}
- 'xrdef {Format Description-pg}{13}
- 'xrdef {Format Description-snt}{Chapter'tie6}
- 'xrdef {Modifying Forms Contents-title}{Modifying The Forms Contents}
- 'xrdef {Modifying Forms Contents-pg}{15}
- 'xrdef {Modifying Forms Contents-snt}{Chapter'tie7}
- 'xrdef {Miscellaneous-title}{Miscellaneous}
- 'xrdef {Miscellaneous-pg}{17}
- 'xrdef {Miscellaneous-snt}{Chapter'tie8}
- 'xrdef {Error Messages-title}{Error Messages}
- 'xrdef {Error Messages-pg}{19}
- 'xrdef {Error Messages-snt}{Chapter'tie9}
- 'xrdef {Long Example-title}{Long Example}
- 'xrdef {Long Example-pg}{21}
- 'xrdef {Long Example-snt}{Chapter'tie10}
- 'xrdef {Credits-title}{Credits}
- 'xrdef {Credits-pg}{23}
- 'xrdef {Credits-snt}{Chapter'tie11}
- 'xrdef {Index-title}{Index}
- 'xrdef {Index-pg}{25}
- 'xrdef {Index-snt}{}
--- 0 ----
Index: emacs/man/forms.cps
diff -c emacs/man/forms.cps:1.1.1.1 emacs/man/forms.cps:removed
*** emacs/man/forms.cps:1.1.1.1	Fri Jul 19 01:56:00 1996
--- emacs/man/forms.cps	Fri Aug  2 21:02:36 1996
***************
*** 1,55 ****
- \initial {B}
- \entry {\code {begin}}{8}
- \initial {C}
- \entry {\code {C-c {\tt\gtr}}}{7}
- \entry {\code {C-c {\tt\less}}}{7}
- \entry {\code {C-c C-k}}{7}
- \entry {\code {C-c C-l}}{7}
- \entry {\code {C-c C-n}}{7}
- \entry {\code {C-c C-o}}{7}
- \entry {\code {C-c C-p}}{7}
- \entry {\code {C-c C-q}}{7}
- \entry {\code {C-c C-s \var {regexp} \key {RET}}}{7}
- \entry {\code {C-c \key {TAB}}}{7}
- \entry {control file}{11}
- \initial {E}
- \entry {\code {end}}{8}
- \initial {F}
- \entry {field}{9}
- \entry {\code {forms-delete-record}}{7}
- \entry {\code {forms-enumerate}}{17}
- \entry {\code {forms-field-sep}}{9, 11}
- \entry {\code {forms-fields}}{13}
- \entry {\code {forms-file}}{11}
- \entry {\code {forms-find-file}}{5}
- \entry {\code {forms-find-file-other-window}}{5}
- \entry {\code {forms-first-record}}{7}
- \entry {\code {forms-format-list}}{11, 13}
- \entry {\code {forms-insert-record}}{7}
- \entry {\code {forms-jump-record}}{7}
- \entry {\code {forms-last-record}}{7}
- \entry {\code {forms-mode}}{17}
- \entry {\code {forms-mode-hooks}}{5}
- \entry {\code {forms-modified-record-filter}}{12}
- \entry {\code {forms-multi-line}}{9, 11}
- \entry {\code {forms-new-record-filter}}{12}
- \entry {\code {forms-next-field}}{7}
- \entry {\code {forms-next-record}}{7}
- \entry {\code {forms-number-of-fields}}{11}
- \entry {\code {forms-prev-field}}{7, 8}
- \entry {\code {forms-prev-record}}{7}
- \entry {\code {forms-read-only}}{11}
- \entry {\code {forms-search}}{7}
- \entry {\code {forms-toggle-read-only}}{7}
- \entry {\code {forms-version}}{17}
- \initial {N}
- \entry {\code {next}}{8}
- \initial {P}
- \entry {\code {prior}}{8}
- \entry {pseudo-newline}{9}
- \initial {R}
- \entry {record}{9}
- \initial {S}
- \entry {\code {S-Tab}}{8}
- \initial {T}
- \entry {\code {\key {TAB}}}{7}
--- 0 ----
Index: emacs/man/forms.texi
diff -c emacs/man/forms.texi:1.1.1.2 emacs/man/forms.texi:1.3
*** emacs/man/forms.texi:1.1.1.2	Mon Jul 22 01:53:50 1996
--- emacs/man/forms.texi	Wed Jul 31 01:36:44 1996
***************
*** 4,10 ****
  @c $Id: forms.texi,v 1.7 1994/10/15 10:58:31 jv Exp $
  
  @comment %**start of header (This is for running Texinfo on a region.)
! @setfilename ../info/forms
  @settitle Forms Mode User's Manual
  @syncodeindex vr cp
  @syncodeindex fn cp
--- 4,10 ----
  @c $Id: forms.texi,v 1.7 1994/10/15 10:58:31 jv Exp $
  
  @comment %**start of header (This is for running Texinfo on a region.)
! @setfilename ../info/forms.info
  @settitle Forms Mode User's Manual
  @syncodeindex vr cp
  @syncodeindex fn cp
Index: emacs/man/forms.vrs
diff -c emacs/man/forms.vrs:1.1.1.1 emacs/man/forms.vrs:removed
*** emacs/man/forms.vrs:1.1.1.1	Fri Jul 19 01:56:02 1996
--- emacs/man/forms.vrs	Fri Aug  2 21:02:39 1996
***************
*** 1,12 ****
- \initial {F}
- \entry {\code {forms-field-sep}}{3}
- \entry {\code {forms-fields}}{4}
- \entry {\code {forms-file}}{2}
- \entry {\code {forms-format-list}}{2, 4}
- \entry {\code {forms-forms-jump}}{3, 9}
- \entry {\code {forms-forms-scroll}}{3, 8}
- \entry {\code {forms-mode-hooks}}{9}
- \entry {\code {forms-multi-line}}{3}
- \entry {\code {forms-number-of-fields}}{2}
- \entry {\code {forms-read-only}}{3}
- \entry {\code {forms-version}}{10}
--- 0 ----
Index: emacs/man/gnu1.texi
diff -c emacs/man/gnu1.texi:1.1.1.1 emacs/man/gnu1.texi:1.2
*** emacs/man/gnu1.texi:1.1.1.1	Fri Jul 19 01:55:46 1996
--- emacs/man/gnu1.texi	Fri Jul 19 05:06:44 1996
***************
*** 1,4 ****
! @setfilename ../etc/GNU1
  @set justgnu
  @include gnu.texi
  @bye
--- 1,4 ----
! @setfilename ../etc/GNU
  @set justgnu
  @include gnu.texi
  @bye
Index: emacs/man/gnus.texi
diff -c emacs/man/gnus.texi:1.1.1.2 emacs/man/gnus.texi:1.3
*** emacs/man/gnus.texi:1.1.1.2	Mon Jul 22 01:53:59 1996
--- emacs/man/gnus.texi	Wed Jul 31 01:36:47 1996
***************
*** 1,7 ****
  \input texinfo                  @c -*-texinfo-*-
  @c Some important changes I made are indicated as !!!.
  @comment %**start of header (This is for running Texinfo on a region.)
! @setfilename ../info/gnus
  @settitle GNUS 3.15 Manual
  @iftex
  @finalout
--- 1,7 ----
  \input texinfo                  @c -*-texinfo-*-
  @c Some important changes I made are indicated as !!!.
  @comment %**start of header (This is for running Texinfo on a region.)
! @setfilename ../info/gnus.info
  @settitle GNUS 3.15 Manual
  @iftex
  @finalout
Index: emacs/man/info.texi
diff -c emacs/man/info.texi:1.1.1.2 emacs/man/info.texi:1.3
*** emacs/man/info.texi:1.1.1.2	Mon Jul 22 01:54:05 1996
--- emacs/man/info.texi	Wed Jul 31 01:36:51 1996
***************
*** 1,6 ****
  \input texinfo    @c -*-texinfo-*-
  @comment %**start of header 
! @setfilename ../info/info
  @settitle Info 1.0
  @comment %**end of header 
  
--- 1,6 ----
  \input texinfo    @c -*-texinfo-*-
  @comment %**start of header 
! @setfilename ../info/info.info
  @settitle Info 1.0
  @comment %**end of header 
  
Index: emacs/man/macro.texi
diff -c /dev/null emacs/man/macro.texi:1.1
*** /dev/null	Fri Aug  2 21:02:51 1996
--- emacs/man/macro.texi	Wed Jul 31 05:07:28 1996
***************
*** 0 ****
--- 1,177 ----
+ @c This file is included in makeinfo.texi.
+ @c
+ @ifinfo
+ @comment Here are some useful examples of the macro facility.
+ 
+ @c Simply insert the right version of the texinfo name.
+ @macro texinfo{}
+ TeXinfo
+ @end macro
+ 
+ @macro dfn{text}
+ @dfn{\text\}
+ @cpindex \text\
+ @end macro
+ 
+ @c Define a macro which expands to a pretty version of the name of the
+ @c Makeinfo program.
+ @macro makeinfo{}
+ @code{Makeinfo}
+ @end macro
+ 
+ @c Define a macro which is used to define other macros.  This one makes
+ @c a macro which creates a node and gives it a sectioning command.  Note
+ @c that the created macro uses the original definition within the
+ @c expansion text.  This takes advantage of the non-recursion feature of
+ @c macro execution.
+ @macro node_define{orig-name}
+ @macro \orig-name\{title}
+ @node \title\
+ @\orig-name\ \title\
+ @end macro
+ @end macro
+ 
+ @c Now actually define a new set of sectioning commands.
+ @node_define {chapter}
+ @node_define {section}
+ @node_define {subsection}
+ @end ifinfo
+ 
+ @chapter The Macro Facility
+ 
+ This chapter describes the new macro facility.
+ 
+ A @dfn{macro} is a command that you define in terms of other commands.
+ It doesn't exist as a @texinfo{} command until you define it as part of
+ the input file to @makeinfo{}.  Once the command exists, it behaves much
+ as any other @texinfo{} command.  Macros are a useful way to ease the
+ details and tedium of writing a `correct' info file.  The following
+ sections explain how to write and invoke macros.
+ 
+ @menu
+ * How to Use Macros in @texinfo{}::
+                         How to use the macro facility.
+ 
+ * Using Macros Recursively::
+                         How to write a macro which does (or doesn't) recurse.
+ 
+ * Using @texinfo{} Macros As Arguments::
+                         Passing a macro as an argument.
+ @end menu
+ 
+ @section How to Use Macros in @texinfo{}
+ 
+ Using macros in @texinfo{} is easy.  First you define the macro.  After
+ that, the macro command is available as a normal @texinfo{} command.
+ Here is what a definition looks like:
+ 
+ @example
+ @@macro @var{name}@{@var{arg1}, @var{@dots{}} @var{argn}@}
+ @var{@texinfo{} commands@dots{}}
+ @@end macro
+ @end example
+ 
+ The arguments that you specify that the macro takes are expanded with
+ the actual parameters used when calling the macro if they are seen
+ surrounded by backslashes.  For example, here is a definition of
+ @code{@@codeitem}, a macro which can be used wherever @code{@@item} can
+ be used, but which surrounds its argument with @code{@@code@{@dots{}@}}.
+ 
+ @example
+ @@macro codeitem@{item@}
+ @@item @@code@{\item\@}
+ @@end macro
+ @end example
+ 
+ When the macro is expanded, all of the text between the @code{@@macro}
+ and @code{@@end macro} is inserted into the document at the expansion
+ point, with the actual parameters substituted for the named parameters.
+ So, a call to the above macro might look like:
+ 
+ @example
+ @@codeitem@{Foo@}
+ @end example
+ 
+ and @makeinfo{} would execute the following code:
+ 
+ @example
+ @@item @@code@{Foo@}
+ @end example
+ 
+ A special case is made for macros which only take a single argument, and
+ which are invoked without any brace characters (i.e.,
+ @samp{@{}@dots{}@samp{@}}) surrounding an argument; the rest of the line
+ is supplied as is as the sole argument to the macro.  This special case
+ allows one to redefine some standard @texinfo{} commands without
+ modifying the input file.  Along with the non-recursive action of macro
+ invocation, one can easily redefine the sectioning commands to also
+ provide index entries:
+ 
+ @example
+ @@macro chapter@{name@}
+ @@chapter \name\
+ @@findex \name\
+ @@end macro
+ @end example
+ 
+ Thus, the text:
+ 
+ @example
+ @@chapter strlen
+ @end example
+ 
+ will expand to:
+ 
+ @example
+ @@chapter strlen
+ @@findex strlen
+ @end example
+ 
+ @section Using Macros Recursively
+ 
+ Normally, while a particular macro is executing, any call to that macro
+ will be seen as a call to a builtin @texinfo{} command.  This allows one
+ to redefine a builtin @texinfo{} command as a macro, and then use that
+ command within the definition of the macro itself.  For example, one
+ might wish to make sure that whereever a term was defined with
+ @code{@@dfn@{@dots{}@}}, the location of the definition would appear
+ in the concept index for the manual.  Here is a macro which redefines
+ @code{@@dfn} to do just that:
+ 
+ @example
+ @@macro dfn@{text@}
+ @@dfn@{\text\@}
+ @@cpindex \text\
+ @@end macro
+ @end example
+ 
+ Note that we used the builtin @texinfo{} command @code{@@dfn} within our
+ overriding macro definition.
+ 
+ This behaviour itself can be overridden for macro execution by writing a
+ special @dfn{macro control command} in the definition of the macro.  The
+ command is considered special because it doesn't affect the output text
+ directly, rather, it affects the way in which the macro is defined.  One
+ such special command is @code{@@allow-recursion}.
+ 
+ @example
+ @@macro silly@{arg@}
+ @@allow-recursion
+ \arg\
+ @@end macro
+ @end example
+ 
+ Now @code{@@silly} is a macro that can be used within a call to itself:
+ 
+ @example
+ This text @@silly@{@@silly@{some text@}@} is ``some text''.
+ @end example
+ 
+ @section Using @texinfo{} Macros As Arguments
+ 
+ @printindex cp
+ How to use @texinfo{} macros as arguments to other @texinfo{} macros.
+ 
+ @bye
+ 
+ 
Index: emacs/man/makeinfo.texi
diff -c /dev/null emacs/man/makeinfo.texi:1.1
*** /dev/null	Fri Aug  2 21:02:55 1996
--- emacs/man/makeinfo.texi	Wed Jul 31 05:07:30 1996
***************
*** 0 ****
--- 1,295 ----
+ \input texinfo    @c -*-texinfo-*-
+ @comment %**start of header
+ @setfilename ../info/makeinfo.info
+ @set VERSION 1.61
+ @paragraphindent none
+ @comment %**start of header
+ 
+ @ifinfo
+ This file is an extract from the @cite{Texinfo} manual.@*
+ It documents @code{makeinfo}, a program that converts Texinfo
+ files into Info files.  
+ 
+ Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
+ Permission is granted to make and distribute verbatim copies of
+ this manual provided the copyright notice and this permission notice
+ are preserved on all copies.
+ 
+ @ignore
+ Permission is granted to process this file through TeX and print the
+ results, provided the printed document carries copying permission
+ notice identical to this one except for the removal of this paragraph
+ (this paragraph not being relevant to the printed manual).
+ 
+ @end ignore
+ Permission is granted to copy and distribute modified versions of this
+ manual under the conditions for verbatim copying, provided that the entire
+ resulting derived work is distributed under the terms of a permission
+ notice identical to this one.
+ 
+ Permission is granted to copy and distribute translations of this manual
+ into another language, under the above conditions for modified versions,
+ except that this permission notice may be stated in a translation approved
+ by the Free Software Foundation.
+ @end ifinfo
+ 
+ @titlepage
+ @title GNU Makeinfo
+ @author Brian J. Fox and Robert J. Chassell
+ 
+ @page
+ @vskip 0pt plus 1filll
+ Copyright @copyright{} 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
+ Permission is granted to make and distribute verbatim copies of
+ this manual provided the copyright notice and this permission notice
+ are preserved on all copies.
+ 
+ Permission is granted to copy and distribute modified versions of this
+ manual under the conditions for verbatim copying, provided that the entire
+ resulting derived work is distributed under the terms of a permission
+ notice identical to this one.
+ 
+ Permission is granted to copy and distribute translations of this manual
+ into another language, under the above conditions for modified versions,
+ except that this permission notice may be stated in a translation approved
+ by the Free Software Foundation.
+ @end titlepage
+ 
+ @node Top, ,(dir), (dir)
+ @chapter What is @code{makeinfo}?
+ 
+ @iftex
+ This file documents the use of the @code{makeinfo} program, versions
+ @value{VERSION} and later.  It is an extract from the @cite{TeXinfo} manual.
+ @end iftex
+ 
+ @code{makeinfo} is a program for converting @dfn{TeXinfo} files into @dfn{Info}
+ files.  TeXinfo is a documentation system that uses a single source file to
+ produce both on-line information and printed output.
+ 
+ You can read the on-line information using Info; type @code{info} to
+ learn about Info.
+ @ifinfo
+ @xref{Top, Texinfo, Overview of Texinfo, texinfo, Texinfo},
+ @end ifinfo
+ @iftex
+ See the @cite{TeXinfo} manual,
+ @end iftex
+ to learn about the TeXinfo documentation system.
+ 
+ @menu
+ * Formatting Control::          Controlling the width of lines, paragraph
+                                 indentation, and other similar formatting.
+ 
+ * Options::                     Command line options which control the
+                                 behaviour of Makeinfo.
+ 
+ * Pointer Validation::          How Makeinfo can help you to track node
+                                 references through complex Texinfo files.
+ 
+ * The Macro Facility::          Makeinfo allows the use of @dfn{macros}.
+ 
+ * Index::                       Index of Concepts.
+ @end menu
+ 
+ @node Formatting Control
+ @section Controlling Paragraph Formats
+ 
+ Without any special options, @code{makeinfo} @dfn{fills} the paragraphs that
+ it outputs to an Info file.  Filling is the process of breaking and connecting
+ lines so that lines are the same length as or shorter than the number
+ specified as the fill column.  Lines are broken between words.  With
+ @code{makeinfo}, you can control:
+ 
+ @itemize @bullet
+ @item
+ The width of each paragraph (the @dfn{fill-column}).
+ @item
+ The amount of indentation that the first line of 
+ each paragraph receives (the @dfn{paragraph-indentation}).
+ @end itemize
+ 
+ @node Options
+ @section Command Line Options
+ 
+ The following command line options are available for @code{makeinfo}.
+ 
+ @need 100
+ @table @code
+ @item -D @var{var}
+ Cause @var{var} to be defined.  This is equivalent to 
+ @code{@@set @var{var}} in the Texinfo file.
+ 
+ @need 150
+ @item --error-limit @var{limit}
+ Set the maximum number of errors that @code{makeinfo} will report
+ before exiting (on the assumption that continuing would be useless).
+ The default number of errors that can be reported before
+ @code{makeinfo} gives up is 100.@refill
+ 
+ @need 150
+ @item --fill-column @var{width}
+ Specify the maximum number of columns in a line; this is the right-hand
+ edge of a line.  Paragraphs that are filled will be filled to this
+ width.  The default value for @code{fill-column} is 72.
+ @refill
+ 
+ @item --footnote-style @var{style}
+ Set the footnote style to @var{style}, either @samp{end} for the end
+ node style or @samp{separate} for the separate node style.  The value
+ set by this option overrides the value set in a Texinfo file by an
+ @code{@@footnotestyle} command.  When the footnote style is
+ @samp{separate}, @code{makeinfo} makes a new node containing the
+ footnotes found in the current node.  When the footnote style is
+ @samp{end}, @code{makeinfo} places the footnote references at the end
+ of the current node.@refill
+ 
+ @need 150
+ @item -I @var{dir}
+ Add @code{dir} to the directory search list for finding files that are
+ included using the @code{@@include} command.  By default,
+ @code{makeinfo} searches only the current directory.
+ 
+ @need 150
+ @item --no-headers
+ Do not include menus or node lines in the output.  This results in an
+ @sc{ascii} file that you cannot read in Info since it does not contain
+ the requisite nodes or menus; but you can print such a file in a
+ single, typewriter-like font and produce acceptable output.
+ 
+ @need 150
+ @item --no-split
+ Suppress the splitting stage of @code{makeinfo}.  Normally, large
+ output files (where the size is greater than 70k bytes) are split into
+ smaller subfiles, each one approximately 50k bytes.  If you specify
+ @samp{--no-split}, @code{makeinfo} will not split up the output
+ file.@refill
+ 
+ @need 100
+ @item --no-pointer-validate
+ @item --no-validate
+ Suppress the pointer-validation phase of @code{makeinfo}.  Normally,
+ after a Texinfo file is processed, some consistency checks are made to
+ ensure that cross references can be resolved, etc.
+ @xref{Pointer Validation}.@refill
+ 
+ @need 150
+ @item --no-warn
+ Suppress the output of warning messages.  This does @emph{not}
+ suppress the output of error messages, only warnings.  You might
+ want this if the file you are creating has examples of Texinfo cross
+ references within it, and the nodes that are referenced do not actually
+ exist.@refill
+ 
+ @item --no-number-footnotes
+ Supress automatic footnote numbering.  By default, @code{makeinfo}
+ numbers each footnote sequentially in a single node, resetting the
+ current footnote number to 1 at the start of each node.
+ 
+ @need 150
+ @item --output @var{file}
+ @itemx -o @var{file}
+ Specify that the output should be directed to @var{file} and not to the
+ file name specified in the @code{@@setfilename} command found in the Texinfo
+ source.  @var{file} can be the special token @samp{-}, which specifies
+ standard output.
+ 
+ @need 150
+ @item --paragraph-indent @var{indent}
+ Set the paragraph indentation style to @var{indent}.  The value set by
+ this option overrides the value set in a Texinfo file by an
+ @code{@@paragraphindent} command.  The value of @var{indent} is
+ interpreted as follows:@refill
+ 
+ @itemize @bullet
+ @item
+ If the value of @var{indent} is @samp{asis}, do not change the
+ existing indentation at the starts of paragraphs.@refill
+ 
+ @item
+ If the value of @var{indent} is zero, delete any existing
+ indentation.@refill
+ 
+ @item
+ If the value of @var{indent} is greater than zero, indent each
+ paragraph by that number of spaces.@refill
+ @end itemize
+ 
+ @need 100
+ @item --reference-limit @var{limit}
+ Set the value of the number of references to a node that
+ @code{makeinfo} will make without reporting a warning.  If a node has more
+ than this number of references in it, @code{makeinfo} will make the
+ references but also report a warning.@refill
+ 
+ @need 150
+ @item -U @var{var}
+ Cause @var{var} to be undefined.  This is equivalent to 
+ @code{@@clear @var{var}} in the Texinfo file.
+ 
+ @need 100
+ @item --verbose
+ Cause @code{makeinfo} to display messages saying what it is doing.
+ Normally, @code{makeinfo} only outputs messages if there are errors or
+ warnings.@refill
+ 
+ @need 100
+ @item --version
+ Report the version number of this copy of @code{makeinfo}.@refill
+ 
+ @item --help
+ Show a summary of the commend line arguments to @code{makeinfo}.
+ @end table
+ 
+ @node Pointer Validation
+ @section Pointer Validation
+ @cindex Pointer validation with @code{makeinfo}
+ @cindex Validation of pointers
+ 
+ If you do not suppress pointer-validation (by using the
+ @samp{--no-pointer-validation} option), @code{makeinfo}
+ will check the validity of the final Info file.  Mostly,
+ this means ensuring that nodes you have referenced
+ really exist.  Here is a complete list of what is
+ checked:@refill
+ 
+ @enumerate
+ @item
+ If a `Next', `Previous', or `Up' node reference is a reference to a
+ node in the current file and is not an external reference such as to
+ @file{(dir)}, then the referenced node must exist.@refill
+ 
+ @item
+ In every node, if the `Previous' node is different from the `Up' node, 
+ then the `Previous' node must also be pointed to by a `Next' node.@refill
+ 
+ @item
+ Every node except the `Top' node must have an `Up' pointer.@refill
+ 
+ @item
+ The node referenced by an `Up' pointer must contain a reference to the
+ current node in some manner other than through a `Next' reference.
+ This includes menu entries and cross references.@refill
+ 
+ @item
+ If the `Next' reference of a node is not the same as the `Next' reference
+ of the `Up' reference, then the node referenced by the `Next' pointer
+ must have a `Previous' pointer that points back to the current node.
+ This rule allows the last node in a section to point to the first node
+ of the next chapter.@refill
+ @end enumerate
+ 
+ @lowersections
+ @include macro.texi
+ @raisesections
+ 
+ @lowersections
+ @node Index
+ @appendix Index
+ @printindex cp
+ @raisesections
+ 
+ @contents
+ @bye
Index: emacs/man/ns-emacs.texi
diff -c /dev/null emacs/man/ns-emacs.texi:1.3
*** /dev/null	Fri Aug  2 21:03:07 1996
--- emacs/man/ns-emacs.texi	Thu Aug  1 02:02:47 1996
***************
*** 0 ****
--- 1,1034 ----
+ \input texinfo @c -*-texinfo-*-
+ 
+ @setfilename ../info/ns-emacs.info
+ @settitle Emacs for NeXTstep
+ 
+ @iftex
+ @finalout
+ @end iftex
+ 
+ @titlepage
+ @sp 10
+ @center @titlefont{Emacs 19 for NeXTstep}
+ @center (Version 4.2beta1, July 28, 1996)
+ @sp 2
+ @center Carl Edman
+ @center Christian Limpach
+ @sp 2
+ @end titlepage
+ 
+ @unnumbered Distribution
+ 
+ Copyright @copyright{} 1994 Carl Edman.
+ 
+ Permission is granted to make and distribute verbatim copies of
+ this manual provided the copyright notice and this permission notice
+ are preserved on all copies.
+ 
+ @ignore
+ Permission is granted to process this file through Tex and print the
+ results, provided the printed document carries copying permission
+ notice identical to this one except for the removal of this paragraph
+ (this paragraph not being relevant to the printed manual).
+ 
+ @end ignore
+ Permission is granted to copy and distribute modified versions of this
+ manual under the conditions for verbatim copying, provided that the entire
+ resulting derived work is distributed under the terms of a permission
+ notice identical to this one.
+ 
+ Permission is granted to copy and distribute translations of this manual
+ into another language, under the same conditions as for modified versions.
+ 
+ @ignore
+ @menu
+ * Introduction::                
+ * Events::                      
+ * Defaults::                    
+ * Tips and Tricks::             
+ * Thanks::                      
+ @end menu
+ @end ignore
+ 
+ @node Top, Introduction, (dir), (dir)
+ @top Emacs 19 for NS
+ 
+ Emacs 19 for NeXTstep is a version of GNU Emacs 19 which adds support
+ for the NeXTstep (or NS, for short) window system while leaving most of
+ the core functions of Emacs 19 unchanged.  As a result Emacs 19 for
+ NS can do anything which GNU Emacs 19 can do and is fully
+ compatible with all Emacs Lisp packages written for it.  It supports
+ NS on the same level (and mostly in a very similar manner) as X is
+ supported.  In addition Emacs 19 for NS has a number of NeXTy
+ features which do not have any X equivalent.  The design aim was to make
+ it look as similar as possible to an X application to Emacs Lisp
+ programs and to make it look like a normal NS application to
+ users.
+ 
+ Comments and bug reports relating to the window system interface are
+ welcome.  To report a bug please use the @samp{User/Submit Bug Report}
+ menu item.  This sends messages to Christian Limpach
+ <chris@@nice.ch>.
+ 
+ Problems and bugs which do not relate to the NS support (i.e. which can
+ be reproduced even in a dumb terminal or under X) are better posted to
+ gnu.emacs.help or mailed to <bug-gnu-emacs@@prep.ai.mit.edu> where general
+ GNU emacs improvements are discussed.  Any improvements made to it will
+ quickly find their way into this version as well.
+ 
+ There are also two mailing lists for Emacs for NS,
+ <emacs-for-ns-users@@lists.princeton.edu> and
+ <emacs-for-ns-announce@@lists.princeton.edu>.  The former is intended
+ for general discussion and allows anybody to post.  The latter restricts
+ posting and should contain only a handful of announcements of new
+ releases every year.  Both of these lists are handled by the CREN
+ Listproc which means that you can subscribe and unsubscribe
+ automatically.  For example, to subscribe to emacs-for-ns-users I'd send
+ a message with the content @samp{SUBSCRIBE emacs-for-ns-users Carl
+ Edman} to <listproc@@lists.princeton.edu>.  For more details write to
+ the same address with the content @samp{HELP}.
+ 
+ @menu
+ * Introduction::	What you need to know to use and program.
+ * Events::              How NS window system events are handled.
+ * Defaults::	        Customization for NS.
+ * Tips and Tricks::     Collected hints from Emacs users
+ * Thanks::              The people who helped create Emacs 19 for NS
+ @end menu
+ 
+ @node Introduction, Events, Top, Top
+ @section Introduction
+ 
+ Despite the size and complexity of GNU Emacs 19, NS and the
+ NS support code this manual can be kept mercifully short by saying
+ that everything written in the Emacs and the Emacs Lisp manuals about
+ GNU Emacs applies equally to this Emacs except as noted here.  
+ 
+ @itemize @bullet
+ @item
+ The @code{window-system} variable can now have the value @code{ns} in
+ addition to @code{x} and @code{nil}.  These are typical examples from
+ @file{~/.emacs} files which need to run different customizations
+ depending on whether a or which window system is running.
+ 
+ If you just want to distinguish between cases in which there is an
+ window system and in which there isn't, this construct is useful.
+ @lisp
+ (if window-system
+     ...       ;;; function to evaluate if any window system is running
+   ...)        ;;; function to evaluate only when running on a dumb terminal
+ @end lisp
+ 
+ For more detailed control, use this.
+ @lisp
+ (cond
+  ((eq window-system 'ns)         ;;; NS specific instructions
+   ...)        
+  ((eq window-system 'x)          ;;; X specific instructions
+   ...)
+  (t      ;;; Instructions for dumb terminal or other window systems
+   ...))
+ @end lisp
+ 
+ @item 
+ All X specific functions have been renamed to begin with @code{x-} if
+ they didn't already (which most did).  The equivalent NS functions
+ have been created with the same name but the @code{ns-} prefix.
+ Finally a function without any prefix was created which will call either
+ the @code{ns-} or the @code{x-} function depending on which window
+ system Emacs is running at the time.  For example, the original
+ @code{frame-face-alist} function was renamed to
+ @code{x-frame-face-alist}, @code{ns-frame-face-alist} was created to
+ fulfill the same task under NS and the new @code{frame-face-alist}
+ will call @code{x-frame-face-alist} when running Emacs under X and
+ @code{ns-frame-face-alist} when running under NS.  As the general
+ function will run under any window system its use is encouraged.
+ 
+ @item
+ A similar renaming was done on the handful of X specific variables.  The
+ only difference is that there are no generic variables which will work
+ in either window system.
+ 
+ @item
+ When Emacs is called by a name which ends in @file{-nw} it will always
+ start in terminal mode.  For example, a user who needs a terminal only
+ emacs would create a symbolic link from @file{emacs} to @file{emacs-nw}.
+ When he launches @file{emacs-nw} from the command line, the window
+ system will never be involved.
+ @end itemize
+ 
+ @node Events, Defaults, Introduction, Top
+ @section Events
+ 
+ Under Emacs the NS command key works as the @dfn{super} modifier key.
+ In principle users can bind their command keys to whatever function they
+ want, but to make the transition for NS users easier the default NS
+ startup files bind the most commonly used NS command keys to work just
+ like they do in most other NS applications.  This is the code which
+ accomplishes that.  You can of course override all of this in your
+ @file{~/.emacs} file.
+ 
+ @lisp
+ (define-key global-map [?\s-'] 'next-multiframe-window)
+ (define-key global-map [?\s--] 'center-line)
+ (define-key global-map [?\s-:] 'ispell)
+ (define-key global-map [?\s-;] 'ispell-next)
+ (define-key global-map [?\s-?] 'info)
+ (define-key global-map [?\s-^] 'kill-some-buffers)
+ (define-key global-map [?\s-&] 'kill-this-buffer)
+ (define-key global-map [?\s-D] 'dired)
+ (define-key global-map [?\s-E] 'edit-abbrevs)
+ (define-key global-map [?\s-G] 'hide-body)
+ (define-key global-map [?\s-L] 'shell-command)
+ (define-key global-map [?\s-M] 'manual-entry)
+ (define-key global-map [?\s-O] 'show-all)
+ (define-key global-map [?\s-S] 'write-file)
+ (define-key global-map [?\s-a] 'mark-whole-buffer)
+ (define-key global-map [?\s-c] 'kill-ring-save)
+ (define-key global-map [?\s-d] 'isearch-repeat-backward)
+ (define-key global-map [?\s-e] 'isearch-yank-kill)
+ (define-key global-map [?\s-f] 'isearch-forward)
+ (define-key global-map [?\s-g] 'isearch-repeat-forward)
+ (define-key global-map [?\s-h] 'do-hide-emacs)
+ (define-key global-map [?\s-j] 'exchange-point-and-mark)
+ (define-key global-map [?\s-l] 'goto-line)
+ (define-key global-map [?\s-m] 'iconify-frame)
+ (define-key global-map [?\s-n] 'new-frame)
+ (define-key global-map [?\s-o] 'find-file-other-frame)
+ (define-key global-map [?\s-p] 'print-buffer)
+ (define-key global-map [?\s-q] 'save-buffers-kill-emacs)
+ (define-key global-map [?\s-s] 'save-buffer)
+ (define-key global-map [?\s-t] 'ns-popup-fontpanel)
+ (define-key global-map [?\s-u] 'revert-buffer)
+ (define-key global-map [?\s-v] 'yank)
+ (define-key global-map [?\s-w] 'delete-frame)
+ (define-key global-map [?\s-x] 'kill-region)
+ (define-key global-map [?\s-z] 'undo)
+ (define-key global-map [?\s-|] 'shell-command-on-region)
+ @end lisp
+ 
+ NS applications receive a number of special events which have no X
+ equivalent.  Under Emacs these events can be bound to functions just
+ like ordinary keystrokes.  Here is a list of these events.
+ 
+ @table @code
+ @item ns-open-file
+ This event occurs when another NS application requests that Emacs
+ open a file.  A typical reason for this would be a user double-clicking
+ a file in the Workspace File Viewer.  When this event is registered the
+ name of the file to open is found in the variable @code{ns-input-file}.
+ 
+ This is the default binding.  It causes Emacs open the new file in the
+ selected frame if the selected buffer is a scratch buffer.  Otherwise
+ Emacs opens a new frame and display the file in that.
+ 
+ @lisp
+ (define-key global-map [ns-open-file] 'ns-find-file-fresh-frame)
+ @end lisp
+ 
+ To always get a new frame one would use a binding like this.
+ 
+ @lisp
+ (define-key global-map [ns-open-file] 'ns-find-file-other-frame)
+ @end lisp
+ 
+ If you prefer the opposite behavior (i.e. always putting the file into
+ the selected frame), use this.
+ 
+ @lisp
+ (define-key global-map [ns-open-file] 'ns-find-file)
+ @end lisp
+ 
+ @item ns-open-temp-file
+ This event occurs when another application requests that Emacs open a
+ temporary file.  The file name is again in @code{ns-input-file}.  By
+ default this is handled by just generating a @code{ns-open-file} event
+ (which then causes the @code{ns-open-file} function to be called
+ whatever that may be).
+ 
+ @lisp
+ (define-key global-map [ns-open-temp-file] [ns-open-file])
+ @end lisp
+ 
+ @item ns-open-file-line
+ Some applications (like e.g. ProjectBuilder or gdb) request not only a
+ particular file, but also a particular line or sequence of lines in the
+ file.  The file name is in @code{ns-input-file}, and
+ @code{ns-input-line} is either the line or a cons cell the car of which
+ contains the beginning line and the cdr of which the ending line.
+ 
+ @lisp
+ (define-key global-map [ns-open-file-line]
+             'ns-open-file-select-line)
+ @end lisp
+ 
+ @item ns-drag-file
+ When a user drags files from another application into an Emacs frame
+ this event is triggered.  Here @code{ns-input-file} is a list of all
+ dragged files.  The default binding inserts all the dragged files into
+ the current buffer.
+ 
+ @lisp
+ (define-key global-map [ns-drag-file] 'ns-insert-files)
+ @end lisp
+ 
+ @item ns-drag-color
+ When a user drags a color from the color well (or some other source)
+ Emacs sees this event and @code{ns-input-color} contains the name of the
+ dragged color.  The default bindings alter the foreground color of the
+ area the color was dragged onto (or background color if the color was
+ shift dragged).
+ 
+ @lisp
+ (define-key global-map [ns-drag-color]
+             'ns-set-foreground-at-mouse)
+ (define-key global-map [S-ns-drag-color]
+             'ns-set-background-at-mouse)
+ @end lisp
+ 
+ @item ns-change-font
+ Emacs allows the user to open a standard NS font panel (by default that
+ function is bound to @kbd{s-t}).  When the user selects a font in that
+ panel this event occurs.  @code{ns-input-font} will contain the name of
+ the selected font and @code{ns-input-fontsize} is its size.  The
+ default binding causes Emacs to adjust the font of the selected frame.
+ 
+ @lisp
+ (define-key global-map [ns-change-font] 'ns-respond-to-changefont)
+ @end lisp
+ 
+ @item ns-power-off
+ Finally when the user logs out and Emacs is still running it receives
+ this event so that it has a chance to save its files before it dies.
+ 
+ @lisp
+ (define-key global-map [ns-power-off]
+   '(lambda () (interactive) (save-buffers-kill-emacs t)))
+ @end lisp
+ 
+ @end table
+ 
+ In addition there are some NS keystrokes available on some NS/FIP
+ machines which are not available under X.  Their names are
+ self-explanatory.  They are @code{kp-at}, @code{kp-backslash},
+ @code{kp-backtick}, @code{kp-bar}, @code{kp-cube}, @code{kp-hash},
+ @code{kp-less}, @code{kp-more}, @code{kp-mu}, @code{kp-paragraph},
+ @code{kp-ring}, @code{kp-square}, @code{kp-tilde}, @code{kp-yen} and
+ @code{scroll-lock}.
+ 
+ Emacs 19 for NS also allows users to make use of NS services.  On the
+ most basic level programmers can use the @code{ns-perform-service} to
+ pass arbitrary strings to arbitrary services and receive the results
+ back.  A more user friendly interface is offered by the
+ @code{ns-define-service} macro.  Its argument is a list of strings which
+ describes the menu path to the service in question (see example).  It
+ returns a command which will send the region to the specified service
+ and if the service returns a value, the region is replaced by the return
+ value. Here are two usage examples:
+ 
+ @lisp
+ (define-key global-map [?\s-=] (ns-define-service '("Define in Webster")))
+ (define-key global-map [?\s-H] (ns-define-service '("HeaderViewer" "Find")))
+ @end lisp
+ 
+ Under NS 3.2 and later such lines are in general not needed as Emacs
+ will automatically define menu items for all the used services.
+ 
+ @node Defaults, Tips and Tricks, Events, Top
+ @section Defaults
+ 
+ Under X resources are used to customize the behavior of Emacs to the
+ needs of the user.  These resources are queried programmatically with
+ the @code{x-get-resource} function.  Under NS defaults fulfill a similar
+ function.  They can be read using the @code{ns-get-resource} function.
+ The @code{get-resource} function will read either X resources or NS
+ defaults depending on the window system which Emacs is running under and
+ so is the best choice for portable programs.  In addition, it is also
+ possible to set many of the following customizations by setting the
+ @code{default-frame-alist} in the @file{~/.emacs} file.  Calling the
+ function ns-save-preferences (for example through the @samp{Save
+ Preferences} menu item) will automatically write out the defaults
+ corresponding the selected window.
+ 
+ This is a listing of some of the more useful defaults (and their default
+ values).  Several of these defaults accept the names of colors as
+ values.  For a list of all available colors look in @file{etc/Emacs.clr}
+ and any other @file{.clr} file in the standard color search patch.
+ Emacs also accepts color specifications of the form @samp{RGBrrggbbaa}
+ where @var{rr}, @var{gg}, @var{bb} and @var{aa} are two hexadecimal
+ digits describing the red, green, blue and alpha content of the color
+ respectively.  @samp{HSBhhssbbaa}, @samp{CMYKccmmyykkaa} and
+ @samp{GRAYggaa} are the equivalents in @samp{HSB}, @samp{CMYK} and gray
+ scales.
+ 
+ @table @samp
+ @item InternalBorderWidth
+ Width in pixels of the internal border of the NS frame.
+ 
+ @example
+ dwrite Emacs InternalBorderWidth 2.0
+ @end example
+ 
+ @item VerticalScrollBars
+ @samp{YES} or @samp{NO} to enable or disable scroll bars.
+ 
+ @example
+ dwrite Emacs VerticalScrollBars YES
+ @end example
+ 
+ @item Menus
+ If this option is set, emacs will create and keep up to date a NS menu.
+ 
+ @example
+ dwrite Emacs Menus YES
+ @end example
+ 
+ @item AutoRaise
+ @samp{YES} or @samp{NO} to indicate whether windows should be automatically raised
+ when the mouse pointer enters them.
+ 
+ @example
+ dwrite Emacs AutoRaise NO
+ @end example
+ 
+ @item AutoLower
+ @samp{YES} or @samp{NO} to indicate whether windows should be automatically lowered
+ when the mouse pointer leaves them.
+ 
+ @example
+ dwrite Emacs AutoLower NO
+ @end example
+ 
+ @item fooFont
+ Name of the font to be used for the Emacs face of name @var{foo}.  If
+ @var{foo} is the empty string, the font for the entire frame is set
+ (which can be overriden by various faces).  If this font is not set,
+ Emacs 19 for NS will use the system wide fixed pitch font set in
+ Preferences.
+ 
+ For most users the system fixed pitch font will be @samp{Ohlfs} which
+ doesn't have any bold or italic versions.  As a consequence bold and
+ italic characters will be indistinguishable from unmodified characters
+ in Emacs.  If you wish to fix this use the following defaults which
+ cause Emacs to use @samp{Courier} instead of @samp{Ohlfs} for italic and
+ bold characters.
+ 
+ @example
+ dwrite Emacs ItalicFont Courier-Oblique
+ dwrite Emacs BoldFont Courier-Bold
+ dwrite Emacs Bold-ItalicFont Courier-BoldOblique
+ @end example
+ 
+ @item fooFontSize
+ Size of the font to be used for the Emacs face of name @var{foo}.  If
+ @var{foo} is the empty string the font size for the entire frame is set.
+ If this font size is not set, Emacs 19 for NS will use the size of the
+ system wide fixed pitch font set in Preferences.  GNU Emacs doesn't
+ currently handle fonts of differing sizes in one frame very well, so for
+ most users it is probably advisable to only set @samp{FontSize} and let
+ Emacs chose fonts of the same size for all faces.
+ 
+ @item fooForeground
+ Name of the color to be used to draw the Emacs face of name @var{foo}.
+ If @var{foo} is the empty string the foreground color for the entire
+ frame is set (which can be overriden by various faces).
+ 
+ @example
+ dwrite Emacs Foreground "Black"
+ @end example
+ 
+ @item fooBackground
+ Name of the color to be used to draw the background for the Emacs face
+ of name @var{foo}.  If @var{foo} is the empty string the background
+ color for the entire frame is set (which can be overriden by various
+ faces).
+ 
+ @example
+ dwrite Emacs Background "White"
+ @end example
+ 
+ @item fooUnderline
+ Whether to underline the Emacs face of name @var{foo}.  If @var{foo} is
+ the empty string the default sets whether the entire screen is
+ underlined (which can be overriden by various faces).
+ 
+ @example
+ dwrite Emacs Underline NO
+ @end example
+ 
+ @item Height
+ Height in rows of the default window.
+ 
+ @example
+ dwrite Emacs Height 48
+ @end example
+ 
+ @item Width
+ Width in columns of the default window.
+ 
+ @example
+ dwrite Emacs Width 80
+ @end example
+ 
+ @item CursorType
+ Name of the default cursor type for Emacs.  Allowed values are
+ @samp{bar}, @samp{box}, @samp{hollow}, @samp{line} and @samp{no}.
+ 
+ @example
+ dwrite Emacs CursorType box
+ @end example
+ 
+ @item CursorColor
+ Name of the default cursor type for Emacs.  Of a particular use for this
+ setting is the @samp{Highlight} "color".  When it is the cursor color,
+ Emacs will draw the cursor using the standard NS highlighting operator.
+ 
+ @example
+ dwrite Emacs CursorColor Highlight
+ @end example
+ 
+ @item Top
+ Distance in pixels from the top of the screen of the upper left corner
+ of the default window.
+ 
+ @example
+ dwrite Emacs Top 100
+ @end example
+ 
+ @item Left
+ Distance in pixels from the left edge of the screen to the upper left
+ corner of the default window.
+ 
+ @example
+ dwrite Emacs Left 100
+ @end example
+ 
+ @item HideOnAutoLaunch
+ @samp{YES} or @samp{NO} to determine whether Emacs will hide itself when
+ autolaunched from the dock.
+ 
+ @example
+ dwrite Emacs HideOnAutoLaunch NO
+ @end example
+ 
+ @item ShrinkSpace
+ For many postscript fonts default line spacing results in lines which
+ are very far apart.  It is possible to reduce that line spacing and get
+ more lines in the same vertical space.  Unfortunately by just how much
+ the line spacing can be shrunk greatly depends on the font in use and
+ shrinking the line spacing too much results in little specks of garbage
+ being left all over the screen.  Setting this option to @samp{YES}
+ shrinks line spacing by the maximum allowable amount for most commonly
+ used fixed pitch fonts.  @samp{NO} instructs Emacs not to shrink the
+ line spacing at all.  By setting this option to a floating point number
+ a user can fine-tune the line spacing.  On the scale for that number,
+ @samp{YES} corresponds to 0.75 and @samp{NO} corresponds to 1.0.
+ @example
+ dwrite Emacs ShrinkSpace YES
+ @end example
+ 
+ @item AlternateIsMeta
+ If this option is set, the alternate key works as meta key.  This is
+ generally the preferable behaviour for US and British users.  However
+ some continental users may want to turn off this option so that they can
+ enter special characters more easily. 
+ 
+ @example
+ dwrite Emacs AlternateIsMeta YES
+ @end example
+ 
+ On keyboards which have two alternate keys Emacs can also be configured
+ to use only one as a meta key while leaving the other one alone.
+ 
+ To use only the left alternate key as a meta key, use this dwrite.
+ 
+ @example
+ dwrite Emacs AlternateIsMeta LEFT
+ @end example
+ 
+ For the inverse, use this.
+ 
+ @example
+ dwrite Emacs AlternateIsMeta RIGHT
+ @end example
+ 
+ Only when this option is set to @samp{NO} NS dead key handling which
+ allows easy entry of umlauts and accents is enabled.
+ 
+ @item ISOLatin
+ @samp{YES} or @samp{NO} to determine whether Emacs uses the ISO-8859-1
+ extension to ASCII for input, output and file storage.  This encoding
+ differs from the NS default encoding for non-ASCII characters, but
+ coincides with that of X and some PC and Mac applications.
+ 
+ @example
+ dwrite Emacs ISOLatin NO
+ @end example
+ 
+ @item Buffered
+ @samp{YES} or @samp{NO} depending on whether Emacs should use buffered
+ or retained windows.  Which of the two gives the more pleasing display
+ performance is a matter of taste.
+ 
+ @example
+ dwrite Emacs Buffered YES
+ @end example
+ 
+ @item UseOpenPanel
+ If this option is set, Emacs will always use the standard NS open
+ panel to ask for filenames.  Otherwise Emacs will use the usual Emacs
+ method of reading a filename from the user.  Regardless of the setting
+ of this option the NS file requester is always available using
+ @code{ns-read-file-name}.  This option can also be turned on and off
+ using the @code{ns-use-open-panel} Emacs Lisp variable.
+ 
+ @example
+ dwrite Emacs UseOpenPanel NO
+ @end example
+ 
+ @item CursorBlinkRate
+ Users who want their cursor to blink can set the rate (in seconds) with
+ this dwrite.  Setting it to @samp{NO} disables cursor blinking.
+ 
+ @example
+ dwrite Emacs CursorBlinkRate NO
+ @end example
+ @end table
+ 
+ Another default used by many Emacs users is this.
+ 
+ @example
+ dwrite Workspace DefaultOpenApp Emacs
+ @end example
+ 
+ It will cause the Workspace to open files without a registered extension
+ in Emacs instead of as usual Edit.  For this default to work, Emacs
+ needs to be in the application search path of the Workspace (which
+ usually includes @file{~/Apps} and @file{/LocalApps}).
+ 
+ @node Tips and Tricks, Thanks, Defaults, Top
+ @section Tips and Tricks
+ 
+ Emacs is an extremely customizable editor.  You can make it conform to
+ virtually any conceivable user idiosyncrasy (and some which are not) by
+ adding a few well-chosen lines of emacs lisp to your @file{~/.emacs}.
+ Unfortunately even many experienced C developers are unfamiliar with
+ Emacs Lisp.  For that reason many Emacs defaults have been chosen to
+ make it behave as similar to Edit as possible.  But there are some
+ customizations which a majority of users probably would hate as much as
+ a minority would love them.  This section contains a cookbook of such
+ customizations.  New contributions by Emacs users are very welcome.
+ 
+ @menu
+ * Grabbing environment variables::  
+ * Miscellaneous useful variables::  
+ * Gnus and NeXTstep::           
+ * Backspace and delete::        
+ * Color adjustments::           
+ * Evaling in the minibuffer::   
+ * Scrolling long completions::  
+ * Highlighting matching parentheses::  
+ * Resize the minibuffer automatically::  
+ * Dealing with X specific packages::  
+ * Rebinding the numeric keypad::  
+ * Improving C mode::            
+ * Custom menu items::           
+ * Single line scrolling::       
+ * Extended font customization::  
+ @end menu
+ 
+ @node Grabbing environment variables, Miscellaneous useful variables, Tips and Tricks, Tips and Tricks
+ @subsection Grabbing environment variables
+ 
+ Many programs which may run under Emacs like latex or man depend on the
+ settings of environment variables.  If Emacs is launched from the shell,
+ it will automatically inherit these environment variables and its
+ subprocesses will inherit them from it.  But if Emacs is launched from
+ the Workspace it is not a descendant of any shell, so its environment
+ variables haven't been set which often causes the subprocesses it
+ launches to behave differently than they would when launched from the
+ shell.
+ 
+ To solve this problem Emacs for NS contains @code{grabenv}.  This
+ function will run a subshell and copy its environment variables into
+ Emacs.
+ 
+ Adding this line to your @file{~/.emacs} will grab the csh environment
+ whenever emacs runs under a window system.
+ 
+ @lisp
+ (if window-system (grabenv))
+ @end lisp
+ 
+ If you have a different shell you will have to give @code{grabenv} some
+ arguments.  For zsh you would do this.
+ 
+ @lisp
+ (if window-system (grabenv "/usr/bin/zsh"
+                            "source /etc/zshenv"
+                            "source ~/.zshenv"))
+ @end lisp
+ 
+ The reason that @code{grabenv} is not done by default is that it adds up
+ to a second or two to the Emacs startup time.
+ 
+ @node Miscellaneous useful variables, Gnus and NeXTstep, Grabbing environment variables, Tips and Tricks
+ @subsection Miscellaneous useful variables
+ 
+ This section describes a few variables you might want to set in your
+ @file{~/.emacs} each of which doesn't warrant its own section.
+ 
+ There is a conflict between the way the region behaved in emacs in the
+ pre-GUI days and the way GUI users expect the selection to work.  By
+ default that conflict is resolved by having the former adopt the
+ behaviour of the latter which most people prefer.  However if you are a
+ die-hard emacs user you may prefer things the other way around and add
+ this line to your @file{~/.emacs}.  Experiment with both settings.
+ 
+ @lisp
+ (setq transient-mark-mode nil)
+ @end lisp
+ 
+ When you try to move beyond the end of a file Emacs will add newlines as
+ needed.  With this line in your @file{~/.emacs} it will stop instead
+ like most other editors do.
+ 
+ @lisp
+ (setq next-line-add-newlines nil)
+ @end lisp
+ 
+ By default when you kill a line with text on it, only the text is
+ removed while the line itself remains.  You have to kill twice to really
+ get rid of the whole line.  When this variable is set and you kill a
+ line while at the beginning of the line it will go at once.
+ 
+ @lisp
+ (setq kill-whole-line t)
+ @end lisp
+ 
+ Annoyed by the Emacs startup message ?  Add this and you start with a
+ tabula rasa.
+ 
+ @lisp
+ (setq inhibit-startup-message t)
+ @end lisp
+ 
+ @node Gnus and NeXTstep, Backspace and delete, Miscellaneous useful variables, Tips and Tricks
+ @subsection Gnus and NeXTstep
+ 
+ Gnus is a highly sophisticated news reader which comes with Emacs.  Many
+ users prefer it over all traditional and even GUI based news readers.
+ However all its benefits are well described in the Emacs manual.  Here
+ let me just add a few NS specific enhancements.
+ 
+ If you have installed the mailapp utilities (available from better
+ archive sites everywhere) then this code in your @file{~/.emacs} will
+ cause gnus to route all your attempts to reply in it to Mail.app.  This
+ code also re-enables the delete key in the summary mode and puts an
+ identifying line on top of all your auto-replies.
+ 
+ @lisp
+ (eval-after-load "gnus"
+    '(progn
+       (define-key gnus-summary-mode-map [delete] 'gnus-summary-prev-page)
+       (load-library "gnus-mailapp"))
+ 
+ (setq gnus-default-article-saver 'gnus-summary-save-in-nextmail
+       gnus-mail-reply-method 'gnus-mail-reply-using-nextmail
+       gnus-mail-forward-method 'gnus-mail-forward-using-nextmail
+       gnus-mail-other-window-method 'gnus-mail-other-window-using-nextmail
+       gnus-mail-send-method (function gnus-mail-send-with-note))
+ @end lisp
+ 
+ These lines do not depend on the mailapp utilities.  They will cause all
+ your posted messages to be spell checked automatically (@emph{very}
+ useful !).  They will also automatically hide emacs while gnus starts
+ up.
+ 
+ @lisp
+ (eval-after-load "gnus"
+    '(progn
+       (add-hook 'news-inews-hook 'ispell-message)
+       (cond
+        ((eq window-system 'ns)
+         (add-hook 'gnus-startup-hook '(lambda () (hide-emacs t)))
+         (add-hook 'gnus-group-prepare-hook '(lambda () (hide-emacs nil)) t)))))
+ @end lisp
+ 
+ @node Backspace and delete, Color adjustments, Gnus and NeXTstep, Tips and Tricks
+ @subsection Backspace and delete
+ 
+ In the computer world there has been no end of confusion about the
+ meaning of backspace and delete.  Here is the convention used by Emacs
+ for NS.  Hitting the oblong key at the upper right hand corner of your
+ main keypad (usually labeled @samp{<--}) will generate a @code{delete}
+ event.  Hitting this key while holding down a shift key generates a
+ @code{backspace} event.  Both of these are distinct from hitting
+ @key{C-h} (which invokes the Emacs help system).
+ 
+ By default both @code{delete} and @code{backspace} will delete the
+ character preceding the cursor.  To rebind @code{delete} to delete the
+ character preceding the cursor and @code{backspace} to delete the
+ character under the cursor, do this.
+ 
+ @lisp
+ (global-set-key [delete] 'backward-delete-char-untabify)
+ (global-set-key [backspace] 'delete-char)
+ @end lisp
+ 
+ @node Color adjustments, Evaling in the minibuffer, Backspace and delete, Tips and Tricks
+ @subsection Color adjustments
+ 
+ A non-elisp hint: The easiest way to adjust your emacs color scheme is
+ to bring up a color panel (with @key{s-C}) and drag the color you want
+ over the emacs face you want to change.  Normal dragging will alter the
+ foreground color.  Shift dragging will alter the background color.  To
+ make the changes permanent select the "Save Preferences" item in the
+ "Info" menu.  Useful in this context is the listing of all faces
+ obtained by @key{M-x} list-faces-display.
+ 
+ @node Evaling in the minibuffer, Scrolling long completions, Color adjustments, Tips and Tricks
+ @subsection Evaling in the minibuffer
+ 
+ Often you (at least if you are an elisp hacker) want to quickly evaluate
+ an elisp expression.  To accomodate this desire Emacs provides the
+ @code{eval-expression} command bound to @key{ESC} @key{ESC}.  By default
+ it is disabled to protect novice users from themselves.  These commands
+ re-enable it and turn on an extremely powerful completion facility.
+ 
+ @lisp
+ (put 'eval-expression 'disabled nil)
+ 
+ (define-key read-expression-map "\t" 'lisp-complete-symbol)
+ @end lisp
+ 
+ @node Scrolling long completions, Highlighting matching parentheses, Evaling in the minibuffer, Tips and Tricks
+ @subsection Scrolling long completions
+ 
+ Frequently completions will contain more lines than can be displayed in
+ the completion window.  With this bit of code, hitting @key{TAB}
+ repeatedly will scroll through all possible completions.
+ 
+ @lisp
+ (defun minibuf-tab ()
+   "Like `minibuffer-complete', but if you use this repeatedly it will scroll
+ the window showing completions."
+   (interactive)
+   (or (eq last-command this-command) (setq minibuffer-scroll-window nil))
+   (if minibuffer-scroll-window
+       (save-excursion
+         (set-buffer (window-buffer minibuffer-scroll-window))
+         (if (pos-visible-in-window-p (point-max) minibuffer-scroll-window)
+             (set-window-start minibuffer-scroll-window (point-min))
+           (scroll-other-window)))
+     (minibuffer-complete)))
+ 
+ (define-key minibuffer-local-must-match-map "\t" 'minibuf-tab)
+ (define-key minibuffer-local-completion-map "\t" 'minibuf-tab)
+ @end lisp
+ 
+ This line will make completion nag you less if you select a valid
+ response.
+ 
+ @lisp
+ (setq minibuffer-completion-confirm nil)
+ @end lisp
+ 
+ @node Highlighting matching parentheses, Resize the minibuffer automatically, Scrolling long completions, Tips and Tricks
+ @subsection Highlighting matching parentheses
+ 
+ I doubt that there is anybody who doesn't use this already, but just in
+ case:
+ 
+ @lisp
+ (require 'paren)
+ @end lisp
+ 
+ Everybody who needs to match parentheses should have this in his
+ @file{~/.emacs}.
+ 
+ @node Resize the minibuffer automatically, Dealing with X specific packages, Highlighting matching parentheses, Tips and Tricks
+ @subsection Resize the minibuffer automatically
+ 
+ Often there is more data in the minibuffer than would fit into a single
+ line.  With this code the minibuffer expands automatically to show the
+ entire contents.
+ 
+ @lisp
+ (require 'rsz-mini)
+ (resize-minibuffer-mode 1)
+ @end lisp
+ 
+ @node Dealing with X specific packages, Rebinding the numeric keypad, Resize the minibuffer automatically, Tips and Tricks
+ @subsection Dealing with X specific packages
+ 
+ Some emacs lisp packages explicitly call X specific functions instead of
+ calling Emacs for NS generic function which call the NS or X versions as
+ appropriate.  Typically such packages will result in error messages like
+ @samp{Symbol's function definition is void: x-foo-bar}.  The proper way
+ of dealing with this is to have the author fix the code to call the
+ generic functions.  Generally all that requires is removing the
+ @samp{x-} prefix from all function calls.
+ 
+ However, sometimes that is not possible.  In such @file{ns-compat.el}
+ can help.  It redefines the X specific functions to call the generic
+ functions without requiring any changes in code and so should make most
+ X specific packages work.  To load @file{ns-compat.el} each time you
+ start Emacs, add this line to your @file{~/.emacs}.
+ 
+ @lisp
+ (require 'ns-compat)
+ @end lisp
+ 
+ @node Rebinding the numeric keypad, Improving C mode, Dealing with X specific packages, Tips and Tricks
+ @subsection Rebinding the numeric keypad
+ 
+ By default in Emacs the numeric keypad keys are bound to the same
+ characters they are in all other NS applications.  But it is easy to
+ change these bindings to commands many will find more useful.  As an
+ example here is the code which rebinds the numeric keypad for me.
+ 
+ @lisp
+ (global-set-key [kp-0] 'other-window)
+ (global-set-key [kp-1] 'end-of-buffer)
+ (global-set-key [kp-2] [down])
+ (global-set-key [kp-3] 'scroll-up)
+ (global-set-key [kp-4] [left])
+ (global-set-key [kp-5] 'set-mark-command)
+ (global-set-key [kp-6] [right])
+ (global-set-key [kp-7] 'beginning-of-buffer)
+ (global-set-key [kp-8] [up])
+ (global-set-key [kp-9] 'scroll-down)
+ (global-set-key [kp-decimal] 'yank)
+ (global-set-key [kp-enter] 'set-mark-command)
+ (global-set-key [kp-add] 'copy-region-as-kill)
+ (global-set-key [kp-subtract] 'kill-region)
+ @end lisp
+ 
+ On machines with function keys they can be bound as well.  This for
+ example would bind @key{F12} to run gnus.
+ 
+ @lisp
+ (global-set-key [f12] 'gnus)
+ @end lisp
+ 
+ @node Improving C mode, Custom menu items, Rebinding the numeric keypad, Tips and Tricks
+ @subsection Improving C mode
+ 
+ That underscores are considered to break words in C mode has been
+ driving me insane for a long time.  This line fixes the problem.
+ 
+ @lisp
+ (modify-syntax-entry ?_ "w" c-mode-syntax-table)
+ @end lisp
+ 
+ @node Custom menu items, Single line scrolling, Improving C mode, Tips and Tricks
+ @subsection Custom menu items
+ 
+ The user menu is intended for customization.  Adding items to it is
+ relatively painless as this example illustrates.
+ 
+ @lisp
+ (define-key global-map [menu-bar user www] '("WWW" . w3-use-hotlist))
+ @end lisp
+ 
+ @node Single line scrolling, Extended font customization, Custom menu items, Tips and Tricks
+ @subsection Single line scrolling
+ 
+ Scott Hess contributed these lines which make alternate arrow keys
+ behave in Emacs just like they do in Stuart.app.
+ 
+ @lisp
+ (defun scroll-one-line-down (arg)
+   (interactive "p")
+   (scroll-down arg))
+ 
+ (defun scroll-one-line-up (arg)
+   (interactive "p")
+   (scroll-up arg))
+ 
+ (global-set-key [M-up] 'scroll-one-line-down)
+ (global-set-key [M-down] 'scroll-one-line-up)
+ @end lisp
+ 
+ @node Extended font customization,  , Single line scrolling, Tips and Tricks
+ @subsection Extended font customization
+ 
+ @ignore
+ FIXME/cl
+ @end ignore
+ By default Emacs tries to guess the right font when you ask for a bold,
+ italic or bold-italic face.  Unfortunately this fails sometimes, for
+ example Emacs won't guess that it should use @samp{Courier-Bold} as the
+ font for the bold face of @samp{Ohlfs}.  As an example here is the code
+ which sets up @samp{Courier-Bold}, @samp{Courier-Oblique} and
+ @samp{Courier-BoldOblique} as the fonts to be used with @samp{Ohlfs}.
+ 
+ @lisp
+ (setq ns-convert-font-trait-alist
+       '(("Ohlfs" "Courier-Bold" "Courier-Oblique"
+          "Courier-BoldOblique")))
+ @end lisp
+ 
+ You will still have to set the @samp{DefaultFont}, @samp{BoldFont},
+ @samp{ItalicFont} and @samp{Bold-ItalicFont} defaults as Emacs
+ initializes the default faces before it reads your @file{~/.emacs}.
+ 
+ @example
+ dwrite Emacs DefaultFont Ohlfs
+ dwrite Emacs BoldFont Courier-Bold
+ dwrite Emacs ItalicFont Courier-Oblique
+ dwrite Emacs Bold-ItalicFont Courier-BoldOblique
+ @end example
+ 
+ @node Thanks,  , Tips and Tricks, Top
+ @section Thanks
+ A signficant number of people have been involved in the creation of
+ Emacs 19 for NS, but first of all I have to thank Michael Brouwer
+ <michael@@wft.stack.urc.tue.nl>, the author of Emacs.app and co-author
+ of Emacs 19 for NS until the Dutch army decided that so much talent
+ shouldn't go to waste and drafted him.  He wrote most of the input code.
+ 
+ Also a number of others have contributed code.  Scott Hess
+ <scott@@nic.gac.edu> helped with the keyboard handling.  Timothy Bissell
+ <bisselt@@gb.swissbank.com> wrote the ProjectBuilder glue.  Scott Byer
+ <byer@@mv.us.adobe.com> suggested and partly wrote the ISOLatin1
+ compatibility code.  The new faster code for dumping characters to the
+ screen is also all his fault.  The font panel code was Andrew Athans
+ <athan@@object.com> work.  Joe Reiss <jreiss@@magnus.acs.ohio-state.edu>
+ both created the beautiful icons you see and wrote the popup menu and
+ dialog box code as well as much else.  David Griffiths
+ <dave@@prim.demon.co.uk> sent me the code which made a reasonable (or
+ nearly so) NS file requester possible.  Some window manipulation code
+ was stolen from John C. Randolph.  And Darcy Brockbank
+ <darcy@@amber.hasc.ca> fixed the dreaded 8-bit color bug which popped up
+ in NS3.3.  Christian Limpach <Christian.Limpach@@nice.ch> in addition to
+ his help with tracking down bugs and fixing features wrote code which
+ improved the font handling of emacs.  Axel Seibert
+ <seiberta@@informatik.tu-muenchen.de> and Paul J. Sanchez
+ <paul@@whimsy.umsl.edu> offered their time and machines to make the
+ binary release possible.
+ 
+ Then there were a number of people who kept up the constant supply of
+ bug reports, suggested features and praise (which is the main fuel which
+ the development of a project like this runs) and so helped ensure that
+ this program is as bug free (hah !)  and feature rich as you see it
+ today.  First among them were Hardy Mayer <hardy@@golem.ps.uci.edu>,
+ Gisli Ottarsson <gisli@@timoshenko.eecs.umich.edu>, Anthony Heading
+ <ajrh@@signal.dra.hmg.gb>, David Bau <bau@@cs.cornell.edu>, Jamie
+ Zawinski <jwz@@lucid.com>, Martin Moncrieffe <moncrief@@mayo.edu>,
+ Simson L. Garfinkel <simsong@@next.cambridge.ma.us>, Richard Stallman
+ <rms@@gnu.ai.mit.edu>, Stephen Anderson <anderson@@sapir.cog.jhu.edu>,
+ Ivo Welch <ivo@@next.agsm.ucla.edu>, Magnus Nordborg
+ <magnus@@fisher.Stanford.EDU>, Tom Epperly
+ <epperly@@valeron.che.wisc.edu>, Andreas Koenig
+ <k@@franz.ww.tu-berlin.de>, Yves Arrouye <Yves.Arrouye@@imag.fr>, Anil
+ Somayaji <soma@@hotspur.mit.edu>, Gregor Hoffleit
+ <flight@@mathi.uni-heidelberg.DE> and doubtlessly many more I missed
+ when scanning the past couple thousand letters I received on this
+ subject.
+ 
+ Finally, let me also thank those few hundred other people on the mailing
+ list from whom I didn't hear much, but the presence of which assured me
+ that maybe this project was actually worth doing.
+ @bye
Index: emacs/man/sc.texi
diff -c emacs/man/sc.texi:1.1.1.2 emacs/man/sc.texi:1.3
*** emacs/man/sc.texi:1.1.1.2	Mon Jul 22 01:53:42 1996
--- emacs/man/sc.texi	Wed Jul 31 01:36:56 1996
***************
*** 1,7 ****
  \input texinfo  @comment -*-texinfo-*-
  @comment 3.47
  @comment %**start of header (This is for running Texinfo on a region.)
! @setfilename ../info/sc
  @settitle Supercite Version 3.1 User's Manual
  @iftex
  @finalout
--- 1,7 ----
  \input texinfo  @comment -*-texinfo-*-
  @comment 3.47
  @comment %**start of header (This is for running Texinfo on a region.)
! @setfilename ../info/sc.info
  @settitle Supercite Version 3.1 User's Manual
  @iftex
  @finalout
Index: emacs/man/texi2dvi
diff -c /dev/null emacs/man/texi2dvi:1.1
*** /dev/null	Fri Aug  2 21:03:37 1996
--- emacs/man/texi2dvi	Fri Jul 19 05:07:00 1996
***************
*** 0 ****
--- 1,263 ----
+ #!/bin/sh
+ # texi2dvi -- smartly produce DVI files from texinfo sources
+ #
+ # Copyright (C) 1992, 1993 Free Software Foundation.
+ #
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 2, or (at your option)
+ # any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ # GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, you can either send email to this
+ # program's author (see below) or write to:
+ #
+ #              Free Software Foundation, Inc.
+ #              675 Mass Ave.
+ #              Cambridge, MA 02139, USA. 
+ #
+ # Please send bug reports, etc. to bug-texinfo@prep.ai.mit.edu
+ # If possible, please send a copy of the output of the script called with
+ # the `--debug' option when making a bug report. 
+ #
+ # Version 0.4
+ # Last modified 26-Mar-93
+ #
+ 
+ # Please note that in the interest of general portability, some common
+ # bourne shell constructs were avoided because they weren't guaranteed to
+ # be available in some earlier implementations.  I've tried to make this as
+ # portable as possible. 
+ #
+ # Among the more interesting lossages I noticed with some bourne shells
+ # are:
+ #       1) Some don't have an `unset' builtin 
+ #       2) In some implementations the `shift' builtin can't take a
+ #          numerical argument. 
+ 
+ progname=`basename $0`
+ 
+ usage="Usage: ${progname} {-D} {-h} [file1] {file2} {...}
+        {--debug} {--help}
+ 
+    Options in braces are optional.  Those in brackets are required. 
+ "
+ 
+ if test $# -eq 0 ; then
+    echo "${usage}" 1>&2;
+    exit 1
+ fi
+ 
+ backup_extension=".bak"
+ texindex="texindex"
+ tex="tex"
+ bq="\`"  # To prevent hairy quoting and escaping later.
+ eq="'"
+ orig_pwd="`pwd`"
+ 
+ if test "z${TEXINDEX}" != "z" ; then
+    texindex="${TEXINDEX}"
+ fi
+ 
+ if test "z${TEX}" != "z" ; then
+    tex="${TEX}"
+ fi
+ 
+ # Save this so we can construct a new TEXINPUTS path for each file to be
+ # processed.
+ TEXINPUTS_orig="${TEXINPUTS}"
+ export TEXINPUTS
+ 
+ # Parse command line options
+ 
+ # "unset" option variables to make sure they weren't accidentally
+ # exported
+ debug=""
+ 
+ # If you add new commands be sure to change the wildcards below to make
+ # sure they are unambiguous (i.e. only match one possible long option)
+ # Be sure to show at least one instance of the full long option name to
+ # document what the long option is canonically called. 
+ while test $# -gt 0 ; do
+    case z$1 in
+       z-D | z--debug | z--d* )
+          debug="t"
+          shift
+         ;;
+       z-h | z--help | z--h* )
+          echo "${usage}" 1>&2
+          exit 1
+         ;;
+       z-- )
+          shift
+          break 
+         ;;
+       z-* )
+          echo "${progname}: ${bq}${1}${eq} is not a valid option." 1>&2
+          echo "" 1>&2
+          echo "${usage}" 1>&2
+          exit 1
+         ;;
+       * )
+          break 
+         ;;
+    esac
+ done
+ 
+ # See if there are any command line args left (which will be interpreted as
+ # filename arguments)
+ if test $# -eq 0 ; then
+    echo "${progname}: at least one file name is required as an argument." 1>&2
+    echo "" 1>&2
+    echo "${usage}" 1>&2
+    exit 1
+ fi
+ 
+ test "z${debug}" = "zt" && set -x
+ 
+ # Texify files
+ for command_line_filename in ${1+"$@"} ; do
+    # Roughly equivalent to `dirname ...`, but more portable
+    directory="`echo ${command_line_filename} | sed 's/\/[^\/]*$//'`"
+    filename_texi="`basename ${command_line_filename}`"
+    # Strip off the last extension part (probably .texinfo or .texi)
+    filename_noext="`echo ${filename_texi} | sed 's/\.[^.]*$//'`"
+ 
+    # If directory and file are the same, then it's probably because there's
+    # no pathname component.  Set dirname to `.', the current directory.
+    if test "z${directory}" = "z${command_line_filename}" ; then
+       directory="."
+    fi
+ 
+    # Source file might @include additional texinfo sources.  Put `.' and
+    # directory where source file(s) reside in TEXINPUTS before anything
+    # else.  `.' goes first to ensure that any old .aux, .cps, etc. files in
+    # ${directory} don't get used in preference to fresher files in `.'. 
+    TEXINPUTS=".:${directory}:${TEXINPUTS_orig}"
+ 
+    # "Unset" variables that might have values from previous iterations and
+    # which won't be completely reset later.
+    definite_index_files=""
+ 
+    # See if file exists here.  If it doesn't we're in trouble since, even
+    # though the user may be able to reenter a valid filename at the tex
+    # prompt (assuming they're attending the terminal), this script won't be
+    # able to find the right index files and so forth.
+    if test ! -r "${command_line_filename}" ; then
+       echo "${progname}: ${command_line_filename}: No such file or permission denied." 1>&2
+       continue; 
+    fi
+ 
+    # Find all files having root filename with a two-letter extension,
+    # determine whether they're really index files, and save them.  Foo.aux
+    # is actually the cross-references file, but we need to keep track of
+    # that too.
+    possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+    for this_file in ${possible_index_files} ; do
+       # If file is empty, forget it.  
+       if test ! -s "${this_file}" ; then
+          continue;
+       fi
+ 
+       # Examine first character of file.  If it's not a backslash or
+       # single quote, then it's definitely not an index or xref file.
+       first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+       if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
+          definite_index_files="${definite_index_files} ${this_file}"
+       fi
+    done
+    orig_index_files="${definite_index_files}"
+    orig_index_files_sans_aux="`echo ${definite_index_files} \
+                                 | sed 's/'${filename_noext}'\.aux//;
+                                        s/^[ ]*//;s/[ ]*$//;'`"
+ 
+    # Now save copies of original index files so we have some means of
+    # comparison later. 
+    for index_file_to_save in ${orig_index_files} ; do
+        cp "${index_file_to_save}" "${index_file_to_save}${backup_extension}"
+    done
+ 
+    # Run texindex on current index files.  If they already exist, and
+    # after running TeX a first time the index files don't change, then
+    # there's no reason to run TeX again.  But we won't know that if the
+    # index files are out of date or nonexistent.
+    if test "${orig_index_files_sans_aux}" ; then
+       ${texindex} ${orig_index_files_sans_aux}
+    fi
+ 
+    if ${tex} ${command_line_filename} ; then		# TeX run first time
+       definite_index_files=""
+       # Get list of new index files
+       possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+       for this_file in ${possible_index_files} ; do
+          # If file is empty, forget it.
+          if test ! -s ${this_file} ; then
+             continue;
+          fi
+ 
+          # Examine first character of file.  If it's not a backslash or
+          # single quote, then it's definitely not an index or xref file.
+          first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+          if test "${first_character}" = "\\" -o "${first_character}" = "'" ; then
+             definite_index_files="${definite_index_files} ${this_file}"
+          fi
+       done
+       new_index_files="${definite_index_files}"
+       new_index_files_sans_aux="`echo ${definite_index_files} \
+                                   | sed 's/'${filename_noext}'\.aux//;
+                                          s/^[ ]*//;s/[ ]*$//;'`"
+ 
+       # If old and new list don't at least have the same file list, then one
+       # file or another has definitely changed.  
+       if test "${orig_index_files}" != "${new_index_files}" ; then
+          index_files_changed_p=t
+       else
+          # File list is the same.  We must compare each file until we find a
+          # difference.  
+          index_files_changed_p=""
+          for this_file in ${new_index_files} ; do
+             # cmp -s will return nonzero exit status if files differ. 
+             cmp -s "${this_file}" "${this_file}${backup_extension}"
+             if test $? -ne 0  ; then
+                # We only need to keep comparing until we find *one* that
+                # differs, because we'll have to run texindex & tex no
+                # matter what. 
+                index_files_changed_p=t
+                break
+             fi
+          done
+       fi
+ 
+       # If index files have changed since TeX has been run, or if the aux
+       # file wasn't present originally, run texindex and TeX again.
+       if test "${index_files_changed_p}"  ; then
+          retval=0
+          if test "${new_index_files_sans_aux}" ; then
+             ${texindex} ${new_index_files_sans_aux} 
+             retval=$?
+          fi
+          if test ${retval} -eq 0 ; then
+             ${tex} "${command_line_filename}"
+          fi
+       fi
+    fi
+ 
+    # Generate list of files to delete, then call rm once with the entire
+    # list.  This is significantly faster than multiple executions of rm. 
+    file_list=""
+    for file in ${orig_index_files} ; do
+        file_list="${file_list} ${file}${backup_extension}"
+    done
+    if test "${file_list}" ; then
+       rm -f ${file_list}
+    fi
+ done
+ 
+ #
+ # eof
+ #
Index: emacs/man/vip.aux
diff -c emacs/man/vip.aux:1.1.1.1 emacs/man/vip.aux:removed
*** emacs/man/vip.aux:1.1.1.1	Fri Jul 19 01:55:53 1996
--- emacs/man/vip.aux	Fri Aug  2 21:03:47 1996
***************
*** 1,129 ****
- 'xrdef {Survey-title}{A Survey of VIP}
- 'xrdef {Survey-pg}{3}
- 'xrdef {Survey-snt}{Chapter'tie1}
- 'xrdef {Basic Concepts-title}{Basic Concepts}
- 'xrdef {Basic Concepts-pg}{3}
- 'xrdef {Basic Concepts-snt}{Section'tie1.1}
- 'xrdef {Loading VIP-title}{Loading VIP}
- 'xrdef {Loading VIP-pg}{3}
- 'xrdef {Loading VIP-snt}{Section'tie1.2}
- 'xrdef {Modes in VIP-title}{Modes in VIP}
- 'xrdef {Modes in VIP-pg}{4}
- 'xrdef {Modes in VIP-snt}{Section'tie1.3}
- 'xrdef {Emacs Mode-title}{Emacs Mode}
- 'xrdef {Emacs Mode-pg}{5}
- 'xrdef {Emacs Mode-snt}{Section'tie1.3.1}
- 'xrdef {Vi Mode-title}{Vi Mode}
- 'xrdef {Vi Mode-pg}{5}
- 'xrdef {Vi Mode-snt}{Section'tie1.3.2}
- 'xrdef {Insert Mode-title}{Insert Mode}
- 'xrdef {Insert Mode-pg}{5}
- 'xrdef {Insert Mode-snt}{Section'tie1.3.3}
- 'xrdef {Differences from Vi-title}{Differences from Vi}
- 'xrdef {Differences from Vi-pg}{6}
- 'xrdef {Differences from Vi-snt}{Section'tie1.4}
- 'xrdef {Undoing-title}{Undoing}
- 'xrdef {Undoing-pg}{6}
- 'xrdef {Undoing-snt}{Section'tie1.4.1}
- 'xrdef {Changing-title}{Changing}
- 'xrdef {Changing-pg}{6}
- 'xrdef {Changing-snt}{Section'tie1.4.2}
- 'xrdef {Searching-title}{Searching}
- 'xrdef {Searching-pg}{6}
- 'xrdef {Searching-snt}{Section'tie1.4.3}
- 'xrdef {z Command-title}{z Command}
- 'xrdef {z Command-pg}{7}
- 'xrdef {z Command-snt}{Section'tie1.4.4}
- 'xrdef {Counts-title}{Counts}
- 'xrdef {Counts-pg}{7}
- 'xrdef {Counts-snt}{Section'tie1.4.5}
- 'xrdef {Marking-title}{Marking}
- 'xrdef {Marking-pg}{7}
- 'xrdef {Marking-snt}{Section'tie1.4.6}
- 'xrdef {Region Commands-title}{Region Commands}
- 'xrdef {Region Commands-pg}{7}
- 'xrdef {Region Commands-snt}{Section'tie1.4.7}
- 'xrdef {New Commands-title}{Some New Commands}
- 'xrdef {New Commands-pg}{8}
- 'xrdef {New Commands-snt}{Section'tie1.4.8}
- 'xrdef {New Bindings-title}{New Key Bindings}
- 'xrdef {New Bindings-pg}{9}
- 'xrdef {New Bindings-snt}{Section'tie1.4.9}
- 'xrdef {Window Commands-title}{Window Commands}
- 'xrdef {Window Commands-pg}{10}
- 'xrdef {Window Commands-snt}{Section'tie1.4.10}
- 'xrdef {Buffer Commands-title}{Buffer Commands}
- 'xrdef {Buffer Commands-pg}{10}
- 'xrdef {Buffer Commands-snt}{Section'tie1.4.11}
- 'xrdef {File Commands-title}{File Commands}
- 'xrdef {File Commands-pg}{11}
- 'xrdef {File Commands-snt}{Section'tie1.4.12}
- 'xrdef {Misc Commands-title}{Miscellaneous Commands}
- 'xrdef {Misc Commands-pg}{11}
- 'xrdef {Misc Commands-snt}{Section'tie1.4.13}
- 'xrdef {Vi Commands-title}{Vi Commands}
- 'xrdef {Vi Commands-pg}{12}
- 'xrdef {Vi Commands-snt}{Chapter'tie2}
- 'xrdef {Numeric Arguments-title}{Numeric Arguments}
- 'xrdef {Numeric Arguments-pg}{12}
- 'xrdef {Numeric Arguments-snt}{Section'tie2.1}
- 'xrdef {Important Keys-title}{Important Keys}
- 'xrdef {Important Keys-pg}{12}
- 'xrdef {Important Keys-snt}{Section'tie2.2}
- 'xrdef {Buffers and Windows-title}{Buffers and Windows}
- 'xrdef {Buffers and Windows-pg}{13}
- 'xrdef {Buffers and Windows-snt}{Section'tie2.3}
- 'xrdef {Files-title}{Files}
- 'xrdef {Files-pg}{14}
- 'xrdef {Files-snt}{Section'tie2.4}
- 'xrdef {Viewing the Buffer-title}{Viewing the Buffer}
- 'xrdef {Viewing the Buffer-pg}{15}
- 'xrdef {Viewing the Buffer-snt}{Section'tie2.5}
- 'xrdef {Mark Commands-title}{Mark Commands}
- 'xrdef {Mark Commands-pg}{16}
- 'xrdef {Mark Commands-snt}{Section'tie2.6}
- 'xrdef {Motion Commands-title}{Motion Commands}
- 'xrdef {Motion Commands-pg}{17}
- 'xrdef {Motion Commands-snt}{Section'tie2.7}
- 'xrdef {Searching and Replacing-title}{Searching and Replacing}
- 'xrdef {Searching and Replacing-pg}{19}
- 'xrdef {Searching and Replacing-snt}{Section'tie2.8}
- 'xrdef {Modifying Commands-title}{Modifying Commands}
- 'xrdef {Modifying Commands-pg}{20}
- 'xrdef {Modifying Commands-snt}{Section'tie2.9}
- 'xrdef {Delete Commands-title}{Delete Commands}
- 'xrdef {Delete Commands-pg}{21}
- 'xrdef {Delete Commands-snt}{Section'tie2.9.1}
- 'xrdef {Yank Commands-title}{Yank Commands}
- 'xrdef {Yank Commands-pg}{22}
- 'xrdef {Yank Commands-snt}{Section'tie2.9.2}
- 'xrdef {Put Back Commands-title}{Put Back Commands}
- 'xrdef {Put Back Commands-pg}{22}
- 'xrdef {Put Back Commands-snt}{Section'tie2.9.3}
- 'xrdef {Change Commands-title}{Change Commands}
- 'xrdef {Change Commands-pg}{23}
- 'xrdef {Change Commands-snt}{Section'tie2.9.4}
- 'xrdef {Repeating and Undoing Modifications-title}{Repeating and Undoing Modifications}
- 'xrdef {Repeating and Undoing Modifications-pg}{23}
- 'xrdef {Repeating and Undoing Modifications-snt}{Section'tie2.9.5}
- 'xrdef {Other Vi Commands-title}{Other Vi Commands}
- 'xrdef {Other Vi Commands-pg}{24}
- 'xrdef {Other Vi Commands-snt}{Section'tie2.10}
- 'xrdef {Commands in Insert Mode-title}{Insert Mode}
- 'xrdef {Commands in Insert Mode-pg}{25}
- 'xrdef {Commands in Insert Mode-snt}{Section'tie2.11}
- 'xrdef {Ex Commands-title}{Ex Commands}
- 'xrdef {Ex Commands-pg}{27}
- 'xrdef {Ex Commands-snt}{Chapter'tie3}
- 'xrdef {Ex Command Reference-title}{Ex Command Reference}
- 'xrdef {Ex Command Reference-pg}{27}
- 'xrdef {Ex Command Reference-snt}{Section'tie3.1}
- 'xrdef {Customization-title}{Customization}
- 'xrdef {Customization-pg}{31}
- 'xrdef {Customization-snt}{Chapter'tie4}
- 'xrdef {Customizing Constants-title}{Customizing Constants}
- 'xrdef {Customizing Constants-pg}{31}
- 'xrdef {Customizing Constants-snt}{Section'tie4.1}
- 'xrdef {Customizing Key Bindings-title}{Customizing Key Bindings}
- 'xrdef {Customizing Key Bindings-pg}{32}
- 'xrdef {Customizing Key Bindings-snt}{Section'tie4.2}
--- 0 ----
Index: emacs/man/vip.texi
diff -c emacs/man/vip.texi:1.1.1.2 emacs/man/vip.texi:1.3
*** emacs/man/vip.texi:1.1.1.2	Mon Jul 22 01:54:38 1996
--- emacs/man/vip.texi	Wed Jul 31 01:36:59 1996
***************
*** 1,6 ****
  \input texinfo
  
! @setfilename ../info/vip
  @settitle VIP
  
  @iftex
--- 1,6 ----
  \input texinfo
  
! @setfilename ../info/vip.info
  @settitle VIP
  
  @iftex
Index: emacs/src/.gdbinit
diff -c emacs/src/.gdbinit:1.1.1.2 emacs/src/.gdbinit:1.3
*** emacs/src/.gdbinit:1.1.1.2	Mon Jul 22 01:44:03 1996
--- emacs/src/.gdbinit	Wed Jul 31 01:37:05 1996
***************
*** 254,270 ****
  end
  
  set print pretty on
! set print sevenbit-strings
  
! show environment DISPLAY
! show environment TERM
! set args -geometry 80x40+0+0
  
  # Don't let abort actually run, as it will make
  # stdio stop working and therefore the `pr' command above as well.
  break abort
  
  # If we are running in synchronous mode, we want a chance to look around
  # before Emacs exits.  Perhaps we should put the break somewhere else
  # instead...
  break x_error_quitter
--- 254,295 ----
  end
  
  set print pretty on
! handle SIGTSTP nopass stop print
! # set print sevenbit-strings
  
! # show environment DISPLAY
! # show environment TERM
! # set args -geometry 80x40+0+0
! set args -ns -q
  
  # Don't let abort actually run, as it will make
  # stdio stop working and therefore the `pr' command above as well.
  break abort
+ break exit
+ 
+ #break ns_ring_bell
+ #command
+ #silent
+ #showps
+ #enable 3
+ #disable 2
+ #cont
+ #end
+ #
+ #break ns_ring_bell
+ #command
+ #silent
+ #shownops
+ #disable 3
+ #enable 2
+ #cont
+ #end
+ #disable 2 3
  
  # If we are running in synchronous mode, we want a chance to look around
  # before Emacs exits.  Perhaps we should put the break somewhere else
  # instead...
  break x_error_quitter
+ 
+ # break check_x
+ break wrong_type_argument
Index: emacs/src/Makefile.in.in
diff -c emacs/src/Makefile.in.in:1.1.1.2 emacs/src/Makefile.in.in:1.3
*** emacs/src/Makefile.in.in:1.1.1.2	Mon Jul 22 01:43:37 1996
--- emacs/src/Makefile.in.in	Wed Jul 31 01:37:08 1996
***************
*** 259,266 ****
--- 259,276 ----
  /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM
     since it may have -I options that should override those two.  */
  ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAG) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM ${CFLAGS}
+ .SUFFIXES: .m .pswm
+ /* .el .elc FIXME/cl */
  .c.o:
  	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
+ .m.o:
+ 	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
+ .pswm.m:
+ 	pswrap $(PSWFLAGS) -o $@ >/dev/null $<
+ .pswm.h:
+ 	pswrap $(PSWFLAGS) -h $@ >/dev/null $<
+ /* .el.elc:
+ 	temacs -batch -l loadup compile FIXME/cl */
  
  #ifndef LIBX10_MACHINE
  #define LIBX10_MACHINE
***************
*** 350,355 ****
--- 360,371 ----
  #endif /* not HAVE_X11 */
  #endif /* not HAVE_X_WINDOWS */
  
+ #ifdef HAVE_NS
+ /* Object files for NeXTstep */
+ PSWFLAGS=-a
+ NSOBJ= nsterm.o nsfns.o nsfaces.o nsmenu.o nsselect.o nswraps.o
+ #endif
+ 
  #ifndef ORDINARY_LINK
  /* Fix linking if compiled with GCC.  */
  #ifdef __GNUC__
***************
*** 457,462 ****
--- 473,484 ----
  #define GETLOADAVG_OBJ getloadavg.o
  #endif
  
+ #ifdef HAVE_WIN
+ #define FRAME_OBJ multi-frame.o
+ #else
+ #define FRAME_OBJ
+ #endif
+ 
  #ifdef HAVE_MKTIME
  #define MKTIME_OBJ
  #else
***************
*** 477,483 ****
  /* 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 window.o \
! 	cm.o term.o $(XOBJ) \
  	emacs.o keyboard.o macros.o keymap.o sysdep.o \
  	buffer.o filelock.o insdel.o marker.o INTERVAL_OBJ \
  	minibuf.o fileio.o dired.o filemode.o \
--- 499,505 ----
  /* 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 window.o \
! 	cm.o term.o $(XOBJ) $(NSOBJ) FRAME_OBJ \
  	emacs.o keyboard.o macros.o keymap.o sysdep.o \
  	buffer.o filelock.o insdel.o marker.o INTERVAL_OBJ \
  	minibuf.o fileio.o dired.o filemode.o \
***************
*** 901,907 ****
     commands.h syssignal.h systime.h systty.h syswait.h frame.h $(config_h) 
  regex.o: regex.c syntax.h buffer.h $(config_h) regex.h 
  region-cache.o: region-cache.c buffer.h region-cache.h
! frame.o: frame.c xterm.h window.h frame.h termhooks.h commands.h keyboard.h \
     buffer.h $(config_h)
  scroll.o: scroll.c termchar.h dispextern.h frame.h $(config_h)
  search.o: search.c regex.h commands.h buffer.h region-cache.h syntax.h \
--- 923,929 ----
     commands.h syssignal.h systime.h systty.h syswait.h frame.h $(config_h) 
  regex.o: regex.c syntax.h buffer.h $(config_h) regex.h 
  region-cache.o: region-cache.c buffer.h region-cache.h
! frame.o: frame.c xterm.h nsterm.h window.h frame.h termhooks.h commands.h keyboard.h \
     buffer.h $(config_h)
  scroll.o: scroll.c termchar.h dispextern.h frame.h $(config_h)
  search.o: search.c regex.h commands.h buffer.h region-cache.h syntax.h \
***************
*** 927,935 ****
  xdisp.o: xdisp.c macros.h commands.h indent.h buffer.h dispextern.h \
     termchar.h frame.h window.h disptab.h termhooks.h $(config_h) 
  xfaces.o: xfaces.c dispextern.h frame.h xterm.h buffer.h blockinput.h \
!    window.h $(config_h) 
  xfns.o: xfns.c buffer.h frame.h window.h keyboard.h xterm.h \
!    blockinput.h paths.h $(config_h)
  xmenu.o: xmenu.c xterm.h window.h dispextern.h frame.h keyboard.h \
     blockinput.h puresize.h msdos.h $(config_h)
  xterm.o: xterm.c xterm.h termhooks.h termopts.h termchar.h window.h \
--- 949,957 ----
  xdisp.o: xdisp.c macros.h commands.h indent.h buffer.h dispextern.h \
     termchar.h frame.h window.h disptab.h termhooks.h $(config_h) 
  xfaces.o: xfaces.c dispextern.h frame.h xterm.h buffer.h blockinput.h \
!    window.h multi-frame.h $(config_h) 
  xfns.o: xfns.c buffer.h frame.h window.h keyboard.h xterm.h \
!    blockinput.h multi-frame.h paths.h $(config_h)
  xmenu.o: xmenu.c xterm.h window.h dispextern.h frame.h keyboard.h \
     blockinput.h puresize.h msdos.h $(config_h)
  xterm.o: xterm.c xterm.h termhooks.h termopts.h termchar.h window.h \
***************
*** 937,942 ****
--- 959,981 ----
    keyboard.h gnu.h sink.h sinkmask.h $(config_h)
  xselect.o: xselect.c dispextern.h frame.h xterm.h blockinput.h $(config_h) 
  xrdb.o: xrdb.c $(config_h)
+ 
+ nsfaces.o: nsfaces.m dispextern.h frame.h nsterm.h buffer.h blockinput.h \
+    window.h multi-frame.h $(config_h) 
+ nsfns.o: nsfns.m buffer.h frame.h window.h keyboard.h nsterm.h \
+    blockinput.h multi-frame.h $(config_h)
+ nsmenu.o: nsmenu.m nsterm.h window.h frame.h keyboard.h blockinput.h $(config_h)
+ nsterm.o: nsterm.m nsterm.h nswraps.h termhooks.h termopts.h termchar.h \
+   window.h dispextern.h frame.h disptab.h blockinput.h systime.h \
+   gnu.h sink.h sinkmask.h multi-frame.h $(config_h)
+ nsselect.o: nsselect.m dispextern.h frame.h nsterm.h blockinput.h $(config_h)
+ 
+ multi-frame.o: multi-frame.c lisp.h dispextern.h frame.h multi-frame.h window.h termhooks.h xterm.h nsterm.h $(config_h) 
+ 
+ nswraps.m: nswraps.pswm
+ nswraps.h: nswraps.pswm
+ nswraps.o: nswraps.m
+ 
  hftctl.o: hftctl.c $(config_h)
  
  /* The files of Lisp proper */
***************
*** 972,978 ****
  /**/# This is used in making a distribution.
  /**/# Do not use it on development directories!
  distclean: clean
! 	rm -f paths.h config.h Makefile Makefile.in ../etc/DOC-*
  maintainer-clean: distclean
  	@echo "This command is intended for maintainers to use;"
  	@echo "it deletes files that may require special tools to rebuild."
--- 1011,1017 ----
  /**/# This is used in making a distribution.
  /**/# Do not use it on development directories!
  distclean: clean
! 	rm -f nswraps.m nswraps.h paths.h config.h Makefile Makefile.in ../etc/DOC-*
  maintainer-clean: distclean
  	@echo "This command is intended for maintainers to use;"
  	@echo "it deletes files that may require special tools to rebuild."
***************
*** 995,1001 ****
  
  /* Arrange to make a tags table in ../lisp, and another in this dir
     which includes ../lisp/TAGS by reference.  */
! ctagsfiles = [a-zA-Z]*.[hc]
  lisptagsfiles = ../lisp/[a-zA-Z]*.el ../lisp/term/[a-zA-Z]*.el
  TAGS: $(ctagsfiles)
  	../lib-src/etags --include=../lisp/TAGS \
--- 1034,1040 ----
  
  /* Arrange to make a tags table in ../lisp, and another in this dir
     which includes ../lisp/TAGS by reference.  */
! ctagsfiles = [a-zA-Z]*.[hcm]
  lisptagsfiles = ../lisp/[a-zA-Z]*.el ../lisp/term/[a-zA-Z]*.el
  TAGS: $(ctagsfiles)
  	../lib-src/etags --include=../lisp/TAGS \
Index: emacs/src/alloc.c
diff -c emacs/src/alloc.c:1.1.1.2 emacs/src/alloc.c:1.3
*** emacs/src/alloc.c:1.1.1.2	Mon Jul 22 01:39:39 1996
--- emacs/src/alloc.c	Wed Jul 31 01:37:10 1996
***************
*** 1274,1280 ****
--- 1274,1283 ----
  
  struct gcpro *gcprolist;
  
+ #define NSTATICS 2048
+ /*
  #define NSTATICS 768
+ */
  
  Lisp_Object *staticvec[NSTATICS] = {0};
  
***************
*** 1289,1294 ****
--- 1292,1313 ----
    staticvec[staticidx++] = varaddress;
    if (staticidx >= NSTATICS)
      abort ();
+ }
+ 
+ void
+ staticunpro (varaddress)
+      Lisp_Object *varaddress;
+ {
+   int i;
+       
+   for(i=staticidx-1;i>=0;i--) if (staticvec[i]==varaddress) break;
+ 
+   if (i<0)
+      abort();
+ 
+   staticidx--;
+   staticvec[i]=staticvec[staticidx];
+   
  }
  
  struct catchtag
Index: emacs/src/buffer.c
diff -c emacs/src/buffer.c:1.1.1.2 emacs/src/buffer.c:1.3
*** emacs/src/buffer.c:1.1.1.2	Mon Jul 22 01:39:43 1996
--- emacs/src/buffer.c	Wed Jul 31 01:37:13 1996
***************
*** 136,142 ****
  
  Lisp_Object QSFundamental;	/* A string "Fundamental" */
  
! Lisp_Object Qkill_buffer_hook;
  
  Lisp_Object Qget_file_buffer;
  
--- 136,142 ----
  
  Lisp_Object QSFundamental;	/* A string "Fundamental" */
  
! Lisp_Object Qkill_buffer_hook, Qcreate_buffer_hook;
  
  Lisp_Object Qget_file_buffer;
  
***************
*** 1100,1126 ****
    (buf)
       Lisp_Object buf;
  {
-   int count;
    Lisp_Object function;
  
    function = buffer_defaults.major_mode;
    if (NILP (function) && NILP (Fget (current_buffer->major_mode, Qmode_class)))
      function = current_buffer->major_mode;
  
!   if (NILP (function) || EQ (function, Qfundamental_mode))
!     return Qnil;
  
!   count = specpdl_ptr - specpdl;
  
!   /* To select a nonfundamental mode,
!      select the buffer temporarily and then call the mode function. */
  
!   record_unwind_protect (save_excursion_restore, save_excursion_save ());
  
!   Fset_buffer (buf);
!   call0 (function);
  
!   return unbind_to (count, Qnil);
  }
  
  DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
--- 1100,1137 ----
    (buf)
       Lisp_Object buf;
  {
    Lisp_Object function;
  
    function = buffer_defaults.major_mode;
    if (NILP (function) && NILP (Fget (current_buffer->major_mode, Qmode_class)))
      function = current_buffer->major_mode;
  
!   if (!NILP (function) && !EQ (function, Qfundamental_mode))
!     {
  
!       int count = specpdl_ptr - specpdl;
  
!       /* To select a nonfundamental mode,
!          select the buffer temporarily and then call the mode function. */
  
!       record_unwind_protect (save_excursion_restore, save_excursion_save ());
  
!       Fset_buffer (buf);
!       call0 (function);
  
!       buf = unbind_to (count, Qnil);
!     }
! 
!   if (!NILP(Fboundp(Qcreate_buffer_hook)))
!     {
!       int count = specpdl_ptr - specpdl;
!       record_unwind_protect (save_excursion_restore, save_excursion_save ());
!       Fset_buffer (buf);
!       call1 (Vrun_hooks, Qcreate_buffer_hook);
!       unbind_to (count, Qnil);
!     }
!     
!   return buf;  
  }
  
  DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
***************
*** 3158,3163 ****
--- 3169,3176 ----
  
    Qkill_buffer_hook = intern ("kill-buffer-hook");
  
+   Qcreate_buffer_hook = intern ("create-buffer-hook");
+   
    Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
    /* super-magic invisible buffer */
    Vbuffer_alist = Qnil;
***************
*** 3217,3222 ****
--- 3230,3236 ----
    staticpro (&Qprotected_field);
    staticpro (&Qpermanent_local);
    staticpro (&Qkill_buffer_hook);
+   staticpro (&Qcreate_buffer_hook);
    staticpro (&Qoverlayp);
    Qevaporate = intern ("evaporate");
    staticpro (&Qevaporate);
Index: emacs/src/config.h.in
diff -c emacs/src/config.h.in:1.1.1.2 emacs/src/config.h.in:1.3
*** emacs/src/config.h.in:1.1.1.2	Mon Jul 22 01:43:59 1996
--- emacs/src/config.h.in	Wed Jul 31 01:37:16 1996
***************
*** 58,74 ****
     and not on others.  */
  #undef HAVE_X_MENU
  
  /* Define if we have the X11R6 or newer version of Xt.  */
  #undef HAVE_X11XTR6
  
  /* Define if netdb.h declares h_errno.  */
  #undef HAVE_H_ERRNO
  
  /* Nowadays we have frame objects even if we support only ASCII terminals.  */
  #define MULTI_FRAME
  
  /* If we're using any sort of window system, define some consequences.  */
! #ifdef HAVE_X_WINDOWS
  #define MULTI_KBOARD
  #define HAVE_FACES
  #define HAVE_MOUSE
--- 58,93 ----
     and not on others.  */
  #undef HAVE_X_MENU
  
+ /* Define if you want to use NeXTstep instead of or in addition
+    to X windows.  */
+ #undef HAVE_NS
+ 
  /* Define if we have the X11R6 or newer version of Xt.  */
  #undef HAVE_X11XTR6
  
  /* Define if netdb.h declares h_errno.  */
  #undef HAVE_H_ERRNO
  
+ #if 0
+ FIXME/cl
+ /* Define if you want to use a non-standard pure size for dumped emacs */
+ #undef PURESIZE
+ 
+ /* Define if you want to use less than the default number of gctype bits */
+ #undef GCTYPEBITS
+ FIXME/cl
+ #endif
+ 
+ /* Using a window system ? */
+ #if defined(HAVE_X_WINDOWS) || defined(HAVE_NS)
+ #define HAVE_WIN
+ #endif
+ 
  /* Nowadays we have frame objects even if we support only ASCII terminals.  */
  #define MULTI_FRAME
  
  /* If we're using any sort of window system, define some consequences.  */
! #ifdef HAVE_WIN
  #define MULTI_KBOARD
  #define HAVE_FACES
  #define HAVE_MOUSE
***************
*** 164,169 ****
--- 183,189 ----
  #undef HAVE_MKTIME
  #undef HAVE_EACCESS
  #undef HAVE_GETPAGESIZE
+ #undef HAVE_STRCASECMP
  #undef HAVE_INET_SOCKETS
  
  #undef HAVE_AIX_SMT_EXP
Index: emacs/src/dispextern.h
diff -c emacs/src/dispextern.h:1.1.1.2 emacs/src/dispextern.h:1.3
*** emacs/src/dispextern.h:1.1.1.2	Mon Jul 22 01:42:40 1996
--- emacs/src/dispextern.h	Wed Jul 31 01:37:18 1996
***************
*** 24,30 ****
     cursX, cursY.  Zero means it was preempted. */
  extern int display_completed;
  
! #ifdef HAVE_X_WINDOWS
  #include <X11/Xlib.h>
  #endif
  
--- 24,30 ----
     cursX, cursY.  Zero means it was preempted. */
  extern int display_completed;
  
! #if defined (HAVE_X_WINDOWS) && !defined (HAVE_NS)
  #include <X11/Xlib.h>
  #endif
  
***************
*** 32,77 ****
  #include "msdos.h"
  #endif
  
! #ifdef HAVE_FACES
! struct face
!   {
!     /* If this is non-zero, it is a GC we can use without modification
!        to represent this face.  */
!     GC gc;
!   
!     /* Pixel value for foreground color.  */
!     EMACS_UINT foreground;
!   
!     /* Pixel value for background color.  */
!     EMACS_UINT background;
!   
!     /* Font used for this face.  */
!     XFontStruct *font;
!   
!     /* Background stipple or bitmap used for this face.  */
!     Pixmap stipple;
! 
!     /* Pixmap_depth.  */
!     unsigned int pixmap_w, pixmap_h;
!   
!     /* Whether or not to underline text in this face.  */
!     char underline;
!   };
! 
! /* Let's stop using this and get rid of it.  */
! typedef struct face *FACE;
! 
! #define NORMAL_FACE ((struct face *) 0)
! 
! #define FACE_HAS_GC(f) ((f)->gc)
! #define FACE_GC(f) ((f)->gc)
! #define FACE_FOREGROUND(f) ((f)->foreground)
! #define FACE_BACKGROUND(f) ((f)->background)
! #define FACE_FONT(f) ((f)->font)
! #define FACE_STIPPLE(f) ((f)->stipple)
! #define FACE_UNDERLINE_P(f) ((f)->underline)
! 
! #else /* not HAVE_FACES */
  
  typedef int FACE;
  
--- 32,38 ----
  #include "msdos.h"
  #endif
  
! #ifndef HAVE_FACES
  
  typedef int FACE;
  
***************
*** 85,91 ****
  
  #endif /* not HAVE_FACES */
  
- 
  /* This structure is used for the actual display of text on a frame.
  
     There are two instantiations of it:  the glyphs currently displayed,
--- 46,51 ----
***************
*** 127,133 ****
         and should be deleted.  */
      int   *bufp;
  
! #ifdef HAVE_X_WINDOWS
      /* Pixel position of top left corner of line.  */
      short *top_left_x;
      short *top_left_y;
--- 87,93 ----
         and should be deleted.  */
      int   *bufp;
  
! #ifdef HAVE_WIN
      /* Pixel position of top left corner of line.  */
      short *top_left_x;
      short *top_left_y;
***************
*** 140,146 ****
  
      /* Largest font ascent on this line.  */
      short *max_ascent;
! #endif	/* HAVE_X_WINDOWS */
  
      /* Mapping of coordinate pairs to buffer positions.
         This field holds a vector indexed by row number.
--- 100,106 ----
  
      /* Largest font ascent on this line.  */
      short *max_ascent;
! #endif	/* HAVE_WIN */
  
      /* Mapping of coordinate pairs to buffer positions.
         This field holds a vector indexed by row number.
Index: emacs/src/dispnew.c
diff -c emacs/src/dispnew.c:1.1.1.2 emacs/src/dispnew.c:1.3
*** emacs/src/dispnew.c:1.1.1.2	Mon Jul 22 01:40:02 1996
--- emacs/src/dispnew.c	Wed Jul 31 01:37:21 1996
***************
*** 44,49 ****
--- 44,52 ----
  #ifdef HAVE_X_WINDOWS
  #include "xterm.h"
  #endif	/* HAVE_X_WINDOWS */
+ #ifdef HAVE_NS
+ #include "nsterm.h"
+ #endif  /* HAVE_NS */
  
  /* Include systime.h after xterm.h to avoid double inclusion of time.h. */
  #include "systime.h"
***************
*** 268,275 ****
    bzero (new->enable, height * sizeof (char));
    new->bufp = (int *) xmalloc (height * sizeof (int));
  
! #ifdef HAVE_X_WINDOWS
!   if (FRAME_X_P (frame))
      {
        new->top_left_x = (short *) xmalloc (height * sizeof (short));
        new->top_left_y = (short *) xmalloc (height * sizeof (short));
--- 271,278 ----
    bzero (new->enable, height * sizeof (char));
    new->bufp = (int *) xmalloc (height * sizeof (int));
  
! #ifdef HAVE_WIN
!   if (FRAME_WIN_P (frame))
      {
        new->top_left_x = (short *) xmalloc (height * sizeof (short));
        new->top_left_y = (short *) xmalloc (height * sizeof (short));
***************
*** 342,349 ****
    if (glyphs->charstarts)
      xfree (glyphs->charstarts);
  
! #ifdef HAVE_X_WINDOWS
!   if (FRAME_X_P (frame))
      {
        xfree (glyphs->top_left_x);
        xfree (glyphs->top_left_y);
--- 345,352 ----
    if (glyphs->charstarts)
      xfree (glyphs->charstarts);
  
! #ifdef HAVE_WIN
!   if (FRAME_WIN_P (frame))
      {
        xfree (glyphs->top_left_x);
        xfree (glyphs->top_left_y);
***************
*** 718,725 ****
  		  current_frame->bufp + from + amount,
  		  (end - from) * sizeof current_frame->bufp[0]);
  
! #ifdef HAVE_X_WINDOWS
!       if (FRAME_X_P (frame))
  	{
  	  safe_bcopy (current_frame->top_left_x + from,
  		      current_frame->top_left_x + from + amount,
--- 721,728 ----
  		  current_frame->bufp + from + amount,
  		  (end - from) * sizeof current_frame->bufp[0]);
  
! #ifdef HAVE_WIN
!       if (FRAME_WIN_P (frame))
  	{
  	  safe_bcopy (current_frame->top_left_x + from,
  		      current_frame->top_left_x + from + amount,
***************
*** 741,747 ****
  		      current_frame->max_ascent + from + amount,
  		      (end - from) * sizeof current_frame->max_ascent[0]);
  	}
! #endif				/* HAVE_X_WINDOWS */
  
        update_end (frame);
      }
--- 744,750 ----
  		      current_frame->max_ascent + from + amount,
  		      (end - from) * sizeof current_frame->max_ascent[0]);
  	}
! #endif				/* HAVE_WIN */
  
        update_end (frame);
      }
***************
*** 814,821 ****
  		  current_frame->bufp + from + amount,
  		  (end - from) * sizeof current_frame->bufp[0]);
  
! #ifdef HAVE_X_WINDOWS
!       if (FRAME_X_P (frame))
  	{
  	  safe_bcopy (current_frame->top_left_x + from,
  		      current_frame->top_left_x + from + amount,
--- 817,824 ----
  		  current_frame->bufp + from + amount,
  		  (end - from) * sizeof current_frame->bufp[0]);
  
! #ifdef HAVE_WIN
!       if (FRAME_WIN_P (frame))
  	{
  	  safe_bcopy (current_frame->top_left_x + from,
  		      current_frame->top_left_x + from + amount,
***************
*** 837,843 ****
  		      current_frame->max_ascent + from + amount,
  		      (end - from) * sizeof current_frame->max_ascent[0]);
  	}
! #endif				/* HAVE_X_WINDOWS */
  
        update_end (frame);
      }
--- 840,846 ----
  		      current_frame->max_ascent + from + amount,
  		      (end - from) * sizeof current_frame->max_ascent[0]);
  	}
! #endif				/* HAVE_WIN */
  
        update_end (frame);
      }
***************
*** 1215,1221 ****
    int pause;
    int preempt_count = baud_rate / 2400 + 1;
    extern input_pending;
! #ifdef HAVE_X_WINDOWS
    register int downto, leftmost;
  #endif
  
--- 1218,1224 ----
    int pause;
    int preempt_count = baud_rate / 2400 + 1;
    extern input_pending;
! #ifdef HAVE_WIN
    register int downto, leftmost;
  #endif
  
***************
*** 1258,1278 ****
    if (desired_frame->enable[FRAME_HEIGHT (f) - 1])
      update_line (f, FRAME_HEIGHT (f) - 1);
  
! #ifdef HAVE_X_WINDOWS
!   if (FRAME_X_P (f))
      {
!       leftmost = downto = f->display.x->internal_border_width;
        if (desired_frame->enable[0])
  	{
  	  current_frame->top_left_x[FRAME_HEIGHT (f) - 1] = leftmost;
! 	  current_frame->top_left_y[FRAME_HEIGHT (f) - 1]
! 	    = PIXEL_HEIGHT (f) - f->display.x->internal_border_width
  	      - current_frame->pix_height[FRAME_HEIGHT (f) - 1];
  	  current_frame->top_left_x[0] = leftmost;
  	  current_frame->top_left_y[0] = downto;
  	}
      }
! #endif /* HAVE_X_WINDOWS */
  
    /* Now update the rest of the lines. */
    for (i = 0; i < FRAME_HEIGHT (f) - 1 && (force || !input_pending); i++)
--- 1261,1289 ----
    if (desired_frame->enable[FRAME_HEIGHT (f) - 1])
      update_line (f, FRAME_HEIGHT (f) - 1);
  
! #ifdef HAVE_WIN
!   if (FRAME_WIN_P (f))
      {
!       if (FRAME_X_P (f))
!         leftmost = downto = f->display.x->internal_border_width;
!       if (FRAME_NS_P (f))
!         leftmost = downto = f->display.ns->internal_border_width;
        if (desired_frame->enable[0])
  	{
  	  current_frame->top_left_x[FRAME_HEIGHT (f) - 1] = leftmost;
!           if (FRAME_X_P (f))
!             current_frame->top_left_y[FRAME_HEIGHT (f) - 1]
!               = X_PIXEL_HEIGHT (f) - f->display.x->internal_border_width
! 	      - current_frame->pix_height[FRAME_HEIGHT (f) - 1];
!           if (FRAME_NS_P (f))
!             current_frame->top_left_y[FRAME_HEIGHT (f) - 1]
!               = NS_PIXEL_HEIGHT (f) - f->display.ns->internal_border_width
  	      - current_frame->pix_height[FRAME_HEIGHT (f) - 1];
  	  current_frame->top_left_x[0] = leftmost;
  	  current_frame->top_left_y[0] = downto;
  	}
      }
! #endif /* HAVE_WIN */
  
    /* Now update the rest of the lines. */
    for (i = 0; i < FRAME_HEIGHT (f) - 1 && (force || !input_pending); i++)
***************
*** 1308,1324 ****
  	    }
  
  	  update_line (f, i);
! #ifdef HAVE_X_WINDOWS
! 	  if (FRAME_X_P (f))
  	    {
  	      current_frame->top_left_y[i] = downto;
  	      current_frame->top_left_x[i] = leftmost;
  	    }
! #endif /* HAVE_X_WINDOWS */
  	}
  
! #ifdef HAVE_X_WINDOWS
!       if (FRAME_X_P (f))
  	downto += current_frame->pix_height[i];
  #endif
      }
--- 1319,1335 ----
  	    }
  
  	  update_line (f, i);
! #ifdef HAVE_WIN
! 	  if (FRAME_WIN_P (f))
  	    {
  	      current_frame->top_left_y[i] = downto;
  	      current_frame->top_left_x[i] = leftmost;
  	    }
! #endif /* HAVE_WIN */
  	}
  
! #ifdef HAVE_WIN
!       if (FRAME_WIN_P (f))
  	downto += current_frame->pix_height[i];
  #endif
      }
***************
*** 1614,1619 ****
--- 1625,1631 ----
    current_frame->highlight[vpos] = desired_frame->highlight[vpos];
    current_frame->bufp[vpos] = desired_frame->bufp[vpos];
  
+ #ifdef HAVE_WIN
  #ifdef HAVE_X_WINDOWS
    if (FRAME_X_P (frame))
      {
***************
*** 1624,1629 ****
--- 1636,1650 ----
  	= frame->display.x->line_height;
      }
  #endif /* HAVE_X_WINDOWS */
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (frame))
+     {
+       current_frame->pix_width[vpos] = current_frame->used[vpos]
+         * frame->display.ns->face->width;
+       current_frame->pix_height[vpos] = frame->display.ns->line_height;
+     }
+ #endif
+ #endif /* HAVE_WIN */
  
    if (!desired_frame->enable[vpos])
      {
***************
*** 1659,1665 ****
        int i,j;
  
  #if 0
!       if (FRAME_X_P (frame))
  	{
  	  /* Under X, erase everything we are going to rewrite,
  	     and rewrite everything from the first char that's changed.
--- 1680,1686 ----
        int i,j;
  
  #if 0
!       if (FRAME_WIN_P (frame))
  	{
  	  /* Under X, erase everything we are going to rewrite,
  	     and rewrite everything from the first char that's changed.
***************
*** 2441,2447 ****
  
  init_display ()
  {
! #ifdef HAVE_X_WINDOWS
    extern int display_arg;
  #endif
  
--- 2462,2468 ----
  
  init_display ()
  {
! #ifdef HAVE_WIN
    extern int display_arg;
  #endif
  
***************
*** 2466,2478 ****
    if (! display_arg)
      {
  #ifdef VMS
!       display_arg = (getenv ("DECW$DISPLAY") != 0);
  #else
!       display_arg = (getenv ("DISPLAY") != 0);
  #endif
      }
  
!   if (!inhibit_window_system && display_arg)
      {
        Vwindow_system = intern ("x");
  #ifdef HAVE_X11
--- 2487,2499 ----
    if (! display_arg)
      {
  #ifdef VMS
!       display_arg = getenv ("DECW$DISPLAY") ? output_x_window : 0;
  #else
!       display_arg = getenv ("DISPLAY") ? output_x_window : 0;
  #endif
      }
  
!   if (!inhibit_window_system && display_arg == output_x_window)
      {
        Vwindow_system = intern ("x");
  #ifdef HAVE_X11
***************
*** 2483,2488 ****
--- 2504,2518 ----
        return;
      }
  #endif /* HAVE_X_WINDOWS */
+ 
+ #ifdef HAVE_NS
+   if (!inhibit_window_system && display_arg==output_ns)
+     {
+       Vwindow_system = intern("ns");
+       Vwindow_system_version = make_number(0);
+       return;
+     }
+ #endif
  
    /* If no window system has been specified, try to use the terminal.  */
    if (! isatty (0))
Index: emacs/src/dosfns.c
diff -c emacs/src/dosfns.c:1.1.1.2 emacs/src/dosfns.c:1.3
*** emacs/src/dosfns.c:1.1.1.2	Mon Jul 22 01:40:06 1996
--- emacs/src/dosfns.c	Wed Jul 31 01:37:24 1996
***************
*** 40,46 ****
  {
    union REGS regs;
  
! #ifdef HAVE_X_WINDOWS
    if (!inhibit_window_system)
      return Qnil;
  #endif
--- 40,46 ----
  {
    union REGS regs;
  
! #ifdef HAVE_WIN
    if (!inhibit_window_system)
      return Qnil;
  #endif
***************
*** 68,74 ****
  {
    union REGS regs;
  
! #ifdef HAVE_X_WINDOWS
    if (!inhibit_window_system)
      return Qnil;
  #endif
--- 68,74 ----
  {
    union REGS regs;
  
! #ifdef HAVE_WIN
    if (!inhibit_window_system)
      return Qnil;
  #endif
Index: emacs/src/emacs.c
diff -c emacs/src/emacs.c:1.1.1.2 emacs/src/emacs.c:1.4
*** emacs/src/emacs.c:1.1.1.2	Mon Jul 22 01:40:10 1996
--- emacs/src/emacs.c	Thu Aug  1 02:57:08 1996
***************
*** 38,43 ****
--- 38,44 ----
  #include "lisp.h"
  #include "commands.h"
  #include "intervals.h"
+ #include "frame.h"
  
  #include "systty.h"
  #include "syssignal.h"
***************
*** 101,118 ****
  extern int inherited_pgroup;
  #endif
  
- #ifdef HAVE_X_WINDOWS
  /* If non-zero, -d was specified, meaning we're using some window system. */
  int display_arg;
- #endif
  
  /* An address near the bottom of the stack.
     Tells GC how to save a copy of the stack.  */
  char *stack_bottom;
  
! #ifdef HAVE_X_WINDOWS
  extern Lisp_Object Vwindow_system;
! #endif /* HAVE_X_WINDOWS */
  
  extern Lisp_Object Vauto_save_list_file_name;
  
--- 102,117 ----
  extern int inherited_pgroup;
  #endif
  
  /* If non-zero, -d was specified, meaning we're using some window system. */
  int display_arg;
  
  /* An address near the bottom of the stack.
     Tells GC how to save a copy of the stack.  */
  char *stack_bottom;
  
! #ifdef HAVE_WIN
  extern Lisp_Object Vwindow_system;
! #endif /* HAVE_WIN */
  
  extern Lisp_Object Vauto_save_list_file_name;
  
***************
*** 529,534 ****
--- 528,541 ----
  
    inhibit_window_system = 0;
  
+   /* calling emacs emacs-nw will inhibit window systems */
+   {
+     int len;
+     
+     if ((len=strlen(argv[0]))>=3 && !strcmp(argv[0]+len-3,"-nw"))
+       inhibit_window_system=1;
+   }
+   
    /* Handle the -t switch, which specifies filename to use as terminal */
    {
      char *term;
***************
*** 551,557 ****
  	    exit (1);
  	  }
  	fprintf (stderr, "Using %s\n", term);
! #ifdef HAVE_X_WINDOWS
  	inhibit_window_system = 1; /* -t => -nw */
  #endif
        }
--- 558,564 ----
  	    exit (1);
  	  }
  	fprintf (stderr, "Using %s\n", term);
! #ifdef HAVE_WIN
  	inhibit_window_system = 1; /* -t => -nw */
  #endif
        }
***************
*** 576,581 ****
--- 583,614 ----
        exit (0);
      }
  
+   display_arg = output_termcap;
+ 
+ #ifdef HAVE_NS
+ #if 0
+   {
+     extern int ns_check_available ();
+ 
+     /* Don't automatically start emacs in NS mode when called from the
+        command line after all */
+     if (ns_check_available())
+       display_arg = output_ns;
+   }
+ #endif
+ 
+   {
+     char *NXHost;
+     
+     if (argmatch (argv, argc, "-MachLaunch", 0, 3, NULL, &skip_args))
+       display_arg = output_ns;
+     else if (argmatch (argv, argc, "-ns", 0, 2, NULL, &skip_args))
+       display_arg = output_ns;
+     else if (argmatch (argv, argc, "-NXHost", 0, 3, &NXHost, &skip_args))
+       display_arg = output_ns;
+   }
+ #endif /* HAVE_NS */
+ 
  #ifdef HAVE_X_WINDOWS
    /* Stupid kludge to catch command-line display spec.  We can't
       handle this argument entirely in window system dependent code
***************
*** 587,595 ****
      int count_before = skip_args;
  
      if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
!       display_arg = 1;
      else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
!       display_arg = 1;
  
      /* If we have the form --display=NAME,
         convert it into  -d name.
--- 620,628 ----
      int count_before = skip_args;
  
      if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
!       display_arg = output_x_window;
      else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
!       display_arg = output_x_window;
  
      /* If we have the form --display=NAME,
         convert it into  -d name.
***************
*** 843,848 ****
--- 876,884 ----
  #endif /* VMS */
        syms_of_window ();
        syms_of_xdisp ();
+ #ifdef HAVE_WIN
+       syms_of_multi_frame ();
+ #endif
  #ifdef HAVE_X_WINDOWS
        syms_of_xterm ();
        syms_of_xfns ();
***************
*** 860,865 ****
--- 896,909 ----
        syms_of_xmenu ();
  #endif
  
+ #ifdef HAVE_NS
+       syms_of_nsterm ();
+       syms_of_nsfns ();
+       syms_of_nsfaces ();
+       syms_of_nsmenu ();
+       syms_of_nsselect ();
+ #endif
+ 
  #ifdef SYMS_SYSTEM
        SYMS_SYSTEM;
  #endif
***************
*** 942,947 ****
--- 986,994 ----
    { "-map", "--map-data", 100, 0 },
  #endif
    { "-t", "--terminal", 90, 1 },
+   { "-MachLaunch", 0, 85, 0 },
+   { "-ns", 0, 85, 0 },
+   { "-NXHost", 0, 85, 1 },
    { "-d", "--display", 80, 1 },
    { "-display", 0, 80, 1 },
    { "-nw", "--no-windows", 70, 0 },
***************
*** 1169,1176 ****
     and Fkill_emacs.  */
  
  void
! shut_down_emacs (sig, no_x, stuff)
!      int sig, no_x;
       Lisp_Object stuff;
  {
    /* Prevent running of hooks from now on.  */
--- 1216,1223 ----
     and Fkill_emacs.  */
  
  void
! shut_down_emacs (sig, no_windows, stuff)
!      int sig, no_windows;
       Lisp_Object stuff;
  {
    /* Prevent running of hooks from now on.  */
***************
*** 1209,1223 ****
    kill_vms_processes ();
  #endif
  
! #if 0 /* This triggers a bug in XCloseDisplay and is not needed.  */
! #ifdef HAVE_X_WINDOWS
!   /* It's not safe to call intern here.  Maybe we are crashing.  */
!   if (!noninteractive && SYMBOLP (Vwindow_system)
!       && XSYMBOL (Vwindow_system)->name->size == 1
!       && XSYMBOL (Vwindow_system)->name->data[0] == 'x'
!       && ! no_x)
!     Fx_close_current_connection ();
! #endif /* HAVE_X_WINDOWS */
  #endif
  
  #ifdef SIGIO
--- 1256,1266 ----
    kill_vms_processes ();
  #endif
  
! #ifdef HAVE_WIN
! #ifndef HAVE_X_WINDOWS
!   if (!noninteractive && !no_windows)
!      Fclose_current_connection ();
! #endif
  #endif
  
  #ifdef SIGIO
Index: emacs/src/emacs.iconheader
diff -c /dev/null emacs/src/emacs.iconheader:1.2
*** /dev/null	Fri Aug  2 21:05:46 1996
--- emacs/src/emacs.iconheader	Thu Aug  1 00:57:06 1996
***************
*** 0 ****
--- 1,16 ----
+ F	Emacs.app	Emacs	app
+ F	Emacs	Emacs	app
+ S	c	Emacs	cfile
+ S	h	Emacs	hfile
+ S	m	Emacs	mfile
+ S	text	Emacs	text
+ S	cc	Emacs	cfile
+ S	cxx	Emacs	cfile
+ S	C	Emacs	cfile
+ S	bib	Emacs	bibfile
+ S	tex	Emacs	texfile
+ S	el	Emacs	elfile
+ S	elc	Emacs	elcfile
+ S	l	Emacs	lfile
+ S	y	Emacs	yfile
+ S	f90	Emacs	f90file
Index: emacs/src/fileio.c
diff -c emacs/src/fileio.c:1.1.1.2 emacs/src/fileio.c:1.3
*** emacs/src/fileio.c:1.1.1.2	Mon Jul 22 01:40:15 1996
--- emacs/src/fileio.c	Wed Jul 31 01:37:32 1996
***************
*** 4056,4061 ****
--- 4056,4069 ----
    register char *homedir;
    int count;
  
+ #ifdef HAVE_NS
+      {
+      extern int ns_use_open_panel;
+      if (ns_use_open_panel)
+         return Fns_read_file_name(prompt,dir,defalt,mustmatch,initial);
+      }  
+ #endif
+   
    if (NILP (dir))
      dir = current_buffer->directory;
    if (NILP (defalt))
Index: emacs/src/fns.c
diff -c emacs/src/fns.c:1.1.1.2 emacs/src/fns.c:1.3
*** emacs/src/fns.c:1.1.1.2	Mon Jul 22 01:40:23 1996
--- emacs/src/fns.c	Wed Jul 31 01:37:37 1996
***************
*** 1250,1258 ****
  
    while (1)
      {
! #ifdef HAVE_X_MENU
!       if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
! 	  && using_x_p ())
  	{
  	  Lisp_Object pane, menu;
  	  redisplay_preserve_echo_area ();
--- 1250,1259 ----
  
    while (1)
      {
! #ifdef HAVE_WIN
! #if defined(HAVE_X_MENU) || defined(HAVE_NS)
!       if (NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)
!           && using_win_p())
  	{
  	  Lisp_Object pane, menu;
  	  redisplay_preserve_echo_area ();
***************
*** 1260,1270 ****
  			Fcons (Fcons (build_string ("No"), Qnil),
  			       Qnil));
  	  menu = Fcons (prompt, pane);
! 	  obj = Fx_popup_dialog (Qt, menu);
  	  answer = !NILP (obj);
  	  break;
  	}
  #endif
        cursor_in_echo_area = 1;
        message_nolog ("%s(y or n) ", XSTRING (xprompt)->data);
  
--- 1261,1272 ----
  			Fcons (Fcons (build_string ("No"), Qnil),
  			       Qnil));
  	  menu = Fcons (prompt, pane);
! 	  obj = Fpopup_dialog (Qt, menu);
  	  answer = !NILP (obj);
  	  break;
  	}
  #endif
+ #endif
        cursor_in_echo_area = 1;
        message_nolog ("%s(y or n) ", XSTRING (xprompt)->data);
  
***************
*** 1358,1366 ****
  
    CHECK_STRING (prompt, 0);
  
! #ifdef HAVE_X_MENU
    if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
!       && using_x_p ())
      {
        Lisp_Object pane, menu, obj;
        redisplay_preserve_echo_area ();
--- 1360,1369 ----
  
    CHECK_STRING (prompt, 0);
  
! #ifdef HAVE_WIN
! #if defined(HAVE_X_MENU) || defined(HAVE_NS)
    if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
!       && using_win_p())
      {
        Lisp_Object pane, menu, obj;
        redisplay_preserve_echo_area ();
***************
*** 1369,1380 ****
  			   Qnil));
        GCPRO1 (pane);
        menu = Fcons (prompt, pane);
!       obj = Fx_popup_dialog (Qt, menu);
        UNGCPRO;
        return obj;
      }
  #endif
! 
    args[0] = prompt;
    args[1] = build_string ("(yes or no) ");
    prompt = Fconcat (2, args);
--- 1372,1384 ----
  			   Qnil));
        GCPRO1 (pane);
        menu = Fcons (prompt, pane);
!       obj = Fpopup_dialog (Qt, menu);
        UNGCPRO;
        return obj;
      }
  #endif
! #endif
!   
    args[0] = prompt;
    args[1] = build_string ("(yes or no) ");
    prompt = Fconcat (2, args);
Index: emacs/src/frame.c
diff -c emacs/src/frame.c:1.1.1.2 emacs/src/frame.c:1.3
*** emacs/src/frame.c:1.1.1.2	Mon Jul 22 01:40:25 1996
--- emacs/src/frame.c	Wed Jul 31 01:37:40 1996
***************
*** 27,32 ****
--- 27,33 ----
  #ifdef MSDOS
  #include "msdos.h"
  #endif
+ #include "blockinput.h"
  
  #ifdef MULTI_FRAME
  
***************
*** 87,92 ****
--- 88,94 ----
  Lisp_Object Qmenu_bar_lines;
  Lisp_Object Qwidth;
  Lisp_Object Qx;
+ Lisp_Object Qns;
  Lisp_Object Qvisible;
  Lisp_Object Qbuffer_predicate;
  
***************
*** 94,105 ****
  extern Lisp_Object get_minibuffer ();
  extern Lisp_Object Fhandle_switch_frame ();
  extern Lisp_Object Fredirect_frame_focus ();
! extern Lisp_Object x_get_focus_frame ();
  
  DEFUN ("framep", Fframep, Sframep, 1, 1, 0,
    "Return non-nil if OBJECT is a frame.\n\
  Value is t for a termcap frame (a character-only terminal),\n\
  `x' for an Emacs frame that is really an X window,\n\
  `pc' for a direct-write MS-DOS frame.\n\
  See also `frame-live-p'.")
    (object)
--- 96,108 ----
  extern Lisp_Object get_minibuffer ();
  extern Lisp_Object Fhandle_switch_frame ();
  extern Lisp_Object Fredirect_frame_focus ();
! extern Lisp_Object get_focus_frame ();
  
  DEFUN ("framep", Fframep, Sframep, 1, 1, 0,
    "Return non-nil if OBJECT is a frame.\n\
  Value is t for a termcap frame (a character-only terminal),\n\
  `x' for an Emacs frame that is really an X window,\n\
+ `ns' for an Emacs frame that is a NeXTstep window,\n\
  `pc' for a direct-write MS-DOS frame.\n\
  See also `frame-live-p'.")
    (object)
***************
*** 113,118 ****
--- 116,123 ----
        return Qt;
      case output_x_window:
        return Qx;
+     case output_ns:
+       return Qns;
        /* The `pc' case is in the Fframep below.  */
      default:
        abort ();
***************
*** 124,130 ****
  Value is nil if OBJECT is not a live frame.  If object is a live\n\
  frame, the return value indicates what sort of output device it is\n\
  displayed on.  Value is t for a termcap frame (a character-only\n\
! terminal), `x' for an Emacs frame being displayed in an X window.")
    (object)
       Lisp_Object object;
  {
--- 129,136 ----
  Value is nil if OBJECT is not a live frame.  If object is a live\n\
  frame, the return value indicates what sort of output device it is\n\
  displayed on.  Value is t for a termcap frame (a character-only\n\
! terminal), `x' for an Emacs frame being displayed in an X window,\n\
! `ns' for an Emacs frame being displayed in a NeXTstep window.")
    (object)
       Lisp_Object object;
  {
***************
*** 458,469 ****
      }
  #else /* ! 0 */
    /* Instead, apply it only to the frame we're pointing to.  */
! #ifdef HAVE_X_WINDOWS
!   if (track && FRAME_X_P (XFRAME (frame)))
      {
        Lisp_Object focus, xfocus;
  
!       xfocus = x_get_focus_frame (XFRAME (frame));
        if (FRAMEP (xfocus))
  	{
  	  focus = FRAME_FOCUS_FRAME (XFRAME (xfocus));
--- 464,475 ----
      }
  #else /* ! 0 */
    /* Instead, apply it only to the frame we're pointing to.  */
! #ifdef HAVE_WIN
!   if (track && FRAME_WIN_P (XFRAME (frame)))
      {
        Lisp_Object focus, xfocus;
  
!       xfocus = get_focus_frame (XFRAME (frame));
        if (FRAMEP (xfocus))
  	{
  	  focus = FRAME_FOCUS_FRAME (XFRAME (xfocus));
***************
*** 471,477 ****
  	    Fredirect_frame_focus (xfocus, frame);
  	}
      }
! #endif /* HAVE_X_WINDOWS */
  #endif /* ! 0 */
  
    if (FRAME_TERMCAP_P (XFRAME (frame)))
--- 477,483 ----
  	    Fredirect_frame_focus (xfocus, frame);
  	}
      }
! #endif /* HAVE_WIN */
  #endif /* ! 0 */
  
    if (FRAME_TERMCAP_P (XFRAME (frame)))
***************
*** 881,890 ****
  	  /* Verify that the frame's window still exists
  	     and we can still talk to it.  And note any recent change
  	     in visibility.  */
! #ifdef HAVE_X_WINDOWS
! 	  if (FRAME_X_P (XFRAME (this)))
  	    {
! 	      x_sync (XFRAME (this));
  	      FRAME_SAMPLE_VISIBILITY (XFRAME (this));
  	    }
  #endif
--- 887,896 ----
  	  /* Verify that the frame's window still exists
  	     and we can still talk to it.  And note any recent change
  	     in visibility.  */
! #ifdef HAVE_WIN
! 	  if (FRAME_WIN_P (XFRAME (this)))
  	    {
! 	      win_sync (XFRAME (this));
  	      FRAME_SAMPLE_VISIBILITY (XFRAME (this));
  	    }
  #endif
***************
*** 893,899 ****
  	      || FRAME_ICONIFIED_P (XFRAME (this))
  	      /* Allow deleting the terminal frame when at least
  		 one X frame exists!  */
! 	      || (FRAME_X_P (XFRAME (this)) && !FRAME_X_P (f)))
  	    count++;
  	}
        return count > 1;
--- 899,906 ----
  	      || FRAME_ICONIFIED_P (XFRAME (this))
  	      /* Allow deleting the terminal frame when at least
  		 one X frame exists!  */
!               /* FIXME/cl check */
! 	      || (FRAME_WIN_P (XFRAME (this)) && !FRAME_WIN_P (f)))
  	    count++;
  	}
        return count > 1;
***************
*** 1008,1016 ****
       called the window-system-dependent frame destruction routine.  */
  
    /* I think this should be done with a hook.  */
! #ifdef HAVE_X_WINDOWS
!   if (FRAME_X_P (f))
!     x_destroy_window (f);
  #endif
  
    f->display.nothing = 0;
--- 1015,1023 ----
       called the window-system-dependent frame destruction routine.  */
  
    /* I think this should be done with a hook.  */
! #ifdef HAVE_WIN
!   if (FRAME_WIN_P (f))
!     destroy_window (f);
  #endif
  
    f->display.nothing = 0;
***************
*** 1175,1180 ****
--- 1182,1192 ----
      /* Warping the mouse will cause  enternotify and focus events. */
      x_set_mouse_position (XFRAME (frame), x, y);
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (XFRAME (frame)))
+     /* Warping the mouse will cause  enternotify and focus events. */
+     ns_set_mouse_position (XFRAME (frame), x, y);
+ #endif
  
    return Qnil;
  }
***************
*** 1197,1202 ****
--- 1209,1219 ----
      /* Warping the mouse will cause  enternotify and focus events. */
      x_set_mouse_pixel_position (XFRAME (frame), x, y);
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (XFRAME (frame)))
+     /* Warping the mouse will cause  enternotify and focus events. */
+     ns_set_mouse_pixel_position (XFRAME (frame), x, y);
+ #endif
  
    return Qnil;
  }
***************
*** 1221,1226 ****
--- 1238,1250 ----
        x_make_frame_visible (XFRAME (frame));
      }
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (XFRAME (frame)))
+     {
+       FRAME_SAMPLE_VISIBILITY (XFRAME (frame));
+       ns_make_frame_visible (XFRAME (frame));
+     }
+ #endif
  
    /* Make menu bar update for the Buffers and Frams menus.  */
    windows_or_buffers_changed++;
***************
*** 1264,1269 ****
--- 1288,1297 ----
    if (FRAME_X_P (XFRAME (frame)))
      x_make_frame_invisible (XFRAME (frame));
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (XFRAME (frame)))
+     ns_make_frame_invisible (XFRAME (frame));
+ #endif
  
    /* Make menu bar update for the Buffers and Frams menus.  */
    windows_or_buffers_changed++;
***************
*** 1298,1306 ****
      }
  
    /* I think this should be done with a hook.  */
! #ifdef HAVE_X_WINDOWS
!   if (FRAME_X_P (XFRAME (frame)))
!       x_iconify_frame (XFRAME (frame));
  #endif
  
    /* Make menu bar update for the Buffers and Frams menus.  */
--- 1326,1334 ----
      }
  
    /* I think this should be done with a hook.  */
! #ifdef HAVE_WIN
!   if (FRAME_WIN_P (XFRAME (frame)))
!       iconify_frame (XFRAME (frame));
  #endif
  
    /* Make menu bar update for the Buffers and Frams menus.  */
***************
*** 1320,1331 ****
  {
    CHECK_LIVE_FRAME (frame, 0);
  
    FRAME_SAMPLE_VISIBILITY (XFRAME (frame));
  
    if (FRAME_VISIBLE_P (XFRAME (frame)))
      return Qt;
-   if (FRAME_ICONIFIED_P (XFRAME (frame)))
-     return Qicon;
    return Qnil;
  }
  
--- 1348,1360 ----
  {
    CHECK_LIVE_FRAME (frame, 0);
  
+   if (FRAME_ICONIFIED_P (XFRAME (frame)))
+     return Qicon;
+ 
    FRAME_SAMPLE_VISIBILITY (XFRAME (frame));
  
    if (FRAME_VISIBLE_P (XFRAME (frame)))
      return Qt;
    return Qnil;
  }
  
***************
*** 1435,1443 ****
    XFRAME (frame)->focus_frame = focus_frame;
  
    /* I think this should be done with a hook.  */
! #ifdef HAVE_X_WINDOWS
    if (!NILP (focus_frame) && ! EQ (focus_frame, frame)
!       && FRAME_X_P (XFRAME (focus_frame)))
      Ffocus_frame (focus_frame);
  #endif
  
--- 1464,1472 ----
    XFRAME (frame)->focus_frame = focus_frame;
  
    /* I think this should be done with a hook.  */
! #ifdef HAVE_WIN
    if (!NILP (focus_frame) && ! EQ (focus_frame, frame)
!       && FRAME_WIN_P (XFRAME (focus_frame)))
      Ffocus_frame (focus_frame);
  #endif
  
***************
*** 1570,1576 ****
--- 1599,1611 ----
      x_report_frame_params (f, &alist);
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     ns_report_frame_params (f, &alist);
+   else
+ #endif
      {
+       /* FIXME/cl */
        /* This ought to be correct in f->param_alist for an X frame.  */
        Lisp_Object lines;
        XSETFASTINT (lines, FRAME_MENU_BAR_LINES (f));
***************
*** 1605,1610 ****
--- 1640,1650 ----
      x_set_frame_parameters (f, alist);
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_WIN_P (f))
+     ns_set_frame_parameters (f, alist);
+   else
+ #endif
      for (tail = alist; !EQ (tail, Qnil); tail = Fcdr (tail))
        {
  	elt = Fcar (tail);
***************
*** 1639,1644 ****
--- 1679,1689 ----
      return make_number (x_char_height (f));
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P(f))
+     return make_number (ns_char_height (f));
+   else
+ #endif
      return make_number (1);
  }
  
***************
*** 1668,1673 ****
--- 1713,1723 ----
      return make_number (x_char_width (f));
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     return make_number (ns_char_width (f));
+   else
+ #endif
      return make_number (1);
  }
  
***************
*** 1694,1699 ****
--- 1744,1754 ----
      return make_number (x_pixel_height (f));
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     return make_number (ns_pixel_height (f));
+   else
+ #endif
      return make_number (FRAME_HEIGHT (f));
  }
  
***************
*** 1720,1727 ****
--- 1775,1797 ----
      return make_number (x_pixel_width (f));
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     return make_number (ns_pixel_width (f));
+   else
+ #endif
      return make_number (FRAME_WIDTH (f));
  }
+ 
+ DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist,
+        0, 1, 0, "")
+   (frame)
+ Lisp_Object frame;
+ {
+   CHECK_FRAME (frame, 0);
+   return XFRAME (frame)->face_alist;
+ }
+ 
  
  DEFUN ("set-frame-height", Fset_frame_height, Sset_frame_height, 2, 3, 0,
    "Specify that the frame FRAME has LINES lines.\n\
***************
*** 1750,1755 ****
--- 1820,1833 ----
      }
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     {
+       if (XINT (rows) != f->width)
+ 	ns_set_window_size (f, 1, f->width, XINT (rows));
+     }
+   else
+ #endif
      change_frame_size (f, XINT (rows), 0, !NILP (pretend), 0);
    return Qnil;
  }
***************
*** 1780,1785 ****
--- 1858,1871 ----
      }
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     {
+       if (XINT (cols) != f->width)
+ 	ns_set_window_size (f, 1, XINT (cols), f->height);
+     }
+   else
+ #endif
      change_frame_size (f, 0, XINT (cols), !NILP (pretend), 0);
    return Qnil;
  }
***************
*** 1806,1811 ****
--- 1892,1905 ----
      }
    else
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     {
+       if (XINT (rows) != f->height || XINT (cols) != f->width)
+ 	ns_set_window_size (f, 1, XINT (cols), XINT (rows));
+     }
+   else
+ #endif
      change_frame_size (f, XINT (rows), XINT (cols), 0, 0);
  
    return Qnil;
***************
*** 1833,1842 ****
--- 1927,1950 ----
    if (FRAME_X_P (f))
      x_set_offset (f, XINT (xoffset), XINT (yoffset), 1);
  #endif
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+     ns_set_offset (f, XINT (xoffset), XINT (yoffset), 1);
+ #endif
  
    return Qt;
  }
  
+ DEFUN ("set-frame-face-alist", Fset_frame_face_alist, Sset_frame_face_alist,
+        2, 2, 0, "")
+   (frame, value)
+   Lisp_Object frame, value;
+ {
+    CHECK_FRAME (frame, 0);
+    XFRAME (frame)->face_alist = value;
+    return value;
+ }
+ 
  
  choose_minibuf_frame ()
  {
***************
*** 1885,1890 ****
--- 1993,2000 ----
    staticpro (&Qwidth);
    Qx = intern ("x");
    staticpro (&Qx);
+   Qns = intern ("ns");
+   staticpro (&Qns);
    Qvisible = intern ("visible");
    staticpro (&Qvisible);
    Qbuffer_predicate = intern ("buffer-predicate");
***************
*** 1965,1974 ****
--- 2075,2086 ----
    defsubr (&Sframe_char_width);
    defsubr (&Sframe_pixel_height);
    defsubr (&Sframe_pixel_width);
+   defsubr (&Sframe_face_alist);
    defsubr (&Sset_frame_height);
    defsubr (&Sset_frame_width);
    defsubr (&Sset_frame_size);
    defsubr (&Sset_frame_position);
+   defsubr (&Sset_frame_face_alist);
  }
  
  keys_of_frame ()
Index: emacs/src/frame.h
diff -c emacs/src/frame.h:1.1.1.2 emacs/src/frame.h:1.3
*** emacs/src/frame.h:1.1.1.2	Mon Jul 22 01:42:45 1996
--- emacs/src/frame.h	Wed Jul 31 01:37:44 1996
***************
*** 37,43 ****
     having miscellaneous random variables scattered about.  */
  
  enum output_method
! { output_termcap, output_x_window, output_msdos_raw };
  
  struct frame
  {
--- 37,43 ----
     having miscellaneous random variables scattered about.  */
  
  enum output_method
! { output_termcap, output_x_window, output_ns, output_msdos_raw };
  
  struct frame
  {
***************
*** 167,179 ****
    int new_height, new_width;
  
    /* The output method says how the contents of this frame
!      are displayed.  It could be using termcap, or using an X window.  */
    enum output_method output_method;
  
    /* A structure of auxiliary data used for displaying the contents.
       struct x_display is used for X window frames;
!      it is defined in xterm.h.  */
!   union display { struct x_display *x; int nothing; } display;
  
  #ifdef MULTI_KBOARD
    /* A pointer to the kboard structure associated with this frame.
--- 167,184 ----
    int new_height, new_width;
  
    /* The output method says how the contents of this frame
!      are displayed.  It could be using termcap, or using an X window
!      or NeXTstep window.  */
    enum output_method output_method;
  
    /* A structure of auxiliary data used for displaying the contents.
       struct x_display is used for X window frames;
!      it is defined in xterm.h.
!      struct ns_display is used for NS window frames;
!      it is defined in nsterm.h.  */
!   union display { struct x_display *x;
!                   struct ns_display *ns;
!                   int nothing; } display;
  
  #ifdef MULTI_KBOARD
    /* A pointer to the kboard structure associated with this frame.
***************
*** 185,191 ****
    /* Number of lines of menu bar.  */
    int menu_bar_lines;
  
! #ifdef USE_X_TOOLKIT
    /* Nonzero means using a menu bar that comes from the X toolkit.  */
    int external_menu_bar;
  #endif
--- 190,196 ----
    /* Number of lines of menu bar.  */
    int menu_bar_lines;
  
! #if defined (USE_X_TOOLKIT) || defined (HAVE_NS)
    /* Nonzero means using a menu bar that comes from the X toolkit.  */
    int external_menu_bar;
  #endif
***************
*** 299,304 ****
--- 304,311 ----
  #define FRAME_LIVE_P(f) ((f)->display.nothing != 0)
  #define FRAME_TERMCAP_P(f) ((f)->output_method == output_termcap)
  #define FRAME_X_P(f) ((f)->output_method == output_x_window)
+ #define FRAME_NS_P(f) ((f)->output_method == output_ns)
+ #define FRAME_WIN_P(f) (FRAME_X_P(f) || FRAME_NS_P(f))
  #define FRAME_MINIBUF_ONLY_P(f) \
    EQ (FRAME_ROOT_WINDOW (f), FRAME_MINIBUF_WINDOW (f))
  #define FRAME_HAS_MINIBUF_P(f) ((f)->has_minibuffer)
***************
*** 310,316 ****
  #define FRAME_NEW_HEIGHT(f) (f)->new_height
  #define FRAME_NEW_WIDTH(f) (f)->new_width
  #define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines
! #ifdef USE_X_TOOLKIT
  #define FRAME_EXTERNAL_MENU_BAR(f) (f)->external_menu_bar
  #else
  #define FRAME_EXTERNAL_MENU_BAR(f) 0
--- 317,323 ----
  #define FRAME_NEW_HEIGHT(f) (f)->new_height
  #define FRAME_NEW_WIDTH(f) (f)->new_width
  #define FRAME_MENU_BAR_LINES(f) (f)->menu_bar_lines
! #if defined (USE_X_TOOLKIT) || defined (HAVE_NS)
  #define FRAME_EXTERNAL_MENU_BAR(f) (f)->external_menu_bar
  #else
  #define FRAME_EXTERNAL_MENU_BAR(f) 0
***************
*** 404,409 ****
--- 411,419 ----
  
  
  extern Lisp_Object Qframep, Qframe_live_p, Qicon;
+ extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
+ extern Lisp_Object Qunsplittable, Qmenu_bar_lines;
+ extern Lisp_Object Vwindow_system_version;
  
  extern struct frame *selected_frame;
  extern struct frame *last_nonminibuf_frame;
***************
*** 447,455 ****
--- 457,469 ----
     but the constants below lead to better code.  */
  #define FRAME_TERMCAP_P(f) (the_only_frame.output_method == output_termcap)
  #define FRAME_X_P(f) (the_only_frame.output_method != output_termcap)
+ #define FRAME_NS_P(f) 0
+ #define FRAME_WIN_P(f) (FRAME_X_P(f))
  #else
  #define FRAME_TERMCAP_P(f) 1
  #define FRAME_X_P(f) 0
+ #define FRAME_NS_P(f) 0
+ #define FRAME_WIN_P(f) 0
  #endif
  #define FRAME_MINIBUF_ONLY_P(f) 0
  #define FRAME_HAS_MINIBUF_P(f) 1
Index: emacs/src/getloadavg.c
diff -c emacs/src/getloadavg.c:1.1.1.2 emacs/src/getloadavg.c:1.3
*** emacs/src/getloadavg.c:1.1.1.2	Mon Jul 22 01:40:27 1996
--- emacs/src/getloadavg.c	Wed Jul 31 01:37:46 1996
***************
*** 415,425 ****
  #endif /* LOAD_AVE_TYPE */
  
  #ifdef NeXT
- #ifdef HAVE_MACH_MACH_H
  #include <mach/mach.h>
- #else
- #include <mach.h>
- #endif
  #endif /* NeXT */
  
  #ifdef sgi
--- 415,421 ----
Index: emacs/src/intervals.h
diff -c emacs/src/intervals.h:1.1.1.2 emacs/src/intervals.h:1.3
*** emacs/src/intervals.h:1.1.1.2	Mon Jul 22 01:42:50 1996
--- emacs/src/intervals.h	Wed Jul 31 01:37:49 1996
***************
*** 18,24 ****
  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  #ifdef USE_TEXT_PROPERTIES
! #ifndef NORMAL_FACE
  #include "dispextern.h"
  #endif
  
--- 18,24 ----
  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  #ifdef USE_TEXT_PROPERTIES
! #ifndef _DISPEXTERN_H_
  #include "dispextern.h"
  #endif
  
Index: emacs/src/keyboard.c
diff -c emacs/src/keyboard.c:1.1.1.2 emacs/src/keyboard.c:1.3
*** emacs/src/keyboard.c:1.1.1.2	Mon Jul 22 01:40:36 1996
--- emacs/src/keyboard.c	Wed Jul 31 01:37:52 1996
***************
*** 56,61 ****
--- 56,65 ----
  #include "xterm.h"
  #endif
  
+ #ifdef HAVE_NS
+ #include "nsterm.h"
+ #endif
+ 
  /* Include systime.h after xterm.h to avoid double inclusion of time.h. */
  #include "systime.h"
  
***************
*** 74,85 ****
  /* File descriptor to use for input.  */
  extern int input_fd;
  
! #ifdef HAVE_X_WINDOWS
! /* Make all keyboard buffers much bigger when using X windows.  */
  #define KBD_BUFFER_SIZE 4096
! #else	/* No X-windows, character input */
  #define KBD_BUFFER_SIZE 256
! #endif	/* No X-windows */
  
  /* Following definition copied from eval.c */
  
--- 78,91 ----
  /* File descriptor to use for input.  */
  extern int input_fd;
  
! #ifdef HAVE_WIN
! extern Lisp_Object Qns,Qx;
! 
! /* Make all keyboard buffers much bigger when using a window system.  */
  #define KBD_BUFFER_SIZE 4096
! #else	/* No window system, character input */
  #define KBD_BUFFER_SIZE 256
! #endif	/* No window system */
  
  /* Following definition copied from eval.c */
  
***************
*** 485,493 ****
  #endif
  #endif
  
! /* If we support X Windows, turn on the code to poll periodically
     to detect C-g.  It isn't actually used when doing interrupt input.  */
! #ifdef HAVE_X_WINDOWS
  #define POLL_FOR_INPUT
  #endif
  
--- 491,499 ----
  #endif
  #endif
  
! /* If we support a window system, turn on the code to poll periodically
     to detect C-g.  It isn't actually used when doing interrupt input.  */
! #ifdef HAVE_WIN
  #define POLL_FOR_INPUT
  #endif
  
***************
*** 499,505 ****
  static int read_avail_input ();
  static void get_input_pending ();
  static int readable_events ();
! static Lisp_Object read_char_x_menu_prompt ();
  static Lisp_Object read_char_minibuf_menu_prompt ();
  static Lisp_Object make_lispy_event ();
  #ifdef HAVE_MOUSE
--- 505,511 ----
  static int read_avail_input ();
  static void get_input_pending ();
  static int readable_events ();
! static Lisp_Object read_char_win_menu_prompt ();
  static Lisp_Object read_char_minibuf_menu_prompt ();
  static Lisp_Object make_lispy_event ();
  #ifdef HAVE_MOUSE
***************
*** 1483,1489 ****
  start_polling ()
  {
  #ifdef POLL_FOR_INPUT
!   if (read_socket_hook && !interrupt_input)
      {
        poll_suppress_count--;
        if (poll_suppress_count == 0)
--- 1489,1495 ----
  start_polling ()
  {
  #ifdef POLL_FOR_INPUT
!   if (read_socket_hook && !interrupt_input && !EQ (Vwindow_system, Qns))
      {
        poll_suppress_count--;
        if (poll_suppress_count == 0)
***************
*** 1502,1508 ****
  input_polling_used ()
  {
  #ifdef POLL_FOR_INPUT
!   return read_socket_hook && !interrupt_input;
  #else
    return 0;
  #endif
--- 1508,1514 ----
  input_polling_used ()
  {
  #ifdef POLL_FOR_INPUT
!   return read_socket_hook && !interrupt_input && !EQ (Vwindow_system, Qns);
  #else
    return 0;
  #endif
***************
*** 1513,1519 ****
  stop_polling ()
  {
  #ifdef POLL_FOR_INPUT
!   if (read_socket_hook && !interrupt_input)
      {
        if (poll_suppress_count == 0)
  	{
--- 1519,1525 ----
  stop_polling ()
  {
  #ifdef POLL_FOR_INPUT
!   if (read_socket_hook && !interrupt_input && !EQ (Vwindow_system, Qns))
      {
        if (poll_suppress_count == 0)
  	{
***************
*** 1847,1853 ****
        /* Don't bring up a menu if we already have another event.  */
        && NILP (Vunread_command_events)
        && unread_command_char < 0)
!     c = read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu);
  
    /* Maybe autosave and/or garbage collect due to idleness.  */
  
--- 1853,1859 ----
        /* Don't bring up a menu if we already have another event.  */
        && NILP (Vunread_command_events)
        && unread_command_char < 0)
!     c = read_char_win_menu_prompt (nmaps, maps, prev_event, used_mouse_menu);
  
    /* Maybe autosave and/or garbage collect due to idleness.  */
  
***************
*** 2524,2530 ****
  	 We return nil for them.  */
        if (event->kind == selection_request_event)
  	{
! #ifdef HAVE_X11
  	  struct input_event copy;
  
  	  /* Remove it from the buffer before processing it,
--- 2530,2536 ----
  	 We return nil for them.  */
        if (event->kind == selection_request_event)
  	{
! #ifdef HAVE_WIN
  	  struct input_event copy;
  
  	  /* Remove it from the buffer before processing it,
***************
*** 2532,2538 ****
  	     and process it again.  */
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  x_handle_selection_request (&copy);
  #else
  	  /* We're getting selection request events, but we don't have
               a window system.  */
--- 2538,2544 ----
  	     and process it again.  */
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  handle_selection_request (&copy);
  #else
  	  /* We're getting selection request events, but we don't have
               a window system.  */
***************
*** 2542,2549 ****
  
        else if (event->kind == selection_clear_event)
  	{
! #ifdef HAVE_X11
! 	  x_handle_selection_clear (event);
  	  kbd_fetch_ptr = event + 1;
  #else
  	  /* We're getting selection request events, but we don't have
--- 2548,2555 ----
  
        else if (event->kind == selection_clear_event)
  	{
! #ifdef HAVE_WIN
! 	  handle_selection_clear (event);
  	  kbd_fetch_ptr = event + 1;
  #else
  	  /* We're getting selection request events, but we don't have
***************
*** 2551,2557 ****
  	  abort ();
  #endif
  	}
! #ifdef HAVE_X11
        else if (event->kind == delete_window_event)
  	{
  	  /* Make an event (delete-frame (FRAME)).  */
--- 2557,2563 ----
  	  abort ();
  #endif
  	}
! #ifdef HAVE_WIN
        else if (event->kind == delete_window_event)
  	{
  	  /* Make an event (delete-frame (FRAME)).  */
***************
*** 2580,2585 ****
--- 2586,2602 ----
  	  XSETBUFFER (obj, current_buffer);
  	  kbd_fetch_ptr = event + 1;
  	}
+ #ifdef HAVE_WIN
+       else if (event->kind == frame_switch_event)
+         {
+ 	  Lisp_Object frame = event->frame_or_window;
+ 	  if (! EQ (frame, internal_last_event_frame)
+ 	      && XFRAME (frame) != selected_frame)
+ 	    obj = make_lispy_switch_frame (frame);
+ 	  internal_last_event_frame = frame;
+           kbd_fetch_ptr = event + 1;
+         }
+ #endif
        /* Just discard these, by returning nil.
  	 With MULTI_KBOARD, these events are used as placeholders
  	 when we need to randomly delete events from the queue.
***************
*** 2717,2727 ****
  	 and don't actually appear to the command loop.  */
        if (event->kind == selection_request_event)
  	{
! #ifdef HAVE_X11
  	  struct input_event copy;
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  x_handle_selection_request (&copy);
  #else
  	  /* We're getting selection request events, but we don't have
               a window system.  */
--- 2734,2744 ----
  	 and don't actually appear to the command loop.  */
        if (event->kind == selection_request_event)
  	{
! #ifdef HAVE_WIN
  	  struct input_event copy;
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  handle_selection_request (&copy);
  #else
  	  /* We're getting selection request events, but we don't have
               a window system.  */
***************
*** 2731,2738 ****
  
        else if (event->kind == selection_clear_event)
  	{
! #ifdef HAVE_X11
! 	  x_handle_selection_clear (event);
  	  kbd_fetch_ptr = event + 1;
  #else
  	  /* We're getting selection request events, but we don't have
--- 2748,2755 ----
  
        else if (event->kind == selection_clear_event)
  	{
! #ifdef HAVE_WIN
! 	  handle_selection_clear (event);
  	  kbd_fetch_ptr = event + 1;
  #else
  	  /* We're getting selection request events, but we don't have
***************
*** 3058,3063 ****
--- 3075,3090 ----
  				   / sizeof (lispy_function_keys[0])));
        break;
  
+     case scroller_event:
+       button_down_time =0;
+       return Fcons(Qvertical_scroll_bar,
+                    Fcons(Fcons(event->frame_or_window,
+                                Fcons(Qvertical_scroll_bar,
+                                      Fcons(Fcons(event->x,event->y),
+                                            Fcons(make_number(event->timestamp),
+                                                  Qnil)))),Qnil));
+       break;
+    
  #ifdef HAVE_MOUSE
        /* A mouse click.  Figure out where it is, decide whether it's
           a press, click or drag, and build the appropriate structure.  */
***************
*** 3090,3096 ****
  	    pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
  				   &column, &row, NULL, 1);
  
! #ifndef USE_X_TOOLKIT
  	    /* In the non-toolkit version, clicks on the menu bar
  	       are ordinary button events in the event buffer.
  	       Distinguish them, and invoke the menu.
--- 3117,3153 ----
  	    pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
  				   &column, &row, NULL, 1);
  
! #ifdef HAVE_NS
!             if (FRAME_NS_P (f) &&
!                 FRAME_EXTERNAL_MENU_BAR (f) && XINT (event->y) == -1)
!               {
! 		Lisp_Object items, item;
! 		int hpos;
! 		int i;
! 
! 		/* Activate the menu bar on the down event.  If the
! 		   up event comes in before the menu code can deal with it,
! 		   just ignore it.  */
! 		if (! (event->modifiers & down_modifier))
! 		  return Qnil;
! 
! 		/* The click happened in the menubar.
! 		   Look for the menu item selected.  */
! 		item = ns_map_event_to_object (event, f);
! 
! 		XSETFASTINT (event->y, 1);
! 
! 		position
! 		  = Fcons (event->frame_or_window,
! 			   Fcons (Qmenu_bar,
! 				  Fcons (Fcons (event->x, event->y),
! 					 Fcons (make_number (event->timestamp),
! 						Qnil))));
! 
! 		return Fcons (item, Fcons (position, Qnil));
! 	      }
! #endif /* HAVE_NS */                
! 
  	    /* In the non-toolkit version, clicks on the menu bar
  	       are ordinary button events in the event buffer.
  	       Distinguish them, and invoke the menu.
***************
*** 3098,3104 ****
  	       (In the toolkit version, the toolkit handles the menu bar
  	       and Emacs doesn't know about it until after the user
  	       makes a selection.)  */
! 	    if (row >= 0 && row < FRAME_MENU_BAR_LINES (f))
  	      {
  		Lisp_Object items, item;
  		int hpos;
--- 3155,3162 ----
  	       (In the toolkit version, the toolkit handles the menu bar
  	       and Emacs doesn't know about it until after the user
  	       makes a selection.)  */
! 	    if (!FRAME_EXTERNAL_MENU_BAR (f) &&
!                 row >= 0 && row < FRAME_MENU_BAR_LINES (f))
  	      {
  		Lisp_Object items, item;
  		int hpos;
***************
*** 3126,3132 ****
  			break;
  		      }
  		  }
! 
  		position
  		  = Fcons (event->frame_or_window,
  			   Fcons (Qmenu_bar,
--- 3184,3190 ----
  			break;
  		      }
  		  }
!                 
  		position
  		  = Fcons (event->frame_or_window,
  			   Fcons (Qmenu_bar,
***************
*** 3136,3142 ****
  
  		return Fcons (item, Fcons (position, Qnil));
  	      }
- #endif /* not USE_X_TOOLKIT */
  
  	    window = window_from_coordinates (f, column, row, &part);
  
--- 3194,3199 ----
***************
*** 3801,3807 ****
        /* No; let's create it.  */
        if (!NILP (name_alist))
  	value = Fcdr_safe (Fassq (symbol_int, name_alist));
!       else if (name_table[symbol_num])
  	value = intern (name_table[symbol_num]);
  
  #ifdef HAVE_X_WINDOWS
--- 3858,3864 ----
        /* No; let's create it.  */
        if (!NILP (name_alist))
  	value = Fcdr_safe (Fassq (symbol_int, name_alist));
!       else if (name_table && name_table[symbol_num])
  	value = intern (name_table[symbol_num]);
  
  #ifdef HAVE_X_WINDOWS
***************
*** 4046,4052 ****
      }
    else
  #ifdef POLL_FOR_INPUT
!   if (read_socket_hook && !interrupt_input && poll_suppress_count == 0)
      {
        SIGMASKTYPE mask;
        mask = sigblockx (SIGALRM);
--- 4103,4110 ----
      }
    else
  #ifdef POLL_FOR_INPUT
!   if (read_socket_hook && !interrupt_input && poll_suppress_count == 0
!       && !EQ (Vwindow_system, Qns))
      {
        SIGMASKTYPE mask;
        mask = sigblockx (SIGALRM);
***************
*** 4643,4653 ****
     This can be done with X menus or with menus put in the minibuf.
     These are done in different ways, depending on how the input will be read.
     Menus using X are done after auto-saving in read-char, getting the input
!    event from Fx_popup_menu; menus using the minibuf use read_char recursively
     and do auto-saving in the inner call of read_char. */
  
  static Lisp_Object
! read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu)
       int nmaps;
       Lisp_Object *maps;
       Lisp_Object prev_event;
--- 4701,4711 ----
     This can be done with X menus or with menus put in the minibuf.
     These are done in different ways, depending on how the input will be read.
     Menus using X are done after auto-saving in read-char, getting the input
!    event from Fpopup_menu; menus using the minibuf use read_char recursively
     and do auto-saving in the inner call of read_char. */
  
  static Lisp_Object
! read_char_win_menu_prompt (nmaps, maps, prev_event, used_mouse_menu)
       int nmaps;
       Lisp_Object *maps;
       Lisp_Object prev_event;
***************
*** 4684,4694 ****
    if (mapno >= nmaps)
      return Qnil;
  
! #if (defined (HAVE_X_WINDOWS) && defined (HAVE_X_MENU)) || defined (MSDOS)
    /* If we got to this point via a mouse click,
       use a real menu for mouse selection.  */
    if (EVENT_HAS_PARAMETERS (prev_event)
!       && !EQ (XCONS (prev_event)->car, Qmenu_bar))
      {
        /* Display the menu and get the selection.  */
        Lisp_Object *realmaps
--- 4742,4753 ----
    if (mapno >= nmaps)
      return Qnil;
  
! #if defined (HAVE_WIN) || defined (MSDOS)
    /* If we got to this point via a mouse click,
       use a real menu for mouse selection.  */
    if (EVENT_HAS_PARAMETERS (prev_event)
!       && !EQ (XCONS (prev_event)->car, Qmenu_bar)
!       && !NILP(Vwindow_system))
      {
        /* Display the menu and get the selection.  */
        Lisp_Object *realmaps
***************
*** 4701,4707 ****
  	if (!NILP (maps[mapno]))
  	  realmaps[nmaps1++] = maps[mapno];
  
!       value = Fx_popup_menu (prev_event, Flist (nmaps1, realmaps));
        if (CONSP (value))
  	{
  	  /* If we got more than one event, put all but the first
--- 4760,4766 ----
  	if (!NILP (maps[mapno]))
  	  realmaps[nmaps1++] = maps[mapno];
  
!       value = Fpopup_menu (prev_event, Flist (nmaps1, realmaps));
        if (CONSP (value))
  	{
  	  /* If we got more than one event, put all but the first
***************
*** 4717,4723 ****
  	*used_mouse_menu = 1;
        return value;
      }
! #endif /* (HAVE_X_WINDOWS && HAVE_X_MENU) || MSDOS */
    return Qnil ;
  }
  
--- 4776,4782 ----
  	*used_mouse_menu = 1;
        return value;
      }
! #endif /* HAVE_WIN || MSDOS */
    return Qnil ;
  }
  
***************
*** 6793,6799 ****
  
    kbd_buffer_frame_or_window
      = Fmake_vector (make_number (KBD_BUFFER_SIZE), Qnil);
!   if (!noninteractive && !read_socket_hook && NILP (Vwindow_system))
      {
        signal (SIGINT, interrupt_signal);
  #if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
--- 6852,6859 ----
  
    kbd_buffer_frame_or_window
      = Fmake_vector (make_number (KBD_BUFFER_SIZE), Qnil);
!   if (!noninteractive && !read_socket_hook &&
!       (NILP (Vwindow_system) || EQ (Vwindow_system, Qns)))
      {
        signal (SIGINT, interrupt_signal);
  #if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
Index: emacs/src/keymap.c
diff -c emacs/src/keymap.c:1.1.1.2 emacs/src/keymap.c:1.3
*** emacs/src/keymap.c:1.1.1.2	Mon Jul 22 01:40:41 1996
--- emacs/src/keymap.c	Wed Jul 31 01:38:00 1996
***************
*** 102,108 ****
  mouse events, and any other things that appear in the input stream.\n\
  All entries in it are initially nil, meaning \"command undefined\".\n\n\
  The optional arg STRING supplies a menu name for the keymap\n\
! in case you use it as a menu with `x-popup-menu'.")
    (string)
       Lisp_Object string;
  {
--- 102,108 ----
  mouse events, and any other things that appear in the input stream.\n\
  All entries in it are initially nil, meaning \"command undefined\".\n\n\
  The optional arg STRING supplies a menu name for the keymap\n\
! in case you use it as a menu with `popup-menu'.")
    (string)
       Lisp_Object string;
  {
***************
*** 123,129 ****
  which binds the function key or mouse event SYMBOL to DEFINITION.\n\
  Initially the alist is nil.\n\n\
  The optional arg STRING supplies a menu name for the keymap\n\
! in case you use it as a menu with `x-popup-menu'.")
    (string)
       Lisp_Object string;
  {
--- 123,129 ----
  which binds the function key or mouse event SYMBOL to DEFINITION.\n\
  Initially the alist is nil.\n\n\
  The optional arg STRING supplies a menu name for the keymap\n\
! in case you use it as a menu with `popup-menu'.")
    (string)
       Lisp_Object string;
  {
Index: emacs/src/lisp.h
diff -c emacs/src/lisp.h:1.1.1.2 emacs/src/lisp.h:1.3
*** emacs/src/lisp.h:1.1.1.2	Mon Jul 22 01:42:55 1996
--- emacs/src/lisp.h	Wed Jul 31 01:38:04 1996
***************
*** 184,189 ****
--- 184,202 ----
  
  #ifdef NO_UNION_TYPE
  
+ #if 0
+ FIXME/cl
+ /* These values are overridden by the m- file on some machines.  */
+ #ifndef GCTYPEBITS
+ #define GCTYPEBITS 7
+ #endif
+ 
+ #ifndef VALBITS
+ #define VALBITS (INTBITS-GCTYPEBITS-1)
+ #endif
+ FIXME/cl
+ #endif
+ 
  #define Lisp_Object EMACS_INT
  
  #ifndef VALMASK
***************
*** 750,756 ****
  #define CHAR_CTL   (0x4000000)
  #define CHAR_META  (0x8000000)
  
! #ifdef USE_X_TOOLKIT
  #ifdef NO_UNION_TYPE
  /* Use this for turning a (void *) into a Lisp_Object, as when the
     Lisp_Object is passed into a toolkit callback function.  */
--- 763,769 ----
  #define CHAR_CTL   (0x4000000)
  #define CHAR_META  (0x8000000)
  
! #if defined (USE_X_TOOLKIT) || defined (HAVE_NS)
  #ifdef NO_UNION_TYPE
  /* Use this for turning a (void *) into a Lisp_Object, as when the
     Lisp_Object is passed into a toolkit callback function.  */
***************
*** 776,782 ****
  #define LISP_TO_VOID(larg) ((larg).v)
  #define LISP_TO_CVOID(larg) ((larg).cv)
  #endif /* not NO_UNION_TYPE */
! #endif /* USE_X_TOOLKIT */
  
  
  /* The glyph datatype, used to represent characters on the display.  */
--- 789,795 ----
  #define LISP_TO_VOID(larg) ((larg).v)
  #define LISP_TO_CVOID(larg) ((larg).cv)
  #endif /* not NO_UNION_TYPE */
! #endif /* USE_X_TOOLKIT || HAVE_NS */
  
  
  /* The glyph datatype, used to represent characters on the display.  */
***************
*** 1255,1260 ****
--- 1268,1274 ----
  /* Call staticpro (&var) to protect static variable `var'.  */
  
  void staticpro();
+ void staticunpro();
    
  #define UNGCPRO (gcprolist = gcpro1.next)
  
Index: emacs/src/multi-frame.c
diff -c /dev/null emacs/src/multi-frame.c:1.3
*** /dev/null	Fri Aug  2 21:06:37 1996
--- emacs/src/multi-frame.c	Thu Aug  1 02:48:17 1996
***************
*** 0 ****
--- 1,1568 ----
+ /* Functions for all window systems
+    Copyright (C) 1989, 1992, 1993 Free Software Foundation.
+ 
+ This file is part of GNU Emacs.
+ 
+ GNU Emacs is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ #include "config.h"
+ 
+ #ifdef HAVE_WIN
+ #include <stdio.h>
+ #include "lisp.h"
+ #include "dispextern.h"
+ #include "frame.h"
+ #include "multi-frame.h"
+ #include "window.h"
+ #include "termhooks.h"
+ #include "blockinput.h"
+ 
+ #ifdef HAVE_X_WINDOWS
+ #include "xterm.h"
+ #endif
+ #ifdef HAVE_NS
+ #include "nsterm.h"
+ #endif
+ extern Lisp_Object Qx, Qns, Vwindow_system;
+ 
+ Lisp_Object QATOM;
+ Lisp_Object QATOM_PAIR;
+ Lisp_Object QCLIPBOARD;
+ Lisp_Object QCUT_BUFFER0;
+ Lisp_Object QCUT_BUFFER1;
+ Lisp_Object QCUT_BUFFER2;
+ Lisp_Object QCUT_BUFFER3;
+ Lisp_Object QCUT_BUFFER4;
+ Lisp_Object QCUT_BUFFER5;
+ Lisp_Object QCUT_BUFFER6;
+ Lisp_Object QCUT_BUFFER7;
+ Lisp_Object QDELETE;
+ Lisp_Object QEMACS_TMP;
+ Lisp_Object QINCR;
+ Lisp_Object QINTEGER;
+ Lisp_Object QMULTIPLE;
+ Lisp_Object QNULL;
+ Lisp_Object QPRIMARY;
+ Lisp_Object QSECONDARY;
+ Lisp_Object QSTRING;
+ Lisp_Object QTARGETS;
+ Lisp_Object QTEXT;
+ Lisp_Object QTIMESTAMP;
+ Lisp_Object QFILE_NAME;
+ Lisp_Object Qauto_lower;
+ Lisp_Object Qauto_raise;
+ Lisp_Object Qbackground_color;
+ Lisp_Object Qbar;
+ Lisp_Object Qborder_color;
+ Lisp_Object Qborder_width;
+ Lisp_Object Qbox;
+ Lisp_Object Qbuffered;
+ Lisp_Object Qcursor_color;
+ Lisp_Object Qcursor_type;
+ Lisp_Object Qface;
+ Lisp_Object Qfont;
+ Lisp_Object Qfontsize;
+ Lisp_Object Qforeground_color;
+ Lisp_Object Qgeometry;
+ Lisp_Object Qheight;
+ Lisp_Object Qicon_left;
+ Lisp_Object Qicon_top;
+ Lisp_Object Qicon_type;
+ Lisp_Object Qicon_name;
+ Lisp_Object Qinternal_border_width;
+ Lisp_Object Qleft;
+ Lisp_Object Qleft;
+ Lisp_Object Qminibuffer;
+ Lisp_Object Qmouse_color;
+ Lisp_Object Qname;
+ Lisp_Object Qnone;
+ Lisp_Object Qonly;
+ Lisp_Object Qparent_id;
+ Lisp_Object Qpriority;
+ Lisp_Object Qretained;
+ Lisp_Object Qreverse_color;
+ Lisp_Object Qright;
+ Lisp_Object Qscroll_bar_width;
+ Lisp_Object Qsuppress_icon;
+ Lisp_Object Qtop;
+ Lisp_Object Qundefined_color;
+ Lisp_Object Qunderline;
+ Lisp_Object Qunsplittable;
+ Lisp_Object Qvertical_scroll_bars;
+ Lisp_Object Qvisibility;
+ Lisp_Object Qwidth;
+ Lisp_Object Qwindow;
+ Lisp_Object Qwindow_id;
+ Lisp_Object Qresource_name;
+ Lisp_Object Quser_position;
+ Lisp_Object Quser_size;
+ Lisp_Object Qmouse_face;
+ Lisp_Object Qdisplay;
+ 
+ Lisp_Object Vwindow_system_version;
+ 
+ Lisp_Object Vlost_selection_hooks;
+ Lisp_Object Vsent_selection_hooks;
+ 
+ Lisp_Object Vmouse_depressed;
+ 
+ /* This is an association list whose elements are of the form
+      ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
+    SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
+    SELECTION-VALUE is the value that emacs owns for that selection.
+      It may be any kind of Lisp object.
+    SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
+      as a cons of two 16-bit numbers (making a 32 bit time.)
+    FRAME is the frame for which we made the selection.
+    If there is an entry in this alist, then it can be assumed that Emacs owns
+     that selection.
+    The only (eq) parts of this list that are visible from Lisp are the
+     selection-values.
+  */
+ Lisp_Object Vselection_alist;
+ 
+ /* This is an alist whose CARs are selection-types (whose names are the same
+    as the names of X Atoms) and whose CDRs are the names of Lisp functions to
+    call to convert the given Emacs selection value to a string representing 
+    the given selection type.  This is for Lisp-level extension of the emacs
+    selection handling.
+  */
+ Lisp_Object Vselection_converter_alist;
+ 
+ /* If the selection owner takes too long to reply to a selection request,
+    we give up on it.  This is in milliseconds (0 = no timeout.)
+  */
+ int selection_timeout;
+ 
+ /* Nonzero if using a window system for display.  */
+ int using_win_p ()
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return using_x_p();
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return using_ns_p();
+ #endif
+    return 0;
+    }
+ 
+ /* The number of the face to use to indicate the region.  */
+ int region_face;
+ 
+ DEFUN ("close-current-connection", Fclose_current_connection,
+        Sclose_current_connection,
+        0, 0, 0, "Closes the connection to the current window server.\n\
+ Currently this only works for nextstep.")
+   ()
+    {
+ #if 0
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_close_current_connection();
+ #endif
+ #endif /* 0 */
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_close_current_connection();
+ #endif
+    return Qnil;
+    }
+ 
+ DEFUN ("color-defined-p", Fcolor_defined_p, Scolor_defined_p,
+        1, 1, 0,
+        "Return t if the current window system supports the color named COLOR.")
+   (color)
+ Lisp_Object color;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_color_defined_p(color);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_color_defined_p(color);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("color-values", Fcolor_values, Scolor_values,
+        1, 1, 0,
+        "Return a description of the color named COLOR.")
+   (color)
+ Lisp_Object color;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_color_values(color);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_color_values(color);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("create-frame", Fcreate_frame, Screate_frame,
+        1, 1, 0, "Make a new window in the current window system.\n\
+ For more details see the window system specific function.")
+   (parms)
+ Lisp_Object parms;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+      return Fx_create_frame(parms);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_create_frame(parms);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("disown-selection-internal", Fdisown_selection_internal,
+        Sdisown_selection_internal, 1, 2, 0,
+        "If we own the selection SELECTION, disown it.")
+   (selection, time)
+ Lisp_Object selection;
+ Lisp_Object time;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_disown_selection_internal(selection,time);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_disown_selection_internal(selection,time);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-backing-store", Fdisplay_backing_store, Sdisplay_backing_store,
+        0, 1, 0,
+        "Returns an indication of what type of backing store FRAME does.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_backing_store(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_backing_store(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("display-color-cells", Fdisplay_color_cells, Sdisplay_color_cells,
+        0, 1, 0,
+        "Returns the number of color cells of the display FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_color_cells(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_color_cells(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("display-color-p", Fdisplay_color_p, Sdisplay_color_p,
+        0, 1, 0,
+        "Return t if the main screen of the current window system supports color.")
+   (display)
+      Lisp_Object display;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_display_color_p(display);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_display_color_p();
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-mm-height", Fdisplay_mm_height, Sdisplay_mm_height,
+        0, 1, 0,
+        "Returns the height in millimeters of the screen FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_mm_height(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_mm_height(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-mm-width", Fdisplay_mm_width, Sdisplay_mm_width,
+        0, 1, 0,
+        "Returns the width in millimeters of the screen FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_mm_width(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_mm_width(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-pixel-height", Fdisplay_pixel_height, Sdisplay_pixel_height,
+        0, 1, 0,
+        "Returns the height in pixels of the display FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_pixel_height(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_pixel_height(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-pixel-width", Fdisplay_pixel_width, Sdisplay_pixel_width,
+        0, 1, 0,
+        "Returns the width in pixels of the display FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_pixel_width(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_pixel_width(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-planes", Fdisplay_planes, Sdisplay_planes,
+        0, 1, 0,
+        "Returns the number of bitplanes of the display FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_planes(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_planes(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("display-save-under", Fdisplay_save_under, Sdisplay_save_under,
+        0, 1, 0,
+        "Returns t if FRAME supports the save-under feature.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_save_under(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_save_under(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-screens", Fdisplay_screens, Sdisplay_screens,
+        0, 1, 0,
+        "Returns the number of screens on the server FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_screens(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_screens(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("display-visual-class", Fdisplay_visual_class, Sdisplay_visual_class,
+        0, 1, 0,
+        "Returns the visual class of the display `screen' is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((NILP(frame) && EQ(Vwindow_system,Qx))||
+        (FRAMEP (frame) && FRAME_X_P(XFRAME(frame))))
+       return Fx_display_visual_class(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((NILP(frame) && EQ(Vwindow_system,Qns))||
+        (FRAMEP (frame) && FRAME_NS_P(XFRAME(frame))))
+       return Fns_display_visual_class(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("get-cut-buffer-internal", Fget_cut_buffer_internal,
+        Sget_cut_buffer_internal, 1, 1, 0,
+        "Returns the value of the named cut buffer.")
+   (buffer)
+ Lisp_Object buffer;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_get_cut_buffer_internal(buffer);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_get_cut_buffer_internal(buffer);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("get-resource", Fget_resource, Sget_resource,
+        2, 4, 0, "Return the appropriate value from the defaults database.\n\
+ For more details see the window system specific function.")
+   (attribute, class, component, subclass)
+ Lisp_Object attribute, class, component, subclass;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_get_resource(attribute,class,component,subclass);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_get_resource(attribute,class);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("set-resource", Fset_resource, Sset_resource,
+        3, 3, 0, "Sets the appropriate value in the defaults database.\n\
+ For more details see the window system specific function.")
+   (attribute, class, value)
+ Lisp_Object attribute, class, value;
+    {
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_set_resource(attribute,class,value);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("get-selection-internal", Fget_selection_internal,
+        Sget_selection_internal, 2, 2, 0,
+        "Return the text selected from some window.\n\
+ For more details see the window system specific function.")
+   (selection_symbol, target_type)
+ Lisp_Object selection_symbol, target_type;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_get_selection_internal(selection_symbol,target_type);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_get_selection_internal(selection_symbol,target_type);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("hide-emacs", Fhide_emacs, Shide_emacs,
+        1, 1, 0, "If ON is non-nil, the entire emacs application is hidden.\n\
+ Otherwise if emacs is hidden, it is unhidden.")
+   (on)
+ Lisp_Object on;
+    {
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_hide_emacs(on);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("internal-next-face-id", Finternal_next_face_id, Sinternal_next_face_id,
+        0, 0, 0, "...")
+   ()
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_internal_next_face_id();
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_internal_next_face_id();
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("list-fonts", Flist_fonts, Slist_fonts,
+        1, 3, 0,
+   "Return a list of the names of available fonts matching PATTERN.\n\
+ If optional arguments FACE and FRAME are specified, return only fonts\n\
+ the same size as FACE on FRAME.\n\
+ \n\
+ PATTERN is a string, perhaps with wildcard characters;\n\
+   the * character matches any substring, and\n\
+   the ? character matches any single character.\n\
+   PATTERN is case-insensitive.\n\
+ FACE is a face name - a symbol.\n\
+ \n\
+ The return value is a list of strings, suitable as arguments to\n\
+ set-face-font.\n\
+ \n\
+ The list does not include fonts Emacs can't use (i.e.  proportional\n\
+ fonts), even if they match PATTERN and FACE.")
+   (pattern, face, frame)
+     Lisp_Object pattern, face, frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_list_fonts(pattern,face,frame);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_list_fonts(pattern,face,frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("make-face-internal", Fmake_face_internal, Smake_face_internal,
+        1, 1, 0, "Create face number FACE-ID on all frames.")
+   (faceid)
+ Lisp_Object faceid;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_make_face_internal(faceid);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_make_face_internal(faceid);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("open-connection", Fopen_connection, Sopen_connection,
+        1, 2, 0, "Open connection to window system.")
+   (display, resource_string)
+ Lisp_Object display, resource_string;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_open_connection(display, resource_string);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_open_connection(display, resource_string);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("own-selection-internal", Fown_selection_internal, Sown_selection_internal,
+        2, 2, 0, "Assert a selection.\n\
+ For more details see the window system specific function.")
+   (selection_name, selection_value)
+ Lisp_Object selection_name,selection_value;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_own_selection_internal(selection_name,selection_value);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_own_selection_internal(selection_name,selection_value);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("popup-menu", Fpopup_menu, Spopup_menu,
+        1, 2, 0, "Pop up a deck-of-cards menu and return user's selection.\n\
+ For more details see the window system specific function.")
+   (position,menu)
+ Lisp_Object position,menu;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_popup_menu(position,menu);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_popup_menu(position,menu);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("popup-dialog", Fpopup_dialog, Spopup_dialog,
+        2, 2, 0, "Pop up a dialog box and return user's selection.\n\
+ For more details see the window system specific function.")
+   (position,contents)
+ Lisp_Object position,contents;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_popup_dialog(position,contents);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_popup_dialog(position,contents);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("rotate-cut-buffers-internal", Frotate_cut_buffers_internal,
+        Srotate_cut_buffers_internal, 1, 1, 0,
+        "Rotate the values of the cut buffers by the given number of steps;\n\
+ positive means move values forward, negative means backward.")
+   (n)
+      Lisp_Object n;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_rotate_cut_buffers_internal(n);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_rotate_cut_buffers_internal(n);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("selection-exists-p", Fselection_exists_p, Sselection_exists_p,
+        0, 1, 0, "Whether there is an owner for the given selection.\n\
+ For more details see the window system specific function.")
+   (selection)
+ Lisp_Object selection;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_selection_exists_p(selection);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_selection_exists_p(selection);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("selection-owner-p", Fselection_owner_p, Sselection_owner_p,
+        0, 1, 0,
+   "Whether the current Emacs process owns the given selection.\n\
+ For more details see the window system specific function.")
+   (selection)
+ Lisp_Object selection;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_selection_owner_p(selection);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_selection_owner_p(selection);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("server-max-request-size", Fserver_max_request_size,
+        Sserver_max_request_size, 0, 1, 0,
+        "Returns the maximum request size of the window server FRAME is using.")
+   (frame)
+ Lisp_Object frame;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if ((FRAMEP(frame) && FRAME_X_P(XFRAME(frame)))||
+        EQ(Vwindow_system,Qx))
+       return Fx_server_max_request_size(frame);
+ #endif
+ #ifdef HAVE_NS
+    if ((FRAMEP(frame) && FRAME_NS_P(XFRAME(frame)))||
+        EQ(Vwindow_system,Qns))
+       return Fns_server_max_request_size(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("server-vendor", Fserver_vendor, Sserver_vendor,
+        0, 1, 0,
+        "Returns the vender ID string of the window server FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+    CHECK_FRAME (frame, 0);
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(XFRAME(frame)))
+       return Fx_server_vendor(frame);
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(XFRAME(frame)))
+       return Fns_server_vendor(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("server-version", Fserver_version, Sserver_version,
+        0, 1, 0,
+        "Returns the version numbers of the window server FRAME is on.")
+   (frame)
+ Lisp_Object frame;
+    {
+    CHECK_FRAME (frame, 0);
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(XFRAME(frame)))
+       return Fx_server_version(frame);
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(XFRAME(frame)))
+       return Fns_server_version(frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("set-face-attribute-internal", Fset_face_attribute_internal,
+        Sset_face_attribute_internal, 4, 4, 0,
+        "")
+   (face_id, attr_name, attr_value, frame)
+ Lisp_Object face_id, attr_name, attr_value, frame;
+    {
+    CHECK_FRAME (frame, 0);
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(XFRAME(frame)))
+       return Fx_set_face_attribute_internal(face_id, attr_name, attr_value,
+                                             frame);
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(XFRAME(frame)))
+       return Fns_set_face_attribute_internal(face_id, attr_name, attr_value,
+                                               frame);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ 
+ DEFUN ("store-cut-buffer-internal", Fstore_cut_buffer_internal,
+        Sstore_cut_buffer_internal, 2, 2, 0,
+   "Sets the value of the named cut buffer (typically CUT_BUFFER0).")
+   (buffer, string)
+ Lisp_Object buffer, string;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_store_cut_buffer_internal(buffer, string);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_store_cut_buffer_internal(buffer, string);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("synchronize", Fsynchronize, Ssynchronize, 1, 1, 0,
+        "If ON is non-nil, report window system errors as soon as the\n\
+ erring request is made.\n\
+ If ON is nil, allow buffering of requests.")
+   (on)
+ Lisp_Object on;
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return Fx_synchronize(on);
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return Fns_synchronize(on);
+ #endif
+    error("Window system unavailable.");
+    }
+ 
+ DEFUN ("focus-frame", Ffocus_frame, Sfocus_frame, 1, 1, 0,
+   "Set the focus on FRAME.")
+   (frame)
+      Lisp_Object frame;
+ {
+   CHECK_LIVE_FRAME (frame, 0);
+    
+   if (FRAME_WIN_P (XFRAME (frame)))
+   {
+     BLOCK_INPUT;
+     focus_on_frame (XFRAME (frame));
+     UNBLOCK_INPUT;
+     return frame;
+   }
+    
+   return Qnil;
+ }
+ 
+ DEFUN ("unfocus-frame", Funfocus_frame, Sunfocus_frame, 0, 0, 0,
+    "If a frame has been focused, release it.")
+    ()
+ {
+   if (FRAME_WIN_P (selected_frame))
+   {
+     if (EQ(Vwindow_system,Qx))
+     {
+       struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
+ 
+       if (dpyinfo->x_focus_frame)
+       {
+         BLOCK_INPUT;
+         x_unfocus_frame (dpyinfo->x_focus_frame);
+         UNBLOCK_INPUT;
+       }
+     }
+     if (EQ(Vwindow_system,Qns))
+     {
+       BLOCK_INPUT;
+       ns_unfocus_frame(ns_focus_frame);
+       UNBLOCK_INPUT;
+     }
+   }
+ 
+   return Qnil;
+ }
+ 
+ void char_height()
+    {
+    /* XXX */
+    }
+ 
+ void char_width()
+    {
+    /* XXX */
+    }
+ 
+ void clear_face_cache(void)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       {      
+       x_clear_face_cache();
+       return;
+       }
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       {
+       ns_clear_face_vector();
+       return;
+       }
+ #endif
+    }
+ 
+ int compute_char_face(struct frame *f, struct window *w,int pos,
+                       int region_beg,int region_end,int *endptr,int limit,
+                       int mouse)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(f))
+       return x_compute_char_face(f,w,pos,region_beg,region_end,endptr,limit,mouse);
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       return ns_compute_char_face(f,w,pos,region_beg,region_end,endptr,limit,mouse);
+ #endif
+    return 0;
+    }
+ 
+ int compute_glyph_face(struct frame *f, int face_code, int current_face)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(f))
+       return x_compute_glyph_face(f,face_code,current_face);
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       return ns_compute_glyph_face(f,face_code,current_face);
+ #endif
+    return 0;
+    }
+ 
+ int compute_glyph_face_1(struct frame *f, Lisp_Object face_name, int current_face)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(f))
+       return x_compute_glyph_face_1(f,face_name,current_face);
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       return ns_compute_glyph_face_1(f,face_name,current_face);
+ #endif
+    return 0;
+    }
+ 
+ void destroy_window(struct frame *f)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P (f))
+       {
+       x_destroy_window (f);
+       return;
+       }   
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_destroy_window (f);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void explicitly_set_name(struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P (f))
+       {
+       x_explicitly_set_name (f,arg,oldval);
+       return;
+       }   
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_explicitly_set_name (f,arg,oldval);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void face_name_id_number()
+    {
+    /* XXX */
+    }
+ 
+ void focus_on_frame(struct frame *f)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P (f))
+       {
+       x_focus_on_frame (f);
+       return;
+       }   
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_focus_on_frame (f);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void font_height()
+    {
+    /* XXX */
+    }
+ 
+ void font_width()
+    {
+    /* XXX */
+    }
+ 
+ void free_frame_faces()
+    {
+    /* XXX */
+    }
+ 
+ void handle_selection_clear(struct input_event *event)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       {      
+       x_handle_selection_clear(event);
+       return;
+       }
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       {
+       ns_handle_selection_clear(event);
+       return;
+       }
+ #endif   
+    }
+ 
+ void handle_selection_request(struct input_event *event)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       {      
+       x_handle_selection_request(event);
+       return;
+       }
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       {      
+       ns_handle_selection_request(event);
+       return;
+       }
+ #endif   
+    }
+ 
+ void iconify_frame(struct frame *f)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P (f))
+       {
+       x_iconify_frame (f);
+       return;
+       }   
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_iconify_frame (f);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void implicitly_set_name(struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P (f))
+       {
+       x_implicitly_set_name (f,arg,oldval);
+       return;
+       }   
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_implicitly_set_name (f,arg,oldval);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void init_frame_faces()
+    {
+    /* XXX */
+    }
+ 
+ void lower_frame()
+    {
+    /* XXX */
+    }
+ 
+ void make_frame_invisible()
+    {
+    /* XXX */
+    }
+ 
+ void make_frame_visible()
+    {
+    /* XXX */
+    }
+ 
+ void mouse_buffer_offset()
+    {
+    /* XXX */
+    }
+ 
+ void new_font()
+    {
+    /* XXX */
+    }
+ 
+ void next_face_id()
+    {
+    /* XXX */
+    }
+ 
+ void pixel_height()
+    {
+    /* XXX */
+    }
+ 
+ void pixel_width()
+    {
+    /* XXX */
+    }
+ 
+ void raise_frame()
+    {
+    /* XXX */
+    }
+ 
+ void recompute_basic_faces()
+    {
+    /* XXX */
+    }
+ 
+ void report_frame_params()
+    {
+    /* XXX */
+    }
+ 
+ void set_autolower()
+    {
+    /* XXX */
+    }
+ 
+ void set_autoraise()
+    {
+    /* XXX */
+    }
+ 
+ void set_background_color()
+    {
+    /* XXX */
+    }
+ 
+ void set_doc_edited()
+    {
+    /* XXX */
+    }
+ 
+ void set_font()
+    {
+    /* XXX */
+    }
+ 
+ void set_foreground_color()
+    {
+    /* XXX */
+    }
+ 
+ void set_frame_parameters()
+    {
+    /* XXX */
+    }
+ 
+ void set_internal_border_width()
+    {
+    /* XXX */
+    }
+ 
+ void set_mouse_position()
+    {
+    /* XXX */
+    }
+ 
+ void set_name()
+    {
+    /* XXX */
+    }
+ 
+ void set_offset()
+    {
+    /* XXX */
+    }
+ 
+ void set_vertical_scroll_bars()
+    {
+    /* XXX */
+    }
+ 
+ void set_visibility()
+    {
+    /* XXX */
+    }
+ 
+ void set_window_size()
+    {
+    /* XXX */
+    }
+ 
+ void unfocus_frame(struct frame *f)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(f))
+       {
+       x_unfocus_frame (f);
+       return;
+       }
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_unfocus_frame (f);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void glyph_to_pixel_coords(struct frame *f,int x,int y,int *pix_x,int *pix_y)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(f))
+       {
+       x_glyph_to_pixel_coords(f,x,y,pix_x,pix_y);
+       return;
+       }
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_glyph_to_pixel_coords(f,x,y,pix_x,pix_y);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void pixel_to_glyph_coords(struct frame *f,int pix_x,int pix_y,int *x,int *y,
+                            void *bounds,int noclip)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(f))
+       {
+       x_pixel_to_glyph_coords(f,pix_x,pix_y,x,y,bounds,noclip);
+       return;
+       }
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_pixel_to_glyph_coords(f,pix_x,pix_y,x,y,bounds,noclip);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ Lisp_Object get_focus_frame(void)
+    {
+ #ifdef HAVE_X_WINDOWS
+    if (EQ(Vwindow_system,Qx))
+       return x_get_focus_frame();
+ #endif
+ #ifdef HAVE_NS
+    if (EQ(Vwindow_system,Qns))
+       return ns_get_focus_frame();
+ #endif
+    return Qnil;
+    }
+ 
+ void win_sync(Lisp_Object f)
+    {
+ /* FIXME/cl */
+ /*    CHECK_FRAME (f,0); */
+ #ifdef HAVE_X_WINDOWS
+    if (FRAME_X_P(XFRAME(f)))
+       {
+       x_sync(f);
+       return;
+       }
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(XFRAME(f)))
+       {
+       ns_sync(f);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ void set_frame_menubar (struct frame *f, int first_time)
+    {
+ #ifdef HAVE_X_WINDOWS
+ #ifdef USE_X_TOOLKIT
+    if (FRAME_X_P(f))
+       {
+       x_set_frame_menubar(f,first_time);
+       return;
+       }
+ #endif
+ #endif
+ #ifdef HAVE_NS
+    if (FRAME_NS_P(f))
+       {
+       ns_set_frame_menubar(f,first_time);
+       return;
+       }
+ #endif
+    return;
+    }
+ 
+ syms_of_multi_frame()
+    {
+    DEFVAR_INT ("region-face", &region_face,
+     "Face number to use to highlight the region\n\
+ The region is highlighted with this face\n\
+ when Transient Mark mode is enabled and the mark is active.");
+ 
+    Vselection_alist = Qnil;
+    staticpro (&Vselection_alist);
+ 
+   DEFVAR_LISP ("mouse-grabbed", &Vmouse_depressed,
+ 	       "Non-nil if a mouse button is currently depressed.");
+   Vmouse_depressed = Qnil;
+ 
+    DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist,
+   "An alist associating GUI selection-types with functions.\n\
+ These functions are called to convert the selection, with three args:\n\
+ the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
+ a desired type to which the selection should be converted;\n\
+ and the local selection value (whatever was given to `own-selection').\n\
+ \n\
+ The function should return the value to send to the X server\n\
+ \(typically a string).  A return value of nil\n\
+ means that the conversion could not be done.\n\
+ A return value which is the symbol `NULL'\n\
+ means that a side-effect was executed,\n\
+ and there is no meaningful selection value.");
+    Vselection_converter_alist = Qnil;
+ 
+    DEFVAR_LISP ("lost-selection-hooks", &Vlost_selection_hooks,
+    "A list of functions to be called when Emacs loses an selection.\n\
+ \(This happens when some other client makes its own selection\n\
+ or when a Lisp program explicitly clears the selection.)\n\
+ The functions are called with one argument, the selection type\n\
+ \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.)");
+    Vlost_selection_hooks = Qnil;
+ 
+    DEFVAR_LISP ("sent-selection-hooks", &Vsent_selection_hooks,
+    "A list of functions to be called when Emacs answers a selection request.\n\
+ The functions are called with four arguments:\n\
+   - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
+   - the selection-type which Emacs was asked to convert the\n\
+     selection into before sending (for example, `STRING' or `LENGTH');\n\
+   - a flag indicating success or failure for responding to the request.\n\
+ We might have failed (and declined the request) for any number of reasons,\n\
+ including being asked for a selection that we no longer own, or being asked\n\
+ to convert into a type that we don't know about or that is inappropriate.\n\
+ This hook doesn't let you change the behavior of Emacs's selection replies,\n\
+ it merely informs you that they have happened.");
+    Vsent_selection_hooks = Qnil;
+ 
+    DEFVAR_INT ("selection-timeout", &selection_timeout,
+    "Number of milliseconds to wait for a selection reply.\n\
+ If the selection owner doens't reply in this time, we give up.\n\
+ A value of 0 means wait as long as necessary.  This is initialized from the\n\
+ \"*selectionTimeout\" resource.");
+    selection_timeout = 0;
+ 
+    defsubr (&Sclose_current_connection);
+    defsubr (&Scolor_defined_p);
+    defsubr (&Scolor_values);
+    defsubr (&Screate_frame);
+    defsubr (&Sdisown_selection_internal);
+    defsubr (&Sdisplay_backing_store);
+    defsubr (&Sdisplay_color_cells);
+    defsubr (&Sdisplay_color_p);
+    defsubr (&Sdisplay_mm_height);
+    defsubr (&Sdisplay_mm_width);
+    defsubr (&Sdisplay_pixel_height);
+    defsubr (&Sdisplay_pixel_width);
+    defsubr (&Sdisplay_planes);
+    defsubr (&Sdisplay_save_under);
+    defsubr (&Sdisplay_screens);
+    defsubr (&Sdisplay_visual_class);
+    defsubr (&Sget_cut_buffer_internal);
+    defsubr (&Sset_resource);
+    defsubr (&Sget_resource);
+    defsubr (&Sget_selection_internal);
+    defsubr (&Shide_emacs);
+    defsubr (&Sinternal_next_face_id);
+    defsubr (&Slist_fonts);
+    defsubr (&Smake_face_internal);
+    defsubr (&Sopen_connection);
+    defsubr (&Sown_selection_internal);
+    defsubr (&Spopup_menu);
+    defsubr (&Spopup_dialog);
+    defsubr (&Srotate_cut_buffers_internal);
+    defsubr (&Sselection_exists_p);
+    defsubr (&Sselection_owner_p);
+    defsubr (&Sserver_max_request_size);
+    defsubr (&Sserver_vendor);
+    defsubr (&Sserver_version);
+    defsubr (&Sset_face_attribute_internal);
+    defsubr (&Sstore_cut_buffer_internal);
+    defsubr (&Ssynchronize);
+    defsubr (&Sfocus_frame);
+    defsubr (&Sunfocus_frame);
+ 
+    Qauto_raise = intern ("auto-raise");
+    staticpro (&Qauto_raise);
+    Qauto_lower = intern ("auto-lower");
+    staticpro (&Qauto_lower);
+    Qbackground_color = intern ("background-color");
+    staticpro (&Qbackground_color);
+    Qbar = intern ("bar");
+    staticpro (&Qbar);
+    Qborder_color = intern ("border-color");
+    staticpro (&Qborder_color);
+    Qborder_width = intern ("border-width");
+    staticpro (&Qborder_width);
+    Qbox = intern ("box");
+    staticpro (&Qbox);
+    Qcursor_color = intern ("cursor-color");
+    staticpro (&Qcursor_color);
+    Qcursor_type = intern ("cursor-type");
+    staticpro (&Qcursor_type);
+    Qfont = intern ("font");
+    staticpro (&Qfont);
+    Qfontsize = intern ("fontsize");
+    staticpro (&Qfontsize);
+    Qforeground_color = intern ("foreground-color");
+    staticpro (&Qforeground_color);
+    Qgeometry = intern ("geometry");
+    staticpro (&Qgeometry);
+    Qicon_left = intern ("icon-left");
+    staticpro (&Qicon_left);
+    Qicon_top = intern ("icon-top");
+    staticpro (&Qicon_top);
+    Qicon_type = intern ("icon-type");
+    staticpro (&Qicon_type);
+    Qicon_name = intern ("icon-name");
+    staticpro (&Qicon_name);
+    Qinternal_border_width = intern ("internal-border-width");
+    staticpro (&Qinternal_border_width);
+    Qleft = intern ("left");
+    staticpro (&Qleft);
+    Qmouse_color = intern ("mouse-color");
+    staticpro (&Qmouse_color);
+    Qname = intern ("name");
+    staticpro (&Qname);
+    Qnone = intern ("none");
+    staticpro (&Qnone);
+    Qparent_id = intern ("parent-id");
+    staticpro (&Qparent_id);
+    Qscroll_bar_width = intern ("scroll-bar-width");
+    staticpro (&Qscroll_bar_width);
+    Qsuppress_icon = intern ("suppress-icon");
+    staticpro (&Qsuppress_icon);
+    Qtop = intern ("top");
+    staticpro (&Qtop);
+    Qundefined_color = intern ("undefined-color");
+    staticpro (&Qundefined_color);
+    Qunderline = intern ("underline");
+    staticpro (&Qunderline);
+    Qvertical_scroll_bars = intern ("vertical-scroll-bars");
+    staticpro (&Qvertical_scroll_bars);
+    Qvisibility = intern ("visibility");
+    staticpro (&Qvisibility);
+    Qwindow_id = intern ("window-id");
+    staticpro (&Qwindow_id);
+    Qwindow = intern ("window");
+    staticpro (&Qwindow);
+    Qface = intern ("face");
+    staticpro (&Qface);
+    Qpriority = intern ("priority");
+    staticpro (&Qpriority);
+    Qbuffered = intern ("buffered");
+    staticpro (&Qbuffered);
+    Qleft = intern ("left");
+    staticpro (&Qleft);
+    Qright = intern ("right");
+    staticpro (&Qright);
+    Qresource_name = intern ("resource-name");
+    staticpro (&Qresource_name);
+    Quser_position = intern ("user-position");
+    staticpro (&Quser_position);
+    Quser_size = intern ("user-size");
+    staticpro (&Quser_size);
+    Qmouse_face = intern ("mouse-face");
+    staticpro (&Qmouse_face);
+    Qdisplay = intern ("display");
+    staticpro (&Qdisplay);
+ 
+    QPRIMARY     = intern ("PRIMARY");     staticpro (&QPRIMARY);
+    QSECONDARY   = intern ("SECONDARY");   staticpro (&QSECONDARY);
+    QSTRING      = intern ("STRING");      staticpro (&QSTRING);
+    QINTEGER     = intern ("INTEGER");     staticpro (&QINTEGER);
+    QCLIPBOARD   = intern ("CLIPBOARD");   staticpro (&QCLIPBOARD);
+    QTIMESTAMP   = intern ("TIMESTAMP");   staticpro (&QTIMESTAMP);
+    QTEXT        = intern ("TEXT");        staticpro (&QTEXT);
+    QFILE_NAME   = intern ("FILE_NAME");   staticpro (&QFILE_NAME);
+    QTIMESTAMP   = intern ("TIMESTAMP");   staticpro (&QTIMESTAMP);
+    QDELETE      = intern ("DELETE");      staticpro (&QDELETE);
+    QMULTIPLE    = intern ("MULTIPLE");    staticpro (&QMULTIPLE);
+    QINCR        = intern ("INCR");        staticpro (&QINCR);
+    QEMACS_TMP   = intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP);
+    QTARGETS     = intern ("TARGETS");     staticpro (&QTARGETS);
+    QATOM        = intern ("ATOM");        staticpro (&QATOM);
+    QATOM_PAIR   = intern ("ATOM_PAIR");   staticpro (&QATOM_PAIR);
+    QNULL        = intern ("NULL");        staticpro (&QNULL);
+    QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0);
+    QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1);
+    QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2);
+    QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3);
+    QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4);
+    QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5);
+    QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6);
+    QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7);
+    }
+ #endif
Index: emacs/src/multi-frame.h
diff -c /dev/null emacs/src/multi-frame.h:1.2
*** /dev/null	Fri Aug  2 21:06:57 1996
--- emacs/src/multi-frame.h	Wed Jul 31 01:38:10 1996
***************
*** 0 ****
--- 1,118 ----
+ /* Window definitions for GNU Emacs.
+    Copyright (C) 1985, 1986, 1993 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 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ extern Lisp_Object QATOM;
+ extern Lisp_Object QATOM_PAIR;
+ extern Lisp_Object QCLIPBOARD;
+ extern Lisp_Object QCUT_BUFFER0;
+ extern Lisp_Object QCUT_BUFFER1;
+ extern Lisp_Object QCUT_BUFFER2;
+ extern Lisp_Object QCUT_BUFFER3;
+ extern Lisp_Object QCUT_BUFFER4;
+ extern Lisp_Object QCUT_BUFFER5;
+ extern Lisp_Object QCUT_BUFFER6;
+ extern Lisp_Object QCUT_BUFFER7;
+ extern Lisp_Object QDELETE;
+ extern Lisp_Object QEMACS_TMP;
+ extern Lisp_Object QINCR;
+ extern Lisp_Object QINTEGER;
+ extern Lisp_Object QMULTIPLE;
+ extern Lisp_Object QNULL;
+ extern Lisp_Object QPRIMARY;
+ extern Lisp_Object QSECONDARY;
+ extern Lisp_Object QSTRING;
+ extern Lisp_Object QTARGETS;
+ extern Lisp_Object QTEXT;
+ extern Lisp_Object QTIMESTAMP;
+ extern Lisp_Object QFILE_NAME;
+ extern Lisp_Object Qauto_lower;
+ extern Lisp_Object Qauto_raise;
+ extern Lisp_Object Qbackground_color;
+ extern Lisp_Object Qbar;
+ extern Lisp_Object Qborder_color;
+ extern Lisp_Object Qborder_width;
+ extern Lisp_Object Qbox;
+ extern Lisp_Object Qbuffered;
+ extern Lisp_Object Qcursor_color;
+ extern Lisp_Object Qcursor_type;
+ extern Lisp_Object Qface;
+ extern Lisp_Object Qfont;
+ extern Lisp_Object Qfontsize;
+ extern Lisp_Object Qforeground_color;
+ extern Lisp_Object Qgeometry;
+ extern Lisp_Object Qheight;
+ extern Lisp_Object Qicon;
+ extern Lisp_Object Qicon_left;
+ extern Lisp_Object Qicon_top;
+ extern Lisp_Object Qicon_type;
+ extern Lisp_Object Qinternal_border_width;
+ extern Lisp_Object Qleft;
+ extern Lisp_Object Qleft;
+ extern Lisp_Object Qminibuffer;
+ extern Lisp_Object Qmouse_color;
+ extern Lisp_Object Qname;
+ extern Lisp_Object Qnone;
+ extern Lisp_Object Qonly;
+ extern Lisp_Object Qparent_id;
+ extern Lisp_Object Qpriority;
+ extern Lisp_Object Qretained;
+ extern Lisp_Object Qreverse_color;
+ extern Lisp_Object Qright;
+ extern Lisp_Object Qsuppress_icon;
+ extern Lisp_Object Qtop;
+ extern Lisp_Object Qundefined_color;
+ extern Lisp_Object Qunderline;
+ extern Lisp_Object Qunsplittable;
+ extern Lisp_Object Qvertical_scroll_bars;
+ extern Lisp_Object Qvisibility;
+ extern Lisp_Object Qwidth;
+ extern Lisp_Object Qwindow;
+ extern Lisp_Object Qwindow_id;
+ extern Lisp_Object Qresource_name;
+ extern Lisp_Object Quser_position;
+ extern Lisp_Object Quser_size;
+ extern Lisp_Object Qmouse_face;
+ 
+ extern Lisp_Object Qundefined;
+ extern Lisp_Object Qmenu_bar;
+ extern Lisp_Object Qmenu_enable;
+ 
+ extern Lisp_Object Vwindow_system_version;
+ extern Lisp_Object Vwindow_system_version;
+ extern Lisp_Object Vmenu_bar_final_items;
+ extern Lisp_Object Vmouse_depressed;
+ extern Lisp_Object Vlost_selection_hooks;
+ extern Lisp_Object Vsent_selection_hooks;
+ extern Lisp_Object Vselection_alist;
+ extern Lisp_Object Vselection_converter_alist;
+ 
+ extern int selection_timeout;
+ extern int region_face;
+ 
+ void clear_face_cache(/*void*/);
+ int compute_char_face(/* struct frame *f, struct window *w,int pos,
+                       int region_beg,int region_end,int *endptr */);
+ void destroy_window(/* struct frame *f */);
+ void explicitly_set_name(/*struct frame *f, Lisp_Object arg,
+                            Lisp_Object oldval*/);
+ void implicitly_set_name(/*struct frame *f, Lisp_Object arg,
+                            Lisp_Object oldval*/);
+ void focus_on_frame(/*struct frame *f*/);
+ void handle_selection_clear(/*struct input_event *event*/);
+ void handle_selection_request(/*struct input_event *event*/);
+ void iconify_frame(/*struct frame *f*/);
Index: emacs/src/nsfaces.m
diff -c /dev/null emacs/src/nsfaces.m:1.2
*** /dev/null	Fri Aug  2 21:07:00 1996
--- emacs/src/nsfaces.m	Wed Jul 31 01:38:12 1996
***************
*** 0 ****
--- 1,740 ----
+ /* "Face" primitives.
+    Copyright (C) 1993, 1994 Free Software Foundation.
+ 
+ This file is part of GNU Emacs.
+ 
+ GNU Emacs is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ /* This is derived from work by Lucid (some parts very loosely so).  */
+ 
+ #import <appkit/appkit.h>
+ 
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ 
+ #include "config.h"
+ #include "lisp.h"
+ 
+ #ifdef HAVE_NS
+ 
+ #include "nsterm.h"
+ #include "buffer.h"
+ #include "dispextern.h"
+ #include "frame.h"
+ #include "blockinput.h"
+ #include "window.h"
+ #include "multi-frame.h"
+ 
+ /* The number of face-id's in use (same for all frames).  */
+ int ns_next_face_id;
+ static NXColor default_color;
+ 
+ int ns_face_name_id_number ( /* FRAME_PTR, Lisp_Object name */ );
+ void ns_recompute_basic_faces ( /* FRAME_PTR f */ );
+ static int new_computed_face (struct frame *f, struct ns_face *new_face);
+ static void ensure_face_ready (struct frame *f, int fid);
+ static int face_eql(const struct ns_face *f1,const struct ns_face *f2);
+ 
+ int ns_load_font(struct ns_face *f)
+    {
+    double shrink;
+    float bbox1,bbox3,under;
+    id font,screenfont;
+    NXFontMetrics *m;
+ 
+    if (!NUMBERP(ns_shrink_space)) return 4;
+    shrink=XFLOATINT(ns_shrink_space);
+ 
+    if (f->name==0 || f->size==-1) return 1;
+    font=[Font newFont:f->name size:f->size];
+    if (font==nil) return 2;
+ 
+    if (screenfont=[font screenFont]) font=screenfont;
+ 
+    m=[font metrics];
+    if (!m->isFixedPitch) return 3;
+ 
+    f->font=font;
+    f->width=[font getWidthOf:"M"];
+ 
+    bbox1=m->fontBBox[1];
+    bbox3=m->fontBBox[3];
+    under=m->underlinePosition;
+    if (!m->isScreenFont)
+       {
+       bbox1=floor(f->size*bbox1);
+       bbox3=ceil (f->size*bbox3);
+       under=floor(f->size*under);
+       }
+    f->height=rint(shrink*bbox3) - bbox1;
+    f->descender=-bbox1;
+    f->underpos=under-bbox1;
+    f->underwidth=rint(m->underlineThickness);
+    return 0;
+    }
+ 
+ /* Clear out face_vector and start anew.
+    This should be done from time to time just to avoid
+    keeping too many graphics contexts in face_vector
+    that are no longer needed.  */
+ 
+ void ns_clear_face_vector (void)
+    {
+    /* Empty for NS */
+    return;
+    }
+ 
+ static int face_eql(const struct ns_face *f1,const struct ns_face *f2)
+    {
+    return(f1->size==f2->size &&
+           f1->underline==f2->underline &&
+           NXEqualColor(f1->foreground_color,f2->foreground_color) &&
+           NXEqualColor(f1->background_color,f2->background_color) &&
+           (f1->name==f2->name));
+    }
+ 
+ /* Managing parameter face arrays for frames. */
+ 
+ void ns_init_frame_faces (struct frame *f)
+    {
+    ensure_face_ready (f, 0);
+    ensure_face_ready (f, 1);
+ 
+    f->display.ns->n_computed_faces=0;
+    f->display.ns->computed_faces=0;
+ 
+    new_computed_face (f, f->display.ns->param_faces[0]);
+    new_computed_face (f, f->display.ns->param_faces[1]);
+    ns_recompute_basic_faces(f);
+ 
+       {
+       int i;
+       Lisp_Object tail, frame;
+ 
+       FOR_EACH_FRAME (tail, frame)
+          if (FRAME_NS_P (XFRAME (frame)) && XFRAME (frame) != f)
+             for (i=2; i< XFRAME(frame)->display.ns->n_param_faces; i++)
+                if (XFRAME(frame)->display.ns->param_faces[i])
+                   ensure_face_ready (f,i);
+       }
+    }
+ 
+ 
+ void ns_free_frame_faces (struct frame *f)
+    {
+    int i;
+ 
+    for(i=0; i< f->display.ns->n_param_faces; i++)
+       if (f->display.ns->param_faces[i])
+          xfree (f->display.ns->param_faces[i]);
+ 
+    for(i=0; i< f->display.ns->n_computed_faces; i++)
+       if (f->display.ns->computed_faces[i])
+          xfree (f->display.ns->computed_faces[i]);
+ 
+    xfree (f->display.ns->param_faces);
+    f->display.ns->param_faces =0;
+    f->display.ns->n_param_faces =0;
+ 
+    xfree (f->display.ns->computed_faces);
+    f->display.ns->computed_faces =0;
+    f->display.ns->n_computed_faces =0;
+    }
+ 
+ /* Interning faces in a frame's face array.  */
+ static int new_computed_face (struct frame *f, struct ns_face *new_face)
+    {
+    int i;
+ 
+    if (f->display.ns->n_computed_faces >= f->display.ns->size_computed_faces)
+       {
+       int new_size = f->display.ns->n_computed_faces + 32;
+ 
+       f->display.ns->computed_faces = (struct ns_face **)
+          xrealloc (f->display.ns->computed_faces,
+                    new_size * sizeof (struct ns_face *));
+       f->display.ns->size_computed_faces = new_size;
+       }
+ 
+    i = f->display.ns->n_computed_faces++;
+    f->display.ns->computed_faces[i] =
+       (struct ns_face *) xmalloc (sizeof(struct ns_face));
+ 
+    *(f->display.ns->computed_faces[i]) = *new_face;
+    return i;
+    }
+ 
+ 
+ /* Find a match for NEW_FACE in a FRAME's computed face array, and add
+    it if we don't find one.  */
+ static int intern_computed_face (struct frame *f, struct ns_face *new_face)
+    {
+    int i;
+ 
+    /* Search for a computed face already on F equivalent to FACE.  */
+    for (i = 0; i < f->display.ns->n_computed_faces; i++)
+       {
+       if (! f->display.ns->computed_faces[i])
+          abort ();
+       if (face_eql(new_face,f->display.ns->computed_faces[i]))
+          return i;
+       }
+ 
+    /* We didn't find one; add a new one.  */
+    return new_computed_face (f, new_face);
+    }
+ 
+ /* Make parameter face id ID valid on frame F.  */
+ static void ensure_face_ready (struct frame *f, int fid)
+    {
+    if (f->display.ns->n_param_faces <= fid)
+       {
+       int n = fid + 10;
+       f->display.ns->param_faces = (struct ns_face **)
+          xrealloc (f->display.ns->param_faces,sizeof (struct ns_face *) * n);
+       bzero (f->display.ns->param_faces + f->display.ns->n_param_faces,
+              (n - f->display.ns->n_param_faces) * sizeof (struct ns_face *));
+ 
+       f->display.ns->n_param_faces = n;
+       }
+ 
+    if (f->display.ns->param_faces [fid] == 0)
+       {
+       struct ns_face *nface=(struct ns_face *) xmalloc(sizeof (*nface));
+       nface->underline=-1;
+       nface->font=0;
+       nface->name=0;
+       nface->size=-1;
+       nface->foreground_color=default_color;
+       nface->background_color=default_color;
+       f->display.ns->param_faces [fid] = nface;
+       }
+    }
+ 
+ 
+ /* Return non-zero if FONT1 and FONT2 have the same width.
+    We do not check the height, because we can now deal with
+    different heights.
+    We assume that they're both character-cell fonts.  */
+ 
+ int ns_same_size_fonts (struct ns_face *font1, struct ns_face *font2)
+    {
+    return (font1->width == font2->width);
+    }
+ 
+ /* Update the line_height of frame F according to the biggest font in
+    any face.  Return nonzero if if line_height changes.  */
+ 
+ int ns_frame_update_line_height (struct frame *f)
+    {
+    int i,shift;
+    int biggest = (int)rint(f->display.ns->face->height);
+ 
+    for (i = 0; i < f->display.ns->n_computed_faces; i++)
+       if (f->display.ns->computed_faces[i]!=0)
+          {
+          if (f->display.ns->computed_faces[i]->font==0)
+             ns_load_font(f->display.ns->computed_faces[i]);
+          if ((f->display.ns->computed_faces[i]->height) > biggest)
+             biggest = (int)rint(f->display.ns->computed_faces[i]->height);
+          }
+ 
+    if (biggest == f->display.ns->line_height)
+       return 0;
+ 
+    f->display.ns->line_height = biggest;
+    return 1;
+    }
+ 
+ /* Modify face TO by copying from FROM all properties which have
+    nondefault settings.  */
+ 
+ static void merge_faces (struct ns_face *from, struct ns_face *to)
+    {
+    if (from->name && to->name!=from->name)
+       {
+       to->name=from->name;
+       to->font=0;
+       }
+    if (from->size!=-1 && to->size!=from->size)
+       {
+       to->size=from->size;
+       to->font=0;
+       }
+    if (from->underline != -1)
+       to->underline = from->underline;
+    if (!NXEqualColor(from->foreground_color,default_color))
+       to->foreground_color = from->foreground_color;
+    if (!NXEqualColor(from->background_color,default_color))
+       to->background_color = from->background_color;
+    }
+ 
+ /* Set up the basic set of facial parameters, based on the frame's
+    data; all faces are deltas applied to this.  */
+ 
+ static void compute_base_face (struct frame *f, struct ns_face *face)
+    {
+    *face = *f->display.ns->face;
+    }
+ 
+ /* Return the face ID to use to display a special glyph which selects
+    FACE_CODE as the face ID, assuming that ordinarily the face would
+    be CURRENT_FACE.  F is the frame.  */
+ 
+ int ns_compute_glyph_face (struct frame *f, int face_code, int current_face)
+    {
+    struct ns_face face;
+ 
+    face = *f->display.ns->param_faces[current_face];
+ 
+    if (face_code >= 0 && face_code < f->display.ns->n_param_faces
+        && f->display.ns->param_faces[face_code] != 0)
+       merge_faces (f->display.ns->param_faces[face_code], &face);
+ 
+    return intern_computed_face (f, &face);
+    }
+ 
+ /* Return the face ID to use to display a special glyph which selects
+    FACE_CODE as the face ID, assuming that ordinarily the face would
+    be CURRENT_FACE.  F is the frame.  */
+ 
+ int ns_compute_glyph_face_1 (struct frame *f, Lisp_Object face_name,
+                              int current_face)
+    {
+    struct ns_face face;
+    
+    face = *f->display.ns->param_faces[current_face];
+    
+    if (!NILP (face_name))
+       {
+       int face_code = ns_face_name_id_number (f, face_name);
+       
+       if (face_code >= 0 && face_code < f->display.ns->n_param_faces
+           && f->display.ns->param_faces[face_code] != 0)
+          merge_faces (f->display.ns->param_faces[face_code], &face);
+       }
+    
+    return intern_computed_face (f, &face);
+    }
+ 
+ /* Return the face ID associated with a buffer position POS.
+    Store into *ENDPTR the position at which a different face is needed.
+    This does not take account of glyphs that specify their own face codes.
+    F is the frame in use for display, and W is a window displaying
+    the current buffer.
+ 
+    REGION_BEG, REGION_END delimit the region, so it can be highlighted.
+ 
+    LIMIT is a position not to scan beyond.  That is to limit
+    the time this function can take.
+ 
+    If MOUSE is nonzero, use the character's mouse-face, not its face.  */
+ 
+ int ns_compute_char_face (struct frame *f, struct window *w, int pos,
+                           int region_beg, int region_end, int *endptr, int limit,
+                           int mouse)
+    {
+    struct ns_face face;
+    Lisp_Object prop, position;
+    int i, j, noverlays;
+    int facecode;
+    Lisp_Object *overlay_vec;
+    Lisp_Object frame;
+    int endpos;
+    Lisp_Object propname;
+ 
+    /* W must display the current buffer.  We could write this function
+       to use the frame and buffer of W, but right now it doesn't.  */
+    if (XBUFFER (w->buffer) != current_buffer)
+       abort ();
+ 
+    XSETFRAME (frame, f);
+ 
+    endpos = ZV;
+    if (pos < region_beg && region_beg < endpos)
+       endpos = region_beg;
+ 
+    XSETFASTINT (position, pos);
+ 
+    if (mouse)
+       propname = Qmouse_face;
+    else
+       propname = Qface;
+ 
+    prop = Fget_text_property (position, propname, w->buffer);
+       {
+       Lisp_Object limit1, end;
+ 
+       XSETFASTINT (limit1, (limit < endpos ? limit : endpos));
+     end = Fnext_single_property_change (position, propname, w->buffer, limit1);
+       if (INTEGERP (end))
+          endpos = XINT (end);
+       }
+ 
+       {
+       int next_overlay;
+       int len;
+ 
+       /* First try with room for 40 overlays.  */
+       len = 40;
+       overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
+ 
+       noverlays = overlays_at (pos, 0, &overlay_vec, &len,
+                                &next_overlay, (int *) 0);
+ 
+       /* If there are more than 40,
+          make enough space for all, and try again.  */
+       if (noverlays > len)
+          {
+          len = noverlays;
+          overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
+          noverlays = overlays_at (pos, 0, &overlay_vec, &len,
+                                   &next_overlay, (int *) 0);
+          }
+ 
+       if (next_overlay < endpos)
+          endpos = next_overlay;
+       }
+ 
+    *endptr = endpos;
+ 
+    /* Optimize the default case.  */
+    if (noverlays == 0 && NILP (prop)
+        && !(pos >= region_beg && pos < region_end))
+       return 0;
+ 
+    compute_base_face (f, &face);
+ 
+   if (CONSP (prop))
+     {
+       /* We have a list of faces, merge them in reverse order */
+       Lisp_Object length = Flength (prop);
+       int len = XINT (length);
+       Lisp_Object *faces;
+ 
+       /* Put them into an array */
+       faces = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
+       for (j = 0; j < len; j++)
+ 	{
+ 	  faces[j] = Fcar (prop);
+ 	  prop = Fcdr (prop);
+ 	}
+       /* So that we can merge them in the reverse order */
+       for (j = len - 1; j >= 0; j--)
+ 	{
+ 	  facecode = ns_face_name_id_number (f, faces[j]);
+ 	  if (facecode >= 0 && facecode < f->display.ns->n_param_faces
+ 	      && f->display.ns->param_faces [facecode] != 0)
+ 	    merge_faces (f->display.ns->param_faces [facecode], &face);
+ 	}
+     }
+   else if (!NILP (prop))
+       {
+       facecode = ns_face_name_id_number (f, prop);
+       if (facecode >= 0 && facecode < f->display.ns->n_param_faces
+ 	  && f->display.ns->param_faces [facecode] != 0)
+          merge_faces (f->display.ns->param_faces [facecode], &face);
+       }
+ 
+    noverlays = sort_overlays (overlay_vec, noverlays, w);
+ 
+    /* Now merge the overlay data in that order.  */
+    for (i = 0; i < noverlays; i++)
+       {
+       prop = Foverlay_get (overlay_vec[i], propname);
+       if (CONSP (prop))
+ 	{
+ 	  /* We have a list of faces, merge them in reverse order */
+ 	  Lisp_Object length = Flength (prop);
+ 	  int len = XINT (length);
+ 	  Lisp_Object *faces;
+ 	  int i;
+ 
+ 	  /* Put them into an array */
+ 	  faces = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
+ 	  for (j = 0; j < len; j++)
+ 	    {
+ 	      faces[j] = Fcar (prop);
+ 	      prop = Fcdr (prop);
+ 	    }
+ 	  /* So that we can merge them in the reverse order */
+ 	  for (j = len - 1; j >= 0; j--)
+ 	    {
+ 	      facecode = ns_face_name_id_number (f, faces[j]);
+ 	      if (facecode >= 0 && facecode < f->display.ns->n_param_faces
+ 		  && f->display.ns->param_faces [facecode] != 0)
+ 		merge_faces (f->display.ns->param_faces [facecode], &face);
+ 	    }
+           /* FIXME/cl maybe should calc endpos here as well !? */
+ 	}
+       else if (!NILP (prop))
+          {
+          Lisp_Object oend;
+          int oendpos;
+ 
+          facecode = ns_face_name_id_number (f, prop);
+          if (facecode >= 0 && facecode < f->display.ns->n_param_faces
+              && f->display.ns->param_faces[facecode] != 0)
+             merge_faces (f->display.ns->param_faces[facecode], &face);
+ 
+          oend = OVERLAY_END (overlay_vec[i]);
+          oendpos = OVERLAY_POSITION (oend);
+          if (oendpos < endpos)
+             endpos = oendpos;
+          }
+       }
+ 
+    if (pos >= region_beg && pos < region_end)
+       {
+       if (region_end < endpos)
+          endpos = region_end;
+       if (region_face >= 0 && region_face < ns_next_face_id)
+          merge_faces (f->display.ns->param_faces[region_face], &face);
+       }
+ 
+    *endptr = endpos;
+ 
+    return intern_computed_face (f, &face);
+    }
+ 
+ /* Recompute the GC's for the default and modeline faces.
+    We call this after changing frame parameters on which those GC's
+    depend.  */
+ 
+ void ns_recompute_basic_faces (struct frame *f)
+    {
+    /* If the frame's faces haven't been initialized yet, don't worry about
+       this stuff.  */
+    if (f->display.ns->n_param_faces < 2)
+       return;
+ 
+    compute_base_face (f, f->display.ns->computed_faces[0]);
+    compute_base_face (f, f->display.ns->computed_faces[1]);
+ 
+    merge_faces (f->display.ns->param_faces[0],
+                 f->display.ns->computed_faces[0]);
+    merge_faces (f->display.ns->param_faces[1],
+                 f->display.ns->computed_faces[1]);
+    }
+ 
+ DEFUN ("ns-make-face-internal", Fns_make_face_internal, Sns_make_face_internal, 1, 1, 0,
+   "Create face number FACE-ID on all frames.")
+   (face_id)
+      Lisp_Object face_id;
+    {
+    Lisp_Object rest;
+    int fid = XINT (face_id);
+ 
+    check_ns();
+    CHECK_NUMBER (face_id, 0);
+    if (fid < 0 || fid >= ns_next_face_id)
+       error ("Face id out of range");
+ 
+    for (rest = Vframe_list; CONSP (rest); rest = XCONS (rest)->cdr)
+       {
+       struct frame *f = XFRAME (XCONS (rest)->car);
+       if (FRAME_NS_P (f))
+          ensure_face_ready (f, fid);
+       }
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-set-face-attribute-internal", Fns_set_face_attribute_internal,
+        Sns_set_face_attribute_internal, 4, 4, 0, "")
+      (face_id, attr_name, attr_value, frame)
+      Lisp_Object face_id, attr_name, attr_value, frame;
+    {
+    struct ns_face *face;
+    struct frame *f;
+    int fid;
+    int garbaged=0;
+ 
+    check_ns();
+    CHECK_FRAME (frame, 0);
+    CHECK_NUMBER (face_id, 0);
+    CHECK_SYMBOL (attr_name, 0);
+ 
+    f = XFRAME (frame);
+    fid = XINT (face_id);
+    if (fid < 0 || fid >= ns_next_face_id)
+       error ("Face id out of range");
+ 
+    if (! FRAME_NS_P (f))
+       return;
+ 
+    ensure_face_ready (f, fid);
+    face = f->display.ns->param_faces[XINT (face_id)];
+ 
+    if (EQ (attr_name, Qfont))
+       {
+       if (NILP(attr_value))
+          {
+          face->name=0;
+          }
+       else
+          {
+          CHECK_STRING(attr_value,0);
+          face->name=NXUniqueString(XSTRING (attr_value)->data);
+          }
+       face->font=0;
+       if (ns_frame_update_line_height (f))
+          ns_set_window_size (f, 0, f->width, f->height);
+       garbaged=1;
+       }
+    else if (EQ (attr_name, Qfontsize))
+       {
+       if (NILP(attr_value))
+          face->size=-1;
+       else
+          {
+          CHECK_NUMBER_OR_FLOAT (attr_value, 0);
+          face->size=XFLOATINT(attr_value);
+          if (face->size<=0)
+             error("Facesize non-positive.");
+          }
+       face->font=0;
+       if (ns_frame_update_line_height (f))
+          ns_set_window_size (f, 0, f->width, f->height);
+       garbaged=1;
+       }
+    else if (EQ (attr_name, intern ("foreground")))
+       {
+       if (NILP(attr_value))
+          face->foreground_color=default_color;
+       else if (ns_lisp_to_color(attr_value,&face->foreground_color))
+          error("Unknown color.");
+       garbaged=1;
+       }
+    else if (EQ (attr_name, intern ("background")))
+       {
+       if (NILP(attr_value))
+          face->background_color=default_color;
+       else if (ns_lisp_to_color(attr_value,&face->background_color))
+          error("Unknown color.");
+       garbaged=1;
+       }
+    else if (EQ (attr_name, intern ("background-pixmap")))
+      {
+        // FIXME/cl
+      }
+    else if (EQ (attr_name, Qunderline))
+       {
+       if (NILP(attr_value))
+          face->underline=-1;
+       else if (EQ(attr_value,Qt))
+          face->underline=1;
+       else
+          face->underline=0;
+       garbaged=1;
+       }
+    else
+       error ("unknown face attribute");
+ 
+    if (fid == 0 || fid == 1)
+       ns_recompute_basic_faces (f);
+ 
+    if (garbaged)
+       SET_FRAME_GARBAGED (f);
+    
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-internal-next-face-id", Fns_internal_next_face_id,
+   Sns_internal_next_face_id, 0, 0, 0, "")
+   ()
+    {
+    check_ns();
+    return make_number (ns_next_face_id++);
+    }
+ 
+ DEFUN ("ns-convert-font-trait-internal",
+   Fns_convert_font_trait_internal, Sns_convert_font_trait_internal,
+   2, 2, 0, "")
+   (Lisp_Object name, Lisp_Object attribute)
+    {
+    id fm;
+    id font;
+    check_ns();
+    CHECK_STRING(name,0);
+    CHECK_SYMBOL(attribute,0);
+    fm=[FontManager new];
+    font=[Font newFont:XSTRING(name)->data size:10.0];
+    if (!fm || !font)
+       error ("Unknown font.");
+ 
+    if (EQ(attribute, intern ("italic")))
+       font=[fm convert:font toHaveTrait:NX_ITALIC];
+    else if (EQ(attribute, intern ("unitalic")))
+       font=[fm convert:font toNotHaveTrait:NX_ITALIC];
+    else if (EQ(attribute, intern ("bold")))
+       font=[fm convert:font toHaveTrait:NX_BOLD];
+    else if (EQ(attribute, intern ("unbold")))
+       font=[fm convert:font toNotHaveTrait:NX_BOLD];
+    else if (EQ(attribute, intern ("nonstandardcharset")))
+       font=[fm convert:font toHaveTrait:NX_NONSTANDARDCHARSET];
+    else if (EQ(attribute, intern ("unnonstandardcharset")))
+       font=[fm convert:font toNotHaveTrait:NX_NONSTANDARDCHARSET];
+    else if (EQ(attribute, intern ("narrow")))
+       font=[fm convert:font toHaveTrait:NX_NARROW];
+    else if (EQ(attribute, intern ("unnarrow")))
+       font=[fm convert:font toNotHaveTrait:NX_NARROW];
+    else if (EQ(attribute, intern ("expanded")))
+       font=[fm convert:font toHaveTrait:NX_EXPANDED];
+    else if (EQ(attribute, intern ("unexpanded")))
+       font=[fm convert:font toNotHaveTrait:NX_EXPANDED];
+    else if (EQ(attribute, intern ("condensed")))
+       font=[fm convert:font toHaveTrait:NX_CONDENSED];
+    else if (EQ(attribute, intern ("uncondensed")))
+       font=[fm convert:font toNotHaveTrait:NX_CONDENSED];
+    else if (EQ(attribute, intern ("smallcaps")))
+       font=[fm convert:font toHaveTrait:NX_SMALLCAPS];
+    else if (EQ(attribute, intern ("unsmallcaps")))
+       font=[fm convert:font toNotHaveTrait:NX_SMALLCAPS];
+    else if (EQ(attribute, intern ("poster")))
+       font=[fm convert:font toHaveTrait:NX_POSTER];
+    else if (EQ(attribute, intern ("unposter")))
+       font=[fm convert:font toNotHaveTrait:NX_POSTER];
+    else if (EQ(attribute, intern ("compressed")))
+       font=[fm convert:font toHaveTrait:NX_COMPRESSED];
+    else if (EQ(attribute, intern ("uncompressed")))
+       font=[fm convert:font toNotHaveTrait:NX_COMPRESSED];
+    return build_string([font name]);
+    }
+ 
+ int ns_face_name_id_number (struct frame *f, Lisp_Object name)
+    {
+    Lisp_Object tem;
+ 
+    tem= Fcdr (assq_no_quit (name, f->face_alist));
+    if (NILP (tem)) return 0;
+ 
+    CHECK_VECTOR (tem, 0);
+    tem = XVECTOR (tem)->contents[2];
+    CHECK_NUMBER (tem, 0);
+    return XINT (tem);
+    }
+ 
+ void syms_of_nsfaces ()
+    {
+    default_color=NX_COLORCLEAR;
+ 
+    defsubr (&Sns_make_face_internal);
+    defsubr (&Sns_set_face_attribute_internal);
+    defsubr (&Sns_internal_next_face_id);
+    defsubr (&Sns_convert_font_trait_internal);
+    }
+ 
+ #endif
+ 
Index: emacs/src/nsfns.m
diff -c /dev/null emacs/src/nsfns.m:1.3
*** /dev/null	Fri Aug  2 21:07:13 1996
--- emacs/src/nsfns.m	Thu Aug  1 02:50:09 1996
***************
*** 0 ****
--- 1,1860 ----
+ /* Functions for the NeXTstep window system.
+    Copyright (C) 1989, 1992, 1993, 1994 Free Software Foundation.
+ 
+ This file is part of GNU Emacs.
+ 
+ GNU Emacs is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ #import <appkit/appkit.h>
+ 
+ #include <signal.h>
+ #include "config.h"
+ #include "lisp.h"
+ #include "nsterm.h"
+ #include "frame.h"
+ #include "window.h"
+ #include "buffer.h"
+ #include "dispextern.h"
+ #include "keyboard.h"
+ #include "blockinput.h"
+ #include "multi-frame.h"
+ #include "regex.h"
+ #include "termhooks.h"
+ 
+ #ifdef HAVE_NS
+ 
+ /*
+  * 3.3 supports eight bit "pseudo-color" and is defined under the 3.3
+  * operating system as an enum with the value "514". This hack allows the
+  * code in nsfns.m to be compliant with 3.2 and 3.3 (3.2 doesn't define this
+  * value in the NXWindowDepth enumerated type), as well as letting Emacs
+  * versions compiled under 3.2 to work properly under 3.3. The only problem is
+  * systems that have built more modern versions of the compiler from the source
+  * (like me) that don't match up with the header files anymore. NeXT, of
+  * course, doesn't place any versioning information in their headers, so in
+  * this case, I don't know what the correct thing to do is. Maybe just
+  * outright define it.  - darcy
+  */
+ 
+ #if !defined(NX_CURRENT_COMPILER_RELEASE)||(NX_CURRENT_COMPILER_RELEASE < 330)
+ #define NX_EightBitRGBDepth 514
+ #endif
+ 
+ extern void ns_free_frame_menubar();
+ 
+ extern struct re_pattern_buffer *compile_pattern ();
+ 
+ Lisp_Object Qns_frame_parameter;
+ 
+ /* Alist of elements (REGEXP . IMAGE) for images of icons associated
+    to frames.*/
+ Lisp_Object Vns_icon_type_alist;
+ 
+ void check_ns (void)
+    {
+    if (ns_current_display == nil)
+       error ("NeXTstep is not in use or not initialized");
+    }
+ 
+ /* Nonzero if using NS for display.  */
+ int using_ns_p ()
+    {
+    return ns_current_display != nil;
+    }
+ 
+ static Lisp_Object ns_get_arg (Lisp_Object alist, Lisp_Object param,
+                                char *owner, char *name)
+    {
+    Lisp_Object tem;
+ 
+    tem = Fassq (param, alist);
+    if (!NILP(tem)) return Fcdr(tem);
+ 
+    tem = Fassq (param, Vdefault_frame_alist);
+    if (!NILP(tem)) return Fcdr(tem);
+ 
+    if (!name) return Qunbound;
+ 
+    tem = Fns_get_resource(owner ? build_string(owner) : Qnil, build_string (name));
+ 
+    if (NILP(tem)) return Qunbound;
+ 
+    if (XTYPE(tem)==Lisp_String)
+       {
+       if (!strcmp(XSTRING(tem)->data,"YES")||
+           !strcmp(XSTRING(tem)->data,"ON")||
+           !strcmp(XSTRING(tem)->data,"TRUE")) return Qt;
+       if (!strcmp(XSTRING(tem)->data,"NO")||
+           !strcmp(XSTRING(tem)->data,"OFF")||
+           !strcmp(XSTRING(tem)->data,"FALSE")) return Qnil;
+       }
+ 
+    return tem;
+    }
+ 
+ static Lisp_Object ns_default_parameter (struct frame *f, Lisp_Object alist,
+                                          Lisp_Object prop, Lisp_Object deflt,
+                                          char *owner, char *name)
+    {
+    Lisp_Object tem;
+ 
+    tem = ns_get_arg (alist, prop, owner, name);
+    if (EQ (tem, Qunbound)) tem=deflt;
+ 
+    ns_set_frame_parameters (f, Fcons (Fcons (prop, tem), Qnil));
+    return tem;
+    }
+ 
+ void ns_set_foreground_color (struct frame *f, Lisp_Object arg,
+                               Lisp_Object oldval)
+    {
+    if (ns_lisp_to_color(arg,&f->display.ns->face->foreground_color))
+       {
+       store_frame_param(f,Qforeground_color,oldval);
+       error("Unknown color");
+       }
+ 
+    if (f->display.ns->view != nil)
+       {
+       ns_recompute_basic_faces (f);
+       if (FRAME_VISIBLE_P (f))
+          redraw_frame (f);
+       }
+    }
+ 
+ void ns_set_background_color (struct frame *f, Lisp_Object arg,
+                               Lisp_Object oldval)
+    {
+    NXColor col;
+    id view=f->display.ns->view;
+ 
+    if (ns_lisp_to_color(arg,&col))
+       {
+       store_frame_param(f,Qbackground_color,oldval);
+       error("Unknown color");
+       }
+ 
+    f->display.ns->face->background_color=col;
+    if (view != nil)
+       {
+       [[view window] setBackgroundColor:col];
+       [[view window] setBackgroundGray:NXGrayComponent(col)];
+       ns_recompute_basic_faces (f);
+       if (FRAME_VISIBLE_P (f))
+          redraw_frame (f);
+       }
+    }
+ 
+ void ns_set_cursor_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    id view=f->display.ns->view;
+    if (ns_lisp_to_color(arg,&f->display.ns->desired_cursor_color))
+       {
+       store_frame_param(f,Qcursor_color,oldval);
+       error("Unknown color");
+       }
+ 
+    if (view != nil)
+       {
+       extern void ns_dumpcursor(struct frame *f,int nx,int ny);
+       ns_dumpcursor(f,f->cursor_x,f->cursor_y);
+       }
+    }
+ 
+ void ns_set_internal_border_width (struct frame *f, Lisp_Object arg,
+                                    Lisp_Object oldval)
+    {
+    if (XTYPE(arg)==Lisp_String)
+       {
+       arg=Fstring_to_number(arg);
+       store_frame_param(f,Qinternal_border_width,arg);
+       }
+ 
+    if (!NUMBERP(arg) || (XFLOATINT(arg)<0))
+       {
+       store_frame_param(f,Qinternal_border_width,oldval);
+       error("Internal border width out of range");
+       }
+ 
+    f->display.ns->internal_border_width=XFLOATINT(arg);
+    ns_set_window_size (f, 0, f->width, f->height);
+    }
+ 
+ void ns_set_visibility (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    Lisp_Object frame;
+    XSETFRAME (frame, f);
+ 
+    if (XTYPE(arg)==Lisp_String)
+       {
+       arg=intern(arg);
+       store_frame_param(f,Qvisibility,arg);
+       }
+ 
+    if (NILP (arg))
+       Fmake_frame_invisible (frame, Qt);
+    else if (EQ (arg, Qicon))
+       Ficonify_frame (frame);
+    else
+       Fmake_frame_visible (frame);
+    }
+ 
+ void ns_explicitly_set_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    id view=f->display.ns->view;
+    if (f->explicit_name && NILP (arg)) update_mode_lines =1;
+    f->explicit_name = !NILP(arg);
+ 
+    if (NILP (arg))
+       arg = build_string ([NXApp appName]);
+    else
+       CHECK_STRING (arg, 0);
+ 
+    if (! NILP (Fstring_equal (arg, f->name)))
+       return;
+ 
+    [[view window] setTitle:XSTRING (arg)->data];
+    f->name = arg;
+    }
+ 
+ void ns_implicitly_set_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    id view=f->display.ns->view;
+ 
+    if (f->explicit_name) return;
+ 
+    if (NILP (arg))
+       arg = build_string ([NXApp appName]);
+    else
+       CHECK_STRING (arg, 0);
+ 
+    if (! NILP (Fstring_equal (arg, f->name)))
+       return;
+ 
+    [[view window] setTitleAsFilename:XSTRING (arg)->data];
+    f->name = arg;
+    }
+ 
+ void ns_set_doc_edited (struct frame *f, Lisp_Object arg,
+                         Lisp_Object oldval)
+    {
+    id view=f->display.ns->view;
+    [[view window] setDocEdited:!NILP(arg)];
+    }
+ 
+ void ns_set_menu_bar_lines (struct frame *f, Lisp_Object arg,
+                             Lisp_Object oldval)
+    {
+    if (XTYPE(arg)==Lisp_String)
+       {
+       arg=Fstring_to_number(arg);
+       FRAME_MENU_BAR_LINES(f)=(int)rint(XFLOATINT(arg));
+       }
+ 
+    if (FRAME_MINIBUF_ONLY_P(f))
+       return;
+ 
+    if (NILP(arg) || (XTYPE(arg)==Lisp_Int && XINT(arg)==0))
+       {
+       if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
+          ns_free_frame_menubar (f);
+       FRAME_EXTERNAL_MENU_BAR (f) = 0;
+       }
+    else
+       {
+       FRAME_EXTERNAL_MENU_BAR (f) = 1;
+       }
+    }
+ 
+ void ns_set_icon_type (struct frame *f, Lisp_Object arg,
+                        Lisp_Object oldval)
+    {
+    id view=f->display.ns->view;
+    id image=nil;
+    unsigned char *name,*fname;
+    Lisp_Object chain, elt;
+    
+    if (XTYPE(arg) == Lisp_Symbol)
+       {
+       arg=build_string(XSYMBOL(arg)->name->data);
+       store_frame_param(f,Qicon_type,arg);
+       }
+ 
+    CHECK_STRING (arg,0);
+ 
+    for (chain = Vns_icon_type_alist;
+         (image==nil) && XTYPE (chain) == Lisp_Cons;
+         chain = XCONS (chain)->cdr)
+       if (XTYPE (elt=XCONS(chain)->car) == Lisp_Cons &&
+           XTYPE (XCONS(elt)->car) == Lisp_String &&
+           XTYPE (XCONS(elt)->cdr) == Lisp_String && 
+           fast_string_match (XCONS(elt)->car, arg) >= 0)
+          image=[NXImage findImageNamed:XSTRING(XCONS (elt)->cdr)->data];
+    
+    for(fname=XSTRING(arg)->data+XSTRING(arg)->size;
+        (fname>XSTRING(arg)->data)&&(*fname!='.');
+        fname--);
+ 
+    if ((image==nil) && *fname=='.')
+       {
+       fname++;
+       name=alloca(strlen(fname)+5);
+       strcpy(name,fname);
+       strcat(name,"file");
+       image=[NXImage findImageNamed:name];      
+       }
+    
+    if (image==nil) image=[NXImage findImageNamed:"text"];
+ 
+    f->display.ns->miniimage=image;
+    [[view window] setMiniwindowImage: image];
+    }
+ 
+ int ns_lisp_to_cursor_type (Lisp_Object arg)
+    {
+    char *str;
+    if (XTYPE(arg) == Lisp_String)
+       str=XSTRING(arg)->data;
+    else if (XTYPE(arg) == Lisp_Symbol)
+       str=XSYMBOL(arg)->name->data;
+    else return -1;
+    if (!strcmp(str,"bar"))    return bar;
+    if (!strcmp(str,"box"))    return filled_box;
+    if (!strcmp(str,"hollow")) return hollow_box;
+    if (!strcmp(str,"line"))   return line;
+    if (!strcmp(str,"no"))     return no_highlight;
+    return -1;
+    }
+ 
+ void ns_set_cursor_type (struct frame *f, Lisp_Object arg,
+                          Lisp_Object oldval)
+    {
+    int val;
+    id view=f->display.ns->view;
+ 
+    val=ns_lisp_to_cursor_type(arg);
+    if (val>=0)
+       {
+       f->display.ns->desired_cursor=val;
+       }
+    else
+       {
+       store_frame_param(f,Qcursor_type,oldval);
+       error ("the `cursor-type' frame parameter should be either `no', `bar', `box', `hollow' or `line'.");
+       }
+ 
+    update_mode_lines++;
+    }
+ 
+ void ns_set_autoraise (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    f->auto_raise = !NILP(arg);
+    }
+ 
+ void ns_set_autolower (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    f->auto_lower = !NILP(arg);
+    }
+ 
+ void ns_set_vertical_scroll_bars (struct frame *f, Lisp_Object arg,
+                                    Lisp_Object oldval)
+    {
+    FRAME_HAS_VERTICAL_SCROLL_BARS (f) = !NILP (arg);
+ 
+    /* We set this parameter before creating the window for the
+       frame, so we can get the geometry right from the start.
+       However, if the window hasn't been created yet, we shouldn't
+       call ns_set_window_size.  */
+    if (f->display.ns->view) ns_set_window_size (f, 0, f->width, f->height);
+    }
+ 
+ void ns_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    if (XTYPE(arg) == Lisp_Symbol)
+       {
+       arg=intern(arg);
+       store_frame_param (f, Qfont, arg);
+       }
+    else if (XTYPE(arg) != Lisp_String)
+       {
+       store_frame_param (f, Qfont, oldval);
+       error ("Font not a string or symbol.");
+       }
+ 
+    if (f->display.ns->view)
+       {
+       if (ns_new_font(f))
+          {
+          store_frame_param (f, Qfont, oldval);
+          error("Not an available fixed-width font.");
+          }
+       ns_recompute_basic_faces (f);
+       }
+    SET_FRAME_GARBAGED (f);
+    }
+ 
+ void ns_set_fontsize (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    if (XTYPE(arg)==Lisp_String)
+       {
+       arg=Fstring_to_number(arg);
+       store_frame_param (f, Qfontsize, arg);
+       }
+ 
+    if (!NUMBERP(arg) || (XFLOATINT(arg)<=0.0))
+       {
+       store_frame_param (f, Qfontsize, oldval);
+       error ("Fontsize not a positive number.");
+       }
+ 
+    if (f->display.ns->view)
+       {
+       if (ns_new_font(f))
+          {
+          store_frame_param (f, Qfontsize, oldval);
+          error("Not an available font size.");
+          }
+       ns_recompute_basic_faces (f);
+       }
+    SET_FRAME_GARBAGED (f);
+    }
+ 
+ void ns_set_underline (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+    {
+    if (f->display.ns->view)
+       {
+       if (ns_new_font(f))
+          {
+          store_frame_param (f, Qunderline, oldval);
+          error("Invalid underline.");
+          }
+       ns_recompute_basic_faces (f);
+       }
+    SET_FRAME_GARBAGED (f);
+    }
+ 
+ struct ns_frame_parm_table
+    {
+    char *name;
+    void (*setter)(struct frame *f, Lisp_Object arg, Lisp_Object oldval);
+    };
+ 
+ static struct ns_frame_parm_table ns_frame_parms[] =
+    {
+ //FIXME/cl
+   "foreground-color", ns_set_foreground_color,
+   "background-color", ns_set_background_color,
+ //   "mouse-color", x_set_mouse_color,
+   "cursor-color", ns_set_cursor_color,
+ //   "border-color", x_set_border_color,
+   "cursor-type", ns_set_cursor_type,
+   "icon-type", ns_set_icon_type,
+ //   "icon-name", x_set_icon_name,
+   "font", ns_set_font,
+   "fontsize", ns_set_fontsize,
+ //   "border-width", x_set_border_width,
+   "internal-border-width", ns_set_internal_border_width,
+   "name", ns_explicitly_set_name,
+   "auto-raise", ns_set_autoraise,
+   "auto-lower", ns_set_autolower,
+   "vertical-scroll-bars", ns_set_vertical_scroll_bars,
+   "visibility", ns_set_visibility,
+   "menu-bar-lines", ns_set_menu_bar_lines,
+ //   "scroll-bar-width", x_set_scroll_bar_width,
+ //   "unsplittable", x_set_unsplittable,
+   "doc-edited", ns_set_doc_edited,
+   "underline", ns_set_underline
+   };
+ 
+ void ns_set_frame_parameters (struct frame *f, Lisp_Object alist)
+    {
+    Lisp_Object tail;
+ 
+    /* If both of these parameters are present, it's more efficient to
+       set them both at once.  So we wait until we've looked at the
+       entire list before we set them.  */
+    Lisp_Object width, height;
+ 
+    /* Same here.  */
+    Lisp_Object left, top;
+ 
+    /* Record in these vectors all the parms specified.  */
+    Lisp_Object *parms;
+    Lisp_Object *values;
+    int i;
+ 
+    i = 0;
+    for (tail = alist; CONSP (tail); tail = Fcdr (tail))
+       i++;
+ 
+    parms  = (Lisp_Object *) alloca (i * sizeof (Lisp_Object));
+    values = (Lisp_Object *) alloca (i * sizeof (Lisp_Object));
+ 
+    /* Extract parm names and values into those vectors.  */
+ 
+    i = 0;
+    for (tail = alist; CONSP (tail); tail = Fcdr (tail))
+       {
+       Lisp_Object elt, prop, val;
+ 
+       elt = Fcar (tail);
+       parms[i] = Fcar (elt);
+       values[i] = Fcdr (elt);
+       i++;
+       }
+ 
+    width = height = top = left = Qunbound;
+ 
+    /* Now process them in reverse of specified order.  */
+    for (i--; i >= 0; i--)
+       {
+       Lisp_Object prop, val;
+ 
+       prop = parms[i];
+       val = values[i];
+ 
+       if (EQ (prop, Qwidth))
+          width = (XTYPE(val)==Lisp_String) ? Fstring_to_number(val) : val;
+       else if (EQ (prop, Qheight))
+          height = (XTYPE(val)==Lisp_String) ? Fstring_to_number(val) : val;
+       else if (EQ (prop, Qtop))
+          top = (XTYPE(val)==Lisp_String) ? Fstring_to_number(val) : val;
+       else if (EQ (prop, Qleft))
+          left = (XTYPE(val)==Lisp_String) ? Fstring_to_number(val) : val;
+       else
+          {
+          Lisp_Object param_index, old_value;
+ 
+          param_index = Fget (prop, Qns_frame_parameter);
+          old_value = get_frame_param (f, prop);
+ 
+          store_frame_param (f, prop, val);
+          if (XTYPE (param_index) == Lisp_Int
+              && XINT (param_index) >= 0
+              && (XINT (param_index)
+                  < sizeof (ns_frame_parms)/sizeof (ns_frame_parms[0])))
+ 	    (*ns_frame_parms[XINT (param_index)].setter)(f, val, old_value);
+          }
+       }
+ 
+    /* Don't die if just one of these was set.  */
+    if (EQ (left, Qunbound))
+       XSET (left, Lisp_Int, (int)f->display.ns->left);
+    if (EQ (top, Qunbound))
+       XSET (top, Lisp_Int, (int)f->display.ns->top);
+ 
+    /* Don't die if just one of these was set.  */
+    if (EQ (width, Qunbound))
+       XSET (width, Lisp_Int, FRAME_WIDTH (f));
+    if (EQ (height, Qunbound))
+       XSET (height, Lisp_Int, FRAME_HEIGHT (f));
+ 
+    /* Don't set these parameters these unless they've been explicitly
+       specified.  The window might be mapped or resized while we're in
+       this function, and we don't want to override that unless the lisp
+       code has asked for it.
+ 
+       Don't set these parameters unless they actually differ from the
+       window's current parameters; the window may not actually exist
+       yet.  */
+       {
+       Lisp_Object frame;
+ 
+       XSETFRAME (frame, f);
+ 
+       if ((NUMBERP (width) && XINT (width) != FRAME_WIDTH (f))
+           || (NUMBERP (height) && XINT (height) != FRAME_HEIGHT (f)))
+          Fset_frame_size (frame, width, height);
+       if ((NUMBERP (left) && XINT (left) != f->display.ns->left)
+           || (NUMBERP (top) && XINT (top) != f->display.ns->top))
+          Fset_frame_position (frame, left, top);
+       }
+    }
+ 
+ void ns_report_frame_params (struct frame *f, Lisp_Object *alistptr)
+    {
+    store_in_alist (alistptr, Qleft, make_number ((int) f->display.ns->left));
+    store_in_alist (alistptr, Qtop, make_number ((int) f->display.ns->top));
+    store_in_alist (alistptr, Qinternal_border_width,
+                    make_number ((int) f->display.ns->internal_border_width));
+    FRAME_SAMPLE_VISIBILITY (f);
+    store_in_alist (alistptr, Qvisibility,
+                    (FRAME_VISIBLE_P (f) ? Qt
+                     : FRAME_ICONIFIED_P (f) ? Qicon : Qnil));
+    store_in_alist (alistptr, Qmenu_bar_lines, FRAME_EXTERNAL_MENU_BAR(f));
+    }
+ 
+ DEFUN ("ns-popup-font-panel", Fns_popup_font_panel, Sns_popup_font_panel, 0,1,"",
+        "Pop up the font panel.")
+      (frame)
+      Lisp_Object frame;
+    {
+    id fm;
+    struct frame *f;
+ 
+    check_ns();
+    fm=[FontManager new];
+    if (NILP(frame))
+       f=selected_frame;
+    else
+       {
+       CHECK_FRAME(frame, 0);
+       f=XFRAME (frame);
+       }
+ 
+    if (f->display.ns->face->font==0)
+       ns_load_font(f->display.ns->face);
+    [fm setSelFont:f->display.ns->face->font isMultiple:NO];
+    [fm orderFrontFontPanel:NXApp];
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-popup-color-panel", Fns_popup_color_panel, Sns_popup_color_panel, 0,1,"",
+        "Pop up the color panel.")
+      (frame)
+      Lisp_Object frame;
+    {
+    struct frame *f;
+ 
+    check_ns();
+    if (NILP(frame))
+       f=selected_frame;
+    else
+       {
+       CHECK_FRAME(frame, 0);
+       f=XFRAME (frame);
+       }
+ 
+    [NXApp orderFrontColorPanel:NXApp];
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-read-file-name", Fns_read_file_name, Sns_read_file_name, 1, 5, 0,
+        "As read-file-name except that NS panels are used for querrying.")
+   (prompt, dir, defalt, mustmatch, initial)
+      Lisp_Object prompt, dir, defalt, mustmatch, initial;
+    {
+    int ret;
+    id panel;
+ 
+    check_ns();
+ 
+    CHECK_STRING(prompt, 0);
+ 
+    if (NILP(dir))
+       dir=current_buffer->directory;
+    else
+       CHECK_STRING(dir,0);
+ 
+    if (NILP(defalt))
+       defalt=current_buffer->filename;
+    else
+       CHECK_STRING(defalt,0);
+    
+    if (NILP(initial))
+       initial=build_string("");
+    else
+       CHECK_STRING(initial,0);
+ 
+    panel=[EmacsFilePanel new];
+    [panel setAllowCreate:NILP(mustmatch)];
+    [panel setAllowOld:YES];
+    [panel setAllowDir:YES];
+    [panel setTitle:XSTRING(prompt)->data];
+    [panel setRequiredFileType:""];
+    [panel setTreatsFilePackagesAsDirectories:YES];
+ 
+    ret=[panel runModalForDirectory:XSTRING(dir)->data file:XSTRING(initial)->data];
+    [[selected_frame->display.ns->view window] makeKeyWindow];
+    if (ret!=NX_OKTAG) Fsignal(Qquit,Qnil);
+    return build_string([panel filename]);
+    }
+ 
+ DEFUN ("ns-yes-or-no-p", Fns_yes_or_no_p, Sns_yes_or_no_p, 1, 1, 0,
+        "As yes-or-no-p except that NS panels are used for querrying.")
+    (prompt)
+    {
+    int ret;
+    CHECK_STRING(prompt, 0);
+    ret=NXRunAlertPanel([NXApp appName], XSTRING(prompt)->data,
+                        "Yes", "No", "Cancel");
+    [[selected_frame->display.ns->view window] makeKeyWindow];
+    if (ret==NX_ALERTDEFAULT)   return Qt;
+    if (ret==NX_ALERTALTERNATE) return Qnil;
+    if (ret==NX_ALERTOTHER)     Fsignal(Qquit,Qnil);
+    error ("NXRunAlertPanel returns invalid.");
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-get-resource", Fns_get_resource, Sns_get_resource, 2, 2, 0,
+   "Return the value of the property NAME of OWNER from the defaults database.\n\
+ If OWNER is nil, Emacs is assumed.")
+   (owner, name)
+    Lisp_Object owner, name;
+    {
+    const char *value;
+ 
+    check_ns();
+    if (NILP(owner))
+       owner= build_string([NXApp appName]);
+    CHECK_STRING(owner, 0);
+    CHECK_STRING(name, 0);
+ 
+    value=NXGetDefaultValue(XSTRING(owner)->data, XSTRING(name)->data);
+ 
+    if (value)
+       return build_string (value);
+    else
+       return Qnil;
+    }
+ 
+ 
+ DEFUN ("ns-set-resource", Fns_set_resource, Sns_set_resource, 3, 3, 0,
+   "Set property NAME of OWNER to VALUE, from the defaults database.\n\
+ If OWNER is nil, Emacs is assumed.\n\
+ If VALUE is nil, the default is removed.")
+   (owner, name, value)
+    Lisp_Object owner, name, value;
+    {
+    check_ns();
+    if (NILP(owner))
+       owner= build_string([NXApp appName]);
+    CHECK_STRING(owner, 0);
+    CHECK_STRING(name, 0);
+    if (NILP(value))
+       {
+       NXRemoveDefault(XSTRING(owner)->data, XSTRING(name)->data);
+       }
+    else
+       {
+       CHECK_STRING(value, 0);
+       NXWriteDefault(XSTRING(owner)->data, XSTRING(name)->data,
+                      XSTRING(value)->data);
+       }
+ 
+    return Qnil;
+    }
+ 
+ 
+ DEFUN ("ns-create-frame", Fns_create_frame, Sns_create_frame,
+        1, 1, 0,
+   "Make a new NS window, which is called a \"frame\" in Emacs terms.\n\
+ Return an Emacs frame object representing the X window.\n\
+ ALIST is an alist of frame parameters.\n\
+ If the parameters specify that the frame should not have a minibuffer,\n\
+ and do not specify a specific minibuffer window to use,\n\
+ then `default-minibuffer-frame' must be a frame whose minibuffer can\n\
+ be shared by the new frame.")
+   (parms)
+ Lisp_Object parms;
+    {
+    struct frame *f;
+    Lisp_Object frame, tem;
+    Lisp_Object name;
+    int minibuffer_only = 0;
+    long window_prompting = 0;
+    int width, height;
+    int count = specpdl_ptr - specpdl;
+ 
+    check_ns();
+ 
+    tem  = ns_get_arg(parms, Qminibuffer, 0, 0);
+    if (XTYPE(tem)==Lisp_String) tem=intern(tem);
+ 
+    if (EQ (tem,Qnone) || NILP(tem))
+       {
+       f= make_frame_without_minibuffer(Qnil, current_kboard, Qnil);
+       }
+    else if (EQ (tem, Qonly))
+       {
+       f= make_minibuffer_frame ();
+       minibuffer_only =1;
+       }
+    else if (WINDOWP (tem))
+       {
+       f= make_frame_without_minibuffer(Qnil, current_kboard, Qnil);
+       }
+    else
+       {
+       f= make_frame (1);
+       }
+ 
+    FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
+ 
+    name = ns_get_arg (parms, Qname, 0, 0);
+    if (EQ (name, Qunbound) || NILP (name) || (XTYPE (name) != Lisp_String))
+       {
+       f->name = build_string([NXApp appName]);
+       f->explicit_name=0;
+       }
+    else
+       {
+       f->name = name;
+       f->explicit_name=1;
+       /* use the frame's title when getting resources for this frame.  */
+       specbind (Qresource_name, name);
+       }
+ 
+    XSETFRAME (frame, f);
+    f->output_method = output_ns;
+    f->display.ns = (struct ns_display *) xmalloc (sizeof *(f->display.ns));
+    bzero (f->display.ns, sizeof (*(f->display.ns)));
+    f->display.ns->face = (struct ns_face *) xmalloc (sizeof *(f->display.ns->face));
+    bzero (f->display.ns->face, sizeof (*(f->display.ns->face)));
+ 
+    f->phys_cursor_x = -1;
+    f->phys_cursor_y = -1;
+ 
+    ns_default_parameter(f, parms, Qinternal_border_width, make_number(2),
+                         0, "InternalBorderWidth");
+    ns_default_parameter(f, parms, Qvertical_scroll_bars, Qt,
+                         0, "VerticalScrollBars");
+    ns_default_parameter(f, parms, Qauto_raise, Qnil,0, "AutoRaise");
+    ns_default_parameter(f, parms, Qauto_lower, Qnil,0, "AutoLower");
+    ns_default_parameter(f, parms, Qbuffered, Qt, 0, "Buffered");
+       {
+       id font=[Font userFixedPitchFontOfSize:-1.0 matrix:NX_FLIPPEDMATRIX];
+       ns_default_parameter(f, parms, Qforeground_color, build_string("Black"),
+                            0, "Foreground");
+       ns_default_parameter(f, parms, Qbackground_color, build_string("White"),
+                            0, "Background");
+       ns_default_parameter(f, parms, Qfont, build_string([font name]),
+                            0, "Font");
+       ns_default_parameter(f, parms, Qfontsize, make_number((int)[font pointSize]),
+                            0, "FontSize");
+       ns_default_parameter(f, parms, Qunderline, Qnil,
+                            0, "Underline");
+       ns_new_font(f);
+       }
+    ns_default_parameter(f, parms, Qheight, make_number(48), 0, "Height");
+    ns_default_parameter(f, parms, Qwidth, make_number(80), 0, "Width");
+    ns_default_parameter(f, parms, Qcursor_color, build_string("Highlight"),
+                         0, "CursorColor");
+    ns_default_parameter(f, parms, Qcursor_type, Qbox, 0, "CursorType");
+    ns_default_parameter(f, parms, Qtop, make_number(100), 0, "Top");
+    ns_default_parameter(f, parms, Qleft, make_number(100), 0, "Left");
+    ns_default_parameter(f, parms, Qmenu_bar_lines, make_number(1), 0, "Menus");
+ 
+    tem= ns_get_arg (parms, Qunsplittable, 0, 0);
+    f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !EQ (tem, Qnil));
+    ns_init_frame_faces(f);
+ 
+    [[EmacsView alloc] initFrameFromEmacs:f];
+ 
+    /* It is now ok to make the frame official
+       even if we get an error below.
+       And the frame needs to be on Vframe_list
+       or making it visible won't work.  */
+    Vframe_list = Fcons (frame, Vframe_list);
+ 
+    tem=ns_get_arg(parms, Qvisibility,0,0);
+    if (EQ (tem, Qunbound)) tem = Qt;
+    ns_set_visibility(f,tem,Qnil);
+ 
+    return unbind_to (count, frame);
+    }
+ 
+ Lisp_Object ns_get_focus_frame(void)
+    {
+    Lisp_Object nsfocus;
+ 
+    if (!ns_focus_frame)
+       return Qnil;
+ 
+    XSETFRAME (nsfocus, ns_focus_frame);
+    return nsfocus;
+    }
+ 
+ DEFUN ("ns-list-fonts", Fns_list_fonts, Sns_list_fonts, 1, 3, 0,
+   "Return a list of the names of available fonts matching PATTERN.\n\
+ If optional arguments FACE and FRAME are specified, return only fonts\n\
+ the same size as FACE on FRAME.\n\
+ \n\
+ PATTERN is a regular expression; FACE is a face name - a symbol.\n\
+ \n\
+ The return value is a list of strings, suitable as arguments to\n\
+ set-face-font.\n\
+ \n\
+ Fonts Emacs can't use (i.e. proportional fonts) may or may not be excluded\n\
+ even if they match PATTERN and FACE.")
+   (pattern, face, frame)
+     Lisp_Object pattern, face, frame;
+    {
+    int len;
+    Lisp_Object list,str,rpattern,args[3];
+    char **fonts,**ofonts;
+    id fm=[FontManager new];
+    struct re_pattern_buffer *bufp;
+ 
+    check_ns();
+    CHECK_STRING(pattern,0);
+ 
+    args[0]=build_string("^");
+    args[1]=pattern;
+    args[2]=build_string("$");
+    rpattern = Fconcat(3, args);
+    bufp = compile_pattern (rpattern, 0, 0, 0);
+ 
+    if (!NILP(face))  CHECK_SYMBOL(face,0);
+    if (!NILP(frame))
+       {
+       CHECK_FRAME(frame,0);
+       if (! FRAME_NS_P (XFRAME(frame)))
+          error ("non-NS frame used in `ns-list-fonts'");
+       }
+ 
+    for(ofonts=fonts=[fm availableFonts],list=Qnil;*fonts;fonts++)
+       {
+       /* XXX: Don't ignore frame/face */
+       len=strlen(*fonts);
+       if (re_search(bufp, *fonts, len, 0, len, 0)>=0)
+          list=Fcons(build_string (*fonts),list);
+       free(*fonts);
+       }
+ 
+    free(ofonts);
+    return list;
+    }
+ 
+ DEFUN ("ns-color-defined-p", Fns_color_defined_p, Sns_color_defined_p, 1, 1, 0,
+   "Return t if the current NS display supports the color named COLOR.")
+   (color)
+      Lisp_Object color;
+    {
+    NXColor col;
+    check_ns();
+    return ns_lisp_to_color(color, &col) ? Qnil : Qt;
+    }
+ 
+ DEFUN ("ns-color-values", Fns_color_values, Sns_color_values, 1, 1, 0,
+   "Return a description of the color named COLOR.\n\
+ The value is a list of integer RGBA values--(RED GREEN BLUE ALPHA).\n\
+ These values appear to range from 0 to 65280; white is (65280 65280 65280 0).")
+   (color)
+ Lisp_Object color;
+    {
+    NXColor col;
+    float red,green,blue,alpha;
+    Lisp_Object rgba[4];
+    
+    check_ns ();
+    CHECK_STRING (color, 0);
+    
+    if (ns_lisp_to_color(color, &col))
+       return Qnil;
+ 
+    NXConvertColorToRGBA(col,&red,&green,&blue,&alpha);
+    rgba[0] = make_number ((int) rint(red*65280));
+    rgba[1] = make_number ((int) rint(green*65280));
+    rgba[2] = make_number ((int) rint(blue*65280));
+    rgba[3] = make_number ((int) rint(alpha*65280));
+    return Flist (4, rgba);
+    }
+ 
+ static id ns_get_window(Lisp_Object frame)
+    {
+    id view=nil,window=nil;
+    const NXScreen *screen=0;
+    CHECK_FRAME(frame,0);
+    if (!FRAME_NS_P(XFRAME(frame)))
+       frame = wrong_type_argument (Qframep, frame);
+    view=XFRAME(frame)->display.ns->view;
+    if (view) window=[view window];
+    return window;
+    }
+ 
+ static const NXScreen *ns_get_screen(Lisp_Object frame)
+    {
+    id window=nil;
+    const NXScreen *screen=0;
+ 
+    if (FRAMEP(frame) && FRAME_NS_P(XFRAME(frame)))
+       window=ns_get_window(frame);
+    if (window!=nil) screen=[window screen];
+    if (!screen) screen=[NXApp mainScreen];
+    return screen;
+    }
+ 
+ DEFUN ("ns-display-color-p", Fns_display_color_p, Sns_display_color_p, 0, 0, 0,
+   "Return t if the main NS screen supports color.")
+   ()
+    {
+    check_ns();
+    switch (ns_get_screen(Qnil)->depth)
+       {
+     case NX_TwoBitGrayDepth:
+     case NX_EightBitGrayDepth:
+       return Qnil;
+     case NX_EightBitRGBDepth:
+     case NX_TwelveBitRGBDepth:
+     case NX_TwentyFourBitRGBDepth:
+       return Qt;
+     default:
+       error ("Screen has an unknown visual class");
+       }
+    }
+ 
+ DEFUN ("ns-display-pixel-width", Fns_display_pixel_width, Sns_display_pixel_width,
+   0, 1, 0,
+   "Returns the width in pixels of the display FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    return make_number ((int) ns_get_screen(frame)->screenBounds.size.width);
+    }
+ 
+ DEFUN ("ns-display-pixel-height", Fns_display_pixel_height,
+   Sns_display_pixel_height, 0, 1, 0,
+   "Returns the height in pixels of the display FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    return make_number ((int) ns_get_screen(frame)->screenBounds.size.height);
+    }
+ 
+ DEFUN ("ns-display-planes", Fns_display_planes, Sns_display_planes,
+   0, 1, 0,
+   "Returns the number of bitplanes of the display FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    return make_number (NXBPSFromDepth(ns_get_screen(frame)->depth));
+    }
+ 
+ DEFUN ("ns-display-color-cells", Fns_display_color_cells, Sns_display_color_cells,
+   0, 1, 0,
+   "Returns the number of color cells of the display FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    return make_number (1<<NXBPSFromDepth(ns_get_screen(frame)->depth));
+    }
+ 
+ DEFUN ("ns-server-max-request-size", Fns_server_max_request_size,
+        Sns_server_max_request_size,
+   0, 1, 0,
+   "This function is only present for completeness.  It does not return\n\
+ a usable result for NS windows.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    /* This function has no real equivalent under NeXTstep.  Return nil to
+       indicate this. */
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-server-vendor", Fns_server_vendor, Sns_server_vendor, 0, 1, 0,
+   "Returns the vendor ID string of the NS server FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    return build_string ("NeXT");
+    }
+ 
+ DEFUN ("ns-server-version", Fns_server_version, Sns_server_version, 0, 1, 0,
+   "Returns the release of NS on the current host.")
+   (frame)
+      Lisp_Object frame;
+    {
+    kernel_version_t string;
+    check_ns();
+    if (host_kernel_version(host_self(), string) == KERN_SUCCESS)
+       return build_string(string);
+    else
+       return Qnil;
+    }
+ 
+ DEFUN ("ns-display-screens", Fns_display_screens, Sns_display_screens, 0, 1, 0,
+   "Returns the number of screens on the NS server FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    const NXScreen *screen;
+    int num;
+ 
+    check_ns();
+    [NXApp getScreens:&screen count:&num];
+ 
+    return (screen!=0) ? make_number (num) : Qnil;
+    }
+ 
+ DEFUN ("ns-display-mm-height", Fns_display_mm_height, Sns_display_mm_height, 0, 1, 0,
+   "Returns the height in millimeters of the X screen FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    return make_number ((int) (ns_get_screen(frame)->screenBounds.size.height/(92.0/25.4)));
+    }
+ 
+ DEFUN ("ns-display-mm-width", Fns_display_mm_width, Sns_display_mm_width, 0, 1, 0,
+   "Returns the width in millimeters of the X screen FRAME is on.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    return make_number ((int) (ns_get_screen(frame)->screenBounds.size.width/(92.0/25.4)));
+    }
+ 
+ DEFUN ("ns-display-backing-store", Fns_display_backing_store,
+   Sns_display_backing_store, 0, 1, 0,
+   "Returns an indication of what type of backing store FRAME does.\n\
+ The value may be `buffered', `retained', or `non-retained'.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    switch ([ns_get_window(frame) backingType])
+       {
+     case NX_BUFFERED:
+       return intern ("buffered");
+ 
+     case NX_RETAINED:
+       return intern ("retained");
+ 
+     case NX_NONRETAINED:
+       return intern ("non-retained");
+ 
+     default:
+       error ("Strange value for backingType parameter of frame");
+       }
+    }
+ 
+ DEFUN ("ns-display-visual-class", Fns_display_visual_class,
+   Sns_display_visual_class, 0, 1, 0,
+   "Returns the visual class of the display `screen' is on.\n\
+ The value is one of the symbols `static-gray', `gray-scale',\n\
+ `static-color', `true-color', or `direct-color'.")
+ 	(frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    switch (ns_get_screen(frame)->depth)
+       {
+     case NX_TwoBitGrayDepth:
+       return (intern ("static-gray"));
+     case NX_EightBitGrayDepth:
+       return (intern ("gray-scale"));
+     case NX_EightBitRGBDepth:
+       return (intern ("pseudo-color"));
+     case NX_TwelveBitRGBDepth:
+       return (intern ("true-color"));
+     case NX_TwentyFourBitRGBDepth:
+       return (intern ("direct-color"));
+     default:
+       error ("Screen has an unknown visual class");
+       }
+    }
+ 
+ DEFUN ("ns-display-save-under", Fns_display_save_under,
+   Sns_display_save_under, 0, 1, 0,
+   "Returns t if FRAME supports the save-under feature.")
+   (frame)
+      Lisp_Object frame;
+    {
+    check_ns();
+    switch ([ns_get_window(frame) backingType])
+       {
+     case NX_BUFFERED:
+       return Qt;
+ 
+     case NX_RETAINED:
+     case NX_NONRETAINED:
+       return Qnil;
+ 
+     default:
+       error ("Strange value for backingType parameter of frame");
+       }
+    }
+ 
+ int ns_pixel_width (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    NXRect r;
+    [view getBounds:&r];
+    return r.size.width+2*f->display.ns->internal_border_width;
+    }
+ 
+ int ns_pixel_height (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    NXRect r;
+    [view getBounds:&r];
+    return r.size.height+2*f->display.ns->internal_border_width;
+    }
+ 
+ int ns_char_width (struct frame *f)
+    {
+    return f->display.ns->face->width;
+    }
+ 
+ int ns_char_height (struct frame *f)
+    {
+    return f->display.ns->line_height;
+    }
+ 
+ /* Offset in buffer of character under the pointer, or 0. */
+ /* XXX: update ns_mouse_buffer_offset (but then X doesn't either) */
+ int ns_mouse_buffer_offset;
+ 
+ DEFUN ("ns-open-connection", Fns_open_connection, Sns_open_connection,
+        1, 1, 0, "Open a connection to a NS server.\n\
+ DISPLAY is the name of the display to connect to.")
+   (display)
+ Lisp_Object display;
+    {
+    if (ns_current_display != nil)
+       {
+       error ("NS connection already initialized");
+       return Qnil;
+       }
+ 
+    nxatoms_of_nsselect();
+    ns_term_init(STRINGP(display) ? 0 : XSTRING (display)->data);
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-close-current-connection", Fns_close_current_connection,
+        Sns_close_current_connection,
+        0, 0, 0, "Close the connection to the current NS server.")
+   ()
+    {
+    check_ns();
+    DPSFlush();
+    [NXApp terminate:NXApp];
+    ns_current_display=nil;
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-synchronize", Fns_synchronize, Sns_synchronize,
+        1, 1, 0,
+ "If ON is non-nil, report NS errors as soon as the erring request is made.\n\
+ If ON is nil, allow buffering of requests.\n\
+ Turning on synchronization prohibits the NS routines from buffering\n\
+ requests and seriously degrades performance, but makes debugging much\n\
+ easier.")
+   (on)
+ Lisp_Object on;
+    {
+    check_ns();
+    DPSSynchronizeContext(DPSGetCurrentContext(), !EQ (on, Qnil));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-hide-emacs", Fns_hide_emacs, Sns_hide_emacs,
+        1, 1, 0, "If ON is non-nil, the entire emacs application is hidden.\n\
+ Otherwise if emacs is hidden, it is unhidden.\n\
+ If ON is equal to 'activate, emacs is unhidden and becomes the active application.")
+   (on)
+ Lisp_Object on;
+    {
+    check_ns();
+    if (EQ(on,intern("activate")))
+       {
+       [NXApp unhide:NXApp];
+       [NXApp activateSelf:YES];
+       }
+    else if (NILP(on))
+       [NXApp unhide:NXApp];
+    else
+       [NXApp hide:NXApp];
+    return Qnil;
+    }
+ 
+ 
+ static Lisp_Object interpret_command_keys(id menu,
+                                           Lisp_Object prefix,Lisp_Object old)
+    {
+    int i;
+    id matrix=[menu itemList],cell;
+    unsigned short key;
+ 
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       {
+       if ([cell hasSubmenu])
+          {
+          old=interpret_command_keys([cell target],
+                                     Fcons([cell value],prefix),old);
+          }
+       else if (key=[cell userKeyEquivalent])
+          {
+          if (!NILP(ns_iso_latin) && key<256)
+             key=ns2isomap[key];
+          old=Fcons(Fcons(make_number(key|super_modifier),
+                          Freverse(Fcons([cell value],prefix))),old);
+          }
+       }
+    return old;
+    }
+ 
+ DEFUN ("ns-list-command-keys", Fns_list_command_keys, Sns_list_command_keys,
+        0, 0, 0, "List NS command equivalents for menus.")
+    ()
+    {
+    Lisp_Object ret=Qnil;
+    check_ns();
+    ret=interpret_command_keys([NXApp mainMenu],Qnil,Qnil);
+    return ret;
+    }
+ 
+ static Lisp_Object interpret_services_menu(id menu,
+                                            Lisp_Object prefix,Lisp_Object old)
+    {
+    int i;
+    id matrix=[menu itemList],cell;
+    const char *name;
+    unsigned short key;
+    Lisp_Object res;
+ 
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       {
+       name=[cell title];
+       if (!name) continue;
+       if ([cell hasSubmenu])
+          {
+          old=interpret_services_menu([cell target],
+                                      Fcons(build_string(name),prefix),old);
+          [[cell target] free];
+          }
+       else
+          {
+          key=[cell keyEquivalent];
+          if (key)
+             {
+             if (!NILP(ns_iso_latin) && key<256)
+                key=ns2isomap[key];
+             res=make_number(key|super_modifier);
+             }
+          else
+             res=Qundefined;
+          old=Fcons(Fcons(res,Freverse(Fcons(build_string(name),prefix))),old);
+          }
+       }
+    return old;
+    }
+ 
+ DEFUN ("ns-list-services", Fns_list_services, Sns_list_services, 0, 0, 0,
+        "List NS services.\n\
+ WARNING:  This function crashes NS version older than NS 3.2.")
+    ()
+    {
+    Lisp_Object ret=Qnil;
+    check_ns();
+    [NXApp registerServicesMenuSendTypes:ns_send_types
+           andReturnTypes:ns_return_types];
+    [NXApp setServicesMenu:[[Menu alloc] init]];
+    [[NXApp servicesMenu] update];
+    ret=interpret_services_menu([NXApp servicesMenu],Qnil,ret);
+    [NXApp setServicesMenu:nil];
+    return ret;
+    }
+ 
+ 
+ DEFUN ("ns-perform-service", Fns_perform_service, Sns_perform_service,
+        2, 2, 0, "Perform NS SERVICE on SEND which is either a string or nil.\n\
+ Returns result of service as string or nil if no result.")
+   (service, send)
+ Lisp_Object service, send;
+    {
+    id pb;
+ 
+    check_ns();
+    pb=[Pasteboard newName:"EmacsServicesPboard"];
+ 
+    CHECK_STRING (service, 0);
+    ns_string_to_pasteboard(pb,send);
+ 
+    if (NXPerformService(XSTRING(service)->data, pb)==NO)
+       Fsignal (Qerror, Fcons (build_string ("service not available"), Qnil));
+ 
+    return ns_string_from_pasteboard(pb);
+    }
+ 
+ DEFUN ("ns-show-ps", Fns_show_ps, Sns_show_ps,
+        1, 1, 0, "Turn postscript logging on or off depending of the value of flag.")
+   (flag)
+ Lisp_Object flag;
+    {
+    check_ns();
+    DPSTraceContext(DPS_ALLCONTEXTS,!NILP(flag));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-show-events", Fns_show_events, Sns_show_events,
+        1, 1, 0, "Turn event logging on or off depending of the value of flag.")
+   (flag)
+ Lisp_Object flag;
+    {
+    check_ns();
+    DPSTraceEvents(DPS_ALLCONTEXTS,!NILP(flag));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-break", Fns_gdb_break, Sns_gdb_break, 2, 2,
+        "sBreak in: \nnBreak at: ",
+        "Tell gdb connected to emacs to do corresponding function.")
+   (file,line)
+ Lisp_Object file,line;
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+    CHECK_STRING(file,0);
+    CHECK_NUMBER(line,0);
+ NX_DURING
+    [ns_gdb_controller breakInFile:XSTRING(file)->data atLine:XINT(line)];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-until", Fns_gdb_until, Sns_gdb_until, 2, 2,
+        "sUntil in: \nnUntil at: ",
+        "Tell gdb connected to emacs to do corresponding function.")
+   (file,line)
+ Lisp_Object file,line;
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+    CHECK_STRING(file,0);
+    CHECK_NUMBER(line,0);
+ NX_DURING
+    [ns_gdb_controller untilInFile:XSTRING(file)->data atLine:XINT(line)];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-step", Fns_gdb_step, Sns_gdb_step, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller step];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-next", Fns_gdb_next, Sns_gdb_next, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller next];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-continue", Fns_gdb_continue, Sns_gdb_continue, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller continue];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-up", Fns_gdb_up, Sns_gdb_up, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller up];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-frame", Fns_gdb_frame, Sns_gdb_frame, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller frame];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-down", Fns_gdb_down, Sns_gdb_down, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller down];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-finish", Fns_gdb_finish, Sns_gdb_finish, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller finish];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-run", Fns_gdb_run, Sns_gdb_run, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller run];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-quit", Fns_gdb_quit, Sns_gdb_quit, 0, 0, "",
+        "Tell gdb connected to emacs to do corresponding function.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+ NX_DURING
+    [ns_gdb_controller quit];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-print", Fns_gdb_print, Sns_gdb_print, 1, 1,
+        "sValue of: ",
+        "Tell gdb connected to emacs to do corresponding function.")
+   (var)
+ Lisp_Object var;
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+    CHECK_STRING(var,0);
+ NX_DURING
+    [ns_gdb_controller printExpression:XSTRING(var)->data];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-print-indirect", Fns_gdb_print_indirect, Sns_gdb_print_indirect,
+        1, 1, "sValue pointed to by: ",
+        "Tell gdb connected to emacs to do corresponding function.")
+   (var)
+ Lisp_Object var;
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+    CHECK_STRING(var,0);
+ NX_DURING
+    [ns_gdb_controller printExpressionIndirect:XSTRING(var)->data];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-select-frame", Fns_gdb_select_frame, Sns_gdb_select_frame,
+        1, 1, "nFrame number: ",
+        "Tell gdb connected to emacs to do corresponding function.")
+   (frame)
+ Lisp_Object frame;
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+    if (STRINGP(ns_gdb_status) && !strcmp(XSTRING(ns_gdb_status)->data,"running"))
+       Fsignal (Qerror, Fcons (build_string ("debugger still running"), Qnil));
+    CHECK_NUMBER(frame,0);
+ NX_DURING
+    [ns_gdb_controller selectFrame:XINT(frame)];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-gdb-interrupt", Fns_gdb_interrupt, Sns_gdb_interrupt, 0, 0, "",
+        "Interrupt gdb connected to emacs.")
+   ()
+    {
+    check_ns();
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("no debugger connected"), Qnil));
+ NX_DURING
+    [ns_gdb_interrupt_controller interrupt];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    if (ns_gdb_controller==nil)
+       Fsignal (Qerror, Fcons (build_string ("debugger doesn't respond", Qnil)));
+    return Qnil;
+    }
+ 
+ /* Inaccessible functions from the GdbController protocol
+ -(int)getFramesUpTo:(int)maxFrames selectedFrame:(out int *)sel symbolsOnly:(BOOL)sOnly;
+ -(id <Frame>)frameAt:(int)frameIndex functionName:(out char **)pFunctionName from:(out unsigned int *)pFrom;
+ -(id <Frame>)frameAt:(int)frameIndex from:(out unsigned int *)pFrom;
+ -(id <Frame>)frameAt:(int)frameIndex;
+ -(char *)functionNameAt:(int)frameIndex;
+ -(char *)functionNameAt:(int)frameIndex hasSymbols:(int *)hasSymbols;
+ -(oneway void)errorOpeningFile:(char *)filename fromLine:(int)start to:(int)end;
+ -(oneway void)executeCommand:(char *)command;
+ -(oneway void)setClient:anObject;
+ -(oneway void)addSourceDirectory:(const char *)directory;
+ -(int)numBreakpoints;
+ -(id <Breakpoint>)breakpointAt:(int)index;
+ -(NXData *)completionsForPrefix:(const char *)prefix; */
+ 
+ void ns_sync(Lisp_Object frame)
+    {
+    /* XXX Not implemented XXX */
+    return;
+    }
+ 
+ syms_of_nsfns ()
+    {
+    int i;
+ 
+    ns_current_display=0;
+ 
+    Qns_frame_parameter = intern ("ns-frame-parameter");
+    staticpro (&Qns_frame_parameter);
+ 
+    for (i = 0; i< sizeof (ns_frame_parms)/ sizeof (ns_frame_parms[0]); i++)
+       Fput (intern (ns_frame_parms[i].name), Qns_frame_parameter,
+             make_number (i));
+ 
+    DEFVAR_INT ("ns-mouse-buffer-offset", &ns_mouse_buffer_offset,
+                "The buffer offset of the character under the pointer.");
+    ns_mouse_buffer_offset = 0;
+ 
+    DEFVAR_LISP ("ns-icon-type-alist", &Vns_icon_type_alist,
+ "Alist of elements (REGEXP . IMAGE) for images of icons associated to\n\
+ frames. If the title of a frame matches REGEXP, then IMAGE.tiff is\n\
+ selected as the image of the icon representing the frame when it's\n\
+ miniaturized.\n\
+ \n\
+ The images have to be installed in a folder called English.lproj in the\n\
+ Emacs.app folder. You have to restart Emacs after installing new icons.\n\
+ \n\
+ Example: Install an icon Gnus.tiff and execute the following code\n\
+ \n\
+   (setq ns-icon-type-alist\n\
+         (append ns-icon-type-alist\n\
+                 '((\"^\\\\*\\\\(Group\\\\*$\\\\|Summary \\\\|Article\\\\*$\\\\)\"\n\
+                    . \"Gnus\"))))\n\
+ \n\
+ When you miniaturize a Group, Summary or Article frame, Gnus.tiff will\n\
+ be used as the image of the icon representing the frame.");
+    Vns_icon_type_alist = Qnil;
+ 
+    defsubr (&Sns_read_file_name);
+    defsubr (&Sns_get_resource);
+    defsubr (&Sns_set_resource);
+    defsubr (&Sns_display_color_p);
+    defsubr (&Sns_list_fonts);
+    defsubr (&Sns_color_defined_p);
+    defsubr (&Sns_color_values);
+    defsubr (&Sns_server_max_request_size);
+    defsubr (&Sns_server_vendor);
+    defsubr (&Sns_server_version);
+    defsubr (&Sns_display_pixel_width);
+    defsubr (&Sns_display_pixel_height);
+    defsubr (&Sns_display_mm_width);
+    defsubr (&Sns_display_mm_height);
+    defsubr (&Sns_display_screens);
+    defsubr (&Sns_display_planes);
+    defsubr (&Sns_display_color_cells);
+    defsubr (&Sns_display_visual_class);
+    defsubr (&Sns_display_backing_store);
+    defsubr (&Sns_display_save_under);
+    defsubr (&Sns_create_frame);
+    defsubr (&Sns_open_connection);
+    defsubr (&Sns_close_current_connection);
+    defsubr (&Sns_synchronize);
+    defsubr (&Sns_hide_emacs);
+    defsubr (&Sns_list_command_keys);
+    defsubr (&Sns_list_services);
+    defsubr (&Sns_perform_service);
+    defsubr (&Sns_show_ps);
+    defsubr (&Sns_yes_or_no_p);
+    defsubr (&Sns_show_events);
+    defsubr (&Sns_popup_font_panel);
+    defsubr (&Sns_popup_color_panel);
+    defsubr (&Sns_gdb_break);
+    defsubr (&Sns_gdb_until);
+    defsubr (&Sns_gdb_step);
+    defsubr (&Sns_gdb_next);
+    defsubr (&Sns_gdb_continue);
+    defsubr (&Sns_gdb_up);
+    defsubr (&Sns_gdb_frame);
+    defsubr (&Sns_gdb_down);
+    defsubr (&Sns_gdb_finish);
+    defsubr (&Sns_gdb_run);
+    defsubr (&Sns_gdb_quit);
+    defsubr (&Sns_gdb_print);
+    defsubr (&Sns_gdb_print_indirect);
+    defsubr (&Sns_gdb_select_frame);
+    defsubr (&Sns_gdb_interrupt);
+    }
+ 
+ @implementation EmacsFilePanel
+ - (BOOL)_validateNames:(char *)name checkBrowser:(BOOL)check
+    {
+    Lisp_Object path;
+    char buf[MAXPATHLEN];
+ 
+    sprintf(buf, "%s/%s", directory, name);
+    path=build_string(buf);
+ 
+    if (NILP(Ffile_exists_p(path)))
+       {
+       if (!allowCreate) return NO;
+       }
+    else
+       {
+       if (!allowOld) return NO;
+       }
+ 
+    if (!allowDir && !NILP(Ffile_directory_p(path))) return NO;
+    filename = NXCopyStringBuffer(buf);
+    return YES;
+    }
+ 
+ - setAllowCreate:(BOOL)ifAllowCreate
+    {
+    allowCreate = ifAllowCreate;
+    return self;
+    }
+ 
+ - setAllowOld:(BOOL)ifAllowOld
+    {
+    allowOld = ifAllowOld;
+    return self;
+    }
+ 
+ - setAllowDir:(BOOL)ifAllowDir
+    {
+    allowDir = ifAllowDir;
+    return self;
+    }
+ @end
+ #endif
Index: emacs/src/nsmenu.m
diff -c /dev/null emacs/src/nsmenu.m:1.4
*** /dev/null	Fri Aug  2 21:07:35 1996
--- emacs/src/nsmenu.m	Fri Aug  2 04:02:32 1996
***************
*** 0 ****
--- 1,1282 ----
+ /* NeXTstep menu module
+    Copyright (C) 1986, 1988, 1993 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 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ #import <appkit/appkit.h>
+ 
+ #include <signal.h>
+ #include "config.h"
+ #include "lisp.h"
+ #include "frame.h"
+ #include "buffer.h"
+ #include "window.h"
+ #include "keyboard.h"
+ #include "commands.h"
+ #include "blockinput.h"
+ #include "nsterm.h"
+ #include "dispextern.h"
+ #include "termhooks.h"
+ #include "multi-frame.h"
+ 
+ #define MenuStagger 10.0
+ 
+ static id oldmenu=nil;
+ Lisp_Object ns_menu_path;
+ 
+ DEFUN ("ns-popup-menu",Fns_popup_menu, Sns_popup_menu, 1, 2, 0,
+   "Pop up a deck-of-cards menu and return user's selection.\n\
+ POSITION is a position specification.  This is either a mouse button event\n\
+ or a list ((XOFFSET YOFFSET) WINDOW)\n\
+ where XOFFSET and YOFFSET are positions in pixels from the top left\n\
+ corner of WINDOW's frame.  (WINDOW may be a frame object instead of a window.)\n\
+ This controls the position of the center of the first line\n\
+ in the first pane of the menu, not the top left of the menu as a whole.\n\
+ \n\
+ MENU is a specifier for a menu.  For the simplest case, MENU is a keymap.\n\
+ The menu items come from key bindings that have a menu string as well as\n\
+ a definition; actually, the \"definition\" in such a key binding looks like\n\
+ \(STRING . REAL-DEFINITION).  To give the menu a title, put a string into\n\
+ the keymap as a top-level element.\n\n\
+ You can also use a list of keymaps as MENU.\n\
+   Then each keymap makes a separate pane.\n\
+ When MENU is a keymap or a list of keymaps, the return value\n\
+ is a list of events.\n\n\
+ Alternatively, you can specify a menu of multiple panes\n\
+   with a list of the form (TITLE PANE1 PANE2...),\n\
+ where each pane is a list of form (TITLE ITEM1 ITEM2...).\n\
+ Each ITEM is normally a cons cell (STRING . VALUE);\n\
+ but a string can appear as an item--that makes a nonselectable line\n\
+ in the menu.\n\
+ With this form of menu, the return value is VALUE from the chosen item.")
+   (position, menu)
+      Lisp_Object position, menu;
+    {
+    id panel;
+    Lisp_Object window,x,y,tem;
+    struct frame *f;
+    NXPoint p;
+ 
+    if (NILP(position))
+       {
+       /* Don't create a menu.  Just precalculate the keyboard equivalents */
+       return Qnil;
+       }
+ 
+    if (CONSP(ns_menu_path))
+       {
+       Lisp_Object ret=XCONS(ns_menu_path)->car;
+       ns_menu_path=XCONS(ns_menu_path)->cdr;
+       return ret;
+       }
+ 
+    check_ns();
+ 
+    if (EQ (position, Qt))
+       {
+       /* Use the mouse's current position.  */
+       struct frame *new_f=0;
+ 
+       if (mouse_position_hook)
+          (*mouse_position_hook) (&new_f, 0, 0, 0, &x, &y, 0);
+       if (new_f != 0)
+          XSETFRAME (window, new_f);
+       else
+          {
+          window = selected_window;
+          x = make_number(0);
+          y = make_number(0);
+          }
+       }
+    else
+       {
+       CHECK_CONS (position,0);
+       tem = Fcar (position);
+       if (XTYPE (tem) == Lisp_Cons)
+          {
+          window = Fcar (Fcdr (position));
+          x = Fcar(tem);
+          y = Fcar(Fcdr (tem));
+          }
+       else
+          {
+          tem = Fcar (Fcdr (position));
+          window = Fcar (tem);
+          tem = Fcar (Fcdr (Fcdr (tem)));
+          x = Fcar (tem);
+          y = Fcdr (tem);
+          }
+       }
+ 
+    CHECK_NUMBER (x,0);
+    CHECK_NUMBER (y,0);
+ 
+    if (FRAMEP (window))
+       {
+       f = XFRAME (window);
+ 
+       p.x = 0;
+       p.y = 0;
+       }
+    else
+       {
+       CHECK_LIVE_WINDOW (window, 0);
+       f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
+ 
+       p.x = ((int)(f->display.ns->face->width) * XWINDOW (window)->left);
+       p.y = (f->display.ns->line_height * XWINDOW (window)->top);
+       }
+ 
+    p.x+=XINT(x); p.y+=XINT(y);
+    [f->display.ns->view convertPoint:&p toView:nil];
+    [[f->display.ns->view window] convertBaseToScreen:&p];
+    panel=[[EmacsMenuPanel alloc] initFromMenu:menu];
+ 
+    tem=[panel runMenuAt:p.x:p.y];
+    [panel close];
+    [[selected_frame->display.ns->view window] makeKeyWindow];
+    return tem;
+    }
+ 
+ DEFUN ("ns-popup-dialog", Fns_popup_dialog, Sns_popup_dialog, 2, 2, 0,
+   "Pop up a dialog box and return user's selection.\n\
+ POSITION specifies which frame to use.\n\
+ This is normally a mouse button event or a window or frame.\n\
+ If POSITION is t, it means to use the frame the mouse is on.\n\
+ The dialog box appears in the middle of the specified frame.\n\
+ \n\
+ CONTENTS specifies the alternatives to display in the dialog box.\n\
+ It is a list of the form (TITLE ITEM1 ITEM2...).\n\
+ Each ITEM is a cons cell (STRING . VALUE).\n\
+ The return value is VALUE from the chosen item.\n\n\
+ An ITEM may also be just a string--that makes a nonselectable item.\n\
+ An ITEM may also be nil--that means to put all preceding items\n\
+ on the left of the dialog box and all following items on the right.\n\
+ \(By default, approximately half appear on each side.)")
+   (position, contents)
+      Lisp_Object position, contents;
+    {
+    id dialog;
+    Lisp_Object window,tem;
+    struct frame *f;
+    NXPoint p;
+ 
+    check_ns();
+    if (EQ (position, Qt))
+       {
+       window = selected_window;
+       }
+    else if (CONSP (position))
+       {
+       Lisp_Object tem;
+       tem = Fcar (position);
+       if (XTYPE (tem) == Lisp_Cons)
+          window = Fcar (Fcdr (position));
+       else
+          {
+          tem = Fcar (Fcdr (position));  /* EVENT_START (position) */
+          window = Fcar (tem);	     /* POSN_WINDOW (tem) */
+          }
+       }
+    else if (FRAMEP (position))
+       {
+       window = position;
+       }
+    else
+       {
+       CHECK_LIVE_WINDOW (position,0);
+       window = position;
+       }
+ 
+    if (FRAMEP (window))
+       f = XFRAME (window);
+    else
+       {
+       CHECK_LIVE_WINDOW (window, 0);
+       f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
+       }
+    p.x = (int)f->display.ns->left +
+          ((int)(f->display.ns->face->width) * f->width)/2;
+    p.y = (int)f->display.ns->top +
+          (f->display.ns->line_height * f->height)/2;
+    dialog=[[EmacsDialogPanel alloc] initFromContents:contents];
+ 
+    tem=[dialog runDialogAt:p.x:p.y];
+    [dialog close];
+    [[selected_frame->display.ns->view window] makeKeyWindow];
+    return tem;
+    }
+ 
+ void ns_free_frame_menubar (struct frame *f)
+    {
+    id menu=[NXApp mainMenu];
+ 
+    if (oldmenu==nil)
+       oldmenu=[[EmacsMenu alloc] initTitle:"Garbage"];
+ 
+    [menu mark];
+    [menu freeMarked];
+    }
+ 
+ void ns_set_frame_menubar (struct frame *f, int first_time)
+    {
+    int i,len;
+    Lisp_Object items,tail,key,string;
+    id menu=[NXApp mainMenu];
+ 
+    if (first_time)
+       {
+       menu=nil;
+       if (oldmenu!=nil) [oldmenu free];
+       oldmenu=nil;
+       }
+    
+    if (f!=selected_frame)
+       return;
+    
+    if (menu==nil)
+       {
+       menu=[[EmacsMenu alloc] initTitle:[NXApp appName]];
+       [NXApp setMainMenu:menu];
+       }
+ 
+    if (NILP (items=FRAME_MENU_BAR_ITEMS (f)))
+       items = FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
+ 
+    if (oldmenu==nil)
+       oldmenu=[[EmacsMenu alloc] initTitle:"Garbage"];
+ 
+    [menu mark];
+ 
+    for(i=0;i<XVECTOR(items)->size;i+=3)
+       {
+       key=XVECTOR(items)->contents[i];
+       string=XVECTOR(items)->contents[i+1];
+       for(tail=XVECTOR(items)->contents[i+2];CONSP(tail);tail=XCONS(tail)->cdr)
+          [menu adjustKey:key binding:XCONS(tail)->car string:string];
+       }
+ 
+    [menu freeMarked];
+    }
+ 
+ DEFUN ("ns-reset-menu",Fns_reset_menu, Sns_reset_menu, 0, 0, 0,
+   "Cause the NS menu to be re-calculated.")
+    ()
+    {
+    ns_set_frame_menubar(selected_frame,1);
+    return Qnil;
+    }
+ 
+ Lisp_Object ns_map_event_to_object (struct input_event *event, struct frame *f)
+    {
+    if (CONSP(ns_menu_path))
+       {
+       Lisp_Object ret=XCONS(ns_menu_path)->car;
+       ns_menu_path=XCONS(ns_menu_path)->cdr;
+       return ret;
+       }
+    return Qnil;
+    }
+ 
+ syms_of_nsmenu ()
+    {
+    ns_menu_path=Qnil;
+    staticpro(&ns_menu_path);
+    defsubr (&Sns_popup_menu);
+    defsubr (&Sns_popup_dialog);
+    defsubr (&Sns_reset_menu);
+    }
+ 
+ @implementation EmacsMenuCell
+ - initTextCell:(const char *)aString
+    {
+    [super initTextCell:aString];
+    value=Qnil;
+    staticpro(&value);
+    supercell=nil;
+    return self;
+    }
+ 
+ - free
+    {
+    if ([self hasSubmenu])
+       {
+       [[self target] close];
+       [[self target] free];
+       }
+    staticunpro(&value);
+    return [super free];
+    }
+ 
+ - (Lisp_Object) value
+    {
+    return value;
+    }
+ 
+ - setValue:(Lisp_Object)nvalue
+    {
+    value=nvalue;
+    return self;
+    }
+ 
+ - supercell
+    {
+    return supercell;
+    }
+ 
+ - setSupercell:(id) nsupercell
+    {
+    supercell=nsupercell;
+    return self;
+    }
+ @end
+ 
+ @implementation EmacsMenu
+ - initTitle:(const char *)aTitle
+    {
+    id oldproto;
+    [super initTitle:aTitle];
+    minmarked=0;
+    wasVisible=NO;
+    if ((oldproto=[matrix setPrototype:nil])!=nil)
+       [oldproto free];
+    [matrix setCellClass:[EmacsMenuCell class]];
+    [matrix setAutodisplay:NO];
+    return self;
+    }
+ 
+ - (BOOL)isAutodisplay
+    {
+    return NO;
+    }
+ 
+ - (BOOL)commandKey:(NXEvent *)theEvent
+    {
+    if (selected_frame && selected_frame->display.ns->view)
+       return [selected_frame->display.ns->view keyDown:theEvent]!=nil;
+    return NO;
+    }
+ 
+ - addItem:(Lisp_Object)val string:(Lisp_Object)aString bind:(Lisp_Object)bind
+    {
+    unsigned int key=0;
+    id cell;
+ 
+    if (!NILP(bind))
+       {
+       Lisp_Object tail,vec;
+       for(tail=Fwhere_is_internal(bind,Qnil,Qnil,Qt);
+           XTYPE(tail)==Lisp_Cons;tail=XCONS(tail)->cdr)
+          {
+          vec=XCONS(tail)->car;
+          if (!VECTORP(vec) ||
+              XVECTOR(vec)->size!=1 ||
+              XTYPE(XVECTOR(vec)->contents[0])!=Lisp_Int)
+             continue;
+          key=XFASTINT(XVECTOR(vec)->contents[0]);
+          if ((key&(alt_modifier|hyper_modifier|super_modifier))==super_modifier)
+             {
+             key=NILP(ns_iso_latin) ? (key&0xff) : iso2nsmap[key&0xff];
+             break;
+             }
+          else
+             {
+             key=0;
+             }
+          }
+       }
+ 
+    cell=[[EmacsMenuCell alloc] initTextCell:XSTRING(aString)->data];
+    [cell setAction:@selector(menuDown:)];
+    [cell setKeyEquivalent:key];
+    [cell setSupercell:supercell];
+    [cell setValue:val];
+    [self addCell:cell];
+    return cell;
+    }
+ 
+ - supercell
+    {
+    return supercell;
+    }
+ 
+ - setSupercell:(id) nsupercell
+    {
+    supercell=nsupercell;
+    return self;
+    }
+ 
+ - mark
+    {
+    int i;
+    id cell;
+ 
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       if ([cell hasSubmenu]) [[cell target] mark];
+    minmarked=0;
+    return self;
+    }
+ 
+ - freeMarked
+    {
+    int i;
+    id cell;
+ 
+    while ((cell=[matrix cellAt:minmarked:0])!=nil)
+       {
+       if ([cell hasSubmenu]) [[cell target] swapout];
+       [self transferCell:minmarked to:oldmenu];
+       }
+ 
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       if ([cell hasSubmenu]) [[cell target] freeMarked];
+ 
+    if ([matrix needsDisplay])
+       {
+       [self sizeToFit];
+       [matrix displayIfNeeded];
+       [matrix setNeedsDisplay:NO];
+       }
+ 
+    return self;
+    }
+ 
+ - findCell:(Lisp_Object)value
+    {
+    int i;
+    id cell;
+ 
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       if ([cell value]==value) return cell;
+ 
+    return nil;
+    }
+ 
+ - (int)findCellNumber:(Lisp_Object)value
+    {
+    int i;
+    id cell;
+ 
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       if ([cell value]==value) return i;
+ 
+    return -1;
+    }
+ 
+ - transferCell:(int)row to:newmenu
+    {
+    id cell=[matrix cellAt:row:0];
+    if (cell!=nil)
+       {
+       [self removeCell:cell];
+       [newmenu addCell:cell];
+       }
+    return cell;
+    }
+ 
+ - addCell:cell
+    {
+    [matrix insertRowAt:minmarked];
+    [[matrix putCell:cell at:minmarked:0] free];
+    [matrix setNeedsDisplay:YES];
+    }
+ 
+ - removeCell:cell
+    {
+    int i;
+    id ncell;
+ 
+    for (i=0;(ncell=[matrix cellAt:i:0])!=nil;i++)
+       if (cell==ncell) break;
+    if (ncell==nil) return nil;
+ 
+    [matrix removeRowAt:i andFree:NO];
+    if (i<minmarked) minmarked--;
+    [matrix setNeedsDisplay:YES];
+    }
+ 
+ - adjustMap:(Lisp_Object)keymap;
+    {
+    Lisp_Object item;
+ 
+    for (keymap=XCONS(keymap)->cdr;
+         XTYPE (keymap) == Lisp_Cons;
+         keymap = XCONS (keymap)->cdr)
+       {
+       item = XCONS (keymap)->car;
+       if (XTYPE(item) == Lisp_Cons)
+          [self adjustKey:XCONS(item)->car binding: XCONS(item)->cdr];
+       else if (VECTORP(item))
+          {
+          int len = XVECTOR (item)->size,c;
+          for (c=0; c<len; c++)
+             [self adjustKey:c binding:XVECTOR(item)->contents[c]];
+          }
+       }
+    return self;
+    }
+ 
+ - adjustKey:(Lisp_Object)key binding:(Lisp_Object)bind
+    {
+    if (XTYPE(bind) == Lisp_Cons)
+       [self adjustKey:key binding:XCONS(bind)->cdr string:XCONS(bind)->car];
+    else if (EQ (bind, Qundefined))
+       [self removeCell:[self findCell:key]];
+    return self;
+    }
+ 
+ - adjustKey:(Lisp_Object)key binding:(Lisp_Object)bind string:(Lisp_Object)string
+    {
+    int i;
+    id cell=nil;
+ 
+    if (XTYPE(string)!=Lisp_String)
+       return nil;
+    
+    if (((cell=[matrix cellAt:minmarked:0])!=nil) && ([cell value]==key))
+       {
+       }
+    else if ((i=[self findCellNumber:key])>=0)
+       {
+       cell=[self transferCell:i to:self];
+       }
+    else if ((i=[oldmenu findCellNumber:key])>=0)
+       {
+       cell=[oldmenu transferCell:i to:self];
+       if ([cell hasSubmenu]) [[cell target] swapin];
+       }
+    else if (XTYPE(bind)==Lisp_Cons && XCONS(bind)->car==Qkeymap)
+       {
+       cell=[self addItem:key string:string bind:Qnil];
+       }
+    else
+       {
+       cell=[self addItem:key string:string bind:bind];
+       }
+ 
+    if (XTYPE(bind)==Lisp_Cons && XCONS(bind)->car==Qkeymap)
+       {
+       id nmenu;
+       
+       if (![cell hasSubmenu])
+          {
+          nmenu=[[EmacsMenu alloc] initTitle:XSTRING(string)->data];
+          [self setSubmenu:nmenu forItem:cell];
+          [nmenu setSupercell:cell];         
+          [matrix setNeedsDisplay:YES];
+          }
+       else
+          {
+          nmenu=[cell target];
+          }
+       
+       [nmenu adjustMap:bind];
+       }
+    else
+       {
+       if ([cell hasSubmenu])
+          {
+          [self removeCell:cell];
+          cell=[self addItem:key string:string bind:bind];
+          }
+       }
+    
+    if (strcmp([cell title],XSTRING(string)->data))
+       {
+       [cell setTitle:XSTRING(string)->data];
+       [matrix setNeedsDisplay:YES];
+       }
+    
+ #if 0
+       {
+       BOOL oenable=[cell isEnabled],nenable=YES;
+       if (XTYPE(bind)==Lisp_Symbol)
+          {
+          Lisp_Object tem = Fget (bind, Qmenu_enable);
+          if (!NILP (tem) && NILP(Feval(tem)))
+             nenable=NO;
+          }
+ 
+       if (oenable!=nenable)
+          {
+          [matrix setNeedsDisplay:YES];
+          [cell setEnabled:nenable];
+          }
+       }
+ #endif
+    
+    minmarked++;
+    }
+ 
+ - swapout
+    {
+    int i;
+    id cell;
+ 
+    wasVisible=[self isVisible];
+    [self orderOut:self];
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       if ([cell hasSubmenu]) [[cell target] swapout];
+    }
+ 
+ - swapin
+    {
+    int i;
+    id cell;
+ 
+    if (wasVisible)
+       {
+       [self orderFront:self];
+       }
+    for (i=0;(cell=[matrix cellAt:i:0])!=nil;i++)
+       if ([cell hasSubmenu]) [[cell target] swapin];
+    }
+ @end
+ 
+ @implementation EmacsMenuCard
+ - init
+    {
+    [super init];
+    popup = nil;
+    [self setTitle:""];
+    [self setFont:[Font userFixedPitchFontOfSize:0 matrix:NX_FLIPPEDMATRIX]];
+    return self;
+    }
+ 
+ - free
+    {
+    [popup free];
+    return [super free];
+    }
+ 
+ - addTitle: (char *)name
+    {
+    [self setTitle:name];
+    [self setAlignment:NX_CENTERED];
+    return self;
+    }
+ 
+ - addItem: (char *)name value:(Lisp_Object)val enabled:(BOOL)enabled
+    {
+    NXSize s;
+    NXRect r;
+    id item;
+ 
+    if (popup == nil)
+       {
+       popup = [[PopUpList alloc] init];
+       [popup changeButtonTitle:NO];
+       [popup setTarget:self];
+       [popup setAction:@selector(clicked:)];
+       [popup setFont:
+          [Font userFixedPitchFontOfSize:0 matrix:NX_FLIPPEDMATRIX]];
+       NXAttachPopUpList(self, popup);
+       [(item=[popup addItem:[self title]]) setTag:Qundefined];
+       [item setAlignment:NX_CENTERED];
+       [self setAlignment:NX_CENTERED];
+       [item calcCellSize:&s];
+       [self sizeTo:s.width:s.height];
+       }
+ 
+    item = [popup addItem:name];
+    [item setTag:(int)val];
+    [item setIconPosition:NX_TITLEONLY];
+    [item setAlignment:NX_LEFTALIGNED];
+    if (!enabled)
+       {
+       [item setEnabled:NO];
+       }
+    [item calcCellSize:&s];
+    [self getFrame:&r];
+    if (s.width > r.size.width)
+       [self sizeTo:s.width:r.size.height];
+    return self;
+    }
+ 
+ - clicked:sender
+    {
+    static id sellist=nil;
+    Lisp_Object seltag;
+ 
+    if (sellist!=nil) [sellist empty];
+    sellist=[sender getSelectedCells:sellist];
+    if ([sellist count]<1) return self;
+ 
+    seltag = (Lisp_Object)[[sellist objectAt:0] tag];
+    if (! EQ(seltag,Qundefined))
+       [NXApp stopModal:seltag];
+    return self;
+    }
+ @end
+ 
+ @implementation EmacsMenuPanel
+ - initContent:(const NXRect *)contentRect style:(int)aStyle backing
+              :(int)backingType buttonMask:(int)mask defer:(BOOL)flag
+    {
+    aStyle=NX_TITLEDSTYLE;
+    mask=NX_CLOSEBUTTONMASK;
+    flag=YES;
+    list=nil;
+    maxwidth=0;
+    [super initContent:contentRect style:aStyle backing:backingType
+           buttonMask:mask defer:flag];
+    [self setOneShot:YES];
+    [self setFreeWhenClosed:YES];
+    [self setHideOnDeactivate:YES];
+    return self;
+    }
+ 
+ - windowWillClose: sender
+    {
+    [NXApp stopModal:Qnil];
+    return nil;
+    }
+ 
+ static void process_keymap(id window,Lisp_Object keymap,Lisp_Object prefix,
+                            char *name)
+    {
+    Lisp_Object tail,pending_maps,tem;
+    int card;
+ 
+    pending_maps=Qnil;
+ 
+    card = [window cards];
+    if (name) [window addTitle:name to:card];
+ 
+    for (tail=keymap; XTYPE(tail)==Lisp_Cons; tail=XCONS(tail)->cdr)
+       {
+       Lisp_Object item=XCONS(tail)->car,item1,item2,def,enabled;
+       if (XTYPE(item)==Lisp_Cons)
+          {
+          item1=XCONS(item)->cdr;
+          if (XTYPE(item1)==Lisp_Cons)
+             {
+             item2=XCONS(item1)->car;
+             if (XTYPE(item2)==Lisp_String)
+                {
+                def=XCONS(item1)->cdr;
+                enabled=Qt;
+                if (XTYPE(def)==Lisp_Symbol)
+                   {
+                   tem=Fget(def,Qmenu_enable);
+                   if (!NILP(tem)) enabled=Feval(tem);
+                   }
+                if (XSTRING (item2)->data[0] == '@' && !NILP(Fkeymapp(def)))
+                   pending_maps = Fcons(Fcons(def,Fcons(item2, XCONS(item)->car)),
+                                        pending_maps);
+                else
+                   [window addItem:XSTRING(item2)->data
+                           value:Freverse(Fcons(XCONS(item)->car,prefix))
+                           enabled:!NILP(enabled) at:card];
+                }
+             }
+          }
+       else if (VECTORP(item))
+          {
+          int len=XVECTOR(item)->size;
+          int c;
+          for(c=0; c<len; c++)
+             {
+             Lisp_Object character;
+             XSETFASTINT(character, c);
+             item1=XVECTOR(item)->contents[c];
+             if (XTYPE(item1)==Lisp_Cons)
+                {
+                item2=XCONS(item1)->car;
+                if (XTYPE(item2)==Lisp_String)
+                   {
+                   def=XCONS(item1)->cdr;
+                   enabled=Qt;
+                   if (XTYPE(def)==Lisp_Symbol)
+                      {
+                      tem=Fget(def,Qmenu_enable);
+                      if (!NILP(tem)) enabled=Feval(tem);
+                      }
+                   if (XSTRING (item2)->data[0] == '@' && !NILP(Fkeymapp(def)))
+                      pending_maps = Fcons(Fcons(def,Fcons(item2, XCONS(item)->car)),
+                                           pending_maps);
+                   else
+                      [window addItem:XSTRING(item2)->data
+                              value:Freverse(Fcons(XCONS(item)->car,prefix))
+                              enabled:!NILP(enabled) at:card];
+                   }
+                }
+             }
+          }
+       }
+ 
+    for(tail=pending_maps;XTYPE(tail)==Lisp_Cons;tail=XCONS(tail)->cdr)
+       {
+       tem=XCONS(tail)->car;
+       process_keymap(window,XCONS(tem)->car,
+                      Fcons(XCONS(XCONS(tem)->cdr)->cdr,prefix),
+                      (char *)XSTRING(XCONS(XCONS(tem)->cdr)->car)->data +1);
+       }
+    }
+ 
+ void process_list(id window,Lisp_Object list)
+    {
+    Lisp_Object tail,pane,tem;
+    int card;
+ 
+    card = [window cards];
+    for(;XTYPE(list)==Lisp_Cons;list=XCONS(list)->cdr)
+       {
+       pane=XCONS(list)->car;
+       if (XTYPE(pane)!=Lisp_Cons || XTYPE(XCONS(pane)->car)!=Lisp_String) continue;
+       for(tail=pane;XTYPE(tail)==Lisp_Cons;tail=XCONS(tail)->cdr)
+          {
+          tem=XCONS(tail)->car;
+          if (XTYPE(tem)==Lisp_String)
+             {
+ 	      if (tail!=pane)		/* Not very first item? */
+ 		  [window addItem:XSTRING(tem)->data value:Qnil
+ 	                  enabled:NO at:card];
+ 	      else
+ 		  [window addTitle:XSTRING(tem)->data to:card];
+             }
+          else if (XTYPE(tem)==Lisp_Cons || XTYPE(XCONS(tem)->car)==Lisp_String)
+             {
+             [window addItem:XSTRING(XCONS(tem)->car)->data value:XCONS(tem)->cdr
+                     enabled:YES at:card];
+             }
+          }
+       }
+    }
+ 
+ 
+ - addItem:(char *)str value:(Lisp_Object)val enabled:(BOOL)enabled at:(int)pane
+    {
+    int row;
+    id card;
+    NXRect area;
+ 
+    row = [list count];
+    for(;row<=pane;row++)
+       {
+       [list addObject:card=[[EmacsMenuCard alloc] init]];
+       [[self contentView] addSubview:card];
+       [[card cell] calcCellSize:&area.size];
+       if (area.size.width > maxwidth)  maxwidth=area.size.width;
+       area.origin.x = MenuStagger*pane;
+       area.origin.y = area.size.height*pane;
+       [card setFrame: &area];
+       }
+    card = [list objectAt:pane];
+    [card addItem:str value:val enabled:enabled];
+    [card getFrame:&area];
+    if (area.size.width > maxwidth)  maxwidth=area.size.width;
+    }
+ 
+ - addTitle:(char *)str to:(int)pane
+    {
+    int row;
+    id card;
+    NXRect area;
+ 
+    row = [list count];
+    for(;row<=pane;row++)
+       {
+       [list addObject:card=[[EmacsMenuCard alloc] init]];
+       [[self contentView] addSubview:card];
+       [[card cell] calcCellSize:&area.size];
+       if (area.size.width > maxwidth)  maxwidth=area.size.width;
+       area.origin.x = MenuStagger*pane;
+       area.origin.y = area.size.height*pane;
+       [card setFrame: &area];
+       }
+ 
+    card = [list objectAt:pane];
+    [card addTitle:str];
+    [[card cell] calcCellSize:&area.size];
+    if (area.size.width > maxwidth)  maxwidth=area.size.width;
+    }
+ 
+ - initFromMenu:(Lisp_Object)menu
+    {
+    Lisp_Object title;
+    NXSize spacing = {0,0};
+    [super init];
+ 
+       {
+       list=[[List alloc] init];
+       [[self contentView] setFlipped:YES];
+       }
+ 
+    if (!NILP (Fkeymapp(menu)))
+       {
+       int i,j;
+       Lisp_Object keymap = get_keymap(menu);
+       process_keymap(self,keymap,Qnil,0);
+       title = map_prompt(keymap);
+       }
+    else if (XTYPE(menu)==Lisp_Cons && !NILP(Fkeymapp (Fcar(menu))))
+       {
+       Lisp_Object tem,keymap;
+       for(title=Qnil;XTYPE(menu) == Lisp_Cons;menu = Fcdr(menu))
+          {
+          keymap=get_keymap(Fcar(menu));
+          process_keymap(self,keymap,Qnil,0);
+          tem = map_prompt (keymap);
+          if (NILP(title) && !NILP(tem)) title=tem;
+          }
+       }
+    else
+       {
+       Lisp_Object tem;
+       title=Fcar(menu);
+       process_list(self,Fcdr(menu));
+       }
+ 
+    if (XTYPE(title)==Lisp_String) [self setTitle:XSTRING(title)->data];
+ 
+       {
+       int i;
+       NXRect r,s,t;
+ 
+       [[list objectAt:0] getFrame:&t];
+       for (i=0; i<[list count]; i++)
+ 	  [[list objectAt:i] sizeTo:maxwidth:t.size.height];
+ 
+       [self getFrame:&r];
+       [[self contentView] getFrame:&s];
+       r.size.height += t.size.height*i-s.size.height;
+       r.size.width  += maxwidth+(i-1)*MenuStagger-s.size.width;
+       [self placeWindow:&r];
+       }
+ 
+    return self;
+    }
+ 
+ - free
+    {
+    id card;
+ 
+    [[list freeObjects] free];
+    return [super free];
+    }
+ 
+ - (int)cards
+    {
+    return [list count];
+    }
+ 
+ - (Lisp_Object)runMenuAt:(NXCoord)x:(NXCoord)y
+    {
+    NXEvent e;
+    NXModalSession session;
+    NXRect r;
+    int ret;
+ 
+    if ([list count] == 0)
+      return Qnil;
+    
+    [[list objectAt:0] getFrame:&r];
+    [[self contentView] convertPoint:&r.origin toView:nil];
+ 
+    [[self moveTo: x-r.size.width/2.0: y-r.origin.y+r.size.height/2.0]
+     orderFront:NXApp];
+ 
+    [NXApp beginModalSession:&session for:self];
+    [self setHideOnDeactivate:YES];
+    while ((ret=[NXApp runModalSession:&session])==NX_RUNCONTINUES)
+       NXGetOrPeekEvent(DPS_ALLCONTEXTS,&e,NX_ALLEVENTS,NX_FOREVER,0,1);
+ 
+    [NXApp endModalSession:&session];
+ 
+    return (Lisp_Object)ret;
+    }
+ @end
+ 
+ @implementation EmacsDialogPanel
+ 
+ #define SPACER		8.0
+ #define ICONSIZE	50.0
+ #define TEXTHEIGHT	20.0
+ 
+ - initContent:(const NXRect *)contentRect style:(int)aStyle backing
+              :(int)backingType buttonMask:(int)mask defer:(BOOL)flag
+    {
+    NXSize spacing = {SPACER,SPACER};
+    NXRect area;
+    char this_cmd_name[80];
+    id cell,tem;
+ 
+    aStyle=NX_TITLEDSTYLE;
+    mask= 0; // NX_CLOSEBUTTONMASK;
+    flag=YES;
+    rows=0;
+    cols=1;
+    [super initContent:contentRect style:aStyle backing:backingType
+           buttonMask:mask defer:flag];
+    [[self contentView] setFlipped:YES];
+    [[self contentView] setAutoresizeSubviews:YES];
+ 
+    area.origin.x   = SPACER;
+    area.origin.y   = SPACER;
+    area.size.width = ICONSIZE;
+    area.size.height= ICONSIZE;
+    tem = [[Button alloc] initFrame:&area icon:"app"
+ 			 tag:0 target:nil action:NULL key:0 enabled:NO];
+    [[self contentView] addSubview:tem];
+    [tem setBordered:NO];
+ 
+    if (XTYPE(this_command)==Lisp_Symbol)
+       {
+       int i;
+ 
+       strcpy(this_cmd_name,XSYMBOL(this_command)->name->data);
+       if (this_cmd_name[0] >= 'a' && this_cmd_name[0] <= 'z')
+ 	 this_cmd_name[0] = this_cmd_name[0]-'a'+'A';
+       for (i=0; this_cmd_name[i] != '\0'; i++)
+ 	 {
+ 	 if (this_cmd_name[i] == '-')
+ 	    {
+ 	    this_cmd_name[i]=' ';
+ 	    if (this_cmd_name[i+1] >= 'a' && this_cmd_name[i+1] <= 'z')
+ 	       this_cmd_name[i+1] = this_cmd_name[i+1]-'a'+'A';
+ 	    }
+ 	 }
+       }
+    else
+       strcpy(this_cmd_name,"Emacs");
+    area.origin.x   = ICONSIZE+2*SPACER;
+    area.origin.y   = ICONSIZE/2-10+SPACER;
+    area.size.width = 400;
+    area.size.height= TEXTHEIGHT;
+    command = [[TextField alloc] initFrame:&area];
+    [[self contentView] addSubview:command];
+    [command setStringValue:this_cmd_name];
+    [command setBackgroundTransparent:YES];
+    [command setBezeled:NO];
+    [command setSelectable:NO];
+    [command setFont: [Font systemFontOfSize:18.0 matrix:NX_FLIPPEDMATRIX]];
+ 
+    area.origin.x   = 0;
+    area.origin.y   = ICONSIZE+2*SPACER;
+    area.size.width = 400;
+    area.size.height= 2;
+    tem = [[Box alloc] initFrame:&area];
+    [[self contentView] addSubview:tem];
+    [tem setTitlePosition:NX_NOTITLE];
+    [tem setAutosizing:NX_WIDTHSIZABLE];
+ 
+    area.origin.x   = 2*SPACER;
+    area.origin.y  += 2*SPACER;
+    area.size.width = 400;
+    area.size.height= TEXTHEIGHT;
+    title = [[TextField alloc] initFrame:&area];
+    [[self contentView] addSubview:title];
+    [title setBackgroundTransparent:YES];
+    [title setBezeled:NO];
+    [title setSelectable:NO];
+    [title setFont: [Font systemFontOfSize:14.0 matrix:NX_FLIPPEDMATRIX]];
+ 
+    cell = [[ButtonCell alloc] initTextCell:""];
+    // Make it look like nothing's here
+    [cell setBordered:NO];
+    [cell setEnabled:NO];
+    [cell setParameter:NX_BUTTONINSET to:8];
+ 
+    matrix = [[Matrix alloc] initFrame:contentRect mode:NX_HIGHLIGHTMODE
+ 			    prototype:cell numRows:0 numCols:1];
+    [[self contentView] addSubview:matrix];
+    [matrix moveTo:SPACER:area.origin.y+TEXTHEIGHT+2*SPACER];
+    [matrix setIntercell:&spacing];
+ 
+    [self setOneShot:YES];
+    [self setFreeWhenClosed:YES];
+    [self setHideOnDeactivate:YES];
+    return self;
+    }
+ 
+ - windowWillClose: sender
+    {
+    [NXApp stopModal:Qnil];
+    return nil;
+    }
+ 
+ void process_dialog(id window,Lisp_Object list)
+    {
+    Lisp_Object item;
+    int row;
+ 
+    row=0;
+    for(;XTYPE(list)==Lisp_Cons;list=XCONS(list)->cdr)
+       {
+       item=XCONS(list)->car;
+       if (XTYPE(item)==Lisp_String)
+ 	 {
+ 	 [window addString:XSTRING(item)->data row:row];
+ 	 row++;
+          }
+       else if (XTYPE(item)==Lisp_Cons)
+          {
+          [window addButton:XSTRING(XCONS(item)->car)->data
+ 		 value:XCONS(item)->cdr row:row];
+ 	 row++;
+          }
+       else if (NILP(item))
+ 	 {
+ 	 [window addSplit];
+ 	 row=0;
+ 	 }
+       }
+    }
+ 
+ 
+ - addButton:(char *)str value:(Lisp_Object)val row:(int)row
+    {
+    id cell;
+        
+    if (row >= rows)
+       {
+       [matrix addRow];
+       rows++;
+       }
+    cell = [matrix cellAt:row:cols-1];
+    [cell setTarget:self];
+    [cell setAction:@selector(clicked:)];
+    [cell setTitle:str];
+    [cell setTag:(int)val];
+    [cell setBordered:YES];
+    [cell setEnabled:YES];
+    }
+ 
+ - addString:(char *)str row:(int)row
+    {
+    id cell;
+        
+    if (row >= rows)
+       {
+       [matrix addRow];
+       rows++;
+       }
+    cell = [matrix cellAt:row:cols-1];
+    // No setAction here.  Disabled buttons can't trigger actions
+    [cell setTitle:str];
+    [cell setBordered:YES];
+    [cell setEnabled:NO];
+    }
+ 
+ - addSplit
+    {
+    [matrix addCol];
+    cols++;
+    }
+ 
+ - clicked:sender
+    {
+    static id sellist=nil;
+    Lisp_Object seltag;
+ 
+    if (sellist!=nil) [sellist empty];
+    sellist=[sender getSelectedCells:sellist];
+    if ([sellist count]<1) return self;
+ 
+    seltag = (Lisp_Object)[[sellist objectAt:0] tag];
+    if (! EQ(seltag,Qundefined))
+       [NXApp stopModal:seltag];
+    return self;
+    }
+ 
+ - initFromContents:(Lisp_Object)contents
+    {
+    Lisp_Object head;
+    [super init];
+ 
+    if (XTYPE(contents)==Lisp_Cons)
+       {
+       Lisp_Object tem;
+       head=Fcar(contents);
+       process_dialog(self,Fcdr(contents));
+       }
+ 
+    if (XTYPE(head)==Lisp_String)
+       [title setStringValue:XSTRING(head)->data];
+ 
+       {
+       int i;
+       NXRect r,s,t;
+ 
+       if (cols == 1 && rows > 1)	// Never told where to split
+ 	 {
+ 	 [matrix addCol];
+ 	 for (i=0; i<rows/2; i++)
+ 	    {
+ 	    [matrix putCell:[matrix cellAt:(rows+1)/2:0] at:i:1];
+ 	    [matrix removeRowAt:(rows+1)/2 andFree:NO];
+ 	    }
+ 	 }
+       [matrix sizeToFit];
+       [title sizeToFit];
+       [command sizeToFit];
+ 
+       [matrix getFrame:&t];
+       [title getFrame:&r];
+       if (r.size.width+r.origin.x > t.size.width+t.origin.x)
+ 	 {
+ 	 t.origin.x   = r.origin.x;
+ 	 t.size.width = r.size.width;
+ 	 }
+       [command getFrame:&r];
+       if (r.size.width+r.origin.x > t.size.width+t.origin.x)
+ 	 {
+ 	 t.origin.x   = r.origin.x;
+ 	 t.size.width = r.size.width;
+ 	 }
+ 
+       [self getFrame:&r];
+       [[self contentView] getFrame:&s];
+       r.size.height += t.origin.y+t.size.height+SPACER-s.size.height;
+       r.size.width  += t.origin.x+t.size.width +SPACER-s.size.width;
+       [self placeWindow:&r];
+       }
+ 
+    return self;
+    }
+ 
+ - free
+    {
+    [matrix free];
+    return [super free];
+    }
+ 
+ - (Lisp_Object)runDialogAt:(NXCoord)x:(NXCoord)y
+    {
+    NXEvent e;
+    NXModalSession session;
+    NXRect r;
+    int ret;
+ 
+ //    [[list objectAt:0] getFrame:&r];
+ //    [[self contentView] convertPoint:&r.origin toView:nil];
+ 
+ //    [[self moveTo: x-r.size.width/2.0: y+r.size.height/2.0]
+ //     orderFront:NXApp];
+ 
+    [self center];
+    [self orderFront:NXApp];
+ 
+    [NXApp beginModalSession:&session for:self];
+    while ((ret=[NXApp runModalSession:&session])==NX_RUNCONTINUES)
+       NXGetOrPeekEvent(DPS_ALLCONTEXTS,&e,NX_ALLEVENTS,NX_FOREVER,0,1);
+    [NXApp endModalSession:&session];
+ 
+    return (Lisp_Object)ret;
+    }
+ @end
Index: emacs/src/nsselect.m
diff -c /dev/null emacs/src/nsselect.m:1.1
*** /dev/null	Fri Aug  2 21:07:53 1996
--- emacs/src/nsselect.m	Fri Jul 19 05:08:18 1996
***************
*** 0 ****
--- 1,421 ----
+ /* NS Selection processing for emacs
+    Copyright (C) 1993, 1994 Free Software Foundation.
+ 
+ This file is part of GNU Emacs.
+ 
+ GNU Emacs is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ #import <appkit/appkit.h>
+ 
+ #include "config.h"
+ #include "lisp.h"
+ #include "nsterm.h"
+ #include "dispextern.h"
+ #include "frame.h"
+ #include "blockinput.h"
+ #include "termhooks.h"
+ #include "multi-frame.h"
+ 
+ #define CUT_BUFFER_SUPPORT
+ 
+ static NXAtom NXSecondaryPboard;
+ 
+ static NXAtom symbol_to_nx_atom (Lisp_Object sym)
+    {
+    CHECK_SYMBOL(sym,0);
+    if (EQ (sym, QPRIMARY))     return NXGeneralPboard;
+    if (EQ (sym, QSECONDARY))   return NXSecondaryPboard;
+    if (EQ (sym, QTEXT))        return NXAsciiPboardType;
+    return NXUniqueString(XSYMBOL(sym)->name->data);
+    }
+ 
+ static Lisp_Object nx_atom_to_symbol (NXAtom t)
+    {
+    if (t==NXGeneralPboard)         return QPRIMARY;
+    if (t==NXSecondaryPboard)       return QSECONDARY;
+    if (t==NXAsciiPboardType)       return QTEXT;
+    if (t==NXFilenamePboardType)    return QFILE_NAME;
+    if (t==NXTabularTextPboardType) return QTEXT;
+    return intern(t);
+    }
+ 
+ static Lisp_Object clean_local_selection_data (Lisp_Object obj)
+    {
+    if (CONSP (obj)
+        && INTEGERP (XCONS (obj)->car)
+        && CONSP (XCONS (obj)->cdr)
+        && INTEGERP (XCONS (XCONS (obj)->cdr)->car)
+        && NILP (XCONS (XCONS (obj)->cdr)->cdr))
+       obj = Fcons (XCONS (obj)->car, XCONS (obj)->cdr);
+ 
+    if (CONSP (obj)
+        && INTEGERP (XCONS (obj)->car)
+        && INTEGERP (XCONS (obj)->cdr))
+       {
+       if (XINT (XCONS (obj)->car) == 0)
+          return XCONS (obj)->cdr;
+       if (XINT (XCONS (obj)->car) == -1)
+          return make_number (- XINT (XCONS (obj)->cdr));
+       }
+ 
+    if (VECTORP (obj))
+       {
+       int i;
+       int size = XVECTOR (obj)->size;
+       Lisp_Object copy;
+ 
+       if (size == 1)
+          return clean_local_selection_data (XVECTOR (obj)->contents [0]);
+       copy = Fmake_vector (size, Qnil);
+       for (i = 0; i < size; i++)
+          XVECTOR (copy)->contents [i]
+             = clean_local_selection_data (XVECTOR (obj)->contents [i]);
+       return copy;
+       }
+ 
+    return obj;
+    }
+ 
+ Lisp_Object ns_string_from_pasteboard(id pb)
+    {
+    int i;
+    NXAtom type;
+    Lisp_Object ret;
+    int l;
+    char *d;
+ 
+    for (i=0;ns_return_types[i];i++);
+    type=[pb findAvailableTypeFrom:ns_return_types num:i];
+    if (type==0) return Qnil;
+    if (![pb readType:type data: &d length: &l])
+       Fsignal (Qerror, Fcons (build_string ("pasteboard doesn't contain valid data"), Qnil));
+    ret=make_string (d, l);
+    [pb deallocatePasteboardData: d length: l];
+    return ret;
+    }
+ 
+ void ns_declare_pasteboard(id pb)
+    {
+    int i;
+    for (i=0;ns_send_types[i];i++);
+    [pb declareTypes:ns_send_types num:i owner:NXApp];
+    }
+ 
+ void ns_undeclare_pasteboard(id pb)
+    {
+    const NXAtom types[] = { };
+    [pb declareTypes:types num:0 owner:nil];
+    }
+ 
+ void ns_string_to_pasteboard(id pb,Lisp_Object str)
+    {
+    int i;
+ 
+    if (EQ (str, Qnil))
+       {
+       const NXAtom types[] = { };
+       [pb declareTypes:types num:0 owner:nil];
+       }
+    else
+       {
+       CHECK_STRING(str, 0);
+       for (i=0;ns_send_types[i];i++);
+       [pb declareTypes:ns_send_types num:i owner:nil];
+       for (i--;i>=0;i--)
+          [pb writeType:ns_send_types[i]
+                   data:XSTRING(str)->data length:XSTRING(str)->size];
+       }
+    }
+ 
+ static Lisp_Object ns_get_local_selection(Lisp_Object selection_name,
+                                           Lisp_Object target_type)
+    {
+    Lisp_Object local_value;
+    Lisp_Object handler_fn, value, type, check;
+    int count;
+ 
+    local_value = assq_no_quit (selection_name, Vselection_alist);
+ 
+    if (NILP (local_value)) return Qnil;
+ 
+    count = specpdl_ptr - specpdl;
+    specbind (Qinhibit_quit, Qt);
+    CHECK_SYMBOL (target_type, 0);
+    handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
+    if (!NILP (handler_fn))
+       value=call3(handler_fn, selection_name, target_type,
+                   XCONS (XCONS (local_value)->cdr)->car);
+    else
+       value=Qnil;
+    unbind_to (count, Qnil);
+ 
+    check=value;
+    if (CONSP(value) && SYMBOLP(XCONS (value)->car))
+       {
+       type=XCONS(value)->car;
+       check=XCONS(value)->cdr;
+       }
+ 
+    if (STRINGP (check) || VECTORP (check) || SYMBOLP (check)
+        || INTEGERP (check) || NILP (value))
+       return value;
+ 
+    if (CONSP (check)
+        && INTEGERP (XCONS (check)->car)
+        && (INTEGERP (XCONS (check)->cdr)||
+            (CONSP (XCONS (check)->cdr)
+             && INTEGERP (XCONS (XCONS (check)->cdr)->car)
+             && NILP (XCONS (XCONS (check)->cdr)->cdr))))
+       return value;
+ 
+    return Fsignal (Qerror,
+                    Fcons (build_string ("invalid data returned by selection-conversion function"),
+                           Fcons (handler_fn, Fcons (value, Qnil))));
+    }
+ 
+ static Lisp_Object ns_get_foreign_selection(Lisp_Object symbol, Lisp_Object target)
+    {
+    id pb;
+    pb=[Pasteboard newName:symbol_to_nx_atom(symbol)];
+    return ns_string_from_pasteboard(pb);
+    }
+ 
+ void ns_handle_selection_request(struct input_event *event)
+    {
+    id pb=(id)event->x;
+    NXAtom type=(NXAtom)event->y;
+    Lisp_Object selection_name,selection_data,target_symbol,data;
+    Lisp_Object successful_p,rest;
+ 
+    selection_name=nx_atom_to_symbol([pb name]);
+    target_symbol=nx_atom_to_symbol(type);
+    selection_data= assq_no_quit (selection_name, Vselection_alist);
+    successful_p=Qnil;
+ 
+    if (NILP (selection_data)) goto DONE;
+ 
+    data = ns_get_local_selection (selection_name, target_symbol);
+    if (!NILP(data))
+       {
+       if (STRINGP(data))
+          [pb writeType:type data:XSTRING(data)->data length:XSTRING(data)->size];
+       successful_p=Qt;
+       }
+ 
+  DONE:
+    if (!EQ(Vsent_selection_hooks,Qunbound))
+       {
+       for(rest=Vsent_selection_hooks;CONSP(rest); rest=Fcdr(rest))
+          call3 (Fcar(rest), selection_name, target_symbol, successful_p);
+       }
+    }
+ 
+ void ns_handle_selection_clear(struct input_event *event)
+    {
+    id pb=(id)event->x;
+    Lisp_Object selection_name,selection_data,rest;
+ 
+    selection_name=nx_atom_to_symbol([pb name]);
+    selection_data=assq_no_quit (selection_name, Vselection_alist);
+    if (NILP(selection_data)) return;
+ 
+    if (EQ (selection_data, Fcar (Vselection_alist)))
+      Vselection_alist = Fcdr (Vselection_alist);
+    else
+       {
+       for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
+          if (EQ (selection_data, Fcar (Fcdr (rest))))
+ 	    Fsetcdr(rest,Fcdr(Fcdr(rest)));
+       }
+ 
+    if (!EQ(Vlost_selection_hooks,Qunbound))
+       {
+       for(rest=Vlost_selection_hooks;CONSP(rest); rest=Fcdr(rest))
+          call1 (Fcar(rest), selection_name);
+       }
+    }
+ 
+ DEFUN ("ns-own-selection-internal", Fns_own_selection_internal,
+        Sns_own_selection_internal, 2, 2, 0, "Assert a selection.\n\
+ For more details see the window system specific function.")
+   (selection_name, selection_value)
+ Lisp_Object selection_name,selection_value;
+    {
+    id pb;
+    Lisp_Object old_value, new_value;
+ 
+    check_ns();
+    CHECK_SYMBOL (selection_name, 0);
+    if (NILP (selection_value)) error ("selection-value may not be nil.");
+    pb=[Pasteboard newName:symbol_to_nx_atom(selection_name)];
+    ns_declare_pasteboard(pb);
+    old_value=assq_no_quit (selection_name, Vselection_alist);
+    new_value= Fcons(selection_name, Fcons(selection_value, Qnil));
+    if (NILP(old_value))
+       Vselection_alist=Fcons(new_value,Vselection_alist);
+    else
+       Fsetcdr(old_value,Fcdr(new_value));
+    /* XXX An evil hack, but a necessary one I fear XXX */
+       {
+       struct input_event ev;
+       ev.kind=selection_request_event;
+       ev.modifiers=0;
+       ev.code=0;
+       ev.x=(int)pb;
+       ev.y=(int)NXAsciiPboardType;
+       ns_handle_selection_request(&ev);
+       }
+    return selection_value;
+    }
+ 
+ DEFUN ("ns-disown-selection-internal", Fns_disown_selection_internal,
+        Sns_disown_selection_internal, 1, 2, 0,
+        "If we own the selection SELECTION, disown it.")
+   (selection_name, time)
+ Lisp_Object selection_name,time;
+    {
+    id pb;
+    check_ns();
+    CHECK_SYMBOL (selection_name, 0);
+    if (NILP(assq_no_quit (selection_name, Vselection_alist))) return Qnil;
+ 
+    pb=[Pasteboard newName:symbol_to_nx_atom(selection_name)];
+    ns_undeclare_pasteboard(pb);
+    return Qt;
+    }
+ 
+ DEFUN ("ns-selection-exists-p", Fns_selection_exists_p, Sns_selection_exists_p,
+        0, 1, 0, "Whether there is an owner for the given selection.\n\
+ The arg should be the name of the selection in question, typically one of\n\
+ the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
+ \(Those are literal upper-case symbol names.)\n\
+ For convenience, the symbol nil is the same as `PRIMARY',\n\
+ and t is the same as `SECONDARY'.)")
+   (selection)
+ Lisp_Object selection;
+    {
+    id pb;
+    const NXAtom *types;
+ 
+    check_ns();
+    CHECK_SYMBOL (selection, 0);
+    if (EQ (selection, Qnil)) selection = QPRIMARY;
+    if (EQ (selection, Qt)) selection = QSECONDARY;
+    pb=[Pasteboard newName:symbol_to_nx_atom(selection)];
+    types=[pb types];
+    return (*types==0) ? Qnil : Qt;
+    }
+ 
+ DEFUN ("ns-selection-owner-p", Fns_selection_owner_p, Sns_selection_owner_p,
+        0, 1, 0,
+   "Whether the current Emacs process owns the given selection.\n\
+ The arg should be the name of the selection in question, typically one of\n\
+ the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
+ \(Those are literal upper-case symbol names.)\n\
+ For convenience, the symbol nil is the same as `PRIMARY',\n\
+ and t is the same as `SECONDARY'.)")
+   (selection)
+ Lisp_Object selection;
+    {
+    check_ns();
+    CHECK_SYMBOL (selection, 0);
+    if (EQ (selection, Qnil)) selection = QPRIMARY;
+    if (EQ (selection, Qt)) selection = QSECONDARY;
+    return (NILP (Fassq (selection, Vselection_alist))) ? Qnil : Qt;
+    }
+ 
+ DEFUN ("ns-get-selection-internal", Fns_get_selection_internal,
+        Sns_get_selection_internal, 2, 2, 0,
+   "Return text selected from some pasteboard.\n\
+ SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
+ \(Those are literal upper-case symbol names.)\n\
+ TYPE is the type of data desired, typically `STRING'.")
+   (selection_name, target_type)
+ Lisp_Object selection_name, target_type;
+    {
+    Lisp_Object val;
+ 
+    check_ns();
+    CHECK_SYMBOL(selection_name, 0);
+    CHECK_SYMBOL(target_type,0);
+    val= ns_get_local_selection(selection_name,target_type);
+    if (NILP(val))
+       val= ns_get_foreign_selection(selection_name,target_type);
+    if (CONSP(val) && SYMBOLP (Fcar(val)))
+       {
+       val = Fcdr(val);
+       if (CONSP (val) && NILP (Fcdr(val)))
+          val = Fcar(val);
+       }
+    val = clean_local_selection_data (val);
+    return val;
+    }
+ 
+ #ifdef CUT_BUFFER_SUPPORT
+ DEFUN ("ns-get-cut-buffer-internal", Fns_get_cut_buffer_internal,
+        Sns_get_cut_buffer_internal, 1, 1, 0,
+   "Returns the value of the named cut buffer.")
+   (buffer)
+ Lisp_Object buffer;
+    {
+    id pb;
+    check_ns();
+    pb=[Pasteboard newName:symbol_to_nx_atom(buffer)];
+    return ns_string_from_pasteboard(pb);
+    }
+ 
+ DEFUN ("ns-rotate-cut-buffers-internal", Fns_rotate_cut_buffers_internal,
+        Sns_rotate_cut_buffers_internal, 1, 1, 0,
+    "Rotate the values of the cut buffers by the given number of steps;\n\
+  positive means move values forward, negative means backward.")
+   (n)
+      Lisp_Object n;
+    {
+    /* XXX This function is unimplemented under NeXTstep XXX */
+    return Qnil;
+    }
+ 
+ DEFUN ("ns-store-cut-buffer-internal", Fns_store_cut_buffer_internal,
+        Sns_store_cut_buffer_internal, 2, 2, 0,
+   "Sets the value of the named cut buffer (typically CUT_BUFFER0).")
+   (buffer, string)
+ Lisp_Object buffer, string;
+    {
+    id pb;
+    check_ns();
+    pb=[Pasteboard newName:symbol_to_nx_atom(buffer)];
+    ns_string_to_pasteboard(pb,string);
+    return Qnil;
+    }
+ #endif
+ 
+ void nxatoms_of_nsselect (void)
+    {
+    NXSecondaryPboard=NXUniqueString("NeXT secondary pasteboard name");
+    }
+ 
+ void syms_of_nsselect (void)
+    {
+    defsubr (&Sns_disown_selection_internal);
+    defsubr (&Sns_get_selection_internal);
+    defsubr (&Sns_own_selection_internal);
+    defsubr (&Sns_selection_exists_p);
+    defsubr (&Sns_selection_owner_p);
+ #ifdef CUT_BUFFER_SUPPORT
+    defsubr (&Sns_get_cut_buffer_internal);
+    defsubr (&Sns_rotate_cut_buffers_internal);
+    defsubr (&Sns_store_cut_buffer_internal);
+ #endif
+    }
Index: emacs/src/nsterm.h
diff -c /dev/null emacs/src/nsterm.h:1.4
*** /dev/null	Fri Aug  2 21:08:00 1996
--- emacs/src/nsterm.h	Fri Aug  2 04:02:34 1996
***************
*** 0 ****
--- 1,519 ----
+ /* Definitions and headers for communication with NeXTstep
+    Copyright (C) 1989, 1993 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 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ #include "config.h"
+ 
+ #ifdef HAVE_NS
+ 
+ #ifdef __OBJC__
+ #import <appkit/appkit.h>
+ #import <remote/NXProxy.h>
+ 
+ @interface Menu (UndocumentedMenu)
+ - (void)_restoreInitialMenuPos;
+ - (void)_saveInitialMenuPos;
+ @end
+ 
+ @interface SavePanel (UndocumentedSavePanel)
+ - (BOOL)_validateNames:(char *)name checkBrowser:(BOOL)check;
+ @end
+ 
+ /* These two interfaces were ruthlessly stolen from John C. Randolph */
+ @interface View (windowButtons)
+ - _setMask:(unsigned int) mask;
+ @end
+ 
+ @interface Window (windowButtons)
+ - toggleClose:sender;
+ - toggleMiniaturize:sender;
+ - setCloseButton:sender to:(BOOL)bool;
+ - setMiniaturizeButton:sender to:(BOOL)bool;
+ - showCloseButton:sender;
+ - showMiniaturizeButton:sender;
+ - hideCloseButton:sender;
+ - hideMiniaturizeButton:sender;
+ - updateBorder;
+ @end
+ 
+ @protocol Interrupt
+ -(oneway void)interrupt;
+ @end
+ 
+ @protocol BaseValueGetting
+ -(int)numSubValues;
+ -(id <BaseValueGetting>)subValueAt:(int)nValue;
+ -(id <BaseValueGetting>)subValueAt:(int)nValue withFlags:(out unsigned *)pFlags andName:(out char **)pName;
+ -(id <BaseValueGetting>)subValueNamed:(in char *)valueName index:(out int *)index;
+ -(id <BaseValueGetting>)subValueFor:(id <BaseValueGetting>)value from:(int *)from index:(int *)index;
+ @end
+ 
+ @protocol Value <BaseValueGetting>
+ -(char *)valueName;
+ -(unsigned)size;
+ -(unsigned)scalerValueFrom:(unsigned)from;
+ -(float)floatValueFrom:(unsigned)from;
+ -(char *)enumValueFrom:(unsigned)from;
+ -(char *)stringValueFrom:(unsigned)from;
+ -(char *)functionValueFrom:(unsigned)from;
+ -(unsigned)addressFrom:(unsigned)from;
+ -(unsigned)addressFrom:(unsigned)from isValid:(out int *)isValid;
+ -(unsigned)flags;
+ -(char *)typeName;
+ -(int)castToTypeNamed:(in char *)typeName from:(unsigned)from;
+ @end
+ 
+ @protocol Frame <BaseValueGetting>
+ -(int)hasSymbols;
+ -(char *)functionName;
+ -(char *)functionNameAndHasSymbols:(int *)hasSymbols;
+ -(unsigned)frame;
+ -(unsigned)pc;
+ -(char *)fileNameAndLine:(unsigned *)line;
+ -(int)frameNumber;
+ @end
+ 
+ @protocol Breakpoint
+ -(char *)fileName;
+ -(int)line;
+ -(BOOL)enabled;
+ -(char *)commands;
+ -(char *)condition;
+ -(char *)expression;
+ -(char *)function;
+ @end
+ 
+ @protocol GdbController
+ -(oneway void)breakInFile:(in char *)filename atLine:(int)line;
+ -(oneway void)untilInFile:(in char *)filename atLine:(int)line;
+ -(oneway void)step;
+ -(oneway void)next;
+ -(oneway void)continue;
+ -(oneway void)up;
+ -(oneway void)frame;
+ -(oneway void)down;
+ -(oneway void)finish;
+ -(oneway void)run;
+ -(oneway void)quit;
+ -(oneway void)printExpression:(in char *)selection;
+ -(oneway void)printExpressionIndirect:(in char *)selection;
+ -(oneway void)selectFrame:(int)frame;
+ -(oneway void)interrupt;
+ -(int)getFramesUpTo:(int)maxFrames selectedFrame:(out int *)sel symbolsOnly:(BOOL)sOnly;
+ -(id <Frame>)frameAt:(int)frameIndex functionName:(out char **)pFunctionName from:(out unsigned int *)pFrom;
+ -(id <Frame>)frameAt:(int)frameIndex from:(out unsigned int *)pFrom;
+ -(id <Frame>)frameAt:(int)frameIndex;
+ -(char *)functionNameAt:(int)frameIndex;
+ -(char *)functionNameAt:(int)frameIndex hasSymbols:(int *)hasSymbols;
+ -(oneway void)errorOpeningFile:(char *)filename fromLine:(int)start to:(int)end;
+ -(oneway void)executeCommand:(char *)command;
+ -(oneway void)setClient:anObject;
+ -(oneway void)addSourceDirectory:(const char *)directory;
+ -(int)numBreakpoints;
+ -(id <Breakpoint>)breakpointAt:(int)index;
+ -(NXData *)completionsForPrefix:(const char *)prefix;
+ @end
+ 
+ @protocol GdbUser
+ -(oneway void)openFile:(char *)fileName onHost:(char *)hostName atTrueLine:(int)line;
+ -(oneway void)openFile:(char *)fileName onHost:(char *)hostName fromTrueLine:(int)startLine to:(int)endLine;
+ -(oneway void)setInterruptHandler:handler;
+ -(oneway void)disconnect;
+ -(oneway void)frameChanged;
+ -(oneway void)programIsRunning;
+ -(oneway void)programStopped;
+ -(oneway void)programIsDead;
+ -(oneway void)setController:(id <GdbController>)anObject;
+ -(int)isNewUser;
+ -(oneway void)setGdbName:(const char *)theName;
+ @end
+ 
+ @protocol GdbNewUser
+ -(oneway void)openFile:(char *)fileName onHost:(char *)hostName atTrueLine:(int)line;
+ -(oneway void)openFile:(char *)fileName onHost:(char *)hostName fromTrueLine:(int)startLine to:(int)endLine;
+ -(oneway void)setInterruptHandler:handler;
+ -(oneway void)disconnect;
+ -(oneway void)frameChanged:(int)selectedFrame;
+ -(oneway void)programIsRunning;
+ -(oneway void)programStopped;
+ -(oneway void)programIsDead;
+ -(oneway void)setController:(id <GdbController>)anObject;
+ -(oneway void)programIsLoaded;
+ -(BOOL)isNewUser;
+ //-(oneway void)breakpointAdded:(id <Breakpoint>)breakpoint;
+ //-(oneway void)breakpointDeleted:(id <Breakpoint>)breakpoint;
+ //-(oneway void)breakpointChanged:(id <Breakpoint>)breakpoint;
+ @end
+ 
+ #define ISPOINTER   (1 << 0)
+ #define ISENUM      (1 << 1)
+ #define ISSCALER    (1 << 2)
+ #define ISFLOAT     (1 << 3)
+ #define ISDOUBLE    (1 << 4)
+ #define ISAGGREGATE (1 << 5)
+ #define ISCHAR	    (1 << 6)
+ #define ISARRAY     (1 << 7)
+ #define ISSIGNED    (1 << 8)
+ #define ISOBJECT    (1 << 9)
+ #define ISSTRING    (1 << 10)
+ #define ISFUNC      (1 << 11)
+ 
+ @protocol PBUser
+ -(oneway void)openFile:(char *)fileName onHost:(char *)hostName atTrueLine:(int)line;
+ -(oneway void)openFile:(char *)fileName onHost:(char *)hostName fromTrueLine:(int)startLine to:(int)endLine;
+ @end
+ 
+ @interface EmacsListener:Listener <PBUser, GdbNewUser>
+    {
+    }
+ @end
+ 
+ @interface EmacsApp :Application
+    {
+    id emacsListener;
+    }
+ 
+ -(int)openFile:(char *)fileName onHost:(char *)hostName atTrueLine:(int)line;
+ -(int)openFile:(char *)fileName onHost:(char *)hostName fromTrueLine:(int)startLine to:(int)endLine;
+ -(int)app:sender openFile:(const char *) filename type:(const char *) aType;
+ -(int)app:sender openTempFile:(const char *) filename type:(const char *) aType;
+ -(BOOL)appAcceptsAnotherFile:sender;
+ 
+ -appWillInit:sender;
+ -appDidInit:sender;
+ -applicationDefined:(NXEvent *) e;
+ 
+ -menuDown:sender;
+ 
+ #if 0
+ -pasteboardChangedOwner:sender;
+ -pasteboard:sender provideData:(NXAtom)type;
+ #endif
+ @end
+ 
+ @interface EmacsView :View
+    {
+    struct frame *emacsframe;
+    char *old_title;
+    }
+ 
+ - changeFont:sender;
+ - (BOOL) acceptsFirstResponder;
+ - becomeFirstResponder;
+ - resignFirstResponder;
+ 
+ - keyDown:(NXEvent *)theEvent;
+ - mouseDown:(NXEvent *)theEvent;
+ - mouseUp:(NXEvent *)theEvent;
+ - rightMouseDown:(NXEvent *)theEvent;
+ - rightMouseUp:(NXEvent *)theEvent;
+ - mouseEntered:(NXEvent *)theEvent;
+ - mouseExited:(NXEvent *)theEvent;
+ - menuDown:sender;
+ 
+ - windowDidResize:sender;
+ - windowWillResize:sender toSize:(NXSize *)frameSize;
+ - windowWillClose:sender;
+ - windowWillMiniaturize:sender toMiniwindow:miniwindow;
+ 
+ - windowDidMove:sender;
+ - windowDidDeminiaturize:sender;
+ - windowDidExpose:sender;
+ - windowDidMiniaturize:sender;
+ - windowDidBecomeKey:sender;
+ - windowDidResignKey:sender;
+ 
+ - drawSelf:(const NXRect *)rects :(int)rectCount;
+ - initFrameFromEmacs:(struct frame *)f;
+ 
+ - validRequestorForSendType:(NXAtom)typeSent andReturnType:(NXAtom)typeReturned;
+ 
+ /* Implemented NXDraggingDestination protocol methods.  */
+ -(NXDragOperation) draggingEntered:(id <NXDraggingInfo>) sender;
+ -(BOOL)performDragOperation:(id <NXDraggingInfo>) sender;
+ @end
+ 
+ @interface EmacsMenu :Menu
+    {
+    int minmarked;
+    id supercell;
+    BOOL wasVisible;
+    }
+ 
+ - initTitle:(const char *)aTitle;
+ - addItem:(Lisp_Object)val string:(Lisp_Object)aString bind:(Lisp_Object)bind;
+ 
+ - adjustMap:(Lisp_Object)keymap;
+ - adjustKey:(Lisp_Object)key binding:(Lisp_Object)bind;
+ - adjustKey:(Lisp_Object)key binding:(Lisp_Object)bind string:(Lisp_Object)string;
+ - findCell:(Lisp_Object)value;
+ - (int)findCellNumber:(Lisp_Object)value;
+ - transferCell:(int) row to:newmenu;
+ 
+ - addCell:cell;
+ - removeCell:cell;
+ 
+ - supercell;
+ - setSupercell:(id) nsupercell;
+ 
+ - mark;
+ - freeMarked;
+ 
+ - swapin;
+ - swapout;
+ @end
+ 
+ @interface EmacsMenuCell:MenuCell
+    {
+    Lisp_Object value;
+    id supercell;
+    }
+ 
+ - initTextCell:(const char *)aString;
+ - free;
+ 
+ - (Lisp_Object)value;
+ - setValue:(Lisp_Object)nvalue;
+ - supercell;
+ - setSupercell:(id) nsupercell;
+ @end
+ 
+ #if 1
+ // this is from 4.1
+ @interface EmacsMenuCard : Button
+    {
+    PopUpList *popup;
+    }
+ -init;
+ -addTitle: (char *)name;
+ -addItem:  (char *)name value:(Lisp_Object)val enabled:(BOOL)enabled;
+ @end
+ 
+ @interface EmacsMenuPanel: Panel
+    {
+    id list;
+    int maxwidth;
+    }
+ - initFromMenu:(Lisp_Object)menu;
+ - addItem:(char *)str value:(Lisp_Object)val enabled:(BOOL)enabled at:(int)pane;
+ - addTitle:(char *)str to:(int)pane;
+ - (int)cards;
+ - (Lisp_Object)runMenuAt:(NXCoord)x:(NXCoord)y;
+ @end
+ #else
+ // this is from 4.1.2
+ @interface EmacsPopupMenu:EmacsMenu
+    {
+    }
+ - windowWillClose:sender;
+ - menuFromKeymap:sender;
+ - menuFromList:sender;
+ - addItem:(Lisp_Object)val string:(Lisp_Object)aString bind:(Lisp_Object)bind;
+ - initFromMenu:(Lisp_Object)def;
+ - (Lisp_Object)runMenuAt:(NXCoord)x:(NXCoord)y;
+ @end
+ #endif
+ 
+ @interface EmacsDialogPanel:Panel
+    {
+    id command;
+    id title;
+    id matrix;
+    int rows,cols;
+    }
+ - initFromContents:(Lisp_Object)menu;
+ - addButton:(char *)str value:(Lisp_Object)val row:(int)row;
+ - addString:(char *)str row:(int)row;
+ - addSplit;
+ - (Lisp_Object)runDialogAt:(NXCoord)x:(NXCoord)y;
+ @end
+ 
+ @interface EmacsFilePanel:SavePanel
+   {
+   BOOL allowCreate,allowOld,allowDir;
+   }
+ - setAllowCreate:(BOOL)ifAllowCreate;
+ - setAllowOld:(BOOL)ifAllowOld;
+ - setAllowDir:(BOOL)ifAllowDir;
+ @end
+ 
+ @interface EmacsScroller:Scroller
+    {
+    Lisp_Object win;
+    BOOL condemned;
+    }
+ - initFrame:(const NXRect *)r window:(Lisp_Object)win;
+ - setFrame:(const NXRect *)r;
+ - free;
+ 
+ - scrollerMoved:sender;
+ - setPosition:(int) position portion:(int) portion whole:(int) whole;
+ 
+ - condemn;
+ - reprieve;
+ - judge;
+ @end
+ 
+ extern id ns_current_display;
+ extern id ns_emacscolors;
+ extern id <Interrupt> ns_gdb_interrupt_controller;
+ extern id <GdbController> ns_gdb_controller;
+ extern int ns_use_open_panel;
+ extern int ns_use_yes_no_panel;
+ extern int ns_gdb_frame;
+ extern Lisp_Object ns_alternate_is_meta,ns_iso_latin,ns_cursor_blink_rate;
+ extern Lisp_Object ns_shrink_space;
+ extern Lisp_Object ns_gdb_status;
+ extern Lisp_Object ns_menu_path;
+ extern unsigned char *ns2isomap;
+ extern unsigned char *iso2nsmap;
+ extern NXAtom *ns_send_types,*ns_return_types;
+ extern struct frame *ns_highlight_frame;
+ extern struct frame *ns_focus_frame;
+ extern struct frame *ns_focus_event_frame;
+ #endif
+ 
+ enum ns_highlight_kinds
+    {
+    no_highlight=0,
+    filled_box,
+    hollow_box,
+    bar,
+    line
+    };
+ 
+ struct ns_display
+    {
+ #ifdef __OBJC__
+    id view;
+    id miniimage;
+    NXColor current_cursor_color;
+    NXColor desired_cursor_color;
+ #else
+    void *view;
+    void *miniimage;
+    char current_cursor_color[16];
+    char desired_cursor_color[16];
+ #endif
+    struct ns_face *face;
+    float top;
+    float left;
+    int line_height;
+    float internal_border_width;
+    float border_width, border_height;
+    enum ns_highlight_kinds current_cursor, desired_cursor;
+ 
+    /* Table of parameter faces for this frame.  Any NS resources (pixel
+       values, fonts) referred to here have been allocated explicitly
+       for this face, and should be freed if we change the face.  */
+    struct ns_face **param_faces;
+    int n_param_faces;
+ 
+    /* Table of computed faces for this frame.  These are the faces
+       whose indexes go into the upper bits of a glyph, computed by
+       combining the parameter faces specified by overlays, text
+       properties, and what have you.  The NS resources mentioned here
+       are all shared with parameter faces.  */
+    struct ns_face **computed_faces;
+    int n_computed_faces;                /* How many are valid */
+    int size_computed_faces;     /* How many are allocated */
+    };
+ 
+ /* FIXME/cl */
+ #define NS_PIXEL_WIDTH(f) ((f)->display.ns->pixel_width)
+ #define NS_PIXEL_HEIGHT(f) (ns_pixel_height (f))
+ 
+ struct ns_face
+    {
+    float width;
+    float height;
+    float descender;
+    float underpos;
+    float underwidth;
+    float size;
+    char underline;
+ #ifdef __OBJC__
+    NXAtom name;
+    id font;
+    NXColor foreground_color;
+    NXColor background_color;
+ #else
+    const char *name;
+    void *font;
+    char foreground_color[16];
+    char background_color[16];
+ #endif
+    };
+ 
+ extern int ns_new_font(), ns_load_font();
+ extern void check_ns(void);
+ extern void ns_set_frame_parameters();
+ extern void ns_display_menu_bar();
+ extern Lisp_Object ns_string_from_pasteboard();
+ extern void ns_string_to_pasteboard();
+ extern int ns_lisp_to_cursor_type();
+ extern struct frame *ns_focus_frame;
+ 
+ /* Create the first two computed faces for a frame -- the ones that
+    have GC's.  */
+ extern void ns_init_frame_faces (/* FRAME_PTR */);
+ 
+ /* Free the resources for the faces associated with a frame.  */
+ extern void ns_free_frame_faces (/* FRAME_PTR */);
+ 
+ /* Given a frame and a face name, return the face's ID number, or
+    zero if it isn't a recognized face name.  */
+ extern int ns_face_name_id_number (/* FRAME_PTR, Lisp_Object */);
+ 
+ /* Return non-zero if FONT1 and FONT2 have the same size bounding box.
+    We assume that they're both character-cell fonts.  */
+ extern int same_size_fonts (/* XFontStruct *, XFontStruct * */);
+ 
+ /* Recompute the GC's for the default and modeline faces.
+    We call this after changing frame parameters on which those GC's
+    depend.  */
+ extern void ns_recompute_basic_faces (/* FRAME_PTR */);
+ 
+ /* Return the face ID associated with a buffer position POS.  Store
+    into *ENDPTR the next position at which a different face is
+    needed.  This does not take account of glyphs that specify their
+    own face codes.  F is the frame in use for display, and W is a
+    window displaying the current buffer.
+ 
+    REGION_BEG, REGION_END delimit the region, so it can be highlighted.  */
+ extern int ns_compute_char_face (/* FRAME_PTR frame,
+                                     struct window *w,
+                                     int pos,
+                                     int region_beg, int region_end,
+                                     int *endptr */);
+ /* Return the face ID to use to display a special glyph which selects
+    FACE_CODE as the face ID, assuming that ordinarily the face would
+    be BASIC_FACE.  F is the frame.  */
+ extern int ns_compute_glyph_face (/* FRAME_PTR, int */);
+ 
+ #define BEANS 0xfabacaea
+ #define MINWIDTH 10
+ #define MINHEIGHT 10
+ 
+ #ifdef __OBJC__
+ #define XNS_SCROLL_BAR(vec) ((id) LISP_TO_VOID (vec))
+ #else
+ #define XNS_SCROLL_BAR(vec) LISP_TO_VOID (vec)
+ #endif
+ 
+ #endif
Index: emacs/src/nsterm.m
diff -c /dev/null emacs/src/nsterm.m:1.4
*** /dev/null	Fri Aug  2 21:08:09 1996
--- emacs/src/nsterm.m	Fri Aug  2 03:38:31 1996
***************
*** 0 ****
--- 1,3222 ----
+ /* NeXTstep communication module
+    Copyright (C) 1989, 1993, 1994 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 2, or (at your option)
+ any later version.
+ 
+ GNU Emacs is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+ 
+ #import <appkit/appkit.h>
+ #import <objc/Object.h>
+ #import <remote/NXProxy.h>
+ #import <machkit/NXPort.h>
+ #import <drivers/event_status_driver.h>
+ #import <mach/mach.h>
+ #import <mach/message.h>
+ #import <servers/netname.h>
+ #import <math.h>
+ 
+ #include "config.h"
+ #include "lisp.h"
+ #include "blockinput.h"
+ #include "dispextern.h"
+ #include "nsterm.h"
+ #include "systime.h"
+ 
+ #include "termhooks.h"
+ #include "termopts.h"
+ #include "termchar.h"
+ #include "gnu.h"
+ #include "frame.h"
+ #include "disptab.h"
+ #include "buffer.h"
+ #include "window.h"
+ #include "multi-frame.h"
+ 
+ #include "nswraps.h"
+ 
+ #define KEY_NS_POWER_OFF      ((1<<28)|(0<<16)|1)
+ #define KEY_NS_OPEN_FILE      ((1<<28)|(0<<16)|2)
+ #define KEY_NS_OPEN_TEMP_FILE ((1<<28)|(0<<16)|3)
+ #define KEY_NS_DRAG_FILE      ((1<<28)|(0<<16)|4)
+ #define KEY_NS_DRAG_COLOR     ((1<<28)|(0<<16)|5)
+ #define KEY_NS_DRAG_ASCII     ((1<<28)|(0<<16)|6)
+ #define KEY_NS_CHANGE_FONT    ((1<<28)|(0<<16)|7)
+ #define KEY_NS_OPEN_FILE_LINE ((1<<28)|(0<<16)|8)
+ #define KEY_NS_CHANGE_GDB     ((1<<28)|(0<<16)|9)
+ 
+ Lisp_Object ns_input_file,ns_input_font,ns_input_fontsize,ns_input_line;
+ Lisp_Object ns_input_color,ns_input_ascii;
+ 
+ int ns_gdb_frame;
+ Lisp_Object ns_gdb_status;
+ 
+ id ns_current_display=nil;
+ id ns_gdb_controller=nil,ns_gdb_interrupt_controller=nil;
+ 
+ /* Under NS, nonzero means that ns_read_file_name is executed whenever
+    read_file_name is called */
+ int ns_use_open_panel;
+ 
+ /* Under NS, nonzero means that ns_yes_or_no_p is executed whenever
+    yes_or_no_p or y_or_n_p are called */
+ int ns_use_yes_no_panel;
+ 
+ Lisp_Object ns_alternate_is_meta,ns_iso_latin,ns_cursor_blink_rate,ns_shrink_space;
+ NXAtom *ns_send_types=0,*ns_return_types=0,*ns_drag_types=0;
+ 
+ struct frame *ns_highlight_frame = 0;
+ struct frame *ns_focus_frame = 0;
+ struct frame *ns_focus_event_frame = 0;
+ 
+ static BOOL send_appdefined = NO;
+ static NXEvent last_appdefined_event;
+ static DPSTimedEntry timed_entry = 0;
+ static DPSTimedEntry cursor_blink_entry = 0;
+ static fd_set *select_readfds = 0;
+ static fd_set *select_writefds = 0;
+ static fd_set *select_exceptfds = 0;
+ static int select_nfds;
+ static int lockfocused=0;
+ static int ns_window_num=0;
+ 
+ extern void ns_free_frame_menubar ();
+ 
+ static void ns_frame_rehighlight(void);
+ static void ns_adjust_size(struct frame *f);
+ static void redraw_previous_char ();
+ static void redraw_following_char ();
+ static int fast_find_position ();
+ static void note_mouse_highlight ();
+ static void clear_mouse_face ();
+ static void show_mouse_face ();
+ 
+ static NXRect last_mouse_glyph;
+ static unsigned long last_mouse_movement_time;
+ static struct frame *last_mouse_frame = 0;
+ static int mouse_face_beg_row, mouse_face_beg_col;
+ static int mouse_face_end_row, mouse_face_end_col;
+ static int mouse_face_past_end;
+ static Lisp_Object mouse_face_window;
+ static int mouse_face_face_id;
+ static FRAME_PTR mouse_face_mouse_frame;
+ static int mouse_face_mouse_x, mouse_face_mouse_y;
+ static int mouse_face_defer;
+ static int mouse_face_deferred_gc;
+ static int disable_mouse_highlight;
+ 
+ /* Convert modifiers in a NeXTSTEP event to emacs style modifiers.  */
+ #define EV_MODIFIERS(e) \
+ ((((e)->flags & NX_HELPMASK) ? hyper_modifier : 0) \
+  |((EQ(ns_alternate_is_meta,Qt) && ((e)->flags & NX_ALTERNATEMASK)) ? meta_modifier:0) \
+  |((EQ(ns_alternate_is_meta,Qleft) && ((e)->flags & NX_ALTERNATEMASK) && ((e)->flags & NX_NEXTLALTKEYMASK)) ? meta_modifier:0) \
+  |((EQ(ns_alternate_is_meta,Qright) && ((e)->flags & NX_ALTERNATEMASK) && ((e)->flags & NX_NEXTRALTKEYMASK)) ? meta_modifier:0) \
+  |(((e)->flags & NX_SHIFTMASK) ? shift_modifier:0) \
+  |(((e)->flags & NX_CONTROLMASK) ? ctrl_modifier:0) \
+  |(((e)->flags & NX_COMMANDMASK) ? super_modifier:0))
+ 
+ #define EV_UDMODIFIERS(e) \
+ ((((e)->type == NX_LMOUSEDOWN) ? down_modifier : 0) \
+  |(((e)->type == NX_RMOUSEDOWN) ? down_modifier : 0) \
+  |(((e)->type == NX_LMOUSEDRAGGED) ? down_modifier : 0) \
+  |(((e)->type == NX_RMOUSEDRAGGED) ? down_modifier : 0) \
+  |(((e)->type == NX_LMOUSEUP)   ? up_modifier   : 0) \
+  |(((e)->type == NX_RMOUSEUP)   ? up_modifier   : 0))
+ 
+ #define EV_BUTTON(e) \
+ ((((e)->type == NX_LMOUSEDOWN) || ((e)->type == NX_LMOUSEUP)) ? 0 : \
+  (((e)->type == NX_RMOUSEDOWN) || ((e)->type == NX_RMOUSEUP)) ? 1 : 2)
+ 
+ /* Convert the time field in a NeXTSTEP event to a timestap in milliseconds.
+    XXX this is not portable to non NeXT NeXTSTEP systems yet.
+    1000/68=250/17.  Avoid over/underflow */
+ #define EV_TIMESTAMP(e) (((e)->time/17)*250)
+ 
+ /* This is a piece of code which is common to all the event handeling
+    methods.  Maybe it should even be a function.  */
+ #define EV_TRAILER(e)    \
+   { \
+   XSETFRAME (events->frame_or_window, emacsframe); \
+   events->timestamp = EV_TIMESTAMP (e); \
+   events++; \
+   eventsleft--; \
+   if (send_appdefined) ns_send_appdefined (-1); \
+   }
+ 
+ 
+ /* Screen max coordinate
+  Using larger coordinates causes movewindow/placewindow to abort */
+ #define SCREENMAX 10000
+ 
+ /* Little utility macro */
+ #define BOUND(min,x,max) (((x)<(min)) ? (min) : (((x)>(max)) ? (max) : (x)))
+ 
+ static int curs_x,curs_y,flexlines,highlight;
+ 
+ static struct input_event *events=0;
+ static int eventsleft=0;
+ 
+ extern struct frame *updating_frame;
+ 
+ static int keytypeno=0;
+ static unsigned char *keytypes=0;
+ static unsigned char **keycode=0;
+ unsigned char *ns2isomap=0;
+ unsigned char *iso2nsmap=0;
+ 
+ static void keymap_init(void)
+    {
+    unsigned char *mapping;
+ 
+    DPSSetDeadKeysEnabled (DPSGetCurrentContext (), NILP(ns_alternate_is_meta));
+ 
+       {
+       NXEventHandle handle=NXOpenEventStatus();
+       NXKeyMapping map;
+ 
+       if (!handle)
+          error ("NXOpenEventStatus: %s", strerror (errno));
+ 
+       map.size = NXKeyMappingLength(handle);
+       map.mapping = (char *) xmalloc(map.size);
+       if (!NXGetKeyMapping(handle,&map))
+          error ("NXGetKeyMapping: %s", strerror (errno));
+ 
+       NXCloseEventStatus(handle);
+       if ((map.mapping[0]!=0) || (map.mapping[1]!=0))
+          error ("Unknown keyboard map format.");
+ 
+       mapping=(unsigned char *)(map.mapping+2);
+       }
+ 
+       {
+       int i;
+       keytypeno=*mapping++;
+       keytypes=mapping;
+       for(i=0;i<keytypeno;i++)
+          mapping+=2+mapping[1];
+       }
+ 
+       {
+       int kc;
+       int kcs = *mapping++;
+ 
+       keycode=(unsigned char **) xmalloc(sizeof(*keycode)*kcs);
+ 
+       for(kc=0;kc<kcs;kc++)
+          {
+          char mask;
+          keycode[kc]=mapping;
+ 
+          if ((mask=*mapping++)!=-1)
+             {
+             int i=2;
+             while(mask)
+                {
+                if (mask&0x1) i<<=1;
+                mask>>=1;
+                }
+             mapping+=i;
+             }
+          }
+       }
+ 
+       {
+       float tmp[256];
+       int n;
+ 
+       ns2isomap=(void *) xmalloc(sizeof(*ns2isomap)*256);
+       nswrap_transtable("NextStepEncoding","ISOLatin1Encoding",tmp);
+       for (n=0;n<256;n++) ns2isomap[n]=tmp[n] ? tmp[n] : n;
+       /* Unfortunately this hack is necessary due to a bug
+          in either NextStepEncoding or ISOLatin1Encoding */
+       ns2isomap[(unsigned char) '-']=(unsigned char)'-';
+ 
+       iso2nsmap=(void *) xmalloc(sizeof(*iso2nsmap)*256);
+       nswrap_transtable("ISOLatin1Encoding","NextStepEncoding",tmp);
+       for (n=0;n<256;n++) iso2nsmap[n]=tmp[n] ? tmp[n] : n;
+       /* Unfortunately this hack is necessary due to a bug
+          in either NextStepEncoding or ISOLatin1Encoding */
+       iso2nsmap[(unsigned char) '-']=(unsigned char)'-';
+       }
+    }
+ 
+ static unsigned short char_from_key(unsigned short kc,int mod)
+    {
+    unsigned char *map=keycode[kc];
+    int pos=0;
+ 
+    if (map[0]&0x40) pos=(pos<<1) + ((mod&NX_HELPMASK)!=0);
+    if (map[0]&0x20) pos=(pos<<1) + ((mod&NX_NUMERICPADMASK)!=0);
+    if (map[0]&0x10) pos=(pos<<1) + ((mod&NX_COMMANDMASK)!=0);
+    if (map[0]&0x08) pos=(pos<<1) + ((mod&NX_ALTERNATEMASK)!=0);
+    if (map[0]&0x04) pos=(pos<<1) + ((mod&NX_CONTROLMASK)!=0);
+    if (map[0]&0x02) pos=(pos<<1) + ((mod&NX_SHIFTMASK)!=0);
+    if (map[0]&0x01) pos=(pos<<1) + ((mod&NX_ALPHASHIFTMASK)!=0);
+ 
+    return /* (map[1+pos*2]<<8) + */ map[2+pos*2];
+    }
+ 
+ static BOOL char_is_type(unsigned short kc,int mod)
+    {
+    unsigned char *m,*n;
+    int t,i;
+    for(mod >>= 16,t=-1;mod;t++,mod>>=1);
+    if (t==-1) return NO;
+    for(i=0,m=keytypes;i<keytypeno;i++,m+=2+m[1])
+       if (m[0]==t) break;
+    if (i>=keytypeno) return NO;
+    for(i=0,n=m+2;n<m+2+m[1];n++) if (*n==kc) return YES;
+    return NO;
+    }
+ 
+ void ns_chars_to_rect(struct frame *f,int x1,int y1,int x2,int y2, NXRect *r)
+    {
+    r->origin.x=x1*f->display.ns->face->width;
+    r->origin.y=y1*f->display.ns->line_height;
+    r->size.width=(x2-x1+1)*f->display.ns->face->width;
+    r->size.height=(y2-y1+1)*f->display.ns->line_height;
+    }
+ 
+ /* Given a pixel position P on the frame F, return glyph co-ordinates in
+    (*X, *Y). */
+ void ns_pixel_to_glyph_coords (struct frame *f, int px, int py,
+                                int *x, int *y, void *bounds, int noclip)
+    {
+    *x=(f->display.ns->face->width <=0)
+             ? 0 : floor(((float)px) / f->display.ns->face->width);
+    *y=(f->display.ns->line_height<=0)
+             ? 0 : floor(((float)py) / f->display.ns->line_height);
+ 
+    if (bounds)
+       abort();
+ 
+    if (!noclip)
+       {
+       *x = BOUND(0,*x,f->width);
+       *y = BOUND(0,*y,f->height);
+       }
+    }
+ 
+ void ns_glyph_to_pixel_coords(struct frame *f,int x,int y,int *pix_x,int *pix_y)
+    {
+    *pix_x=(int)rint(x*f->display.ns->face->width);
+    *pix_y=(int)rint(y*f->display.ns->line_height);
+    }
+ 
+ static void ns_rect_to_glyph_coords(struct frame *f, NXRect *r,int maximize,
+                                      int *x, int *y, int *cols, int *rows)
+    {
+    if (f->display.ns->face->width<=0)
+       {
+       *x=0;
+       *cols=f->width;
+       }
+    else if (maximize)
+       {
+       *x=floor(r->origin.x/f->display.ns->face->width+0.001);
+       *cols=ceil((r->origin.x+r->size.width)/f->display.ns->face->width-0.001);
+       }
+    else
+       {
+       *x=ceil(r->origin.x/f->display.ns->face->width-0.001);
+       *cols=floor((r->origin.x+r->size.width)/f->display.ns->face->width+0.001);
+       }
+ 
+    if (f->display.ns->line_height<=0)
+       {
+       *y=0;
+       *rows=f->height;
+       }
+    else if (maximize)
+       {
+       *y=floor(r->origin.y/f->display.ns->line_height+0.001);
+       *rows=ceil((r->origin.y+r->size.height)/f->display.ns->line_height-0.001);
+       }
+    else
+       {
+       *y=ceil(r->origin.y/f->display.ns->line_height-0.001);
+       *rows=floor((r->origin.y+r->size.height)/f->display.ns->line_height+0.001);
+       }
+ 
+    *cols=*cols-*x;
+    *rows=*rows-*y;
+    }
+ 
+ void ns_focus_on_frame (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+ /*   [[view window] makeKeyAndOrderFront:NXApp]; */
+    }
+ 
+ void ns_unfocus_frame (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+ /*   [[view window] orderBack:NXApp]; */ /* XXX unfocus ! */
+    }
+ 
+ void ns_raise_frame (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+    [[view window] orderFront:NXApp];
+    }
+ 
+ void ns_lower_frame (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+    [[view window] orderBack:NXApp];
+    }
+ 
+ void ns_make_frame_visible (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+    [[view window] orderFront:NXApp];
+    }
+ 
+ void ns_make_frame_invisible (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+    [[view window] orderOut:NXApp];
+    }
+ 
+ void ns_iconify_frame (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+    [[view window] miniaturize:NXApp];
+    }
+ 
+ void ns_destroy_window (struct frame *f)
+    {
+    id view=f->display.ns->view;
+    check_ns();
+    if (f==ns_focus_frame)
+       ns_focus_frame=0;
+    if (f==ns_highlight_frame)
+       ns_highlight_frame=0;
+    if (f == mouse_face_mouse_frame)
+       {
+       mouse_face_beg_row = mouse_face_beg_col = -1;
+       mouse_face_end_row = mouse_face_end_col = -1;
+       mouse_face_window = Qnil;
+       }
+    xfree (f->display.ns->face);
+    xfree (f->display.ns);
+    [[view window] close];
+    ns_window_num--;
+ 
+ #if 0
+       {
+       Lisp_Object rest;
+       struct frame *f;
+       
+       for (rest=Vframe_list; CONSP(rest); rest=XCONS(rest)->cdr)
+          if (FRAME_NS_P(f=XFRAME(XCONS(rest)->car)))
+             [[f->display.ns->view window] setCloseButton:NXApp to:(ns_window_num>1)];
+       }
+ #endif
+    }
+ 
+ int ns_get_color (const char *name, NXColor *col)
+    {
+    NXColor new;
+    id colorlistlist=[NXColorList availableColorLists];
+    int n=[colorlistlist count],i,finished=0;
+    unsigned int t1,t2;
+    const char *c;
+ 
+    if (name[0]=='R' && name[1]=='G' && name[2]=='B')
+       {
+       for(t1=t2=0,c=name+3;1;c++)
+          {
+          if (*c>='0' && *c<='9')      t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-'0';
+          else if (*c>='a' && *c<='f') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('a'-10);
+          else if (*c>='A' && *c<='F') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('A'-10);
+          else break;
+          }
+       if ((*c=='\0') && (t2==0))
+          {
+          *col=NXConvertRGBAToColor(((t1>>24)&0xff)/255.0,((t1>>16)&0xff)/255.0,
+                                    ((t1>> 8)&0xff)/255.0,(t1&0xff)/255.0);
+          return 0;
+          }
+       }
+ 
+    if (name[0]=='H' && name[1]=='S' && name[2]=='B')
+       {
+       for(t1=t2=0,c=name+3;1;c++)
+          {
+          if (*c>='0' && *c<='9')      t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-'0';
+          else if (*c>='a' && *c<='f') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('a'-10);
+          else if (*c>='A' && *c<='F') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('A'-10);
+          else break;
+          }
+       if ((*c=='\0') && (t2==0))
+          {
+          *col=NXConvertHSBAToColor(((t1>>24)&0xff)/255.0,((t1>>16)&0xff)/255.0,
+                                    ((t1>> 8)&0xff)/255.0,(t1&0xff)/255.0);
+          return 0;
+          }
+       }
+ 
+    if (name[0]=='G' && name[1]=='R' && name[2]=='A' && name[3]=='Y')
+       {
+       for(t1=t2=0,c=name+4;1;c++)
+          {
+          if (*c>='0' && *c<='9')      t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-'0';
+          else if (*c>='a' && *c<='f') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('a'-10);
+          else if (*c>='A' && *c<='F') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('A'-10);
+          else break;
+          }
+       if ((*c=='\0') && (t1>>16==0) && (t2==0))
+          {
+          *col=NXConvertGrayAlphaToColor(((t1>>8)&0xff)/255.0,(t1&0xff)/255.0);
+          return 0;
+          }
+       }
+ 
+    if (name[0]=='C' && name[1]=='M' && name[2]=='Y' && name[3]=='K')
+       {
+       for(t1=t2=0,c=name+4;1;c++)
+          {
+          if (*c>='0' && *c<='9')      t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-'0';
+          else if (*c>='a' && *c<='f') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('a'-10);
+          else if (*c>='A' && *c<='F') t2=16*t2+((t1>>28)&0xff),t1=16*t1+*c-('A'-10);
+          else break;
+          }
+       if ((*c=='\0') && (t2>>8==0))
+          {
+          *col=NXConvertCMYKAToColor((t2&0xff)/255.0,((t1>>24)&0xff)/255.0,
+                                     ((t1>>16)&0xff)/255.0,((t1>> 8)&0xff)/255.0,
+                                     (t1&0xff)/255.0);
+          return 0;
+          }
+       }
+ 
+    for(i=0;!finished && (i<n);i++)
+       {
+       finished=1;
+       NX_DURING
+          if (i<n)
+             new=[[colorlistlist objectAt:i] colorNamed:name];
+       NX_HANDLER
+          switch (NXLocalHandler.code)
+             {
+           case NX_colorUnknown:
+             finished=0;
+             break;
+           default:
+             NX_RERAISE();
+             }
+       NX_ENDHANDLER
+       }
+ 
+    if (finished) *col=new;
+    return !finished;
+    }
+ 
+ NXColor ns_get_color_default (const char *name, NXColor dflt)
+    {
+    NXColor col;
+ 
+    if (ns_get_color(name, &col))
+       return dflt;
+    else
+       return col;
+    }
+ 
+ int ns_lisp_to_color (Lisp_Object color, NXColor *col)
+    {
+    if (XTYPE(color) == Lisp_String)
+       return ns_get_color (XSTRING(color)->data, col);
+    else if (XTYPE(color) == Lisp_Symbol)
+       return ns_get_color (XSYMBOL(color)->name->data, col);
+    return 1;
+    }
+ 
+ Lisp_Object ns_color_to_lisp (NXColor col)
+    {
+    float red,green,blue,alpha,gray;
+    char buf[1024];
+    const char *str;
+ 
+    if (str=NXColorName(col))
+       return build_string(str);
+    
+    NXConvertColorToRGBA(col,&red,&green,&blue,&alpha);
+    if (red==green && red==blue)
+       {
+       NXConvertColorToGrayAlpha(col,&gray,&alpha);
+       sprintf(buf,"GRAY%02.2x%02.2x",(int)rint(gray*0xff),(int)rint(alpha*0xff));
+       return build_string(buf);
+       }
+ 
+    sprintf(buf,"RGB%02.2x%02.2x%02.2x%02.2x",(int)rint(red*0xff),
+            (int)rint(green*0xff),(int)rint(blue*0xff),(int)rint(alpha*0xff));
+    return build_string(buf);
+    }
+ 
+ /* If hl==-1, write out buffer unconditionally
+       hl== 0, add glyphs described by glyphs, len
+       hl== 1, add glyphs described by glyphs, len in face=1
+       hl== 2, clear region described by len, x, y
+       hl== 3, add glyphs described by glyphs, len in face=mouse_face_face_id */
+ 
+ void ns_dumpglyphs(struct frame *nf,int x,int y, GLYPH *glyphs,int len,int hl)
+    {
+    static int faceid=-1,no=0;
+    static struct frame *f=0;
+    static NXRect r[256];
+    static unsigned int l[256];
+    static unsigned char *t[256];
+    static unsigned char buf[4096];
+    static unsigned char *p=buf;
+    int tlen = GLYPH_TABLE_LENGTH;
+    Lisp_Object *tbase = GLYPH_TABLE_BASE;
+    int nfaceid,g;
+ 
+  start:
+    switch(hl)
+       {
+     case -1:
+       if (no==0) return;
+       nfaceid=-1;
+       break;
+     case 0:
+       g=*glyphs;
+       GLYPH_FOLLOW_ALIASES (GLYPH_TABLE_BASE, GLYPH_TABLE_LENGTH, g);
+       nfaceid=FAST_GLYPH_FACE(g);
+       break;
+     case 1:
+       nfaceid=1;
+       break;
+     case 2:
+       nfaceid=0;
+       break;
+     case 3:
+       nfaceid=mouse_face_face_id;
+       break;
+       }
+ 
+    if ((no>0)&&
+        ((nf!=f) || (nfaceid!=faceid) || (no>=sizeof(t)/sizeof(t[0])) ||
+         (p+len-buf>=sizeof(buf)/sizeof(buf[0]))))
+       {
+       id view=f->display.ns->view;
+       int i;
+       struct ns_face *face;
+ 
+       face=f->display.ns->computed_faces[((faceid<-1)||
+                                           (faceid>=f->display.ns->n_computed_faces)||
+                                           (f->display.ns->computed_faces[faceid]==0))
+                                          ? 0 : faceid];
+ 
+       if (f!=updating_frame || !lockfocused)
+          {
+          [view lockFocus];
+          if (f==updating_frame) lockfocused=1;
+          }
+ 
+       NXSetColor(face->background_color);
+       NXRectFillList(r,no);
+       NXSetColor(face->foreground_color);
+       if (face->font==0) ns_load_font(face);
+       [face->font set];
+       for(i=0;i<no;i++) if (l[i]>0)
+          nswrap_moveshow(r[i].origin.x,r[i].origin.y+f->display.ns->line_height
+                          -face->descender,t[i],l[i]);
+       if (face->underline)
+          {
+          PSsetlinewidth(face->underwidth);
+          for(i=0;i<no;i++) if (l[i]>0)
+             nswrap_moveline(r[i].origin.x,r[i].origin.y+f->display.ns->line_height
+                             -face->underpos,floor(r[i].size.width-1));
+          PSstroke();
+          }
+       if (f!=updating_frame)
+          {
+          [view unlockFocus];
+          [[view window] flushWindow];
+          DPSFlush();
+          }
+       no=0;
+       }
+ 
+    if (no==0)
+       {
+       p=buf;
+       faceid=nfaceid;
+       f=nf;
+       }
+ 
+    switch(hl)
+       {
+     case -1:
+       break;
+     case  0:
+       for(t[no]=p;(len>0);len--)
+          {
+          g=*glyphs;
+          GLYPH_FOLLOW_ALIASES (GLYPH_TABLE_BASE, GLYPH_TABLE_LENGTH, g);
+          if (FAST_GLYPH_FACE(g)!=nfaceid) break;
+          *p=FAST_GLYPH_CHAR(g); *glyphs++;
+          if (!NILP(ns_iso_latin)) *p=iso2nsmap[*p];
+          p++;
+          }
+       ns_chars_to_rect(f,x,y,x+(p-t[no])-1,y,&r[no]);
+       l[no]=p-t[no];
+       x+=l[no];
+       no++;
+       break;
+     case 1:
+       for(t[no]=p;len>0;len--)
+          {
+          g=*glyphs;
+          GLYPH_FOLLOW_ALIASES (GLYPH_TABLE_BASE, GLYPH_TABLE_LENGTH, g);
+          *p=FAST_GLYPH_CHAR(g); glyphs++;
+          if (!NILP(ns_iso_latin)) *p=iso2nsmap[*p];
+          p++;
+          }
+       ns_chars_to_rect(f,x,y,x+(p-t[no])-1,y,&r[no]);
+       l[no]=p-t[no];
+       x+=l[no];
+       no++;
+       break;
+     case 2:
+       ns_chars_to_rect(f,x,y,x+len-1,y,&r[no]);
+       t[no]=p;
+       l[no]=0;
+       len=0;
+       no++;
+       break;
+     case 3:
+       for(t[no]=p;len>0;len--)
+          {
+          g=*glyphs;
+          GLYPH_FOLLOW_ALIASES (GLYPH_TABLE_BASE, GLYPH_TABLE_LENGTH, g);
+          *p=FAST_GLYPH_CHAR(g); glyphs++;
+          if (!NILP(ns_iso_latin)) *p=iso2nsmap[*p];
+          p++;
+          }
+       ns_chars_to_rect(f,x,y,x+(p-t[no])-1,y,&r[no]);
+       l[no]=p-t[no];
+       x+=l[no];
+       no++;
+       break;
+       }
+ 
+    if (len>0) goto start;
+    }
+ 
+ void ns_dumpcursor(struct frame *f,int nx,int ny)
+    {
+    NXRect r,s;
+    id view=f->display.ns->view;
+ 
+    if (f->phys_cursor_x==nx && f->phys_cursor_y == ny &&
+        f->display.ns->current_cursor==f->display.ns->desired_cursor &&
+        NXEqualColor(f->display.ns->current_cursor_color,
+                     f->display.ns->desired_cursor_color))
+       return;
+ 
+    if (f!=updating_frame || !lockfocused)
+       {
+       [view lockFocus];
+       if (f==updating_frame) lockfocused=1;
+       }
+ 
+    if (f->phys_cursor_x >= 0 && f->phys_cursor_x < f->width &&
+        f->phys_cursor_y >= 0 && f->phys_cursor_y < f->height)
+       {
+       ns_chars_to_rect(f,f->phys_cursor_x,f->phys_cursor_y,
+                        f->phys_cursor_x,f->phys_cursor_y,&r);
+       if (NXEqualColor(f->display.ns->current_cursor_color,NX_COLORCLEAR))
+          {
+          switch(f->display.ns->current_cursor)
+             {
+           case no_highlight:
+             break;
+           case filled_box:
+             NXHighlightRect(&r);
+             break;
+           case hollow_box:
+             s=r;
+             NXHighlightRect(&s);
+             s.size.width-=2;
+             s.size.height-=2;
+             s.origin.x+=1;
+             s.origin.y+=1;
+             NXHighlightRect(&s);
+             break;
+           case bar:
+             s=r;
+             s.origin.y += 0.75 * s.size.height;
+             s.size.height *= 0.25;
+             NXHighlightRect(&s);
+             break;
+           case line:
+             s=r;
+             s.size.width = 2;
+             NXHighlightRect(&s);
+             break;
+             }
+          }
+       else
+          {
+          struct ns_face *face=f->display.ns->computed_faces[FAST_GLYPH_FACE(f->phys_cursor_glyph)];
+          unsigned char c=FAST_GLYPH_CHAR(f->phys_cursor_glyph);
+ 
+          NXSetColor(face->background_color);
+          NXRectFill(&r);
+          NXSetColor(face->foreground_color);
+          if (face->font==0) ns_load_font(face);
+          [face->font set];
+          if (!NILP(ns_iso_latin)) c=iso2nsmap[c];
+          nswrap_moveshow(r.origin.x,r.origin.y+f->display.ns->line_height
+                          -face->descender,&c,1);
+          if (face->underline)
+             {
+             PSsetlinewidth(face->underwidth);
+             nswrap_moveline(r.origin.x,r.origin.y+f->display.ns->line_height
+                             -face->underpos,r.size.width-1);
+             PSstroke();
+             }
+          }
+       }
+ 
+    f->phys_cursor_x = nx;
+    f->phys_cursor_y = ny;
+    f->display.ns->current_cursor = f->display.ns->desired_cursor;
+    f->display.ns->current_cursor_color = f->display.ns->desired_cursor_color;
+ 
+    if (f->phys_cursor_x >= 0 && f->phys_cursor_x < f->width &&
+        f->phys_cursor_y >= 0 && f->phys_cursor_y < f->height)
+       {
+       ns_chars_to_rect(f,f->phys_cursor_x,f->phys_cursor_y,
+                        f->phys_cursor_x,f->phys_cursor_y,&r);
+       if (NXEqualColor(f->display.ns->current_cursor_color,NX_COLORCLEAR))
+          {
+          switch(f->display.ns->current_cursor)
+             {
+           case no_highlight:
+             break;
+           case filled_box:
+             NXHighlightRect(&r);
+             break;
+           case hollow_box:
+             s=r;
+             NXHighlightRect(&s);
+             s.size.width-=2;
+             s.size.height-=2;
+             s.origin.x+=1;
+             s.origin.y+=1;
+             NXHighlightRect(&s);
+             break;
+           case bar:
+             s=r;
+             s.origin.y += 0.75 * s.size.height;
+             s.size.height *= 0.25;
+             NXHighlightRect(&s);
+             break;
+           case line:
+             s=r;
+             s.size.width = 2;
+             NXHighlightRect(&s);
+             break;
+             }
+          }
+       else
+          {
+          struct frame_glyphs *current_glyphs = FRAME_CURRENT_GLYPHS (f);
+          struct ns_face *face;
+          unsigned char c;
+ 
+          f->phys_cursor_glyph
+             = ((current_glyphs->enable[f->phys_cursor_y]
+                 && f->phys_cursor_x < current_glyphs->used[f->phys_cursor_y])
+                ? current_glyphs->glyphs[f->phys_cursor_y][f->phys_cursor_x]
+                : SPACEGLYPH);
+          face=f->display.ns->computed_faces[FAST_GLYPH_FACE(f->phys_cursor_glyph)];
+          c=FAST_GLYPH_CHAR(f->phys_cursor_glyph);
+ 
+          NXSetColor(face->background_color);
+          NXRectFill(&r);
+          NXSetColor(f->display.ns->current_cursor_color);
+          switch(f->display.ns->current_cursor)
+             {
+           case no_highlight:
+             break;
+           case filled_box:
+             NXRectFill(&r);
+             break;
+           case hollow_box:
+             NXFrameRect(&r);
+             break;
+           case bar:
+             s=r;
+             s.origin.y += 0.75 * s.size.height;
+             s.size.height *= 0.25;
+             NXRectFill(&s);
+             break;
+           case line:
+             s=r;
+             s.size.width = 2;
+             NXRectFill(&s);
+             break;
+             }
+ 	 if (NXEqualColor(f->display.ns->current_cursor_color,
+                           face->foreground_color))
+             NXSetColor(face->background_color);
+ 	 else
+             NXSetColor(face->foreground_color);
+ 
+          if (face->font==0) ns_load_font(face);
+          [face->font set];
+ 
+          if (!NILP(ns_iso_latin)) c=iso2nsmap[c];
+          nswrap_moveshow(r.origin.x,r.origin.y+f->display.ns->line_height
+                          -face->descender,&c,1);
+          if (face->underline)
+             {
+             PSsetlinewidth(face->underwidth);
+             nswrap_moveline(r.origin.x,r.origin.y+f->display.ns->line_height
+                             -face->underpos,r.size.width-1);
+             PSstroke();
+             }
+          }
+       }
+ 
+    if (f!=updating_frame)
+       {
+       [view unlockFocus];
+       [[view window] flushWindow];
+       DPSFlush();
+       }
+    }
+ 
+ static int ns_cursor_to(int row, int col)
+    {
+    struct frame *f=(updating_frame ? updating_frame : selected_frame);
+    id view=f->display.ns->view;
+ 
+    curs_x = col;
+    curs_y = row;
+ 
+    if (f!=updating_frame)
+       {
+       ns_dumpglyphs(f,0,0,0,0,-1);
+       ns_dumpcursor(f,curs_x,curs_y);
+       }
+ 
+    return 0;
+    }
+ 
+ void ns_set_offset (struct frame *f, int xoff, int yoff, int change_grav)
+    {
+    const NXScreen *screen;
+    id view=f->display.ns->view;
+    f->display.ns->left=xoff;
+    f->display.ns->top=yoff;
+    if (view != nil && (screen=[[view window] screen])!=0)
+       [[view window] moveTopLeftTo:f->display.ns->left
+                                   :screen->screenBounds.size.height
+                                    -f->display.ns->top];
+    }
+ 
+ 
+ static void ns_reset_clip(id view)
+    {
+    int i;
+    id sv,v;
+    NXRect r,s;
+ 
+    [view lockFocus];
+    PSinitclip();
+    PSnewpath();
+    [view getBounds:&r];
+    nswrap_rect(r.origin.x,r.origin.y,r.size.width,r.size.height);
+ 
+    if (sv=[[view superview] subviews]) for(i=[sv count]-1;i>=0;i--)
+       {
+       v=[sv objectAt:i];
+       if (v==view) continue;
+       [v getFrame:&s];
+       [view convertRectFromSuperview:&s];
+       if (!NXIntersectionRect(&r,&s)) continue;
+       if (s.origin.y==0)
+          {
+          s.origin.y-=1;
+          s.size.height+=1;
+          }
+       nswrap_rect_rev(s.origin.x,s.origin.y,s.size.width,s.size.height);
+       }
+ 
+    PSclip();
+    PSnewpath();
+    PSgstate();
+    DPSDefineUserObject([view gState]);
+    [view unlockFocus];
+    }
+ 
+ static void ns_adjust_size(struct frame *f)
+    {
+    int x, y, rows, cols;
+    id view=f->display.ns->view;
+    id win=[view window];
+    NXRect r;
+ 
+    [win invalidateCursorRectsForView:view];
+    [win discardTrackingRect:0];
+    [win getFrame:&r];
+    r.origin.x=r.origin.y=0;
+    [win setTrackingRect:&r inside:NO owner:view tag:0 left:NO right:NO];
+    ns_reset_clip(view);
+    [view getBounds:&r];
+    ns_rect_to_glyph_coords(f,&r,0,&x,&y,&cols,&rows);
+    change_frame_size (f, rows, cols, 0, 1);
+    SET_FRAME_GARBAGED (f);
+    }
+ 
+ void ns_set_window_size (struct frame *f, int change_grav, int cols, int rows)
+    {
+    id view=f->display.ns->view;
+    id window;
+    int vbextra=FRAME_HAS_VERTICAL_SCROLL_BARS(f) ?
+                rint(FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0
+                     ? FRAME_SCROLL_BAR_PIXEL_WIDTH (f)
+                     : (FRAME_SCROLL_BAR_COLS (f)
+                        *f->display.ns->face->width)) : 0;
+    const NXScreen *screen;
+    NXRect r,wr;
+ 
+    if (view!=nil)
+       {
+       window=[view window];
+       screen=[window screen];
+       [view getFrame:&r];
+       [window getFrame:&wr];
+ 
+       ns_dumpcursor(f,-1,-1);
+ 
+       r.origin.x=f->display.ns->internal_border_width;
+       r.origin.y=f->display.ns->internal_border_width;
+       r.size.width =wr.size.width -(f->display.ns->internal_border_width*2+
+                                     f->display.ns->border_width) - vbextra;
+       r.size.height=wr.size.height-(f->display.ns->internal_border_width*2+
+                                     f->display.ns->border_height);
+       [view setFrame:&r];
+ 
+       wr.size.width +=cols*f->display.ns->face->width-r.size.width;
+       wr.size.height+=rows*f->display.ns->line_height-r.size.height;
+ 
+       if (screen)
+          {
+          wr.origin.x=f->display.ns->left;
+          wr.origin.y=screen->screenBounds.size.height-(f->display.ns->top
+                                                        +wr.size.height);
+          }
+ 
+       wr.origin.x=BOUND(-SCREENMAX,wr.origin.x,SCREENMAX);
+       wr.origin.y=BOUND(-SCREENMAX,wr.origin.y,SCREENMAX);
+       [window placeWindow:&wr];
+ 
+       ns_adjust_size(f);
+       }
+    else
+       {
+       change_frame_size(f, rows, cols, 0, 0);
+       SET_FRAME_GARBAGED(f);
+       }
+    }
+ 
+ void ns_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
+    {
+    id view=f->display.ns->view;
+ 
+    ns_raise_frame(f);
+    [view lockFocus];
+    PSsetmouse((float)pix_x,(float)pix_y);
+    [view unlockFocus];
+    DPSFlush();
+    }
+ 
+ int ns_set_mouse_position (struct frame *f, int x, int y)
+    {
+    NXRect r;
+ 
+    ns_chars_to_rect(f,x,y,x,y,&r);
+    ns_set_mouse_pixel_position(f,r.origin.x+r.size.width/2,
+                                r.origin.y+r.size.height/2);
+    return 0;
+    }
+ 
+ /* Take proper action when the mouse has moved to position X, Y on frame F
+    as regards highlighting characters that have mouse-face properties.
+    Also dehighlighting chars where the mouse was before.  */
+ 
+ static void note_mouse_highlight (struct frame *f, int x, int y)
+    {
+    /* XXX */
+    }
+ 
+ static void show_mouse_face (int hl)
+    {
+    /* XXX */
+    }
+ 
+ static void clear_mouse_face (void)
+    {
+    /* XXX */
+    }
+ 
+ int ns_new_font (struct frame *f)
+    {
+    struct ns_face face;
+    NXColor col;
+    Lisp_Object tem;
+ 
+    tem=get_frame_param(f, Qfont);
+    CHECK_STRING(tem, 0);
+    face.name=NXUniqueString(XSTRING(tem)->data);
+ 
+    tem=get_frame_param(f, Qfontsize);
+    CHECK_NUMBER_OR_FLOAT(tem, 0);
+    face.size=XFLOATINT(tem);
+ 
+    tem=get_frame_param(f, Qforeground_color);
+    if (NILP(tem) || ns_lisp_to_color(tem,&col))
+       face.foreground_color=NX_COLORBLACK;
+    else
+       face.foreground_color=col;
+ 
+    tem=get_frame_param(f, Qbackground_color);
+    if (NILP(tem) || ns_lisp_to_color(tem,&col))
+       face.background_color=NX_COLORWHITE;
+    else
+       face.background_color=col;
+ 
+    tem=get_frame_param(f, Qunderline);
+    if (NILP(tem))
+       face.underline=0;
+    else
+       face.underline=1;
+ 
+    if (ns_load_font(&face))
+       return 1;
+ 
+    *f->display.ns->face=face;
+ 
+   /* Compute the scroll bar width in character columns.  */
+   if (f->scroll_bar_pixel_width > 0)
+     {
+       int wid = face.width;
+       f->scroll_bar_cols = (f->scroll_bar_pixel_width + wid-1) / wid;
+     }
+   else
+     f->scroll_bar_cols = 2;
+       
+    ns_frame_update_line_height(f);
+    ns_set_window_size(f, 0, f->width, f->height);
+    return 0;
+    }
+ 
+ static int ns_clear_frame(void)
+    {
+    struct frame *f=(updating_frame ? updating_frame : selected_frame);
+    id view=f->display.ns->view;
+    int i;
+    NXRect r;
+ 
+    if (f!=updating_frame || !lockfocused)
+       {
+       [view lockFocus];
+       if (f==updating_frame) lockfocused=1;
+       }
+ 
+    ns_dumpcursor(f,-1,-1);
+    curs_x=curs_y=0;
+ 
+    [[view window] display];
+ 
+    if (f!=updating_frame)
+       {
+       ns_dumpcursor (f,f->cursor_x,f->cursor_y);
+       [view unlockFocus];
+       [[view window] flushWindow];
+       DPSFlush();
+       }
+    return 0;
+    }
+ 
+ static int ns_clear_end_of_line(int first_unused)
+    {
+    struct frame *f=(updating_frame ? updating_frame : selected_frame);
+    id view=f->display.ns->view;
+    NXRect r;
+ 
+    if (curs_y < 0 || curs_y >= f->height) return 0;
+    if (first_unused <= 0) return 0;
+    if (first_unused > f->width) first_unused = f->width;
+ 
+    if (curs_y == f->phys_cursor_y &&
+        curs_x <= f->phys_cursor_x && f->phys_cursor_x < first_unused)
+       ns_dumpcursor(f,-1,-1);
+    ns_dumpglyphs(f,curs_x,curs_y,0,first_unused-curs_x,2);
+ 
+    if (f!=updating_frame)
+       {
+       ns_dumpglyphs(f,0,0,0,0,-1);
+       ns_dumpcursor(f,f->cursor_x,f->cursor_y);
+       }
+    return 0;
+    }
+ 
+ static int ns_ins_del_lines(int vpos, int n)
+    {
+    struct frame *f=(updating_frame ? updating_frame : selected_frame);
+    id view=f->display.ns->view;
+    int height;
+    NXPoint p;
+    NXRect r,s;
+ 
+    curs_x = 0;
+    curs_y = vpos;
+ 
+    if (curs_y >= flexlines) return 0;
+ 
+    if (n>0)
+       {
+       height=f->display.ns->line_height*n;
+       ns_chars_to_rect(f,curs_x,curs_y,f->width-1,flexlines-1,&r);
+       s=r;
+       p=r.origin;
+ 
+       r.size.height-=height;
+       p.y          +=height;
+       s.size.height =height;
+       }
+    else if (n<0)
+       {
+       height=f->display.ns->line_height*(-n);
+       ns_chars_to_rect(f,curs_x,curs_y,f->width-1,flexlines-1,&r);
+       s=r;
+       p=r.origin;
+ 
+       r.size.height-=height;
+       r.origin.y   +=height;
+       s.origin.y    =s.origin.y+s.size.height-height;
+       s.size.height =height;
+       }
+ 
+    if (f!=updating_frame || !lockfocused)
+       {
+       [view lockFocus];
+       if (f==updating_frame) lockfocused=1;
+       }
+ 
+    ns_dumpcursor(f,-1,-1);
+    if (r.size.height>0) NXCopyBits(NXNullObject,&r,&p);
+ 
+    if (s.size.height>0)
+       {
+       NXSetColor(f->display.ns->face->background_color);
+       NXRectFill(&s);
+       }
+ 
+    if (f!=updating_frame)
+       {
+       ns_dumpcursor(f,f->cursor_x,f->cursor_y);
+       [view unlockFocus];
+       [[view window] flushWindow];
+       DPSFlush();
+       }
+ 
+    return 0;
+    }
+ 
+ static int ns_change_line_highlight(int new_highlight, int vpos,
+                                      int first_unused_hpos)
+    {
+    highlight = new_highlight;
+    curs_x = 0;
+    curs_y = vpos;
+    ns_clear_end_of_line (updating_frame->width);
+    return 0;
+    }
+ 
+ static int ns_insert_glyphs(GLYPH *start, int len)
+    {
+    abort();
+    return 0;
+    }
+ 
+ static int ns_write_glyphs(GLYPH *start, int len)
+    {
+    struct frame *f=(updating_frame ? updating_frame : selected_frame);
+ 
+    if (f!=updating_frame)
+       {
+       curs_x = f->cursor_x;
+       curs_y = f->cursor_y;
+       }
+ 
+    if (curs_y == f->phys_cursor_y && curs_x <= f->phys_cursor_x
+        && curs_x + len > f->phys_cursor_x)
+       ns_dumpcursor(f,-1,-1);
+    ns_dumpglyphs(f,curs_x,curs_y,start,len,highlight);
+ 
+    if (f!=updating_frame)
+       {
+       ns_dumpglyphs(f,0,0,0,0,-1);
+       ns_dumpcursor(f,f->cursor_x+len,f->cursor_y);
+       }
+    else
+       curs_x += len;
+ 
+    return 0;
+    }
+ 
+ static int ns_delete_glyphs(GLYPH *start,int len)
+    {
+    abort();
+    return 0;
+    }
+ 
+ static int ns_ring_bell(void)
+    {
+    NXBeep();
+    return 0;
+    }
+ 
+ static int ns_reset_terminal_modes(void)
+    {
+    return 0;
+    }
+ 
+ static int ns_set_terminal_modes(void)
+    {
+    return 0;
+    }
+ 
+ static int ns_update_begin(struct frame *f)
+    {
+    flexlines = f->height;
+    highlight = 0;
+    lockfocused=0;
+    if (f == mouse_face_mouse_frame)
+       {
+       /* Don't do highlighting for mouse motion during the update.  */
+       mouse_face_defer = 1;
+       if (!NILP (mouse_face_window))
+          {
+          int firstline, lastline, i;
+          struct window *w = XWINDOW (mouse_face_window);
+ 
+          /* Find the first, and the last+1, lines affected by redisplay.  */
+          for (firstline = 0; firstline < f->height; firstline++)
+ 	    if (FRAME_DESIRED_GLYPHS (f)->enable[firstline])
+                break;
+ 
+          lastline = f->height;
+          for (i = f->height - 1; i >= 0; i--)
+ 	    {
+             if (FRAME_DESIRED_GLYPHS (f)->enable[i])
+                break;
+             else
+                lastline = i;
+ 	    }
+ 
+          /* Can we tell that this update does not affect the window
+             where the mouse highlight is?  If so, no need to turn off.  */
+          if (! (firstline > (XFASTINT (w->top) + window_internal_height (w))
+                 || lastline < XFASTINT (w->top)))
+ 	    /* Otherwise turn off the mouse highlight now.  */
+ 	    clear_mouse_face ();
+          }
+       }
+    return 0;
+    }
+ 
+ static int ns_update_end(struct frame *f)
+    {
+    ns_dumpglyphs(f,0,0,0,0,-1);
+    ns_dumpcursor(f,curs_x,curs_y);
+    if (lockfocused)
+       {
+       id view=f->display.ns->view;
+       [view unlockFocus];
+       [[view window] flushWindow];
+       DPSFlush();
+       lockfocused=0;
+       }
+    return 0;
+    }
+ 
+ static int ns_frame_up_to_date(struct frame *f)
+    {
+    if (mouse_face_deferred_gc || (f == mouse_face_mouse_frame))
+       {
+       note_mouse_highlight (mouse_face_mouse_frame,
+ 			    mouse_face_mouse_x, mouse_face_mouse_y);
+       mouse_face_deferred_gc = 0;
+       }
+    }
+ 
+ static int ns_set_terminal_window(int n)
+    {
+    struct frame *f=(updating_frame ? updating_frame : selected_frame);
+ 
+    flexlines = ((n > 0) && (n <= f->height)) ? n : f->height;
+    return 0;
+    }
+ 
+ void ns_send_appdefined (int value)
+    {
+    int i;
+ 
+    /* Only post this event if we haven't already posted one.  This will end
+       the [NXApp run] main loop after having processed all events queued at
+       this moment.  */
+    if (!send_appdefined)
+       abort ();
+    else
+       {
+       NXEvent nxev;
+       nxev.type = NX_APPDEFINED;
+       nxev.window = BEANS + value;
+ 
+       /* Post an application defined event on the event queue.  When this is
+          recieved the [NXApp run] will return, thus having processed all
+          events which are currently queued.  */
+       if (DPSPostEvent (&nxev, NO)) abort ();
+ 
+       /* We only need one NX_APPDEFINED event to stop NXApp from running.  */
+       send_appdefined = NO;
+ 
+       if (timed_entry)
+          {
+          DPSRemoveTimedEntry (timed_entry);
+          timed_entry = 0;
+          }
+ 
+       if (cursor_blink_entry)
+          {
+          DPSRemoveTimedEntry (cursor_blink_entry);
+          cursor_blink_entry = 0;
+          }
+ 
+       if (select_readfds)
+          {
+          for (i = 0; i < select_nfds; i++) if (FD_ISSET (i, select_readfds))
+             DPSRemoveFD (i);
+          select_readfds = 0;
+          }
+ 
+       if (select_writefds)
+          {
+          for (i = 0; i < select_nfds; i++) if (FD_ISSET (i, select_writefds))
+             DPSRemoveFD (i);
+          select_writefds = 0;
+          }
+ 
+       if (select_exceptfds)
+          {
+          for (i = 0; i < select_nfds; i++) if (FD_ISSET (i, select_exceptfds))
+             DPSRemoveFD (i);
+          select_exceptfds = 0;
+          }
+       }
+    }
+ 
+ /* Post an event to ourself and keep reading events until we read it back
+    again.  In effect process all events which were waiting.  */
+ static int ns_read_socket (int sd, struct input_event *bufp,
+                            int numchars, int waitp, int expected)
+    {
+    int nevents;
+ 
+    if (send_appdefined) abort ();
+ 
+    /* We must always send one NX_APPDEFINED event to ourself, otherwise
+       [NXApp run] will never exit.  */
+    send_appdefined = YES;
+ 
+    if (!waitp)
+       {
+       /* Post an application defined event on the event queue.  When this is
+          recieved the [NXApp run] will return, thus having processed all
+          events which are currently queued, if any.  */
+       ns_send_appdefined (-1);
+       }
+ 
+    events = bufp;
+    eventsleft = numchars;
+ 
+    [(Application *)NXApp run];
+ 
+    nevents = numchars - eventsleft;
+    eventsleft = 0;
+    events = 0;
+    return nevents;
+    }
+ 
+ static int ns_reassert_line_highlight(int new, int vpos)
+    {
+    highlight = new;
+    return 0;
+    }
+ 
+ static void ns_mouse_position (struct frame **f, int insist,
+ 			       Lisp_Object *bar_window,
+                                enum scroll_bar_part *part,
+                                Lisp_Object *x, Lisp_Object *y,
+                                unsigned long *time)
+    {
+    id view;
+    NXPoint position;
+    int xchar, ychar;
+ 
+    mouse_moved = 0;
+ 
+    if (last_mouse_frame) *f=last_mouse_frame;
+    view=(*f)->display.ns->view;
+ 
+    [[view window] getMouseLocation:&position];
+    [view convertPoint:&position fromView:nil];
+    ns_pixel_to_glyph_coords(*f, (int)rint(position.x), (int)rint(position.y),
+                             &xchar, &ychar, 0, 1);
+    ns_chars_to_rect(*f, xchar, ychar, xchar, ychar, &last_mouse_glyph);
+    if (bar_window) *bar_window = Qnil;
+    if (part) *part = 0;
+    if (x) XSET (*x, Lisp_Int, (int)rint(position.x));
+    if (y) XSET (*y, Lisp_Int, (int)rint(position.y));
+    if (time) *time = last_mouse_movement_time;
+    }
+ 
+ static void ns_frame_rehighlight(void)
+    {
+    struct frame *f=0;
+ 
+    if (ns_focus_frame)
+       {
+       f = (GC_FRAMEP (FRAME_FOCUS_FRAME (ns_focus_frame))
+            ? XFRAME (FRAME_FOCUS_FRAME (ns_focus_frame))
+            : ns_focus_frame);
+       if (!FRAME_LIVE_P (f))
+          {
+          FRAME_FOCUS_FRAME (ns_focus_frame) = Qnil;
+          f = ns_focus_frame;
+          }
+       }
+ 
+   if (f != ns_highlight_frame)
+      {
+      if (f)
+         [[f->display.ns->view window] makeKeyAndOrderFront:NXApp];
+ /*     else
+         resign key window */
+      }
+    }
+ 
+ static void ns_frame_raise_lower(struct frame *f, int raise)
+    {
+    if (raise)
+       ns_raise_frame(f);
+    else
+       ns_lower_frame(f);
+    }
+ 
+ static void ns_set_vertical_scroll_bar(struct window *window,
+                                        int portion, int whole, int position)
+    {
+    Lisp_Object win;
+    NXRect r,s;
+    struct frame *f= XFRAME (WINDOW_FRAME (window));
+    id view=f->display.ns->view;
+    int top = XINT (window->top);
+    int left = WINDOW_VERTICAL_SCROLL_BAR_COLUMN (window);
+    int height = WINDOW_VERTICAL_SCROLL_BAR_HEIGHT (window);
+    id bar;
+ 
+    XSETWINDOW (win, window);
+    if (FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0)
+      {
+        ns_chars_to_rect (f, left, top, left, top+height-1, &r);
+        r.size.width = FRAME_SCROLL_BAR_PIXEL_WIDTH (f);
+      }
+    else
+      ns_chars_to_rect (f, left, top,
+                        left + (FRAME_SCROLL_BAR_COLS (f) - 1),
+                        top + height - 1, &r);
+    [view convertRectToSuperview:&r];
+ 
+    if (r.size.width*2.5>=r.size.height)
+       {
+       if (!NILP (window->vertical_scroll_bar))
+          {
+          bar = XNS_SCROLL_BAR(window->vertical_scroll_bar);
+          [bar free];
+          }
+       return;
+       }
+ 
+    if (NILP (window->vertical_scroll_bar))
+       {
+       bar=[[EmacsScroller alloc] initFrame:&r window:win];
+       VOID_TO_LISP (window->vertical_scroll_bar, bar);
+       }
+    else
+       {
+       bar= XNS_SCROLL_BAR(window->vertical_scroll_bar);
+       [bar setFrame:&r];
+       }
+ 
+    [bar setPosition:position portion:portion whole:whole];
+    }
+ 
+ /* The following three hooks are used when we're doing a thorough
+    redisplay of the frame.  We don't explicitly know which scroll bars
+    are going to be deleted, because keeping track of when windows go
+    away is a real pain - "Can you say set-window-configuration, boys
+    and girls?"  Instead, we just assert at the beginning of redisplay
+    that *all* scroll bars are to be removed, and then save a scroll bar
+    from the fiery pit when we actually redisplay its window.  */
+ 
+ /* Arrange for all scroll bars on FRAME to be removed at the next call
+    to `*judge_scroll_bars_hook'.  A scroll bar may be spared if
+    `*redeem_scroll_bar_hook' is applied to its window before the judgement.  */
+ static void ns_condemn_scroll_bars(struct frame *f)
+    {
+    int i;
+    id view;
+    id subviews=[[f->display.ns->view superview] subviews];
+    for (i=[subviews count]-1; i>=0; i--)
+       {
+       view=[subviews objectAt:i];
+       if (![view isKindOf:[EmacsScroller class]]) continue;
+       [view condemn];
+       }
+    }
+ 
+ /* Unmark WINDOW's scroll bar for deletion in this judgement cycle.
+    Note that WINDOW isn't necessarily condemned at all.  */
+ static void ns_redeem_scroll_bar(struct window *window)
+    {
+    id bar;
+    if (!NILP(window->vertical_scroll_bar))
+       {
+       bar=XNS_SCROLL_BAR (window->vertical_scroll_bar);
+       [bar reprieve];
+       }
+    }
+ 
+ /* Remove all scroll bars on FRAME that haven't been saved since the
+    last call to `*condemn_scroll_bars_hook'.  */
+ static void ns_judge_scroll_bars(struct frame *f)
+    {
+    int i;
+    id view;
+    id subviews=[[f->display.ns->view superview] subviews];
+    for (i=[subviews count]-1; i>=0; i--)
+       {
+       view=[subviews objectAt:i];
+       if (![view isKindOf:[EmacsScroller class]]) continue;
+       [view judge];
+       }
+    }
+ 
+ static Lisp_Object append2(Lisp_Object list, Lisp_Object item)
+    {
+    Lisp_Object array[2];
+    array[0]=list;
+    array[1]=Fcons(item,Qnil);
+    return Fnconc(2,&array[0]);
+    }
+ 
+ int ns_check_available (void)
+    {
+    int ret=1;
+ 
+    if (ret)
+       {
+       NXEventHandle handle=NXOpenEventStatus();
+       if (handle)
+          NXCloseEventStatus(handle);
+       else
+          ret=0;
+       }
+ 
+    return ret;
+    }
+ 
+ /* Start the Application and get things rolling.  */
+ void ns_term_init (char *display_name)
+    {
+    extern Lisp_Object Fset_input_mode(Lisp_Object,Lisp_Object,
+                                       Lisp_Object,Lisp_Object);
+ 
+    [EmacsApp new];
+    if ((ns_current_display = NXApp) == 0)
+       fatal ("NeXTstep on %s not responding.\n", display_name);
+ 
+       {
+       const char *value=NXGetDefaultValue([NXApp appName],"Menus");
+       if (!value || strcasecmp(value,"NO"))
+          ns_set_frame_menubar(selected_frame,1);
+       }
+ 
+       {
+       const char *value, *parameter;
+       if (value=NXGetDefaultValue([NXApp appName],parameter="ShrinkSpace"))
+          {
+          double f;
+          if (strcasecmp(value,"YES")==0)
+             ns_shrink_space=make_float(0.75);
+          else if (strcasecmp(value,"NO")==0)
+             ns_shrink_space=make_float(1.0);
+          else if ((f=atof(value))>0.0)
+             ns_shrink_space=make_float(f);
+          else fprintf(stderr, "Bad value for default \"%s\": \"%s\"\n",
+                       parameter,value);
+          }
+ 
+       if (value=NXGetDefaultValue([NXApp appName],parameter="AlternateIsMeta"))
+          {
+          if (strcasecmp(value,"YES")==0)
+             ns_alternate_is_meta=Qt;
+          else if (strcasecmp(value,"NO")==0)
+             ns_alternate_is_meta=Qnil;
+          else if (strcasecmp(value,"LEFT")==0)
+             ns_alternate_is_meta=Qleft;
+          else if (strcasecmp(value,"RIGHT")==0)
+             ns_alternate_is_meta=Qright;
+          else fprintf(stderr, "Bad value for default \"%s\": \"%s\"\n",
+                       parameter,value);
+          }
+ 
+       if (value=NXGetDefaultValue([NXApp appName],parameter="UseOpenPanel"))
+          {
+          if (strcasecmp(value,"YES")==0)
+             ns_use_open_panel=YES;
+          else if (strcasecmp(value,"NO")==0)
+             ns_use_open_panel=NO;
+          else fprintf(stderr, "Bad value for default \"%s\": \"%s\"\n",
+                       parameter,value);
+          }
+ 
+       if (value=NXGetDefaultValue([NXApp appName],parameter="UseYesNoPanel"))
+          {
+          if (strcasecmp(value,"YES")==0)
+             ns_use_yes_no_panel=YES;
+          else if (strcasecmp(value,"NO")==0)
+             ns_use_yes_no_panel=NO;
+          else fprintf(stderr, "Bad value for default \"%s\": \"%s\"\n",
+                       parameter,value);
+          }
+ 
+       if (value=NXGetDefaultValue([NXApp appName],parameter="ISOLatin"))
+          {
+          if (strcasecmp(value,"YES")==0)
+             ns_iso_latin=Qt;
+          else if (strcasecmp(value,"NO")==0)
+             ns_iso_latin=Qnil;
+          else fprintf(stderr, "Bad value for default \"%s\": \"%s\"\n",
+                       parameter,value);
+          }
+ 
+       if (value=NXGetDefaultValue([NXApp appName],parameter="CursorBlinkRate"))
+          {
+          double f;
+          if (strcasecmp(value,"NO")==0)
+             ns_cursor_blink_rate=Qnil;
+          else if (strcasecmp(value,"YES")==0)
+             ns_cursor_blink_rate=make_float(0.5);
+          else if ((f=atof(value))>0)
+             ns_cursor_blink_rate=make_float(f);
+          else fprintf(stderr, "Bad value for default \"%s\": \"%s\"\n",
+                       parameter,value);
+          }
+       }
+ 
+    keymap_init();
+    
+       {
+       id cl;
+       char *fname=alloca(XSTRING(Vdata_directory)->size+10);
+       
+       strcpy(fname,XSTRING(Vdata_directory)->data);
+       strcat(fname,"Emacs.clr");
+       cl=[[NXColorList alloc] initWithName:"Emacs" fromFile:fname];
+       if (cl==nil)
+          fatal ("Could not find %s.\n", fname);
+       [[NXColorList availableColorLists] addObject:cl];
+       }
+ 
+       {
+       char c[1024];
+       PSnextrelease(1024,c);
+       Vwindow_system_version = build_string(c);
+       }
+ 
+    clear_frame_hook = ns_clear_frame;
+    clear_end_of_line_hook = ns_clear_end_of_line;
+    ins_del_lines_hook = ns_ins_del_lines;
+    change_line_highlight_hook = ns_change_line_highlight;
+    insert_glyphs_hook = ns_insert_glyphs;
+    write_glyphs_hook = ns_write_glyphs;
+    delete_glyphs_hook = ns_delete_glyphs;
+    update_begin_hook = ns_update_begin;
+    update_end_hook = ns_update_end;
+    ring_bell_hook = ns_ring_bell;
+    reset_terminal_modes_hook = ns_reset_terminal_modes;
+    set_terminal_modes_hook = ns_set_terminal_modes;
+    set_terminal_window_hook = ns_set_terminal_window;
+    read_socket_hook = ns_read_socket;
+    frame_up_to_date_hook = ns_frame_up_to_date;
+    cursor_to_hook = ns_cursor_to;
+    reassert_line_highlight_hook = ns_reassert_line_highlight;
+    mouse_position_hook = ns_mouse_position;
+    frame_rehighlight_hook = ns_frame_rehighlight;
+    frame_raise_lower_hook = ns_frame_raise_lower;
+    set_vertical_scroll_bar_hook = ns_set_vertical_scroll_bar;
+    condemn_scroll_bars_hook = ns_condemn_scroll_bars;
+    redeem_scroll_bar_hook = ns_redeem_scroll_bar;
+    judge_scroll_bars_hook = ns_judge_scroll_bars;
+ 
+    scroll_region_ok = 1;
+    char_ins_del_ok = 0;
+    line_ins_del_ok = 1;
+    fast_clear_end_of_line = 1;
+    memory_below_frame = 0;
+    baud_rate = 38400;
+ 
+    // FIXME/cl
+    // change_keyboard_wait_descriptor(-1);
+ 
+    /* No interupt input under NS */
+    Fset_input_mode (Qnil, Qnil, Qt, Qnil);
+    
+    [(Application *)NXApp run];
+    }
+ 
+ void syms_of_nsterm ()
+    {
+    DEFVAR_LISP("ns-input-file", &ns_input_file,
+                "The file specified in the last NS event.");
+    ns_input_file=Qnil;
+ 
+    DEFVAR_LISP("ns-input-ascii", &ns_input_ascii,
+                "The data received in the last NS drag event..");
+    ns_input_ascii=Qnil;
+ 
+    DEFVAR_LISP("ns-input-font", &ns_input_font,
+                "The font specified in the last NS event.");
+    ns_input_font=Qnil;
+ 
+    DEFVAR_LISP("ns-input-fontsize", &ns_input_fontsize,
+                "The fontsize specified in the last NS event.");
+    ns_input_fontsize=Qnil;
+ 
+    DEFVAR_LISP ("ns-input-line", &ns_input_line,
+                 "The line specified in the last NS event.");
+    ns_input_line=Qnil;
+ 
+    DEFVAR_LISP ("ns-input-color", &ns_input_color,
+                 "The color specified in the last NS event.");
+    ns_input_color=Qnil;
+ 
+    DEFVAR_LISP ("ns-gdb-status", &ns_gdb_status,
+                 "Status of program running under debugger.");
+    ns_gdb_status=Qnil;
+ 
+    DEFVAR_LISP ("ns-alternate-is-meta", &ns_alternate_is_meta,
+    "This variable describes what the effect of the alternate key is under NS.\n\
+ nil means that the alternate key is not interpreted by Emacs at all,\n\
+ t means that the alternate key is used as meta key,\n\
+ left means that the left alternate key only is interpreted as meta key,\n\
+ right means that the right alternate key only is interpreted as meta key.\n\
+ (This variable should only be read, never set.)");
+    ns_alternate_is_meta=Qt;
+ 
+    DEFVAR_LISP ("ns-iso-latin", &ns_iso_latin,
+    "If non-nil use the ISO Latin 8859/1 encoding.  Otherwise use the NS encoding.\n\
+ (This variable should only be read, never set.)");
+    ns_iso_latin=Qnil;
+ 
+    DEFVAR_LISP ("ns-shrink-space", &ns_shrink_space,
+    "Amount by which spacing between lines is compressed.\n\
+ (This variable should only be read, never set.)");
+    ns_shrink_space=make_float(0.75);
+ 
+    DEFVAR_LISP ("ns-cursor-blink-rate", &ns_cursor_blink_rate,
+    "Rate at which the Emacs cursor blinks (in seconds).\n\
+ Set to nil to disable blinking.");
+    ns_cursor_blink_rate=Qnil;
+ 
+    DEFVAR_BOOL ("ns-use-open-panel", &ns_use_open_panel,
+      "*Non-nil means to use ns-read-file-name whenever read-file-name is called.");
+    ns_use_open_panel=NO;
+ 
+    DEFVAR_BOOL ("ns-use-yes-no-panel", &ns_use_yes_no_panel,
+      "*Non-nil means to use ns-yes-or-no-p whenever yes-or-no-p or y-or-n-p are called.");
+    ns_use_yes_no_panel=NO;
+    }
+ 
+ static void timeout_handler (DPSTimedEntry timedEntry, double now, void *userData)
+    {
+    /* The timeout specified to ns_select has passed.  */
+    ns_send_appdefined (-2);
+    }
+ 
+ static void cursor_blink_handler (DPSTimedEntry cursorBlinkEntry, double now,
+                                   void *userData)
+    {
+    if (!ns_highlight_frame) return;
+    if (ns_highlight_frame->display.ns->current_cursor==no_highlight)
+       {
+       Lisp_Object tem=get_frame_param(ns_highlight_frame, Qcursor_type);
+       ns_highlight_frame->display.ns->desired_cursor=ns_lisp_to_cursor_type(tem);
+       }
+    else
+       {
+       ns_highlight_frame->display.ns->desired_cursor=no_highlight;
+       }
+ 
+    ns_dumpglyphs(ns_highlight_frame,0,0,0,0,-1);
+    ns_dumpcursor(ns_highlight_frame,ns_highlight_frame->cursor_x,
+                  ns_highlight_frame->cursor_y);
+    }
+ 
+ /* One of the file selectors which has been added with a DPSAddFD by
+    ns_select has finished a read, has data waiting on it or has finished a
+    write.  Let ns_select know by sending it an event.  */
+ static void fd_handler (int fd, void *data)
+    {
+    ns_send_appdefined (fd);
+    }
+ 
+ /* This is where events get dispatched to the application.  This is done
+    whilst waiting for all input.  */
+ int ns_select (int nfds, fd_set *readfds, fd_set *writefds,
+                fd_set *exceptfds, struct timeval *timeout)
+    {
+    int i, j, tfds;
+    double time;
+    NXEvent *ev;
+    struct timezone tz;
+    struct timeval curtime;
+ 
+    if (ns_current_display == nil)
+       return select (nfds, readfds, writefds, exceptfds, timeout);
+ 
+    select_nfds = nfds;
+    select_readfds = readfds;
+    select_writefds = writefds;
+    select_exceptfds = exceptfds;
+    tfds = 0;
+ 
+    if (readfds) for (i = 0; i < nfds; i++) if (FD_ISSET (i, readfds))
+       {
+       if (i >= tfds) tfds = i + 1;
+       DPSAddFD (i, fd_handler, 0, NX_BASETHRESHOLD + 1);
+       }
+ 
+    if (writefds) for (i = 0; i < nfds; i++) if (FD_ISSET (i, writefds))
+       {
+       if (i >= tfds) tfds = i + 1;
+       DPSAddFD (i, fd_handler, 0, NX_BASETHRESHOLD + 1);
+       }
+ 
+    if (exceptfds) for (i = 0; i < nfds; i++) if (FD_ISSET (i, exceptfds))
+       {
+       if (i >= tfds) tfds = i + 1;
+       DPSAddFD (i, fd_handler, 0, NX_BASETHRESHOLD + 1);
+       }
+    nfds = tfds;
+ 
+    if (timeout)
+       {
+       time = ((double) timeout->tv_sec) + ((double) timeout->tv_usec) / 1000000.0;
+       gettimeofday (&curtime, &tz);
+       timeout->tv_sec += curtime.tv_sec;
+       timeout->tv_usec += curtime.tv_usec;
+       /* Set a DPSTimedEntry as timeout.  */
+       timed_entry = DPSAddTimedEntry (time, timeout_handler,
+                                       0, NX_BASETHRESHOLD + 1);
+       }
+ 
+    if (NUMBERP(ns_cursor_blink_rate))
+       {
+       if (ns_highlight_frame &&
+           ns_highlight_frame->display.ns->current_cursor==no_highlight)
+          {
+          Lisp_Object tem=get_frame_param(ns_highlight_frame, Qcursor_type);
+          ns_highlight_frame->display.ns->desired_cursor=ns_lisp_to_cursor_type(tem);
+          ns_dumpglyphs(ns_highlight_frame,0,0,0,0,-1);
+          ns_dumpcursor(ns_highlight_frame,ns_highlight_frame->cursor_x,
+                        ns_highlight_frame->cursor_y);
+          }
+       cursor_blink_entry = DPSAddTimedEntry (XFLOATINT(ns_cursor_blink_rate),
+                                              cursor_blink_handler, 0,
+                                              NX_BASETHRESHOLD + 1);
+       }
+ 
+    /* Let Application dispatch events until it recieves an event of the type
+       NX_APPDEFINED, which should only be sent by fd_handler or
+       timeout_handler.  */
+    gobble_input (timeout ? 1 : 0);
+    ev = &last_appdefined_event;
+ 
+    /* select does not yet have to return modified timeout information, does it?  */
+ #if 0
+    if (timeout)
+       {
+       gettimeofday (&curtime, &tz);
+       timeout->tv_usec -= curtime.tv_usec;
+       timeout->tv_sec -= curtime.tv_sec;
+       while (timeout->tv_usec < 0)
+          {
+          timeout->tv_usec += 1000000;
+          timeout->tv_sec--;
+          }
+       while (timeout->tv_usec > 1000000)
+          {
+          timeout->tv_usec -= 1000000;
+          timeout->tv_sec++;
+          }
+       if (timeout->tv_sec < 0)
+          {
+          timeout->tv_sec = 0;
+          timeout->tv_usec = 0;
+          }
+       }
+ #endif
+ 
+    if (ev->type != NX_APPDEFINED) abort ();
+ 
+    i = ev->window - BEANS;
+    if (i == -2)
+       {
+       /* The NX_APPDEFINED event we recieved was the result of a timeout.  */
+       return 0;
+       }
+   else if (i == -1)
+      {
+      if (!timeout)
+         return 0;
+      else
+         {
+         /* The NX_APPDEFINED event we recieved was the result of at least
+            one real input event arriving.  */
+         errno = EINTR;
+         return -1;
+         }
+      }
+   else if (i < 0 || i >= nfds)
+      {
+      abort ();
+      }
+ 
+    if (readfds)
+       if (FD_ISSET (i, readfds))
+          {
+          FD_ZERO (readfds);
+          FD_SET (i,readfds);
+          }
+       else
+          FD_ZERO (readfds);
+ 
+    if (writefds)
+       if (FD_ISSET (i, writefds))
+          {
+          FD_ZERO (writefds);
+          FD_SET (i,writefds);
+          }
+       else
+          FD_ZERO (writefds);
+ 
+    if (exceptfds)
+       if (FD_ISSET (i, exceptfds))
+          {
+          FD_ZERO (exceptfds);
+          FD_SET (i,exceptfds);
+          }
+       else
+          FD_ZERO (exceptfds);
+ 
+    return 1;
+    }
+ 
+ @implementation  EmacsListener:Listener
+ static NXRemoteMethod *remoteMethods = 0;
+ 
+ + initialize
+    {
+    if ([self class] != [EmacsListener class])
+       return self;
+ 
+    if (!remoteMethods)
+       {
+       remoteMethods = (NXRemoteMethod *)malloc(4*sizeof(NXRemoteMethod));
+       remoteMethods[0].key = @selector(openFile:onHost:atTrueLine:);
+       remoteMethods[0].types = "cci";
+       remoteMethods[1].key = @selector(openFile:onHost:fromTrueLine:to:);
+       remoteMethods[1].types = "ccii";
+       remoteMethods[2].key = @selector(connectTo:);
+       remoteMethods[2].types = "s";
+       remoteMethods[3].key = 0;
+       }
+    return self;
+    }
+ 
+ -(void)connectTo:(port_t)port
+    {
+    ns_gdb_controller=[NXConnection connectToPort:[NXPort newFromMachPort:port]];
+ 
+    [[ns_gdb_controller connectionForProxy] runFromAppKit];
+    [ns_gdb_controller setProtocolForProxy:@protocol(GdbController)];
+ NX_DURING
+    [ns_gdb_controller setClient:self];
+ NX_HANDLER
+    ns_gdb_controller=nil;
+ NX_ENDHANDLER
+    }
+ 
+ - (int)performRemoteMethod:(NXRemoteMethod *)method paramList:(NXParamValue *)paramList
+    {
+    switch (method - remoteMethods)
+       {
+     case 0:
+       [self openFile:paramList[0].bval.p onHost:paramList[1].bval.p atTrueLine:paramList[2].ival];
+       return -1;
+     case 1:
+       [self openFile:paramList[0].bval.p onHost:paramList[1].bval.p fromTrueLine:paramList[2].ival to:paramList[3].ival];
+       return -1;
+     case 2:
+       [self connectTo:paramList[0].pval];
+       return -1;
+     default:
+       return [super performRemoteMethod:method paramList:paramList];
+       }
+    }
+ 
+ - (NXRemoteMethod *)remoteMethodFor:(SEL)aSel
+    {
+    NXRemoteMethod *rm = NXRemoteMethodFromSel(aSel,remoteMethods);
+    return rm ? rm : [super remoteMethodFor:aSel];
+    }
+ 
+ -(oneway void)openFile:(char *)fileName onHost:(char *)host atTrueLine:(int)line
+    {
+    EmacsApp *t;
+    if (t = NXResponsibleDelegate(self, @selector(openFile:onHost:atTrueLine:)))
+       [t openFile:fileName onHost:host atTrueLine:line];
+    }
+ 
+ -(oneway void)openFile:(char *)fileName onHost:(char *)host fromTrueLine:(int)startLine to:(int)endLine
+    {
+    EmacsApp *t;
+    if (t = NXResponsibleDelegate(self, @selector(openFile:onHost:fromTrueLine:to:)))
+       [t openFile:fileName onHost:host fromTrueLine:startLine to:endLine];
+    }
+ 
+ -(oneway void)setInterruptHandler:handler
+    {
+    ns_gdb_interrupt_controller=handler;
+    }
+ 
+ -(oneway void)setController:(id <GdbController>)anObject
+    {
+    ns_gdb_controller=anObject;
+    }
+ 
+ -(oneway void)disconnect
+    {
+    ns_gdb_controller=nil;
+    ns_gdb_interrupt_controller=nil;
+    ns_gdb_status=Qnil;
+    ns_gdb_frame=0;
+    }
+ 
+ -(oneway void)frameChanged:(int)selectedFrame
+    {
+    ns_gdb_frame=selectedFrame;
+    update_mode_lines++;
+    }
+ 
+ -(oneway void)programIsRunning
+    {
+    ns_gdb_status=build_string("running");
+    update_mode_lines++;
+    }
+ 
+ -(oneway void)programStopped
+    {
+    ns_gdb_status=build_string("stopped");
+    update_mode_lines++;
+    }
+ 
+ -(oneway void)programIsDead
+    {
+    ns_gdb_status=build_string("dead");
+    update_mode_lines++;
+    }
+ 
+ -(oneway void)programIsLoaded
+    {
+    ns_gdb_status=build_string("loaded");
+    update_mode_lines++;
+    }
+ 
+ -(BOOL)isNewUser
+    {
+    return YES;
+    }
+ @end
+ 
+ @implementation EmacsApp
+ - (int)runModalFor:theWindow
+    {
+    if (running)
+       return [super runModalFor:theWindow];
+    else
+       {
+       int ret;
+       running++;
+       ret=[super runModalFor:theWindow];
+       running--;
+       return ret;
+       }
+    }
+ 
+ - (int)runModalSession:(NXModalSession *)session
+    {
+    if (running)
+       return [super runModalSession:session];
+    else
+       {
+       int ret;
+       running++;
+       ret=[super runModalSession:session];
+       running--;
+       return ret;
+       }
+    }
+ 
+ -(int)openFile:(char *)fileName onHost:(char *)host atTrueLine:(int)line
+    {
+    return [self openFile:fileName onHost:host fromTrueLine:line to:line];
+    }
+ 
+ -(int)openFile:(char *)fileName onHost:(char *)host fromTrueLine:(int)startLine to:(int)endLine;
+    {
+    struct frame *emacsframe=selected_frame;
+    NXEvent *e=[NXApp currentEvent];
+ 
+    if (eventsleft<=0) return NO;
+    ns_input_file=append2(ns_input_file,build_string(fileName));
+ 
+    if (startLine==endLine)
+       ns_input_line=(startLine>=0) ? make_number(startLine) : Qnil;
+    else
+       ns_input_line=Fcons(make_number(startLine),make_number(endLine));
+ 
+    events->kind=non_ascii_keystroke;
+    events->modifiers=0;
+    events->code=KEY_NS_OPEN_FILE_LINE;
+    EV_TRAILER(e);
+    return YES;
+    }
+ 
+ -(int)app:sender openFile:(const char *) file type:(const char *) aType
+    {
+    struct frame *emacsframe=selected_frame;
+    NXEvent *e=[NXApp currentEvent];
+ 
+    if (eventsleft<=0) return NO;
+    ns_input_file=append2(ns_input_file,build_string(file));
+    events->kind=non_ascii_keystroke;
+    events->modifiers=0;
+    events->code=KEY_NS_OPEN_FILE;
+    EV_TRAILER(e);
+    return YES;
+    }
+ 
+ -(int)app:sender openTempFile:(const char *)file type:(const char *) aType;
+    {
+    struct frame *emacsframe=selected_frame;
+    NXEvent *e=[NXApp currentEvent];
+ 
+    if (eventsleft<=0) return NO;
+    ns_input_file=append2(ns_input_file,build_string(file));
+    events->kind=non_ascii_keystroke;
+    events->modifiers=0;
+    events->code=KEY_NS_OPEN_TEMP_FILE;
+    EV_TRAILER(e);
+    return YES;
+    }
+ 
+ -(BOOL) appAcceptsAnotherFile:sender
+    {
+    return YES;
+    } /* -appAcceptsAnotherFile:*/
+ 
+ 
+ /* Set up our listener *before* we start up */
+ -appWillInit:sender
+    {
+    /* XXX Actually NXFilenamePboardType should be in there.  Unfortunately
+       it is broken badly by some serious problems in the services code.  Disabling
+       it breaks some services.  Unfortunately leaving it in there breaks a lot
+       more at this time. XXX */
+    
+    const NXAtom send_types[]   = { NXAsciiPboardType, /* NXFilenamePboardType,
+                                       NXTabularTextPboardType, */ 0 };
+    const NXAtom return_types[] = { NXAsciiPboardType, /* NXFilenamePboardType,
+                                       NXTabularTextPboardType, */ 0 };
+    const NXAtom drag_types[] = { NXAsciiPboardType, NXTabularTextPboardType,
+                                     NXFilenamePboardType, NXColorPboardType,
+                                     NXFontPboardType, 0 };
+ 
+    ns_send_types  = (void *)xmalloc(sizeof(send_types));
+    bcopy(send_types,  ns_send_types,  sizeof(send_types));
+    ns_return_types= (void *)xmalloc(sizeof(return_types));
+    bcopy(return_types,ns_return_types,sizeof(return_types));
+    ns_drag_types= (void *)xmalloc(sizeof(drag_types));
+    bcopy(drag_types,ns_drag_types,sizeof(drag_types));
+ 
+    emacsListener = [[EmacsListener alloc] init];
+    [NXApp setAppListener:emacsListener];
+    return self;
+    }
+ 
+ /* Stop ourself from running as soon as we have finished initialization.  We
+    will actually run in ns_select's call to NXGetOrPeekEvent ().  */
+ -appDidInit:sender
+    {
+    [self setJournalable:NO];
+    [self setImportAlpha:YES];   
+    [self stop:self];
+    return self;
+    }
+ 
+ /* The function ns_select should remove all these events.  */
+ -applicationDefined:(NXEvent *) e
+    {
+    last_appdefined_event = *e;
+    [self stop: self];
+    return self;
+    }
+ 
+ -app:sender powerOffIn:(int)ms andSave:(int)aFlag
+    {
+    /* XXX This does not work yet XXX */
+    struct frame *emacsframe=selected_frame;
+    NXEvent *e=[NXApp currentEvent];
+ 
+    if (eventsleft<=0) return self;
+    events->kind=non_ascii_keystroke;
+    events->modifiers=0;
+    events->code=KEY_NS_POWER_OFF;
+    EV_TRAILER(e);
+    return self;
+    }
+ 
+ - menuDown:sender
+    {
+    if (selected_frame && selected_frame->display.ns->view)
+       return [selected_frame->display.ns->view menuDown:sender];
+    return nil;
+    }
+ 
+ #if 0
+ -pasteboardChangedOwner:sender
+    {
+    struct frame *emacsframe=selected_frame;
+    NXEvent *e=[NXApp currentEvent];
+ 
+    if (eventsleft<=0) return self;
+    events->kind=selection_clear_event;
+    events->modifiers=0;
+    events->code=0;
+    events->x=(int)sender;
+    events->y=0;
+ #if 1
+    EV_TRAILER(e);
+ #else
+    ns_handle_selection_clear(events);
+ #endif
+    return self;
+    }
+ 
+ -pasteboard:sender provideData:(NXAtom)type
+    {
+    struct frame *emacsframe=selected_frame;
+    NXEvent *e=[NXApp currentEvent];
+ 
+    if (eventsleft<=0) return self;
+    events->kind=selection_request_event;
+    events->modifiers=0;
+    events->code=0;
+    events->x=(int)sender;
+    events->y=(int)type;
+ #if 1
+    EV_TRAILER(e);
+ #else
+    ns_handle_selection_request(events);
+ #endif
+    return self;
+    }
+ #endif
+ @end
+ 
+ @implementation EmacsView
+ - changeFont:sender
+    {
+    NXEvent *e=[NXApp currentEvent];
+    struct ns_face *face=emacsframe->display.ns->face;
+    id newFont;
+    float size;
+ 
+    if (eventsleft<=0) return self;
+ 
+    if (newFont=[sender convertFont:face->font])
+       {
+       events->kind=non_ascii_keystroke;
+       events->modifiers=0;
+       events->code=KEY_NS_CHANGE_FONT;
+ 
+       size=[newFont pointSize];
+       if (size==rint(size))
+          ns_input_fontsize=make_number((int)rint(size));
+       else
+          ns_input_fontsize=make_float(size);
+       ns_input_font=build_string([newFont name]);
+       EV_TRAILER(e);
+       }
+    return self;
+    }
+ 
+ - (BOOL)acceptsFirstResponder
+    {
+    return YES;
+    }
+ 
+ - becomeFirstResponder
+    {
+    return [super becomeFirstResponder];
+    }
+ 
+ - resignFirstResponder
+    {
+    return [super resignFirstResponder];
+    }
+ 
+ - resetCursorRects
+    {
+    NXRect visible;
+    if ([self getVisibleRect:&visible])
+       [self addCursorRect:&visible cursor:NXIBeam];
+    return self;
+    }
+ 
+ -keyDown:(NXEvent *) theEvent
+    {
+    int code;
+    enum event_kind kind;
+    int flags;
+ 
+    if (eventsleft <= 0)
+       return self;
+ 
+    PSobscurecursor();
+ 
+    code=theEvent->data.key.charCode;
+    kind=non_ascii_keystroke;
+    flags=theEvent->flags;
+ 
+    events->modifiers=0;
+    if (flags & NX_HELPMASK)
+       {
+       events->modifiers |= hyper_modifier;
+       }
+    if (flags & NX_COMMANDMASK)
+       {
+       events->modifiers |= super_modifier;
+       }
+    if (!NILP(ns_alternate_is_meta) &&
+        ((EQ(ns_alternate_is_meta,Qt) && (flags & NX_ALTERNATEMASK))||
+         (EQ(ns_alternate_is_meta,Qleft) && (flags & NX_ALTERNATEMASK) && (flags & NX_NEXTLALTKEYMASK))||
+         (EQ(ns_alternate_is_meta,Qright) && (flags & NX_ALTERNATEMASK) && (flags & NX_NEXTRALTKEYMASK))))
+       {
+       events->modifiers |= meta_modifier;
+       flags&=~(NX_ALTERNATEMASK|NX_NEXTLALTKEYMASK|NX_NEXTRALTKEYMASK);
+       code = char_from_key(theEvent->data.key.keyCode,flags);
+       }
+    if ((flags & NX_CONTROLMASK) &&
+        (code == char_from_key(theEvent->data.key.keyCode,flags&~NX_CONTROLMASK)))
+       {
+       events->modifiers |= ctrl_modifier;
+       flags&=~NX_CONTROLMASK;
+       }
+    if ((flags & NX_SHIFTMASK) &&
+        (code == char_from_key(theEvent->data.key.keyCode,flags&~NX_SHIFTMASK)))
+       {
+       events->modifiers |= shift_modifier;
+       flags&=~NX_SHIFTMASK;
+       }
+ 
+    if ((flags & NX_NUMERICPADMASK) &&
+        (char_is_type(theEvent->data.key.keyCode,NX_NUMERICPADMASK)))
+       {
+       code |= (1<<28)|(2<<16);
+       }
+    else if ((theEvent->data.key.charSet==NX_DINGBATSSET) ||
+             (theEvent->data.key.charSet==254))
+       {
+       code |= (1<<28)|(1<<16);
+       }
+    else
+       {
+       if ((code<0x20)&&((theEvent->flags&NX_CONTROLMASK)==0))
+          code |= (1<<28)|(3<<16);
+       else if (code==0x7f)
+          code |= (1<<28)|(3<<16);
+       else
+          kind=ascii_keystroke;
+       }
+ 
+    if (kind==ascii_keystroke && !NILP(ns_iso_latin) && (code>=0) && (code<256))
+       code=ns2isomap[code];
+    events->kind=kind;
+    events->code=code;
+    EV_TRAILER (theEvent);
+    return self;
+    }
+ 
+ /* This is what happens when the user presses the mouse button.  */
+ -mouseDown:(NXEvent *) theEvent
+    {
+    int x, y;
+    NXPoint position;
+ 
+    if (eventsleft <= 0) return self;
+ 
+    last_mouse_frame=emacsframe;
+    switch (EV_UDMODIFIERS(theEvent))
+       {
+     case up_modifier:
+       Vmouse_depressed=Qnil;
+       break;
+     case down_modifier:
+       Vmouse_depressed=Qt;
+       break;
+       }
+ 
+    position=theEvent->location;
+    [self convertPoint:&position fromView:nil];
+    events->kind = mouse_click;
+    events->code = EV_BUTTON(theEvent);
+    XSET (events->x, Lisp_Int, (int)rint(position.x));
+    XSET (events->y, Lisp_Int, (int)rint(position.y));
+    events->modifiers = EV_MODIFIERS (theEvent) | EV_UDMODIFIERS (theEvent);
+    EV_TRAILER (theEvent);
+    return self;
+    }
+ 
+ /* This is what happens when the user releases the mouse button.  */
+ -mouseUp:(NXEvent *) theEvent
+    {
+    return [self mouseDown:theEvent];
+    }
+ 
+ -rightMouseDown:(NXEvent *) theEvent
+    {
+    return [self mouseDown:theEvent];
+    }
+ 
+ -rightMouseUp:(NXEvent *) theEvent
+    {
+    return [self mouseDown:theEvent];
+    }
+ 
+ /* Tell emacs the mouse has moved.  */
+ -mouseMoved:(NXEvent *) e
+    {
+    NXPoint p=e->location;
+ 
+    [self convertPoint:&p fromView:nil];
+ 
+    /* Has the mouse moved off the glyph it was on at the last sighting?  */
+    if ((emacsframe!=last_mouse_frame)||
+        (p.x<last_mouse_glyph.origin.x)||
+        (p.x>=(last_mouse_glyph.origin.x+last_mouse_glyph.size.width))||
+        (p.y<last_mouse_glyph.origin.y)||
+        (p.y>=(last_mouse_glyph.origin.y+last_mouse_glyph.size.height)))
+       {
+       mouse_moved = 1;
+       last_mouse_movement_time = EV_TIMESTAMP (e);
+       last_mouse_frame = emacsframe;
+       note_mouse_highlight (emacsframe, p.x, p.y);
+       if (send_appdefined) ns_send_appdefined (-1);
+       }
+    return self;
+    }
+ 
+ -mouseDragged:(NXEvent *) e
+    {
+    return [self mouseMoved:e];
+    }
+ 
+ -rightMouseDragged:(NXEvent *) e
+    {
+    return [self mouseMoved:e];
+    }
+ 
+ -windowWillClose:sender
+    {
+    NXEvent *e=[NXApp currentEvent];
+ 
+    if (ns_window_num<=1) return nil;
+    if (eventsleft <= 0) return nil;
+    events->kind=delete_window_event;
+    events->modifiers=0;
+    events->code=0;
+    EV_TRAILER (e);
+    /* Don't close this window, let this be done from lisp code.  */
+    return nil;
+    }
+ 
+ - windowWillResize:sender toSize:(NXSize *)frameSize
+    {
+    NXRect r;
+    char *size;
+    int rows,cols;
+    int vbextra=FRAME_HAS_VERTICAL_SCROLL_BARS(emacsframe) ?
+                rint(FRAME_SCROLL_BAR_PIXEL_WIDTH (emacsframe) > 0
+                     ? FRAME_SCROLL_BAR_PIXEL_WIDTH (emacsframe)
+                     : (FRAME_SCROLL_BAR_COLS(emacsframe)
+                        *emacsframe->display.ns->face->width)) : 0;
+ 
+    cols=rint((frameSize->width-
+               emacsframe->display.ns->border_width-
+               2*emacsframe->display.ns->internal_border_width-
+               vbextra)/emacsframe->display.ns->face->width);
+    if (cols<MINWIDTH) cols=MINWIDTH;
+    frameSize->width=(cols*emacsframe->display.ns->face->width+
+                      emacsframe->display.ns->border_width+
+                      2*emacsframe->display.ns->internal_border_width+
+                      vbextra);
+ 
+    rows=rint((frameSize->height-
+               emacsframe->display.ns->border_height-
+               2*emacsframe->display.ns->internal_border_width)/
+              emacsframe->display.ns->line_height);
+    if (rows<MINHEIGHT) rows=MINHEIGHT;
+    frameSize->height=(rows*emacsframe->display.ns->line_height+
+                       emacsframe->display.ns->border_height+
+                       2*emacsframe->display.ns->internal_border_width);
+ 
+    [[self window] getFrame:&r];
+    if (r.size.height == frameSize->height && r.size.width == frameSize->width)
+       {
+       if (old_title!=0)
+          {
+          [[self window] setTitle:old_title];
+          xfree(old_title);
+          old_title=0;
+          }
+       }
+    else
+       {
+       if (old_title==0)
+          {
+          const char *t=[[self window] title];
+          old_title=(char *) xmalloc(strlen(t)+1);
+          strcpy(old_title,t);
+          }
+       size=alloca(strlen(old_title)+20);
+       sprintf(size,"%s (%dx%d)",old_title,cols,rows);
+       [[self window] setTitle:size];
+       }
+    return self;
+    }
+ 
+ - windowDidResize:sender
+    {
+    if (old_title!=0)
+       {
+       [[self window] setTitle:old_title];
+       xfree(old_title);
+       old_title=0;
+       }
+    return self;
+    }
+ 
+ - windowDidBecomeKey:sender
+    {
+    NXEvent *e=[NXApp currentEvent];
+    int val;
+ 
+    ns_highlight_frame=emacsframe;
+    if ((val=ns_lisp_to_cursor_type(get_frame_param(emacsframe, Qcursor_type)))>=0)
+       {
+       emacsframe->display.ns->desired_cursor=val;
+       ns_dumpglyphs(emacsframe,0,0,0,0,-1);
+       ns_dumpcursor(emacsframe,emacsframe->cursor_x,emacsframe->cursor_y);
+       }
+ 
+    if (eventsleft <= 0) return nil;
+    events->kind=frame_switch_event;
+    events->modifiers=0;
+    events->code=0;
+    EV_TRAILER (e);
+    return self;
+    }
+ 
+ - windowDidResignKey:sender
+    {
+    emacsframe->display.ns->desired_cursor = hollow_box;
+    ns_dumpglyphs(emacsframe,0,0,0,0,-1);
+    ns_dumpcursor(emacsframe,emacsframe->cursor_x,emacsframe->cursor_y);
+    if (ns_highlight_frame==emacsframe)
+       ns_highlight_frame=0;
+    return self;
+    }
+ 
+ - windowWillMiniaturize:sender toMiniwindow:miniwindow
+    {
+    [window setMiniwindowImage:emacsframe->display.ns->miniimage];
+    return self;
+    }
+ 
+ - initFrameFromEmacs:(struct frame *)f
+    {
+    NXRect r,wr;
+    Lisp_Object tem;
+    id win,oview;
+    int vbextra=FRAME_HAS_VERTICAL_SCROLL_BARS(f) ?
+                rint(FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0
+                     ? FRAME_SCROLL_BAR_PIXEL_WIDTH (f)
+                     : (FRAME_SCROLL_BAR_COLS (f)
+                        *f->display.ns->face->width)) : 0;
+ 
+    r.origin.x   =f->display.ns->internal_border_width;
+    r.origin.y   =f->display.ns->internal_border_width;
+    r.size.width =rint(f->display.ns->face->width*f->width);
+    r.size.height=rint(f->display.ns->line_height*f->height);
+    [self initFrame:&r];
+ 
+    f->display.ns->view=self;
+    emacsframe=f;
+    old_title=0;
+ 
+    r.origin.x=r.origin.y=0;
+    r.size.width +=2*f->display.ns->internal_border_width+vbextra;
+    r.size.height+=2*f->display.ns->internal_border_width;
+ 
+    win=[[Window alloc] initContent:&r
+                        style:NX_RESIZEBARSTYLE
+                        backing:(NILP(get_frame_param(f,Qbuffered)) ?
+                                 NX_RETAINED :NX_BUFFERED)
+                        buttonMask:NX_MINIATURIZEBUTTONMASK|
+                                   NX_CLOSEBUTTONMASK
+                                   /* (ns_window_num>0 ? NX_CLOSEBUTTONMASK : 0) */
+                        defer:NO];
+    [win getFrame:&wr];
+    [win setTrackingRect:&wr inside:NO owner:self tag:0 left:NO right:NO];
+ 
+    f->display.ns->border_width=wr.size.width-r.size.width;
+    f->display.ns->border_height=wr.size.height-r.size.height;
+    [win addToEventMask:(NX_LMOUSEDOWNMASK|NX_LMOUSEUPMASK|
+                         NX_RMOUSEDOWNMASK|NX_RMOUSEUPMASK|
+                         NX_MOUSEENTERED|NX_MOUSEEXITED|
+                         NX_LMOUSEDRAGGEDMASK|NX_RMOUSEDRAGGEDMASK|
+                         NX_KEYDOWNMASK)];
+    [win setFreeWhenClosed:YES];
+    [win setDelegate:self];
+    [win useOptimizedDrawing:YES];
+ 
+    [[win contentView] addSubview:self];
+    [[self superview] setAutoresizeSubviews:YES];
+ 
+    if (ns_drag_types)
+       {
+       int i;
+       for(i=0;ns_drag_types[i];i++);
+       [self registerForDraggedTypes:ns_drag_types count:i];
+       }
+ 
+    tem=f->name;
+    if (!NILP(tem)) [win setTitle:XSTRING(tem)->data];
+ 
+        {
+        const NXScreen *screen=[win screen];
+ 
+        if (screen!=0)
+           [win moveTopLeftTo:BOUND(-SCREENMAX,f->display.ns->left,SCREENMAX)
+                             :BOUND(-SCREENMAX,screen->screenBounds.size.height
+                                    -f->display.ns->top,SCREENMAX)];
+        }
+ 
+    [win makeFirstResponder:self];
+    [win setBackgroundColor:emacsframe->display.ns->face->background_color];
+    [win setBackgroundGray:NXGrayComponent(emacsframe->display.ns->face->background_color)];
+ 
+    [self allocateGState];
+    [self setAutosizing:NX_WIDTHSIZABLE|NX_HEIGHTSIZABLE];
+    [self setOpaque:YES];
+    [self setAutodisplay:YES];
+    [self setFlipped:YES];
+    [self setClipping:NO];
+ 
+    ns_adjust_size(emacsframe);
+ 
+    [win reenableDisplay];
+    [win display];
+    [win makeKeyAndOrderFront:NXApp];
+    ns_window_num++;
+ 
+ #if 0
+       {
+       Lisp_Object rest;
+       struct frame *f;
+       
+       for (rest=Vframe_list; CONSP(rest); rest=XCONS(rest)->cdr)
+          if (FRAME_NS_P(f=XFRAME(XCONS(rest)->car)))
+             [[f->display.ns->view window] setCloseButton:NXApp to:(ns_window_num>1)];
+       }
+ #endif
+    return self;
+    }
+ 
+ - windowDidMove:sender
+    {
+    id win=[self window];
+    NXRect r;
+    const NXScreen *screen;
+ 
+    if (!emacsframe->display.ns) return self;
+    [win getFrame:&r];
+    screen=[win screen];
+    if (screen!=0)
+       {
+       emacsframe->display.ns->left=r.origin.x;
+       emacsframe->display.ns->top=screen->screenBounds.size.height-
+                                    (r.origin.y+r.size.height);
+       }
+    /* Terminate the event loop.  */
+    if (send_appdefined) ns_send_appdefined (-1);
+    return self;
+    }
+ 
+ - windowDidDeminiaturize:sender
+    {
+    if (!emacsframe->display.ns) return self;
+    emacsframe->async_visible   = 1;
+    emacsframe->async_iconified = 0;
+    /* Terminate the event loop.  */
+    if (send_appdefined) ns_send_appdefined (-1);
+    return self;
+    }
+ 
+ - windowDidExpose:sender
+    {
+    if (!emacsframe->display.ns) return self;
+    emacsframe->async_visible = 1;
+    SET_FRAME_GARBAGED (emacsframe);
+    /* Terminate the event loop.  */
+    if (send_appdefined) ns_send_appdefined (-1);
+    return self;
+    }
+ 
+ - windowDidMiniaturize:sender
+    {
+    if (!emacsframe->display.ns) return self;
+    emacsframe->async_iconified = 1;
+    /* Terminate the event loop.  */
+    if (send_appdefined) ns_send_appdefined (-1);
+    return self;
+    }
+ 
+ - mouseEntered:(NXEvent *)theEvent
+    {
+    if (emacsframe && emacsframe->auto_raise)
+       {
+       [[self window] makeKeyAndOrderFront:NXApp];
+       }
+    return self;
+    }
+ 
+ - mouseExited:(NXEvent *)theEvent
+    {
+    if (emacsframe && emacsframe->auto_lower)
+       {
+       [[self window] orderBack:NXApp]; /* XXX unfocus ! */
+       }
+    return self;
+    }
+ 
+ - menuDown:sender
+    {
+    static id list=nil;
+    NXEvent *theEvent;
+    NXPoint p;
+    int x,y;
+    id cell;
+ 
+    if (list!=nil) [list empty];
+    list=[sender getSelectedCells:list];
+    if ([list count]<1) return self;
+ 
+    if (eventsleft<=0) return self;
+    theEvent=[NXApp currentEvent];
+    ns_menu_path=Qnil;
+    for(cell=[list objectAt:0];cell!=nil;cell=[cell supercell])
+       ns_menu_path = Fcons([cell value],ns_menu_path);
+    [[self window] getMouseLocation:&p];
+    [self convertPoint:&p fromView:nil];
+ 
+    events->kind = mouse_click;
+    XSET (events->code, Lisp_Int, 0);
+    events->modifiers=EV_MODIFIERS(theEvent)|down_modifier;
+    XSET (events->x, Lisp_Int, (int)rint(p.x));
+    XSET (events->y, Lisp_Int, -1);
+    EV_TRAILER(theEvent);
+    return self;
+    }
+ 
+ - drawSelf:(const NXRect *)rects :(int)rectCount
+    {
+    if (!emacsframe->display.ns) return nil;
+ 
+    emacsframe->async_visible = 1;
+    emacsframe->async_iconified = 0;
+    ns_adjust_size(emacsframe);
+ 
+    /* Terminate the event loop.  */
+    if (send_appdefined) ns_send_appdefined (-1);
+    return self;
+    }
+ 
+ /* NXDraggingDestination protocol methods.  Actually this is not really a
+    protocol, but a category of Object.  O well...  */
+ 
+ -(NXDragOperation) draggingEntered:(id <NXDraggingInfo>) sender
+    {
+    return NX_DragOperationGeneric;
+    }
+ 
+ -(BOOL)performDragOperation:(id <NXDraggingInfo>) sender
+    {
+    id pb;
+    int i,x,y;
+    NXAtom type;
+    NXEvent *theEvent=[NXApp currentEvent];
+    NXPoint position;
+ 
+    position=theEvent->location;
+    [self convertPoint:&position fromView:nil];
+    ns_pixel_to_glyph_coords (emacsframe, (int)rint(position.x),
+                              (int)rint(position.y), &x, &y, 0, 1);
+ 
+    pb = [sender draggingPasteboard];
+    for (i=0;ns_drag_types[i];i++);
+    type = [pb findAvailableTypeFrom:ns_drag_types num:i];
+    if (type==0)
+       {
+       return NO;
+       }
+    else if (type==NXFilenamePboardType)
+       {
+       int l;
+       char *data;
+       char *d,*e;
+       if (![pb readType:type data:&data length:&l])
+          return NO;
+       for(d=data;(*d) && (eventsleft>0);d = *e ? e+1 : e)
+          {
+          for(e=d;*e!='\0' && *e!='\t';e++);
+          events->kind=non_ascii_keystroke;
+          events->code=KEY_NS_DRAG_FILE;
+          XSET(events->x, Lisp_Int, x);
+          XSET(events->y, Lisp_Int, y);
+          ns_input_file=append2(ns_input_file,make_string(d,e-d));
+          events->modifiers=EV_MODIFIERS(theEvent);
+          EV_TRAILER(theEvent);
+          }
+       [pb deallocatePasteboardData:data length:l];
+       return YES;
+       }
+    else if (type==NXAsciiPboardType || type==NXTabularTextPboardType)
+       {
+       int l;
+       char *data;
+       char *d,*e;
+       if (![pb readType:type data:&data length:&l])
+          return NO;
+       for(d=data;(*d) && (eventsleft>0);d = *e ? e+1 : e)
+          {
+          for(e=d;*e!='\0' && *e!='\t';e++);
+          events->kind=non_ascii_keystroke;
+          events->code=KEY_NS_DRAG_ASCII;
+          XSET(events->x, Lisp_Int, x);
+          XSET(events->y, Lisp_Int, y);
+          ns_input_ascii=make_string(d,e-d);
+          events->modifiers=EV_MODIFIERS(theEvent);
+          EV_TRAILER(theEvent);
+          }
+       [pb deallocatePasteboardData:data length:l];
+       return YES;
+       }
+    else if (type==NXColorPboardType)
+       {
+       NXColor c=NXReadColorFromPasteboard(pb);
+       events->kind=non_ascii_keystroke;
+       events->code=KEY_NS_DRAG_COLOR;
+       XSET(events->x, Lisp_Int, x);
+       XSET(events->y, Lisp_Int, y);
+       ns_input_color=ns_color_to_lisp(c);
+       events->modifiers=EV_MODIFIERS(theEvent);
+       EV_TRAILER(theEvent);
+       return YES;
+       }
+    else
+       {
+       error("Invalid data type in dragging pasteboard.");
+       return NO;
+       }
+    }
+ 
+ - validRequestorForSendType:(NXAtom)typeSent andReturnType:(NXAtom)typeReturned
+    {
+    int i;
+ 
+    for (i=0;ns_send_types[i] && ns_send_types[i]!=typeSent;i++);
+    for (i=0;ns_return_types[i] && ns_return_types[i]!=typeReturned;i++);
+    if (typeSent!=ns_send_types[i] || typeReturned!=ns_return_types[i])
+       return [super validRequestorForSendType:typeSent andReturnType:typeReturned];
+ 
+    return self;
+    }
+ @end
+ 
+ @implementation EmacsScroller
+ - initFrame:(const NXRect *)r window:(Lisp_Object)nwin
+    {
+    struct frame *f;
+    id view;
+ 
+    [super initFrame:r];
+    [self setTarget:self];
+    [self setAction:@selector(scrollerMoved:)];
+    [self setArrowsPosition:NX_SCROLLARROWSNONE];
+    [self setAutosizing:NX_MINXMARGINSIZABLE|NX_HEIGHTSIZABLE];
+    [self setAutodisplay:YES];
+    [self setContinuous:YES];
+    [self setEnabled:YES];
+ 
+    win=nwin;
+    staticpro(&win);
+    condemned=NO;
+ 
+    f=XFRAME(XWINDOW (win)->frame);
+    if (FRAME_LIVE_P(f))
+       {
+       view=f->display.ns->view;
+       [[[view window] contentView] addSubview:self];
+       }
+ 
+    [self setFrame:r];
+    return self;
+    }
+ 
+ - setFrame:(const NXRect *)r
+    {
+    struct frame *f=XFRAME(XWINDOW (win)->frame);
+    id view=FRAME_LIVE_P(f) ? f->display.ns->view : 0;
+    NXRect s,t;
+ 
+    [self getFrame:&s];
+    if (r==0)
+       {
+       t.origin=s.origin;
+       t.size.width=t.size.height=0;
+       }
+    else
+       {
+       t=*r;
+       }
+    [super setFrame:&t];
+    if (NXEqualRect(&t,&s) || !view) return self;
+    ns_reset_clip(view);
+ 
+       {
+       int i;
+       id sview=[self superview];
+       id subs=[sview subviews];
+       id v;
+ 
+       [sview lockFocus];
+       NXSetColor(f->display.ns->face->background_color);
+       NXRectFill(&s);
+       [sview unlockFocus];
+       [self display];
+ 
+       for (i=[subs count]-1; i>=0; i--)
+          {
+          v=[subs objectAt:i];
+          if (v==view || v==self) continue;
+          [v getFrame:&t];
+          if (!NXIntersectsRect(&t,&s)) continue;
+          [v display];
+          }
+       }
+ 
+    return self;
+    }
+ 
+ - free
+    {
+    [self setFrame:0];
+    if (!NILP(win)) XWINDOW (win)->vertical_scroll_bar = Qnil;
+    staticunpro(&win);
+    return [super free];
+    }
+ 
+ - scrollerMoved:sender
+    {
+    NXEvent *e=[NXApp currentEvent];
+    if (eventsleft <= 0) return nil;
+    events->kind = scroller_event;
+    if (curValue>0.999)
+       {
+       XSET (events->x, Lisp_Int, SHRT_MAX);
+       XSET (events->y, Lisp_Int, SHRT_MAX);
+       }
+    else
+       {
+       XSET (events->x, Lisp_Int, SHRT_MAX*(curValue*(1.0-perCent)));
+       XSET (events->y, Lisp_Int, SHRT_MAX);
+       }
+    events->code=0;
+    events->modifiers=EV_MODIFIERS(e);
+    events->frame_or_window=win;
+    events->timestamp=EV_TIMESTAMP (e);
+    events++;
+    eventsleft--;
+    if (send_appdefined) ns_send_appdefined (-1);
+    return self;
+    }
+ 
+ - setPosition:(int) position portion:(int) portion whole:(int) whole
+    {
+    if (portion>=whole)
+       [self setFloatValue:0.0:1.0];
+    else
+       {
+       double start=((double)position)/whole;
+       double end=((double)position+portion)/whole;
+       [self setFloatValue:start/(1.0-(end-start)):end-start];
+       }
+    }
+ 
+ - condemn
+    {
+    condemned=YES;
+    return self;
+    }
+ 
+ - reprieve
+    {
+    condemned=NO;
+    return self;
+    }
+ 
+ - judge
+    {
+    return condemned ? [self free] : self;
+    }
+ @end
+ 
+ /* Stolen from John C. Randolph */
+ @implementation Window (windowButtons)
+ - toggleClose:sender
+    {
+    wFlags.buttonMask ^= NX_CLOSEBUTTONMASK;
+    return [self updateBorder];
+    }
+ 
+ - toggleMiniaturize:sender
+    {
+    wFlags.buttonMask ^= NX_MINIATURIZEBUTTONMASK;
+    return [self updateBorder];
+    }
+ 
+ - setCloseButton:sender to:(BOOL)bool
+    {
+    if (!(wFlags.buttonMask & NX_CLOSEBUTTONMASK)==bool)
+       return [self toggleClose:sender];
+    return self;
+    }
+ 
+ - setMiniaturizeButton:sender to:(BOOL)bool
+    {
+    if (!(wFlags.buttonMask & NX_MINIATURIZEBUTTONMASK)==bool)
+       return [self toggleMiniaturize:sender];
+    return self;
+    }
+ 
+ - showCloseButton:sender
+    {
+    if (!(wFlags.buttonMask & NX_CLOSEBUTTONMASK))
+       return [self toggleClose:sender];
+    return self;
+    }
+ 
+ - showMiniaturizeButton:sender
+    {
+    if (!(wFlags.buttonMask & NX_MINIATURIZEBUTTONMASK))
+       return [self toggleMiniaturize:sender];
+    return self;
+    }
+ 
+ - hideCloseButton:sender
+    {
+    if (wFlags.buttonMask & NX_CLOSEBUTTONMASK)
+       return [self toggleClose:sender];
+    return self;
+    }
+ 
+ - hideMiniaturizeButton:sender
+    {
+    if (wFlags.buttonMask & NX_MINIATURIZEBUTTONMASK)
+       return [self toggleMiniaturize:sender];
+    return self;
+    }
+ 
+ - updateBorder
+    {
+    [_borderView _setMask:wFlags.buttonMask];
+    [_borderView tile];
+    [_borderView display];
+    return [self display];
+    }
+ @end
Index: emacs/src/nswraps.pswm
diff -c /dev/null emacs/src/nswraps.pswm:1.1
*** /dev/null	Fri Aug  2 21:08:44 1996
--- emacs/src/nswraps.pswm	Fri Jul 19 05:08:24 1996
***************
*** 0 ****
--- 1,47 ----
+ /* %% defineps nswrap_latinify(int no)
+ %% no execuserobject
+ %% dup begin Encoding end ISOLatin1Encoding ne
+ %% { dup length dict begin
+ %%  {1 index /FID ne {def} {pop pop} ifelse} forall
+ %%  /Encoding ISOLatin1Encoding def
+ %%  FontName dup length string cvs dup length 10 add string /FontName exch def
+ %%  dup length exch FontName exch 0 exch putinterval FontName exch (-ISOLatin1)
+ %%  putinterval FontName cvn /FontName exch def
+ %%  FontName
+ %%  currentdict
+ %% end
+ %% definefont no exch defineuserobject }
+ %% { pop } ifelse
+ %% endps */
+ 
+ defineps nswrap_transtable(char *EncodingIn,*EncodingOut|float Array[256])
+ /TrDict 256 dict def
+ 
+ TrDict begin
+   255 -1 0  { dup EncodingOut exch get
+     exch def
+   } bind for
+ end
+ 
+ 0 1 255 {
+   EncodingIn exch get dup
+   TrDict exch known  { TrDict exch get } { pop 0 } ifelse
+   Array
+ } bind for
+ endps
+ 
+ defineps nswrap_moveline(float x,y,l)
+ x y moveto l 0 rlineto
+ endps
+ 
+ defineps nswrap_moveshow(float x,y;char txt[n]; int n)
+ x y moveto (txt) show
+ endps
+ 
+ defineps nswrap_rect(float x,y,w,h)
+ 0 setlinewidth x y moveto w 0 rlineto 0 h rlineto w neg 0 rlineto closepath
+ endps
+ 
+ defineps nswrap_rect_rev(float x,y,w,h)
+ 0 setlinewidth x y moveto 0 h rlineto w 0 rlineto 0 h neg rlineto closepath
+ endps
Index: emacs/src/process.c
diff -c emacs/src/process.c:1.1.1.2 emacs/src/process.c:1.3
*** emacs/src/process.c:1.1.1.2	Mon Jul 22 01:41:00 1996
--- emacs/src/process.c	Wed Jul 31 01:38:28 1996
***************
*** 54,59 ****
--- 54,63 ----
  #include <arpa/inet.h>
  #endif /* HAVE_SOCKETS */
  
+ #ifdef HAVE_NS
+ #define select(n,r,w,e,t) ns_select(n,r,w,e,t)
+ #endif
+ 
  /* TERM is a poor-man's SLIP, used on Linux.  */
  #ifdef TERM
  #include <client.h>
***************
*** 817,824 ****
    CHECK_PROCESS (proc, 0);
    CHECK_NATNUM (height, 0);
    CHECK_NATNUM (width, 0);
!   if (set_window_size (XINT (XPROCESS (proc)->infd),
! 		       XINT (height), XINT(width)) <= 0)
      return Qnil;
    else
      return Qt;
--- 821,828 ----
    CHECK_PROCESS (proc, 0);
    CHECK_NATNUM (height, 0);
    CHECK_NATNUM (width, 0);
!   if (tty_set_window_size (XINT (XPROCESS (proc)->infd),
!                            XINT (height), XINT(width)) <= 0)
      return Qnil;
    else
      return Qt;
***************
*** 2168,2175 ****
  		}
  	      proc = chan_process[channel];
  	      if (NILP (proc))
! 		continue;
! 
  	      /* Read data from the process, starting with our
  		 buffered-ahead character if we have one.  */
  
--- 2172,2183 ----
  		}
  	      proc = chan_process[channel];
  	      if (NILP (proc))
!                  {
!                  gobble_input(0);
!                  continue;
!                  }
!               
!               
  	      /* Read data from the process, starting with our
  		 buffered-ahead character if we have one.  */
  
Index: emacs/src/scroll.c
diff -c emacs/src/scroll.c:1.1.1.2 emacs/src/scroll.c:1.3
*** emacs/src/scroll.c:1.1.1.2	Mon Jul 22 01:41:14 1996
--- emacs/src/scroll.c	Wed Jul 31 01:38:37 1996
***************
*** 272,279 ****
    bcopy (current_frame->bufp, temp_frame->bufp,
  	 current_frame->height * sizeof (int));
  
! #ifdef HAVE_X_WINDOWS
!   if (FRAME_X_P (frame))
      {
        bcopy (current_frame->top_left_x, temp_frame->top_left_x,
  	     current_frame->height * sizeof (short));
--- 272,279 ----
    bcopy (current_frame->bufp, temp_frame->bufp,
  	 current_frame->height * sizeof (int));
  
! #ifdef HAVE_WIN
!   if (FRAME_WIN_P (frame))
      {
        bcopy (current_frame->top_left_x, temp_frame->top_left_x,
  	     current_frame->height * sizeof (short));
Index: emacs/src/sysdep.c
diff -c emacs/src/sysdep.c:1.1.1.2 emacs/src/sysdep.c:1.3
*** emacs/src/sysdep.c:1.1.1.2	Mon Jul 22 01:41:22 1996
--- emacs/src/sysdep.c	Wed Jul 31 01:38:40 1996
***************
*** 1552,1558 ****
     to HEIGHT and WIDTH.  This is used mainly with ptys.  */
  
  int
! set_window_size (fd, height, width)
       int fd, height, width;
  {
  #ifdef TIOCSWINSZ
--- 1552,1558 ----
     to HEIGHT and WIDTH.  This is used mainly with ptys.  */
  
  int
! tty_set_window_size (fd, height, width)
       int fd, height, width;
  {
  #ifdef TIOCSWINSZ
***************
*** 2405,2412 ****
  /* Read keyboard input into the standard buffer,
     waiting for at least one character.  */
  
! /* Make all keyboard buffers much bigger when using X windows.  */
! #ifdef HAVE_X_WINDOWS
  #define BUFFER_SIZE_FACTOR 16
  #else
  #define BUFFER_SIZE_FACTOR 1
--- 2405,2412 ----
  /* Read keyboard input into the standard buffer,
     waiting for at least one character.  */
  
! /* Make all keyboard buffers much bigger when using a window system.  */
! #ifdef HAVE_WIN
  #define BUFFER_SIZE_FACTOR 16
  #else
  #define BUFFER_SIZE_FACTOR 1
Index: emacs/src/term.c
diff -c emacs/src/term.c:1.1.1.2 emacs/src/term.c:1.3
*** emacs/src/term.c:1.1.1.2	Mon Jul 22 01:41:26 1996
--- emacs/src/term.c	Wed Jul 31 01:38:43 1996
***************
*** 1113,1127 ****
    FRAME_COST_BAUD_RATE (frame) = baud_rate;
  
    scroll_region_cost = string_cost (f);
! #ifdef HAVE_X_WINDOWS
!   if (FRAME_X_P (frame))
!     {
!       do_line_insertion_deletion_costs (frame, 0, ".5*", 0, ".5*",
! 					0, 0,
! 					x_screen_planes (frame));
!       scroll_region_cost = 0;
!       return;
!     }
  #endif
  
    /* These variables are only used for terminal stuff.  They are allocated
--- 1113,1133 ----
    FRAME_COST_BAUD_RATE (frame) = baud_rate;
  
    scroll_region_cost = string_cost (f);
! #ifdef HAVE_WIN
!   {
!     Lisp_Object f,planes=Qnil;
! 
!     XSETFRAME (f, frame);
!     if (FRAME_WIN_P (frame))
!       planes=Fdisplay_planes(f);
!     if (XTYPE (planes) == Lisp_Int)
!       {
!         do_line_insertion_deletion_costs (frame, 0, ".5*", 0, ".5*",
!                                           0, 0, XINT(planes));
!         scroll_region_cost = 0;
!         return;
!       }
!   }
  #endif
  
    /* These variables are only used for terminal stuff.  They are allocated
Index: emacs/src/termhooks.h
diff -c emacs/src/termhooks.h:1.1.1.2 emacs/src/termhooks.h:1.3
*** emacs/src/termhooks.h:1.1.1.2	Mon Jul 22 01:43:21 1996
--- emacs/src/termhooks.h	Wed Jul 31 01:38:45 1996
***************
*** 243,264 ****
  				   whose scroll bar was clicked in.
  				   .timestamp gives a timestamp (in
  				   milliseconds) for the click.  */
!   selection_request_event,	/* Another X client wants a selection from us.
  				   See `struct selection_event'.  */
!   selection_clear_event,	/* Another X client cleared our selection.  */
    buffer_switch_event,		/* A process filter has switched buffers.  */
!   delete_window_event,		/* An X client said "delete this window".  */
    menu_bar_event,		/* An event generated by the menu bar.
  				   The frame_or_window field's cdr holds the
  				   Lisp-level event value.
! 				   (Only the toolkit version uses these.)  */
    iconify_event,		/* An X client iconified this window.  */
    deiconify_event		/* An X client deiconified this window.  */
  };
  
  /* If a struct input_event has a kind which is selection_request_event
     or selection_clear_event, then its contents are really described
!    by `struct selection_event'; see xterm.h.  */
  
  /* The keyboard input buffer is an array of these structures.  Each one
     represents some sort of input event - a keystroke, a mouse click, or
--- 243,267 ----
  				   whose scroll bar was clicked in.
  				   .timestamp gives a timestamp (in
  				   milliseconds) for the click.  */
!   selection_request_event,	/* Another client wants a selection from us.
  				   See `struct selection_event'.  */
!   selection_clear_event,	/* Another client cleared our selection.  */
    buffer_switch_event,		/* A process filter has switched buffers.  */
!   delete_window_event,		/* A client said "delete this window".  */
!   scroller_event,               /* A scroller event for window systems which
!                                    handle scrollers themselves */
!   frame_switch_event,           /* A user switched the frame */
    menu_bar_event,		/* An event generated by the menu bar.
  				   The frame_or_window field's cdr holds the
  				   Lisp-level event value.
! 				   (Only the toolkit and NS version uses these.) */
    iconify_event,		/* An X client iconified this window.  */
    deiconify_event		/* An X client deiconified this window.  */
  };
  
  /* If a struct input_event has a kind which is selection_request_event
     or selection_clear_event, then its contents are really described
!    by `struct selection_event'; see xterm.h/nsterm.h.  */
  
  /* The keyboard input buffer is an array of these structures.  Each one
     represents some sort of input event - a keystroke, a mouse click, or
Index: emacs/src/unexnext.c
diff -c emacs/src/unexnext.c:1.1.1.1 emacs/src/unexnext.c:1.2
*** emacs/src/unexnext.c:1.1.1.1	Fri Jul 19 01:52:39 1996
--- emacs/src/unexnext.c	Fri Jul 19 05:08:43 1996
***************
*** 2,430 ****
     Copyright (C) 1990, 1993 Free Software Foundation, Inc.
     Written by Bradley Taylor (btaylor@next.com).
  
! This file is part of GNU Emacs.
  
! GNU Emacs is free software; you can redistribute it and/or modify
! it under the terms of the GNU General Public License as published by
! the Free Software Foundation; either version 2, or (at your option)
! any later version.
! 
! GNU Emacs is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
! GNU General Public License for more details.
! 
! You should have received a copy of the GNU General Public License
! along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
! 
! 
! #undef __STRICT_BSD__
  
  #include <stdio.h>
! #include <stdlib.h>
! #include <stdarg.h>
  #include <mach/mach.h>
  #include <mach-o/loader.h>
- #include <sys/file.h>
- #include <sys/stat.h>
- #include <libc.h>
- 
  
  int malloc_cookie;
  
! /*
!  * Kludge: we don't expect any program data beyond VM_HIGHDATA
!  * What is really needed is a way to find out from malloc() which
!  * pages it vm_allocated and write only those out into the data segment.
!  *
!  * This kludge may break when we stop using fixed virtual address
!  * shared libraries. Actually, emacs will probably continue working, but be 
!  * much larger on disk than it needs to be (because non-malloced data will
!  * be in the file).
!  */
! static const unsigned VM_HIGHDATA = 0x2000000;
! 
! typedef struct region_t {
! 	vm_address_t address;
! 	vm_size_t size;
! 	vm_prot_t protection;
! 	vm_prot_t max_protection;
! 	vm_inherit_t inheritance;
! 	boolean_t shared;
! 	port_t object_name;
! 	vm_offset_t offset;
! } region_t;
! 
! 
! static void
! grow(
!      struct load_command ***the_commands,
!      unsigned *the_commands_len
!      )
! {
! 	if (*the_commands == NULL) {
! 		*the_commands_len = 1;
! 		*the_commands = malloc(sizeof(*the_commands));
! 	} else {
! 		(*the_commands_len)++;
! 		*the_commands = realloc(*the_commands, 
! 					(*the_commands_len *
! 					 sizeof(**the_commands)));
! 	}
! }
! 
! 
! static void
! save_command(
! 	     struct load_command *command,
! 	     struct load_command ***the_commands,
! 	     unsigned *the_commands_len
! 	     )
! {
! 	struct load_command **tmp;
! 
! 	grow(the_commands, the_commands_len);
! 	tmp = &(*the_commands)[*the_commands_len - 1];
! 	*tmp = malloc(command->cmdsize);
! 	bcopy(command, *tmp, command->cmdsize);
! }
! 
! static void
! fatal_unexec(char *format, ...)
! {
! 	va_list ap;
! 
! 	va_start(ap, format);
! 	fprintf(stderr, "unexec: ");
! 	vfprintf(stderr, format, ap);
! 	fprintf(stderr, "\n");
! 	va_end(ap);
! }
! 
! static int
! read_macho(
! 	   int fd,
! 	   struct mach_header *the_header,
! 	   struct load_command ***the_commands,
! 	   unsigned *the_commands_len
! 	   )
! {
! 	struct load_command command;
! 	struct load_command *buf;
! 	int i;
! 	int size;
! 
! 	if (read(fd, the_header, sizeof(*the_header)) != sizeof(*the_header)) {
! 		fatal_unexec("cannot read macho header");
! 		return (0);
! 	}
! 	for (i = 0; i < the_header->ncmds; i++) {
! 		if (read(fd, &command, sizeof(struct load_command)) != 
! 		    sizeof(struct load_command)) {
! 		  	fatal_unexec("cannot read macho load command header");
! 			return (0);
! 		}
! 		size = command.cmdsize - sizeof(struct load_command);
! 		if (size < 0) {
! 		  	fatal_unexec("bogus load command size");
! 			return (0);
! 		}
! 		buf = malloc(command.cmdsize);
! 		buf->cmd = command.cmd;
! 		buf->cmdsize = command.cmdsize;
! 		if (read(fd, ((char *)buf + 
! 			      sizeof(struct load_command)), 
! 			 size) != size) {
! 		  	fatal_unexec("cannot read load command data");
! 			return (0);
! 		}
! 		save_command(buf, the_commands, the_commands_len);
! 	}
! 	return (1);
! }
! 
! static int
! filldatagap(
! 	    vm_address_t start_address,
! 	    vm_size_t *size,
! 	    vm_address_t end_address
! 	    )
! {
! 	vm_address_t address;
! 	vm_size_t gapsize;
! 
! 	address = (start_address + *size);
! 	gapsize = end_address - address;
! 	*size += gapsize;
! 	if (vm_allocate(task_self(), &address, gapsize,
! 			FALSE) != KERN_SUCCESS) {
! 		fatal_unexec("cannot vm_allocate");
! 	        return (0);
! 	}
! 	return (1);
! }
! 
! static int
! get_data_region(
! 		vm_address_t *address,
! 		vm_size_t *size
! 		)
! {
! 	region_t region;
! 	kern_return_t ret;
! 	struct section *sect;
! 
! 	sect = (struct section *) getsectbyname(SEG_DATA, SECT_DATA);
! 	region.address = 0;
! 	*address = 0;
! 	for (;;) {
! 		ret = vm_region(task_self(), 
! 				&region.address, 
! 				&region.size, 
! 				&region.protection, 
! 				&region.max_protection, 
! 				&region.inheritance,
! 				&region.shared, 
! 				&region.object_name, 
! 				&region.offset);
! 		if (ret != KERN_SUCCESS || region.address >= VM_HIGHDATA) {
! 			break;
! 		}
! 		if (*address != 0) {
! 			if (region.address > *address + *size) {
! 				if (!filldatagap(*address, size, 
! 						 region.address)) {
! 					return (0);
! 				}
! 			} 
! 			*size += region.size;
! 		} else {
! 			if (region.address == sect->addr) {
! 				*address = region.address;
! 				*size = region.size;
! 			} 
! 		}
! 		region.address += region.size;
! 	}
! 	return (1);
! }
! 
! static char *
! my_malloc(
! 	  vm_size_t size
! 	  )
! {
! 	vm_address_t address;
! 
! 	if (vm_allocate(task_self(), &address, size, TRUE) != KERN_SUCCESS) {
! 		return (NULL);
! 	}
! 	return ((char *)address);
! }
! 
! static void
! my_free(
! 	char *buf,
! 	vm_size_t size
! 	)
! {
! 	vm_deallocate(task_self(), (vm_address_t)buf, size);
! }
! 
! static int
! unexec_doit(
! 	    int infd,
! 	    int outfd
! 	    )
! {
! 	int i;
! 	struct load_command **the_commands = NULL;
! 	unsigned the_commands_len;
! 	struct mach_header the_header;
! 	int fgrowth;
! 	int fdatastart;
! 	int fdatasize;
! 	int size;
! 	struct stat st;
! 	char *buf;
! 	vm_address_t data_address;
! 	vm_size_t data_size;
! 
! 	struct segment_command *segment;
! 
! 	if (!read_macho(infd, &the_header, &the_commands, &the_commands_len)) {
! 		return (0);
! 	}
! 
! 
! 	malloc_cookie = malloc_freezedry ();
! 	if (!get_data_region(&data_address, &data_size)) {
! 		return (0);
! 	}
! 
! 
! 	/*
! 	 * DO NOT USE MALLOC IN THIS SECTION
! 	 */
! 	{
! 		/*
! 		 * Fix offsets
! 		 */
! 		for (i = 0; i < the_commands_len; i++) {
! 			switch (the_commands[i]->cmd) {
! 			case LC_SEGMENT:
! 				segment = ((struct segment_command *)
! 					   the_commands[i]);
! 				if (strcmp(segment->segname, SEG_DATA) == 0) {
! 					fdatastart = segment->fileoff;
! 					fdatasize = segment->filesize;
! 					fgrowth = (data_size - 
! 						   segment->filesize);
! 					segment->vmsize = data_size;
! 					segment->filesize = data_size;
! 				}
! 				break;
! 			case LC_SYMTAB:
! 				((struct symtab_command *)
! 				 the_commands[i])->symoff += fgrowth;
! 				((struct symtab_command *)
! 				 the_commands[i])->stroff += fgrowth;
! 				break;
! 			case LC_SYMSEG:
! 				((struct symseg_command *)
! 				 the_commands[i])->offset += fgrowth;
! 				break;
! 			default:
! 				break;
! 			}
! 		}
! 		
! 		/*
! 		 * Write header
! 		 */
! 		if (write(outfd, &the_header, 
! 			  sizeof(the_header)) != sizeof(the_header)) {
! 			fatal_unexec("cannot write output file");
! 			return (0);
! 		}
! 		
! 		/*
! 		 * Write commands
! 		 */
! 		for (i = 0; i < the_commands_len; i++) {
! 			if (write(outfd, the_commands[i], 
! 				  the_commands[i]->cmdsize) != 
! 			    the_commands[i]->cmdsize) {
! 			  	fatal_unexec("cannot write output file");
! 				return (0);
! 			}
! 		}
! 		
! 		/*
! 		 * Write original text
! 		 */
! 		if (lseek(infd, the_header.sizeofcmds + sizeof(the_header), 
! 			  L_SET) < 0) {
! 		  	fatal_unexec("cannot seek input file");
! 			return (0);
! 		}
! 		size = fdatastart - (sizeof(the_header) + 
! 				     the_header.sizeofcmds);
! 		buf = my_malloc(size);
! 		if (read(infd, buf, size) != size) {
! 			my_free(buf, size);
! 		  	fatal_unexec("cannot read input file");
! 		}
! 		if (write(outfd, buf, size) != size) {
! 			my_free(buf, size);
! 			fatal_unexec("cannot write output file");
! 			return (0);
! 		}
! 		my_free(buf, size);
! 		
! 		
! 		/*
! 		 * Write new data
! 		 */
! 		if (write(outfd, (char *)data_address, 
! 			  data_size) != data_size) {
! 			fatal_unexec("cannot write output file");
! 			return (0);
! 		}
! 		
! 	}
! 
! 	/*
! 	 * OKAY TO USE MALLOC NOW
! 	 */
! 
! 	/*
! 	 * Write rest of file
! 	 */
! 	fstat(infd, &st);
! 	if (lseek(infd, fdatasize, L_INCR) < 0) {
! 		fatal_unexec("cannot seek input file");
! 		return (0);
! 	}
! 	size = st.st_size - lseek(infd, 0, L_INCR);
! 
! 	buf = malloc(size);
! 	if (read(infd, buf, size) != size) {
! 		free(buf);
! 		fatal_unexec("cannot read input file");
! 		return (0);
! 	}
! 	if (write(outfd, buf, size) != size) {
! 		free(buf);
! 		fatal_unexec("cannot write output file");
! 		return (0);
! 	}
! 	free(buf);
! 	return (1);
! }
! 
! void
! unexec(
!        char *outfile,
!        char *infile
!        )
! {
! 	int infd;
! 	int outfd;
! 	char tmpbuf[L_tmpnam];
! 	char *tmpfile;
! 
! 	infd = open(infile, O_RDONLY, 0);
! 	if (infd < 0) {
! 	  	fatal_unexec("cannot open input file `%s'", infile);
! 		exit(1);
! 	}
! 	
! 	tmpnam(tmpbuf);
! 	tmpfile = rindex(tmpbuf, '/');
! 	if (tmpfile == NULL) {
! 		tmpfile = tmpbuf;
! 	} else {
! 		tmpfile++;
! 	}
! 	outfd = open(tmpfile, O_WRONLY|O_TRUNC|O_CREAT, 0755);
! 	if (outfd < 0) {
! 		close(infd);
! 		fatal_unexec("cannot open tmp file `%s'", tmpfile);
! 		exit(1);
! 	}
! 	if (!unexec_doit(infd, outfd)) {
! 		close(infd);
! 		close(outfd);
! 		unlink(tmpfile);
! 		exit(1);
! 	}
! 	close(infd);
! 	close(outfd);
! 	if (rename(tmpfile, outfile) < 0) {
! 		unlink(tmpfile);
! 		fatal_unexec("cannot rename `%s' to `%s'", tmpfile, outfile);
! 		exit(1);
! 	}
! }
--- 2,300 ----
     Copyright (C) 1990, 1993 Free Software Foundation, Inc.
     Written by Bradley Taylor (btaylor@next.com).
  
!    This file is part of GNU Emacs.
  
!    GNU Emacs is free software; you can redistribute it and/or modify
!    it under the terms of the GNU General Public License as published by
!    the Free Software Foundation; either version 2, or (at your option)
!    any later version.
!    
!    GNU Emacs is distributed in the hope that it will be useful,
!    but WITHOUT ANY WARRANTY; without even the implied warranty of
!    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
!    GNU General Public License for more details.
!    
!    You should have received a copy of the GNU General Public License
!    along with GNU Emacs; see the file COPYING.  If not, write to
!    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  #include <stdio.h>
! #include <libc.h>
! #include <nlist.h>
  #include <mach/mach.h>
+ #include <mach-o/ldsyms.h>
  #include <mach-o/loader.h>
  
  int malloc_cookie;
  
! static void fatal_unexec(char *format, ...)
!    {
!    va_list ap;
!    
!    va_start(ap, format);
!    fprintf(stderr, "unexec: ");
!    vfprintf(stderr, format, ap);
!    fprintf(stderr, "\n");
!    va_end(ap);
!    exit(1);
!    }
! 
! static void mcopy(int ffd,int tfd,
!                   unsigned long fpos,unsigned long tpos,unsigned long len)
!    {
!    if ((ffd==-1)&&(tfd==-1))
!       {
!       char *f,*t,*e;
!       if (fpos>tpos)
!          {
!          f=(char *)fpos;
!          t=(char *)tpos;
!          e=(char *)(fpos+len);
!          while(f<e) *t++=*f++;
!          }
!       else if (tpos>fpos)
!          {
!          f=(char *)(fpos+len);
!          t=(char *)(tpos+len);
!          e=(char *)fpos;
!          while(f>e) *--t=*--f;         
!          }   
!       }
!    else if (ffd==-1)
!       {
!       if (lseek(tfd,tpos,L_SET)<0)
!          fatal_unexec("cannot seek target");
!       if (write(tfd,(void *)fpos,len)!=len)
!          fatal_unexec("cannot write target");
!       }
!    else if (tfd==-1)
!       {
!       if (lseek(ffd,fpos,L_SET)<0)
!          fatal_unexec("cannot seek source");
!       if (read(ffd,(void *)tpos,len)!=len)
!          fatal_unexec("cannot read source");
!       }
!    else
!       {
!       int bread;
!       char *buf=alloca(1<<16);
!       
!       if (lseek(ffd,fpos,L_SET)<0)
!          fatal_unexec("cannot seek source");
!       
!       if (lseek(tfd,tpos,L_SET)<0)
!          fatal_unexec("cannot seek target");
!       
!       while((len>0) && (bread=read(ffd,buf,MIN(1<<16,len)))>0)
!          {
!          if (bread<0)
!             fatal_unexec("cannot read source");
!          if (write(tfd,buf,bread)!=bread)
!             fatal_unexec("cannot write target");
!          len-=bread;
!          }
!       }
!    }
! 
! static void unexec_doit(int infd,int outfd)
!    {
!    int i,j,hpos,opos;
!    extern int malloc_freezedry(void);
!    struct region
!       {
!       struct region *next;
!       unsigned long addr;
!       unsigned long size;
!       vm_prot_t prot;
!       vm_prot_t mprot;
!       } *regions=0,*cregion,**pregions;
!    struct mach_header mh;
!    struct segment_command *lc,*sp;
!    struct symtab_command *st;
!    struct section *sect;
! 
!    malloc_cookie=malloc_freezedry();
!    
!       {
!       vm_task_t task=task_self();
!       vm_address_t addr;
!       vm_size_t size;
!       vm_prot_t prot,mprot;
!       vm_inherit_t inhe;
!       boolean_t shrd;
!       port_t name;
!       vm_offset_t offset;
!       
!       for(addr=VM_MIN_ADDRESS,pregions=&regions;
!           vm_region(task,&addr,&size,&prot,&mprot,
!                     &inhe,&shrd,&name,&offset)==KERN_SUCCESS;
!           addr += size)
!          {
!          (*pregions)=alloca(sizeof(struct region));
!          (*pregions)->addr=addr;
!          (*pregions)->size=size;
!          (*pregions)->prot=prot;
!          (*pregions)->mprot=mprot;
!          (*pregions)->next=0;
!          pregions=&((*pregions)->next);
!          }
!       }
!    
!    for(cregion=regions;cregion;cregion=cregion->next)
!       while ((cregion->next) &&
!              (cregion->next->addr==cregion->addr+cregion->size) &&
!              (cregion->next->prot==cregion->prot) &&
!              (cregion->next->mprot==cregion->mprot))
!          {
!          cregion->size += cregion->next->size;
!          cregion->next = cregion->next->next;
!          }
! 
!    mcopy(infd,-1,0,(unsigned long) &mh,sizeof(mh));
!    lc=alloca(mh.sizeofcmds);
!    mcopy(infd,-1,sizeof(mh),(unsigned long) lc,mh.sizeofcmds);
!    
!    for(pregions=&regions;*pregions;)
!       {
!       if (!((*pregions)->prot&VM_PROT_WRITE)
!           || ((*pregions)->addr>=0x3000000))
!          goto kill_region;
!       
!       for(sp=lc,i=0;
!           i<mh.ncmds;
!           i++,sp=(struct segment_command *)(((char *)sp)+sp->cmdsize))
!          {
!          unsigned long ob,oe;
!          if (sp->cmd!=LC_SEGMENT||(strcmp(sp->segname,SEG_DATA)==0)) continue;
!          ob=MAX((*pregions)->addr,sp->vmaddr);
!          oe=MIN((*pregions)->addr+(*pregions)->size,sp->vmaddr+sp->vmsize);
!          if (ob >= oe) continue;
!          if (ob==(*pregions)->addr)
!             if (oe==(*pregions)->addr+(*pregions)->size)
!                {
!                goto kill_region;
!                }
!             else
!                {
!                (*pregions)->addr=oe;
!                (*pregions)->size-=(oe-ob);
!                }
!          else
!             if (oe==(*pregions)->addr+(*pregions)->size)
!                {
!                (*pregions)->size-=(oe-ob);
!                }
!             else
!                {
!                cregion=alloca(sizeof(*cregion));
!                cregion->addr=oe;
!                cregion->size=((*pregions)->addr+(*pregions)->size)-oe;
!                cregion->prot=(*pregions)->prot;
!                cregion->mprot=(*pregions)->mprot;
!                cregion->next=(*pregions)->next;
!                (*pregions)->size=ob-(*pregions)->addr;
!                (*pregions)->next=cregion;
!                }
!          }
!       pregions=&((*pregions)->next);
!       continue;
!     kill_region:
!       *pregions=(*pregions)->next;
!       }
! 
!    for(sp=lc,i=mh.ncmds,hpos=sizeof(mh),opos=0;
!        i>0;
!        i--,sp=(struct segment_command *)(((char *)sp)+sp->cmdsize))
!       switch (sp->cmd)
!          {
!        case LC_SEGMENT:
!          if (strcmp(sp->segname,SEG_DATA)==0)
!             {
!             mh.ncmds--;
!             j=sp->cmdsize;
!             while (regions)
!                {
!                mcopy(-1,outfd,regions->addr,opos,regions->size);
!                sp->cmd=LC_SEGMENT;
!                sp->cmdsize=sizeof(*sp);
!                strncpy(sp->segname,SEG_DATA,sizeof(sp->segname));
!                sp->vmaddr=regions->addr;
!                sp->vmsize=regions->size;
!                sp->filesize=regions->size;
!                sp->maxprot=regions->prot;
!                sp->initprot=regions->mprot;
!                sp->nsects=0;
!                sp->flags=0;
!                sp->fileoff=opos;
!                opos+=sp->filesize;
!                mcopy(-1,outfd,(unsigned long)sp,hpos,sp->cmdsize);
!                hpos+=sp->cmdsize;
!                mh.ncmds++;
!                regions=regions->next;
!                }
!             sp->cmdsize=j;
!             regions=0;
!             }
!          else if (strcmp(sp->segname,SEG_LINKEDIT)==0)
!             {
!             mh.ncmds--;
!             }
!          else
!             {
!             mcopy(infd,outfd,sp->fileoff,opos,sp->filesize);
!             sect=(struct section *) (((char *)sp)+sizeof(*sp));
!             for(j=0;j<sp->nsects;j++)
!                {
!                if (sect[j].offset!=0)
!                   sect[j].offset=(sect[j].offset-sp->fileoff)+opos;
!                if (sect[j].reloff!=0)
!                   sect[j].reloff=(sect[j].reloff-sp->fileoff)+opos;
!                }
!             sp->fileoff=opos;
!             opos+=sp->filesize;
!             mcopy(-1,outfd,(unsigned long)sp,hpos,sp->cmdsize);
!             hpos+=sp->cmdsize;
!             }
! 	 break;
!        case LC_SYMTAB:
!          st=(struct symtab_command *)sp;
!          
!          mcopy(infd,outfd,st->symoff,opos,st->nsyms*sizeof(struct nlist));
!          st->symoff=opos;
!          opos+=sizeof(struct nlist)*st->nsyms;
!          
!          mcopy(infd,outfd,st->stroff,opos,st->strsize);
!          ((struct symtab_command *)sp)->stroff=opos;
!          opos+=((struct symtab_command *)sp)->strsize;
!        default:
!          mcopy(-1,outfd,(unsigned long)sp,hpos,sp->cmdsize);
!          hpos+=sp->cmdsize;
!          }
!    mh.sizeofcmds=hpos-sizeof(mh);
!    mcopy(-1,outfd,(unsigned long) &mh,0,sizeof(mh));
!    }
! 
! void unexec(char *outfile,char *infile)
!    {
!    char tmpfile[MAXPATHLEN];
!    int infd,outfd;
!    
!    if ((infd=open(infile, O_RDONLY, 0))<0)
!       fatal_unexec("cannot open input file `%s'", infile);
! 
!    strcpy(tmpfile,outfile);
!    strcat(tmpfile,"-temp");
!    
!    if ((outfd=open(tmpfile, O_RDWR|O_TRUNC|O_CREAT, 0755))<0)
!       fatal_unexec("cannot open temporary output file `%s'",tmpfile);
! 
!    unexec_doit(infd,outfd);
! 
!    close(infd);
!    close(outfd);
!    if (rename(tmpfile, outfile)<0)
!       {
!       unlink(tmpfile);
!       fatal_unexec("cannot rename `%s' to `%s'", tmpfile, outfile);
!       }  
!    }
Index: emacs/src/xdisp.c
diff -c emacs/src/xdisp.c:1.1.1.2 emacs/src/xdisp.c:1.3
*** emacs/src/xdisp.c:1.1.1.2	Mon Jul 22 01:42:13 1996
--- emacs/src/xdisp.c	Wed Jul 31 01:38:50 1996
***************
*** 36,42 ****
  #include "intervals.h"
  #include "keyboard.h"
  
! #ifdef USE_X_TOOLKIT
  extern void set_frame_menubar ();
  #endif
  
--- 36,46 ----
  #include "intervals.h"
  #include "keyboard.h"
  
! #ifdef HAVE_NS
! #include "nsterm.h"
! #endif
! 
! #if defined (USE_X_TOOLKIT) || defined (HAVE_NS)
  extern void set_frame_menubar ();
  #endif
  
***************
*** 600,606 ****
    previous_echo_glyphs = echo_area_glyphs;
  }
  
! #ifdef HAVE_X_WINDOWS
  static char frame_title_buf[512];
  static char *frame_title_ptr;
  
--- 604,610 ----
    previous_echo_glyphs = echo_area_glyphs;
  }
  
! #ifdef HAVE_WIN
  static char frame_title_buf[512];
  static char *frame_title_ptr;
  
***************
*** 621,627 ****
  }
  
  static void
! x_consider_frame_title (frame)
       Lisp_Object frame;
  {
    Lisp_Object fmt;
--- 625,631 ----
  }
  
  static void
! consider_frame_title (frame)
       Lisp_Object frame;
  {
    Lisp_Object fmt;
***************
*** 629,637 ****
    int len;
    FRAME_PTR f = XFRAME (frame);
  
!   if (!FRAME_X_P (f) || FRAME_MINIBUF_ONLY_P (f) || f->explicit_name)
      return;
  
    /* Do we have more than one visible frame on this X display?  */
    {
      Lisp_Object tail;
--- 633,663 ----
    int len;
    FRAME_PTR f = XFRAME (frame);
  
!   if (!FRAME_WIN_P (f) || FRAME_MINIBUF_ONLY_P (f) || f->explicit_name)
      return;
  
+ #ifdef HAVE_NS
+   if (FRAME_NS_P (f))
+   {
+     void ns_set_doc_edited(struct frame *f, Lisp_Object arg, Lisp_Object oldval);
+     void ns_set_icon_type(struct frame *f, Lisp_Object arg, Lisp_Object oldval);
+     
+     Lisp_Object win=f->selected_window;
+     Lisp_Object buf=XWINDOW(win)->buffer;
+     Lisp_Object title;
+     
+     if (!MINI_WINDOW_P(XWINDOW(win)))
+     {
+       title=XBUFFER(buf)->filename;
+       if (NILP(title)) title=XBUFFER(buf)->name;
+       
+       ns_implicitly_set_name(f, title, Qnil);
+       ns_set_icon_type(f, f->name, Qnil);
+       ns_set_doc_edited(f, Fbuffer_modified_p(buf), Qnil);
+     }
+     return;
+   }
+ #endif
    /* Do we have more than one visible frame on this X display?  */
    {
      Lisp_Object tail;
***************
*** 664,670 ****
       level than this.)  */
    if (! STRINGP (f->name) || XSTRING (f->name)->size != len
        || bcmp (frame_title_buf, XSTRING (f->name)->data, len) != 0)
!     x_implicitly_set_name (f, make_string (frame_title_buf, len), Qnil);
  }
  #else
  #define frame_title_ptr ((char *)0)
--- 690,696 ----
       level than this.)  */
    if (! STRINGP (f->name) || XSTRING (f->name)->size != len
        || bcmp (frame_title_buf, XSTRING (f->name)->data, len) != 0)
!     implicitly_set_name (f, make_string (frame_title_buf, len), Qnil);
  }
  #else
  #define frame_title_ptr ((char *)0)
***************
*** 694,700 ****
       create its menu bar using the name `emacs' if no other name
       has yet been specified."
       I think that is no longer a concern.  */
! #ifdef HAVE_X_WINDOWS
    if (windows_or_buffers_changed)
      {
        Lisp_Object tail, frame;
--- 720,726 ----
       create its menu bar using the name `emacs' if no other name
       has yet been specified."
       I think that is no longer a concern.  */
! #ifdef HAVE_WIN
    if (windows_or_buffers_changed)
      {
        Lisp_Object tail, frame;
***************
*** 702,708 ****
        FOR_EACH_FRAME (tail, frame)
  	if (FRAME_VISIBLE_P (XFRAME (frame))
  	    || FRAME_ICONIFIED_P (XFRAME (frame)))
! 	  x_consider_frame_title (frame);
      }
  #endif
  
--- 728,734 ----
        FOR_EACH_FRAME (tail, frame)
  	if (FRAME_VISIBLE_P (XFRAME (frame))
  	    || FRAME_ICONIFIED_P (XFRAME (frame)))
! 	  consider_frame_title (frame);
      }
  #endif
  
***************
*** 1238,1248 ****
      w->update_mode_line = Qt;
  
    if (
  #ifdef USE_X_TOOLKIT
!       FRAME_EXTERNAL_MENU_BAR (f) 
  #else
        FRAME_MENU_BAR_LINES (f) > 0
  #endif
        )
      {
        /* If the user has switched buffers or windows, we need to
--- 1264,1278 ----
      w->update_mode_line = Qt;
  
    if (
+ #ifdef HAVE_NS
+       FRAME_EXTERNAL_MENU_BAR (f) || FRAME_MENU_BAR_LINES (f) > 0
+ #else
  #ifdef USE_X_TOOLKIT
!       FRAME_EXTERNAL_MENU_BAR (f)
  #else
        FRAME_MENU_BAR_LINES (f) > 0
  #endif
+ #endif
        )
      {
        /* If the user has switched buffers or windows, we need to
***************
*** 1281,1288 ****
  	    call0 (Qrecompute_lucid_menubar);
  	  call1 (Vrun_hooks, Qmenu_bar_update_hook);
  	  FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
! #ifdef USE_X_TOOLKIT
! 	  set_frame_menubar (f, 0);
  #endif /* USE_X_TOOLKIT */
  
  	  unbind_to (count, Qnil);
--- 1311,1319 ----
  	    call0 (Qrecompute_lucid_menubar);
  	  call1 (Vrun_hooks, Qmenu_bar_update_hook);
  	  FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
! #if defined(USE_X_TOOLKIT) || defined (HAVE_NS)
!           if (FRAME_EXTERNAL_MENU_BAR (f))
!              set_frame_menubar (f, 0);
  #endif /* USE_X_TOOLKIT */
  
  	  unbind_to (count, Qnil);
***************
*** 1670,1680 ****
  
    /* When we reach a frame's selected window, redo the frame's menu bar.  */
    if (update_mode_line
  #ifdef USE_X_TOOLKIT
!       && FRAME_EXTERNAL_MENU_BAR (f) 
  #else
        && FRAME_MENU_BAR_LINES (f) > 0
  #endif
        && EQ (FRAME_SELECTED_WINDOW (f), window))
      display_menu_bar (w);
  
--- 1701,1715 ----
  
    /* When we reach a frame's selected window, redo the frame's menu bar.  */
    if (update_mode_line
+ #ifdef HAVE_NS
+       && (FRAME_EXTERNAL_MENU_BAR (f) || FRAME_MENU_BAR_LINES (f) > 0)
+ #else
  #ifdef USE_X_TOOLKIT
!       && FRAME_EXTERNAL_MENU_BAR (f)
  #else
        && FRAME_MENU_BAR_LINES (f) > 0
  #endif
+ #endif
        && EQ (FRAME_SELECTED_WINDOW (f), window))
      display_menu_bar (w);
  
***************
*** 2631,2637 ****
  	  /* Did we hit a face change?  Figure out what face we should
  	     use now.  We also hit this the first time through the
  	     loop, to see what face we should start with.  */
! 	  if (pos >= next_face_change && FRAME_X_P (f))
  	    current_face = compute_char_face (f, w, pos,
  					      region_beg, region_end,
  					      &next_face_change, pos + 50, 0);
--- 2666,2672 ----
  	  /* Did we hit a face change?  Figure out what face we should
  	     use now.  We also hit this the first time through the
  	     loop, to see what face we should start with.  */
! 	  if (pos >= next_face_change && FRAME_WIN_P (f))
  	    current_face = compute_char_face (f, w, pos,
  					      region_beg, region_end,
  					      &next_face_change, pos + 50, 0);
***************
*** 3056,3062 ****
    int hpos = 0;
    int i;
  
- #ifndef USE_X_TOOLKIT
    if (FRAME_MENU_BAR_LINES (f) <= 0)
      return;
  
--- 3091,3096 ----
***************
*** 3097,3103 ****
    vpos++;
    while (vpos < FRAME_MENU_BAR_LINES (f))
      get_display_line (f, vpos++, 0);
- #endif /* not USE_X_TOOLKIT */
  }
  
  /* Display the mode line for window w */
--- 3131,3136 ----
Index: emacs/src/xfaces.c
diff -c emacs/src/xfaces.c:1.1.1.2 emacs/src/xfaces.c:1.3
*** emacs/src/xfaces.c:1.1.1.2	Mon Jul 22 01:42:16 1996
--- emacs/src/xfaces.c	Wed Jul 31 01:38:54 1996
***************
*** 39,44 ****
--- 39,45 ----
  #include "blockinput.h"
  #include "window.h"
  #include "intervals.h"
+ #include "multi-frame.h"
  
  #ifdef HAVE_X_WINDOWS
  /* Compensate for bug in Xos.h on some systems, on which it requires
***************
*** 68,74 ****
  
     Let FACE-VECTOR be (assq FACE-NAME (frame-face-alist FRAME))
     FACE-VECTOR is either nil, or a vector of the form
!        [face NAME ID FONT FOREGROUND BACKGROUND BACKGROUND-PIXMAP UNDERLINE-P]
     where
         face is the symbol `face',
         NAME is the symbol with which this vector is associated (a backpointer),
--- 69,76 ----
  
     Let FACE-VECTOR be (assq FACE-NAME (frame-face-alist FRAME))
     FACE-VECTOR is either nil, or a vector of the form
!        [face NAME ID FONT FOREGROUND BACKGROUND BACKGROUND-PIXMAP UNDERLINE-P
!              FONTSIZE]
     where
         face is the symbol `face',
         NAME is the symbol with which this vector is associated (a backpointer),
***************
*** 88,105 ****
     global parameters for that face.
  
     Let PARAM-FACE be FRAME->display.x->param_faces[Faref (FACE-VECTOR, 2)].
!    PARAM_FACE is a struct face whose members are the Xlib analogues of
     the parameters in FACE-VECTOR.  If an element of FACE-VECTOR is
     nil, then the corresponding member of PARAM_FACE is FACE_DEFAULT.
     These faces are called "parameter faces", because they're the ones
     lisp manipulates to control what gets displayed.  Elements 0 and 1
     of FRAME->display.x->param_faces are special - they describe the
     default and mode line faces.  None of the faces in param_faces have
!    GC's.  (See src/dispextern.h for the definiton of struct face.
     lisp/faces.el maintains the isomorphism between face_alist and
     param_faces.)
  
!    The functions compute_char_face and compute_glyph_face find and
     combine the parameter faces associated with overlays and text
     properties.  The resulting faces are called "computed faces"; none
     of their members are FACE_DEFAULT; they are completely specified.
--- 90,107 ----
     global parameters for that face.
  
     Let PARAM-FACE be FRAME->display.x->param_faces[Faref (FACE-VECTOR, 2)].
!    PARAM_FACE is a struct x_face whose members are the Xlib analogues of
     the parameters in FACE-VECTOR.  If an element of FACE-VECTOR is
     nil, then the corresponding member of PARAM_FACE is FACE_DEFAULT.
     These faces are called "parameter faces", because they're the ones
     lisp manipulates to control what gets displayed.  Elements 0 and 1
     of FRAME->display.x->param_faces are special - they describe the
     default and mode line faces.  None of the faces in param_faces have
!    GC's.  (See src/dispextern.h for the definiton of struct x_face.
     lisp/faces.el maintains the isomorphism between face_alist and
     param_faces.)
  
!    The functions x_compute_char_face and x_compute_glyph_face find and
     combine the parameter faces associated with overlays and text
     properties.  The resulting faces are called "computed faces"; none
     of their members are FACE_DEFAULT; they are completely specified.
***************
*** 115,123 ****
     Each computed face belongs to a particular frame.
  
     Computed faces have graphics contexts some of the time.
!    intern_face builds a GC for a specified computed face
     if it doesn't have one already.
!    clear_face_cache clears out the GCs of all computed faces.
     This is done from time to time so that we don't hold on to
     lots of GCs that are no longer needed.
  
--- 117,125 ----
     Each computed face belongs to a particular frame.
  
     Computed faces have graphics contexts some of the time.
!    x_intern_face builds a GC for a specified computed face
     if it doesn't have one already.
!    x_clear_face_cache clears out the GCs of all computed faces.
     This is done from time to time so that we don't hold on to
     lots of GCs that are no longer needed.
  
***************
*** 145,178 ****
  /* Definitions and declarations.  */
  
  /* The number of face-id's in use (same for all frames).  */
! static int next_face_id;
! 
! /* The number of the face to use to indicate the region.  */
! static int region_face;
  
  /* This is what appears in a slot in a face to signify that the face
     does not specify that display aspect.  */
  #define FACE_DEFAULT (~0)
  
- Lisp_Object Qface, Qmouse_face;
  Lisp_Object Qpixmap_spec_p;
  
! int face_name_id_number ( /* FRAME_PTR, Lisp_Object name */ );
  
! struct face *intern_face ( /* FRAME_PTR, struct face * */ );
! static int new_computed_face ( /* FRAME_PTR, struct face * */ );
! static int intern_computed_face ( /* FRAME_PTR, struct face * */ );
  static void ensure_face_ready ( /* FRAME_PTR, int id */ );
! void recompute_basic_faces ( /* FRAME_PTR f */ );
  
! /* Allocating, copying, and comparing struct faces.  */
  
  /* Allocate a new face */
! static struct face *
  allocate_face ()
  {
!   struct face *result = (struct face *) xmalloc (sizeof (struct face));
!   bzero (result, sizeof (struct face));
    result->font = (XFontStruct *) FACE_DEFAULT;
    result->foreground = FACE_DEFAULT;
    result->background = FACE_DEFAULT;
--- 147,176 ----
  /* Definitions and declarations.  */
  
  /* The number of face-id's in use (same for all frames).  */
! static int x_next_face_id;
  
  /* This is what appears in a slot in a face to signify that the face
     does not specify that display aspect.  */
  #define FACE_DEFAULT (~0)
  
  Lisp_Object Qpixmap_spec_p;
  
! int x_face_name_id_number ( /* FRAME_PTR, Lisp_Object name */ );
  
! struct x_face *x_intern_face ( /* FRAME_PTR, struct x_face * */ );
! static int new_computed_face ( /* FRAME_PTR, struct x_face * */ );
! static int intern_computed_face ( /* FRAME_PTR, struct x_face * */ );
  static void ensure_face_ready ( /* FRAME_PTR, int id */ );
! void x_recompute_basic_faces ( /* FRAME_PTR f */ );
  
! /* Allocating, copying, and comparing struct x_faces.  */
  
  /* Allocate a new face */
! static struct x_face *
  allocate_face ()
  {
!   struct x_face *result = (struct x_face *) xmalloc (sizeof (struct x_face));
!   bzero (result, sizeof (struct x_face));
    result->font = (XFontStruct *) FACE_DEFAULT;
    result->foreground = FACE_DEFAULT;
    result->background = FACE_DEFAULT;
***************
*** 181,191 ****
  }
  
  /* Make a new face that's a copy of an existing one.  */
! static struct face *
  copy_face (face)
!      struct face *face;
  {
!   struct face *result = allocate_face ();
  
    result->font = face->font;
    result->foreground = face->foreground;
--- 179,189 ----
  }
  
  /* Make a new face that's a copy of an existing one.  */
! static struct x_face *
  copy_face (face)
!      struct x_face *face;
  {
!   struct x_face *result = allocate_face ();
  
    result->font = face->font;
    result->foreground = face->foreground;
***************
*** 200,206 ****
  
  static int
  face_eql (face1, face2)
!      struct face *face1, *face2;
  {
    return (   face1->font       == face2->font
  	  && face1->foreground == face2->foreground
--- 198,204 ----
  
  static int
  face_eql (face1, face2)
!      struct x_face *face1, *face2;
  {
    return (   face1->font       == face2->font
  	  && face1->foreground == face2->foreground
***************
*** 214,223 ****
  #ifdef HAVE_X_WINDOWS
  /* Given a computed face, construct its graphics context if necessary.  */
  
! struct face *
! intern_face (f, face)
       struct frame *f;
!      struct face *face;
  {
    GC gc;
    XGCValues xgcv;
--- 212,221 ----
  #ifdef HAVE_X_WINDOWS
  /* Given a computed face, construct its graphics context if necessary.  */
  
! struct x_face *
! x_intern_face (f, face)
       struct frame *f;
!      struct x_face *face;
  {
    GC gc;
    XGCValues xgcv;
***************
*** 269,275 ****
     keeping too many graphics contexts that are no longer needed.  */
  
  void
! clear_face_cache ()
  {
    Lisp_Object tail, frame;
  
--- 267,273 ----
     keeping too many graphics contexts that are no longer needed.  */
  
  void
! x_clear_face_cache ()
  {
    Lisp_Object tail, frame;
  
***************
*** 284,290 ****
  
  	  for (i = 2; i < FRAME_N_COMPUTED_FACES (f); i++)
  	    {
! 	      struct face *face = FRAME_COMPUTED_FACES (f) [i];
  	      if (face->gc)
  		XFreeGC (dpy, face->gc);
  	      face->gc = 0;
--- 282,288 ----
  
  	  for (i = 2; i < FRAME_N_COMPUTED_FACES (f); i++)
  	    {
! 	      struct x_face *face = FRAME_COMPUTED_FACES (f) [i];
  	      if (face->gc)
  		XFreeGC (dpy, face->gc);
  	      face->gc = 0;
***************
*** 347,355 ****
      return FACE_DEFAULT;
  
    CHECK_STRING (name, 0);
!   /* if the colormap is full, defined_color will return a best match
       to the values in an an existing cell. */
!   result = defined_color(f, (char *) XSTRING (name)->data, &color, 1);
    if (! result)
      Fsignal (Qerror, Fcons (build_string ("undefined color"),
  			    Fcons (name, Qnil)));
--- 345,353 ----
      return FACE_DEFAULT;
  
    CHECK_STRING (name, 0);
!   /* if the colormap is full, x_defined_color will return a best match
       to the values in an an existing cell. */
!   result = x_defined_color(f, (char *) XSTRING (name)->data, &color, 1);
    if (! result)
      Fsignal (Qerror, Fcons (build_string ("undefined color"),
  			    Fcons (name, Qnil)));
***************
*** 456,471 ****
  
  /* Stubs for MSDOS when not under X.  */
  
! struct face *
! intern_face (f, face)
       struct frame *f;
!      struct face *face;
  {
    return face;
  }
  
  void
! clear_face_cache ()
  {
    /* No action.  */
  }
--- 454,469 ----
  
  /* Stubs for MSDOS when not under X.  */
  
! struct x_face *
! x_intern_face (f, face)
       struct frame *f;
!      struct x_face *face;
  {
    return face;
  }
  
  void
! x_clear_face_cache ()
  {
    /* No action.  */
  }
***************
*** 496,502 ****
  /* Managing parameter face arrays for frames. */
  
  void
! init_frame_faces (f)
       FRAME_PTR f;
  {
    ensure_face_ready (f, 0);
--- 494,500 ----
  /* Managing parameter face arrays for frames. */
  
  void
! x_init_frame_faces (f)
       FRAME_PTR f;
  {
    ensure_face_ready (f, 0);
***************
*** 507,513 ****
  
    new_computed_face (f, FRAME_PARAM_FACES (f)[0]);
    new_computed_face (f, FRAME_PARAM_FACES (f)[1]);
!   recompute_basic_faces (f);
  
  #ifdef MULTI_FRAME
    /* Find another X frame.  */
--- 505,511 ----
  
    new_computed_face (f, FRAME_PARAM_FACES (f)[0]);
    new_computed_face (f, FRAME_PARAM_FACES (f)[1]);
!   x_recompute_basic_faces (f);
  
  #ifdef MULTI_FRAME
    /* Find another X frame.  */
***************
*** 531,537 ****
        {
  	int i;
  	int n_faces = FRAME_N_PARAM_FACES (XFRAME (result));
! 	struct face **faces = FRAME_PARAM_FACES (XFRAME (result));
  
  	for (i = 2; i < n_faces; i++)
  	  if (faces[i])
--- 529,535 ----
        {
  	int i;
  	int n_faces = FRAME_N_PARAM_FACES (XFRAME (result));
! 	struct x_face **faces = FRAME_PARAM_FACES (XFRAME (result));
  
  	for (i = 2; i < n_faces; i++)
  	  if (faces[i])
***************
*** 545,551 ****
  /* Called from Fdelete_frame.  */
  
  void
! free_frame_faces (f)
       struct frame *f;
  {
    Display *dpy = FRAME_X_DISPLAY (f);
--- 543,549 ----
  /* Called from Fdelete_frame.  */
  
  void
! x_free_frame_faces (f)
       struct frame *f;
  {
    Display *dpy = FRAME_X_DISPLAY (f);
***************
*** 555,561 ****
  
    for (i = 0; i < FRAME_N_PARAM_FACES (f); i++)
      {
!       struct face *face = FRAME_PARAM_FACES (f) [i];
        if (face)
  	{
  	  unload_font (f, face->font);
--- 553,559 ----
  
    for (i = 0; i < FRAME_N_PARAM_FACES (f); i++)
      {
!       struct x_face *face = FRAME_PARAM_FACES (f) [i];
        if (face)
  	{
  	  unload_font (f, face->font);
***************
*** 574,580 ****
       But we do free the GCs and the face objects themselves.  */
    for (i = 0; i < FRAME_N_COMPUTED_FACES (f); i++)
      {
!       struct face *face = FRAME_COMPUTED_FACES (f) [i];
        if (face)
  	{
  	  if (face->gc)
--- 572,578 ----
       But we do free the GCs and the face objects themselves.  */
    for (i = 0; i < FRAME_N_COMPUTED_FACES (f); i++)
      {
!       struct x_face *face = FRAME_COMPUTED_FACES (f) [i];
        if (face)
  	{
  	  if (face->gc)
***************
*** 594,600 ****
  static int
  new_computed_face (f, new_face)
       struct frame *f;
!      struct face *new_face;
  {
    int i = FRAME_N_COMPUTED_FACES (f);
  
--- 592,598 ----
  static int
  new_computed_face (f, new_face)
       struct frame *f;
!      struct x_face *new_face;
  {
    int i = FRAME_N_COMPUTED_FACES (f);
  
***************
*** 603,612 ****
        int new_size = i + 32;
  
        FRAME_COMPUTED_FACES (f)
! 	= (struct face **) (FRAME_SIZE_COMPUTED_FACES (f) == 0
! 			    ? xmalloc (new_size * sizeof (struct face *))
  			    : xrealloc (FRAME_COMPUTED_FACES (f),
! 					new_size * sizeof (struct face *)));
        FRAME_SIZE_COMPUTED_FACES (f) = new_size;
      }
  
--- 601,610 ----
        int new_size = i + 32;
  
        FRAME_COMPUTED_FACES (f)
! 	= (struct x_face **) (FRAME_SIZE_COMPUTED_FACES (f) == 0
! 			    ? xmalloc (new_size * sizeof (struct x_face *))
  			    : xrealloc (FRAME_COMPUTED_FACES (f),
! 					new_size * sizeof (struct x_face *)));
        FRAME_SIZE_COMPUTED_FACES (f) = new_size;
      }
  
***************
*** 621,627 ****
  static int
  intern_computed_face (f, new_face)
       struct frame *f;
!      struct face *new_face;
  {
    int len = FRAME_N_COMPUTED_FACES (f);
    int i;
--- 619,625 ----
  static int
  intern_computed_face (f, new_face)
       struct frame *f;
!      struct x_face *new_face;
  {
    int len = FRAME_N_COMPUTED_FACES (f);
    int i;
***************
*** 652,665 ****
        int i;
        if (!FRAME_N_PARAM_FACES (f))
  	FRAME_PARAM_FACES (f)
! 	  = (struct face **) xmalloc (sizeof (struct face *) * n);
        else
  	FRAME_PARAM_FACES (f)
! 	  = (struct face **) xrealloc (FRAME_PARAM_FACES (f),
! 				       sizeof (struct face *) * n);
  
        bzero (FRAME_PARAM_FACES (f) + FRAME_N_PARAM_FACES (f),
! 	     (n - FRAME_N_PARAM_FACES (f)) * sizeof (struct face *));
        FRAME_N_PARAM_FACES (f) = n;
      }
  
--- 650,663 ----
        int i;
        if (!FRAME_N_PARAM_FACES (f))
  	FRAME_PARAM_FACES (f)
! 	  = (struct x_face **) xmalloc (sizeof (struct x_face *) * n);
        else
  	FRAME_PARAM_FACES (f)
! 	  = (struct x_face **) xrealloc (FRAME_PARAM_FACES (f),
! 				       sizeof (struct x_face *) * n);
  
        bzero (FRAME_PARAM_FACES (f) + FRAME_N_PARAM_FACES (f),
! 	     (n - FRAME_N_PARAM_FACES (f)) * sizeof (struct x_face *));
        FRAME_N_PARAM_FACES (f) = n;
      }
  
***************
*** 674,680 ****
     We assume that they're both character-cell fonts.  */
  
  int
! same_size_fonts (font1, font2)
       XFontStruct *font1, *font2;
  {
    XCharStruct *bounds1 = &font1->min_bounds;
--- 672,678 ----
     We assume that they're both character-cell fonts.  */
  
  int
! x_same_size_fonts (font1, font2)
       XFontStruct *font1, *font2;
  {
    XCharStruct *bounds1 = &font1->min_bounds;
***************
*** 687,693 ****
     any face.  Return nonzero if if line_height changes.  */
  
  int
! frame_update_line_height (f)
       FRAME_PTR f;
  {
    int i;
--- 685,691 ----
     any face.  Return nonzero if if line_height changes.  */
  
  int
! x_frame_update_line_height (f)
       FRAME_PTR f;
  {
    int i;
***************
*** 715,726 ****
  
  static void 
  merge_faces (from, to)
!      struct face *from, *to;
  {
    /* Only merge the font if it's the same width as the base font.
       Otherwise ignore it, since we can't handle it properly.  */
    if (from->font != (XFontStruct *) FACE_DEFAULT
!       && same_size_fonts (from->font, to->font))
      to->font = from->font;
    if (from->foreground != FACE_DEFAULT)
      to->foreground = from->foreground;
--- 713,724 ----
  
  static void 
  merge_faces (from, to)
!      struct x_face *from, *to;
  {
    /* Only merge the font if it's the same width as the base font.
       Otherwise ignore it, since we can't handle it properly.  */
    if (from->font != (XFontStruct *) FACE_DEFAULT
!       && x_same_size_fonts (from->font, to->font))
      to->font = from->font;
    if (from->foreground != FACE_DEFAULT)
      to->foreground = from->foreground;
***************
*** 742,748 ****
  static void
  compute_base_face (f, face)
       FRAME_PTR f;
!      struct face *face;
  {
    face->gc = 0;
    face->foreground = FRAME_FOREGROUND_PIXEL (f);
--- 740,746 ----
  static void
  compute_base_face (f, face)
       FRAME_PTR f;
!      struct x_face *face;
  {
    face->gc = 0;
    face->foreground = FRAME_FOREGROUND_PIXEL (f);
***************
*** 757,767 ****
     be CURRENT_FACE.  F is the frame.  */
  
  int
! compute_glyph_face (f, face_code, current_face)
       struct frame *f;
       int face_code, current_face;
  {
!   struct face face;
  
    face = *FRAME_COMPUTED_FACES (f)[current_face];
  
--- 755,765 ----
     be CURRENT_FACE.  F is the frame.  */
  
  int
! x_compute_glyph_face (f, face_code, current_face)
       struct frame *f;
       int face_code, current_face;
  {
!   struct x_face face;
  
    face = *FRAME_COMPUTED_FACES (f)[current_face];
  
***************
*** 777,794 ****
     be CURRENT_FACE.  F is the frame.  */
  
  int
! compute_glyph_face_1 (f, face_name, current_face)
       struct frame *f;
       Lisp_Object face_name;
       int current_face;
  {
!   struct face face;
  
    face = *FRAME_COMPUTED_FACES (f)[current_face];
  
    if (!NILP (face_name))
      {
!       int facecode = face_name_id_number (f, face_name);
        if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	  && FRAME_PARAM_FACES (f) [facecode] != 0)
  	merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
--- 775,792 ----
     be CURRENT_FACE.  F is the frame.  */
  
  int
! x_compute_glyph_face_1 (f, face_name, current_face)
       struct frame *f;
       Lisp_Object face_name;
       int current_face;
  {
!   struct x_face face;
  
    face = *FRAME_COMPUTED_FACES (f)[current_face];
  
    if (!NILP (face_name))
      {
!       int facecode = x_face_name_id_number (f, face_name);
        if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	  && FRAME_PARAM_FACES (f) [facecode] != 0)
  	merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
***************
*** 811,817 ****
     If MOUSE is nonzero, use the character's mouse-face, not its face.  */
  
  int
! compute_char_face (f, w, pos, region_beg, region_end, endptr, limit, mouse)
       struct frame *f;
       struct window *w;
       int pos;
--- 809,815 ----
     If MOUSE is nonzero, use the character's mouse-face, not its face.  */
  
  int
! x_compute_char_face (f, w, pos, region_beg, region_end, endptr, limit, mouse)
       struct frame *f;
       struct window *w;
       int pos;
***************
*** 820,826 ****
       int limit;
       int mouse;
  {
!   struct face face;
    Lisp_Object prop, position;
    int i, j, noverlays;
    int facecode;
--- 818,824 ----
       int limit;
       int mouse;
  {
!   struct x_face face;
    Lisp_Object prop, position;
    int i, j, noverlays;
    int facecode;
***************
*** 909,915 ****
        /* So that we can merge them in the reverse order */
        for (j = len - 1; j >= 0; j--)
  	{
! 	  facecode = face_name_id_number (f, faces[j]);
  	  if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	      && FRAME_PARAM_FACES (f) [facecode] != 0)
  	    merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
--- 907,913 ----
        /* So that we can merge them in the reverse order */
        for (j = len - 1; j >= 0; j--)
  	{
! 	  facecode = x_face_name_id_number (f, faces[j]);
  	  if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	      && FRAME_PARAM_FACES (f) [facecode] != 0)
  	    merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
***************
*** 917,923 ****
      }
    else if (!NILP (prop))
      {
!       facecode = face_name_id_number (f, prop);
        if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	  && FRAME_PARAM_FACES (f) [facecode] != 0)
  	merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
--- 915,921 ----
      }
    else if (!NILP (prop))
      {
!       facecode = x_face_name_id_number (f, prop);
        if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	  && FRAME_PARAM_FACES (f) [facecode] != 0)
  	merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
***************
*** 947,953 ****
  	  /* So that we can merge them in the reverse order */
  	  for (j = len - 1; j >= 0; j--)
  	    {
! 	      facecode = face_name_id_number (f, faces[j]);
  	      if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  		  && FRAME_PARAM_FACES (f) [facecode] != 0)
  		merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
--- 945,951 ----
  	  /* So that we can merge them in the reverse order */
  	  for (j = len - 1; j >= 0; j--)
  	    {
! 	      facecode = x_face_name_id_number (f, faces[j]);
  	      if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  		  && FRAME_PARAM_FACES (f) [facecode] != 0)
  		merge_faces (FRAME_PARAM_FACES (f) [facecode], &face);
***************
*** 958,964 ****
  	  Lisp_Object oend;
  	  int oendpos;
  
! 	  facecode = face_name_id_number (f, prop);
  	  if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	      && FRAME_PARAM_FACES (f) [facecode] != 0)
  	    merge_faces (FRAME_PARAM_FACES (f)[facecode], &face);
--- 956,962 ----
  	  Lisp_Object oend;
  	  int oendpos;
  
! 	  facecode = x_face_name_id_number (f, prop);
  	  if (facecode >= 0 && facecode < FRAME_N_PARAM_FACES (f)
  	      && FRAME_PARAM_FACES (f) [facecode] != 0)
  	    merge_faces (FRAME_PARAM_FACES (f)[facecode], &face);
***************
*** 974,980 ****
      {
        if (region_end < endpos)
  	endpos = region_end;
!       if (region_face >= 0 && region_face < next_face_id)
  	merge_faces (FRAME_PARAM_FACES (f)[region_face], &face);
      }
  
--- 972,978 ----
      {
        if (region_end < endpos)
  	endpos = region_end;
!       if (region_face >= 0 && region_face < x_next_face_id)
  	merge_faces (FRAME_PARAM_FACES (f)[region_face], &face);
      }
  
***************
*** 988,994 ****
     depend.  */
  
  void
! recompute_basic_faces (f)
       FRAME_PTR f;
  {
    /* If the frame's faces haven't been initialized yet, don't worry about
--- 986,992 ----
     depend.  */
  
  void
! x_recompute_basic_faces (f)
       FRAME_PTR f;
  {
    /* If the frame's faces haven't been initialized yet, don't worry about
***************
*** 1009,1016 ****
    merge_faces (FRAME_DEFAULT_PARAM_FACE (f), FRAME_DEFAULT_FACE (f));
    merge_faces (FRAME_MODE_LINE_PARAM_FACE (f), FRAME_MODE_LINE_FACE (f));
    
!   intern_face (f, FRAME_DEFAULT_FACE (f));
!   intern_face (f, FRAME_MODE_LINE_FACE (f));
  
    UNBLOCK_INPUT;
  }
--- 1007,1014 ----
    merge_faces (FRAME_DEFAULT_PARAM_FACE (f), FRAME_DEFAULT_FACE (f));
    merge_faces (FRAME_MODE_LINE_PARAM_FACE (f), FRAME_MODE_LINE_FACE (f));
    
!   x_intern_face (f, FRAME_DEFAULT_FACE (f));
!   x_intern_face (f, FRAME_MODE_LINE_FACE (f));
  
    UNBLOCK_INPUT;
  }
***************
*** 1019,1045 ****
  
  /* Lisp interface. */
  
! DEFUN ("frame-face-alist", Fframe_face_alist, Sframe_face_alist, 1, 1, 0,
!        "")
!      (frame)
!      Lisp_Object frame;
! {
!   CHECK_FRAME (frame, 0);
!   return XFRAME (frame)->face_alist;
! }
! 
! DEFUN ("set-frame-face-alist", Fset_frame_face_alist, Sset_frame_face_alist,
!        2, 2, 0, "")
!      (frame, value)
!      Lisp_Object frame, value;
! {
!   CHECK_FRAME (frame, 0);
!   XFRAME (frame)->face_alist = value;
!   return value;
! }
! 
! 
! DEFUN ("make-face-internal", Fmake_face_internal, Smake_face_internal, 1, 1, 0,
    "Create face number FACE-ID on all frames.")
    (face_id)
       Lisp_Object face_id;
--- 1017,1023 ----
  
  /* Lisp interface. */
  
! DEFUN ("x-make-face-internal", Fx_make_face_internal, Sx_make_face_internal, 1, 1, 0,
    "Create face number FACE-ID on all frames.")
    (face_id)
       Lisp_Object face_id;
***************
*** 1048,1054 ****
    int id = XINT (face_id);
  
    CHECK_NUMBER (face_id, 0);
!   if (id < 0 || id >= next_face_id)
      error ("Face id out of range");
  
    FOR_EACH_FRAME (rest, frame)
--- 1026,1032 ----
    int id = XINT (face_id);
  
    CHECK_NUMBER (face_id, 0);
!   if (id < 0 || id >= x_next_face_id)
      error ("Face id out of range");
  
    FOR_EACH_FRAME (rest, frame)
***************
*** 1060,1071 ****
  }
  
  
! DEFUN ("set-face-attribute-internal", Fset_face_attribute_internal,
!        Sset_face_attribute_internal, 4, 4, 0, "")
       (face_id, attr_name, attr_value, frame)
       Lisp_Object face_id, attr_name, attr_value, frame;
  {
!   struct face *face;
    struct frame *f;
    int magic_p;
    int id;
--- 1038,1049 ----
  }
  
  
! DEFUN ("x-set-face-attribute-internal", Fx_set_face_attribute_internal,
!        Sx_set_face_attribute_internal, 4, 4, 0, "")
       (face_id, attr_name, attr_value, frame)
       Lisp_Object face_id, attr_name, attr_value, frame;
  {
!   struct x_face *face;
    struct frame *f;
    int magic_p;
    int id;
***************
*** 1077,1083 ****
  
    f = XFRAME (frame);
    id = XINT (face_id);
!   if (id < 0 || id >= next_face_id)
      error ("Face id out of range");
  
    if (! FRAME_X_P (f))
--- 1055,1061 ----
  
    f = XFRAME (frame);
    id = XINT (face_id);
!   if (id < 0 || id >= x_next_face_id)
      error ("Face id out of range");
  
    if (! FRAME_X_P (f))
***************
*** 1095,1101 ****
        if (face->font != f->display.x->font)
  	unload_font (f, face->font);
        face->font = font;
!       if (frame_update_line_height (f))
  	x_set_window_size (f, 0, f->width, f->height);
        /* Must clear cache, since it might contain the font
  	 we just got rid of.  */
--- 1073,1079 ----
        if (face->font != f->display.x->font)
  	unload_font (f, face->font);
        face->font = font;
!       if (x_frame_update_line_height (f))
  	x_set_window_size (f, 0, f->width, f->height);
        /* Must clear cache, since it might contain the font
  	 we just got rid of.  */
***************
*** 1134,1144 ****
        int new = !NILP (attr_value);
        face->underline = new;
      }
    else
      error ("unknown face attribute");
  
    if (id == 0 || id == 1)
!     recompute_basic_faces (f);
  
    /* We must redraw the frame whenever any face font or color changes,
       because it's possible that a merged (display) face
--- 1112,1126 ----
        int new = !NILP (attr_value);
        face->underline = new;
      }
+   else if (EQ (attr_name, intern ("fontsize")))
+   {
+     /* XXX Just ignore fontsize for now.  Other windowsystems need it. XXX */
+   }
    else
      error ("unknown face attribute");
  
    if (id == 0 || id == 1)
!     x_recompute_basic_faces (f);
  
    /* We must redraw the frame whenever any face font or color changes,
       because it's possible that a merged (display) face
***************
*** 1151,1161 ****
    return Qnil;
  }
  
! DEFUN ("internal-next-face-id", Finternal_next_face_id, Sinternal_next_face_id,
    0, 0, 0, "")
    ()
  {
!   return make_number (next_face_id++);
  }
  
  /* Return the face id for name NAME on frame FRAME.
--- 1133,1143 ----
    return Qnil;
  }
  
! DEFUN ("x-internal-next-face-id", Fx_internal_next_face_id, Sx_internal_next_face_id,
    0, 0, 0, "")
    ()
  {
!   return make_number (x_next_face_id++);
  }
  
  /* Return the face id for name NAME on frame FRAME.
***************
*** 1164,1170 ****
     as to use any other one.)  */
  
  int
! face_name_id_number (f, name)
       FRAME_PTR f;
       Lisp_Object name;
  {
--- 1146,1152 ----
     as to use any other one.)  */
  
  int
! x_face_name_id_number (f, name)
       FRAME_PTR f;
       Lisp_Object name;
  {
***************
*** 1184,1209 ****
  void
  syms_of_xfaces ()
  {
-   Qface = intern ("face");
-   staticpro (&Qface);
-   Qmouse_face = intern ("mouse-face");
-   staticpro (&Qmouse_face);
    Qpixmap_spec_p = intern ("pixmap-spec-p");
    staticpro (&Qpixmap_spec_p);
  
-   DEFVAR_INT ("region-face", &region_face,
-     "Face number to use to highlight the region\n\
- The region is highlighted with this face\n\
- when Transient Mark mode is enabled and the mark is active.");
- 
  #ifdef HAVE_X_WINDOWS
    defsubr (&Spixmap_spec_p);
  #endif
!   defsubr (&Sframe_face_alist);
!   defsubr (&Sset_frame_face_alist);
!   defsubr (&Smake_face_internal);
!   defsubr (&Sset_face_attribute_internal);
!   defsubr (&Sinternal_next_face_id);
  }
  
  #endif /* HAVE_FACES */
--- 1166,1180 ----
  void
  syms_of_xfaces ()
  {
    Qpixmap_spec_p = intern ("pixmap-spec-p");
    staticpro (&Qpixmap_spec_p);
  
  #ifdef HAVE_X_WINDOWS
    defsubr (&Spixmap_spec_p);
  #endif
!   defsubr (&Sx_make_face_internal);
!   defsubr (&Sx_set_face_attribute_internal);
!   defsubr (&Sx_internal_next_face_id);
  }
  
  #endif /* HAVE_FACES */
Index: emacs/src/xfns.c
diff -c emacs/src/xfns.c:1.1.1.2 emacs/src/xfns.c:1.3
*** emacs/src/xfns.c:1.1.1.2	Mon Jul 22 01:41:04 1996
--- emacs/src/xfns.c	Wed Jul 31 01:38:57 1996
***************
*** 36,41 ****
--- 36,42 ----
  #include "keyboard.h"
  #include "blockinput.h"
  #include "paths.h"
+ #include "multi-frame.h"
  
  #ifdef HAVE_X_WINDOWS
  extern void abort ();
***************
*** 81,87 ****
  /* This is part of a kludge--see lwlib/xlwmenu.c.  */
  XFontStruct *xlwmenu_default_font;
  
! extern void free_frame_menubar ();
  #endif /* USE_X_TOOLKIT */
  
  #define min(a,b) ((a) < (b) ? (a) : (b))
--- 82,88 ----
  /* This is part of a kludge--see lwlib/xlwmenu.c.  */
  XFontStruct *xlwmenu_default_font;
  
! extern void x_free_frame_menubar ();
  #endif /* USE_X_TOOLKIT */
  
  #define min(a,b) ((a) < (b) ? (a) : (b))
***************
*** 93,98 ****
--- 94,101 ----
  #define MAXREQUEST(dpy) ((dpy)->max_request_size)
  #endif
  
+ Lisp_Object Qx_frame_parameter;
+ 
  /* The name we're using in resource queries.  */
  Lisp_Object Vx_resource_name;
  
***************
*** 614,619 ****
--- 617,623 ----
    X_PARM_MOUSE_COLOR,
    X_PARM_CURSOR_COLOR,
    X_PARM_BORDER_COLOR,
+   X_PARM_CURSOR_TYPE,
    X_PARM_ICON_TYPE,
    X_PARM_FONT,
    X_PARM_BORDER_WIDTH,
***************
*** 679,684 ****
--- 683,689 ----
  /* Attach the `x-frame-parameter' properties to
     the Lisp symbol names of parameters relevant to X.  */
  
+ void
  init_x_parm_symbols ()
  {
    int i;
***************
*** 988,993 ****
--- 993,999 ----
     and whose values are not correctly recorded in the frame's
     param_alist need to be considered here.  */
  
+ void
  x_report_frame_params (f, alistptr)
       struct frame *f;
       Lisp_Object *alistptr;
***************
*** 1023,1028 ****
--- 1029,1035 ----
  		   : FRAME_ICONIFIED_P (f) ? Qicon : Qnil));
    store_in_alist (alistptr, Qdisplay,
  		  XCONS (FRAME_X_DISPLAY_INFO (f)->name_list_element)->car);
+   store_in_alist (alistptr, Qmenu_bar_lines, (FRAME_MENU_BAR_LINES (f)));
  }
  
  
***************
*** 1031,1037 ****
     If ALLOC is nonzero, allocate a new colormap cell.  */
  
  int
! defined_color (f, color, color_def, alloc)
       FRAME_PTR f;
       char *color;
       XColor *color_def;
--- 1038,1044 ----
     If ALLOC is nonzero, allocate a new colormap cell.  */
  
  int
! x_defined_color (f, color, color_def, alloc)
       FRAME_PTR f;
       char *color;
       XColor *color_def;
***************
*** 1131,1142 ****
    if (FRAME_X_DISPLAY_INFO (f)->n_planes == 1)
      return def;
  
!   /* defined_color is responsible for coping with failures
       by looking for a near-miss.  */
!   if (defined_color (f, XSTRING (arg)->data, &cdef, 1))
      return cdef.pixel;
  
!   /* defined_color failed; return an ultimate default.  */
    return def;
  }
  
--- 1138,1149 ----
    if (FRAME_X_DISPLAY_INFO (f)->n_planes == 1)
      return def;
  
!   /* x_defined_color is responsible for coping with failures
       by looking for a near-miss.  */
!   if (x_defined_color (f, XSTRING (arg)->data, &cdef, 1))
      return cdef.pixel;
  
!   /* x_defined_color failed; return an ultimate default.  */
    return def;
  }
  
***************
*** 1163,1169 ****
        XSetBackground (FRAME_X_DISPLAY (f), f->display.x->reverse_gc,
  		      f->display.x->foreground_pixel);
        UNBLOCK_INPUT;
!       recompute_basic_faces (f);
        if (FRAME_VISIBLE_P (f))
          redraw_frame (f);
      }
--- 1170,1176 ----
        XSetBackground (FRAME_X_DISPLAY (f), f->display.x->reverse_gc,
  		      f->display.x->foreground_pixel);
        UNBLOCK_INPUT;
!       x_recompute_basic_faces (f);
        if (FRAME_VISIBLE_P (f))
          redraw_frame (f);
      }
***************
*** 1195,1208 ****
        {
  	Lisp_Object bar;
  	for (bar = FRAME_SCROLL_BARS (f); !NILP (bar);
! 	     bar = XSCROLL_BAR (bar)->next)
  	  XSetWindowBackground (FRAME_X_DISPLAY (f),
! 				SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar)),
  				f->display.x->background_pixel);
        }
        UNBLOCK_INPUT;
  
!       recompute_basic_faces (f);
  
        if (FRAME_VISIBLE_P (f))
          redraw_frame (f);
--- 1202,1215 ----
        {
  	Lisp_Object bar;
  	for (bar = FRAME_SCROLL_BARS (f); !NILP (bar);
! 	     bar = XX_SCROLL_BAR (bar)->next)
  	  XSetWindowBackground (FRAME_X_DISPLAY (f),
! 				X_SCROLL_BAR_X_WINDOW (XX_SCROLL_BAR (bar)),
  				f->display.x->background_pixel);
        }
        UNBLOCK_INPUT;
  
!       x_recompute_basic_faces (f);
  
        if (FRAME_VISIBLE_P (f))
          redraw_frame (f);
***************
*** 1572,1578 ****
      error ("the characters of the given font have varying widths");
    else if (STRINGP (result))
      {
!       recompute_basic_faces (f);
        store_frame_param (f, Qfont, result);
      }
    else
--- 1579,1585 ----
      error ("the characters of the given font have varying widths");
    else if (STRINGP (result))
      {
!       x_recompute_basic_faces (f);
        store_frame_param (f, Qfont, result);
      }
    else
***************
*** 1689,1695 ****
    else
      {
        if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
! 	free_frame_menubar (f);
        FRAME_EXTERNAL_MENU_BAR (f) = 0;
        f->display.x->menubar_widget = 0;
      }
--- 1696,1702 ----
    else
      {
        if (FRAME_EXTERNAL_MENU_BAR (f) == 1)
! 	x_free_frame_menubar (f);
        FRAME_EXTERNAL_MENU_BAR (f) = 0;
        f->display.x->menubar_widget = 0;
      }
***************
*** 2539,2552 ****
  
        if (window_prompting & USPosition)
  	sprintf (shell_position, "=%dx%d%c%d%c%d",
! 		 PIXEL_WIDTH (f) + extra_borders, 
! 		 PIXEL_HEIGHT (f) + menubar_size + extra_borders,
  		 (xneg ? '-' : '+'), left,
  		 (yneg ? '-' : '+'), top);
        else
  	sprintf (shell_position, "=%dx%d",
! 		 PIXEL_WIDTH (f) + extra_borders, 
! 		 PIXEL_HEIGHT (f) + menubar_size + extra_borders);
      }
  
      len = strlen (shell_position) + 1;
--- 2546,2559 ----
  
        if (window_prompting & USPosition)
  	sprintf (shell_position, "=%dx%d%c%d%c%d",
! 		 X_PIXEL_WIDTH (f) + extra_borders, 
! 		 X_PIXEL_HEIGHT (f) + menubar_size + extra_borders,
  		 (xneg ? '-' : '+'), left,
  		 (yneg ? '-' : '+'), top);
        else
  	sprintf (shell_position, "=%dx%d",
! 		 X_PIXEL_WIDTH (f) + extra_borders, 
! 		 X_PIXEL_HEIGHT (f) + menubar_size + extra_borders);
      }
  
      len = strlen (shell_position) + 1;
***************
*** 2615,2621 ****
    UNBLOCK_INPUT;
  
    if (!minibuffer_only && FRAME_EXTERNAL_MENU_BAR (f))
!     initialize_frame_menubar (f);
    lw_set_main_areas (pane_widget, f->display.x->menubar_widget, frame_widget);
  
    if (FRAME_X_WINDOW (f) == 0)
--- 2622,2628 ----
    UNBLOCK_INPUT;
  
    if (!minibuffer_only && FRAME_EXTERNAL_MENU_BAR (f))
!     x_initialize_frame_menubar (f);
    lw_set_main_areas (pane_widget, f->display.x->menubar_widget, frame_widget);
  
    if (FRAME_X_WINDOW (f) == 0)
***************
*** 2652,2658 ****
  		     f->display.x->parent_desc,
  		     f->display.x->left_pos,
  		     f->display.x->top_pos,
! 		     PIXEL_WIDTH (f), PIXEL_HEIGHT (f),
  		     f->display.x->border_width,
  		     CopyFromParent, /* depth */
  		     InputOutput, /* class */
--- 2659,2665 ----
  		     f->display.x->parent_desc,
  		     f->display.x->left_pos,
  		     f->display.x->top_pos,
! 		     X_PIXEL_WIDTH (f), X_PIXEL_HEIGHT (f),
  		     f->display.x->border_width,
  		     CopyFromParent, /* depth */
  		     InputOutput, /* class */
***************
*** 2948,2954 ****
        f->name = name;
        f->explicit_name = 1;
        /* use the frame's title when getting resources for this frame.  */
!       specbind (Qx_resource_name, name);
      }
  
    /* Extract the window parameters from the supplied values
--- 2955,2961 ----
        f->name = name;
        f->explicit_name = 1;
        /* use the frame's title when getting resources for this frame.  */
!       specbind (Qresource_name, name);
      }
  
    /* Extract the window parameters from the supplied values
***************
*** 3051,3057 ****
  #endif
    x_icon (f, parms);
    x_make_gc (f);
!   init_frame_faces (f);
  
    /* We need to do this after creating the X window, so that the
       icon-creation functions can say whose icon they're describing.  */
--- 3058,3064 ----
  #endif
    x_icon (f, parms);
    x_make_gc (f);
!   x_init_frame_faces (f);
  
    /* We need to do this after creating the X window, so that the
       icon-creation functions can say whose icon they're describing.  */
***************
*** 3133,3174 ****
    return xfocus;
  }
  
- DEFUN ("focus-frame", Ffocus_frame, Sfocus_frame, 1, 1, 0,
-   "Set the focus on FRAME.")
-   (frame)
-      Lisp_Object frame;
- {
-   CHECK_LIVE_FRAME (frame, 0);
- 
-   if (FRAME_X_P (XFRAME (frame)))
-     {
-       BLOCK_INPUT;
-       x_focus_on_frame (XFRAME (frame));
-       UNBLOCK_INPUT;
-       return frame;
-     }
- 
-   return Qnil;
- }
- 
- DEFUN ("unfocus-frame", Funfocus_frame, Sunfocus_frame, 0, 0, 0,
-   "If a frame has been focused, release it.")
-   ()
- {
-   if (FRAME_X_P (selected_frame))
-     {
-       struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
- 
-       if (dpyinfo->x_focus_frame)
- 	{
- 	  BLOCK_INPUT;
- 	  x_unfocus_frame (dpyinfo->x_focus_frame);
- 	  UNBLOCK_INPUT;
- 	}
-     }
- 
-   return Qnil;
- }
  
  DEFUN ("x-list-fonts", Fx_list_fonts, Sx_list_fonts, 1, 3, 0,
    "Return a list of the names of available fonts matching PATTERN.\n\
--- 3140,3145 ----
***************
*** 3217,3223 ****
        if (! FRAME_X_P (f))
  	error ("non-X frame used in `x-list-fonts'");
  
!       face_id = face_name_id_number (f, face);
  
        if (face_id < 0 || face_id >= FRAME_N_PARAM_FACES (f)
  	  || FRAME_PARAM_FACES (f) [face_id] == 0)
--- 3188,3194 ----
        if (! FRAME_X_P (f))
  	error ("non-X frame used in `x-list-fonts'");
  
!       face_id = x_face_name_id_number (f, face);
  
        if (face_id < 0 || face_id >= FRAME_N_PARAM_FACES (f)
  	  || FRAME_PARAM_FACES (f) [face_id] == 0)
***************
*** 3256,3262 ****
            thisinfo = XLoadQueryFont (FRAME_X_DISPLAY (f),
  				     XSTRING (XCONS (tem)->car)->data);
  
!           if (thisinfo && same_size_fonts (thisinfo, size_ref))
  	    newlist = Fcons (XCONS (tem)->car, newlist);
  
  	  XFreeFont (FRAME_X_DISPLAY (f), thisinfo);
--- 3227,3233 ----
            thisinfo = XLoadQueryFont (FRAME_X_DISPLAY (f),
  				     XSTRING (XCONS (tem)->car)->data);
  
!           if (thisinfo && x_same_size_fonts (thisinfo, size_ref))
  	    newlist = Fcons (XCONS (tem)->car, newlist);
  
  	  XFreeFont (FRAME_X_DISPLAY (f), thisinfo);
***************
*** 3319,3327 ****
  	      thisinfo = XLoadQueryFont (FRAME_X_DISPLAY (f), names[i]);
  	      UNBLOCK_INPUT;
  
! 	      keeper = thisinfo && same_size_fonts (thisinfo, size_ref);
  #else
! 	      keeper = same_size_fonts (&info[i], size_ref);
  #endif
  	    }
            if (keeper)
--- 3290,3298 ----
  	      thisinfo = XLoadQueryFont (FRAME_X_DISPLAY (f), names[i]);
  	      UNBLOCK_INPUT;
  
! 	      keeper = thisinfo && x_same_size_fonts (thisinfo, size_ref);
  #else
! 	      keeper = x_same_size_fonts (&info[i], size_ref);
  #endif
  	    }
            if (keeper)
***************
*** 3354,3360 ****
  
    CHECK_STRING (color, 1);
  
!   if (defined_color (f, XSTRING (color)->data, &foo, 0))
      return Qt;
    else
      return Qnil;
--- 3325,3331 ----
  
    CHECK_STRING (color, 1);
  
!   if (x_defined_color (f, XSTRING (color)->data, &foo, 0))
      return Qt;
    else
      return Qnil;
***************
*** 3374,3380 ****
  
    CHECK_STRING (color, 1);
  
!   if (defined_color (f, XSTRING (color)->data, &foo, 0))
      {
        Lisp_Object rgb[3];
  
--- 3345,3351 ----
  
    CHECK_STRING (color, 1);
  
!   if (x_defined_color (f, XSTRING (color)->data, &foo, 0))
      {
        Lisp_Object rgb[3];
  
***************
*** 3663,3676 ****
  x_pixel_width (f)
       register struct frame *f;
  {
!   return PIXEL_WIDTH (f);
  }
  
  int
  x_pixel_height (f)
       register struct frame *f;
  {
!   return PIXEL_HEIGHT (f);
  }
  
  int
--- 3634,3647 ----
  x_pixel_width (f)
       register struct frame *f;
  {
!   return X_PIXEL_WIDTH (f);
  }
  
  int
  x_pixel_height (f)
       register struct frame *f;
  {
!   return X_PIXEL_HEIGHT (f);
  }
  
  int
***************
*** 4258,4264 ****
  int mouse_track_top, mouse_track_left, mouse_track_width;
  
  /* Offset in buffer of character under the pointer, or 0.  */
! int mouse_buffer_offset;
  
  DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 0, 0, 0,
    "Track the pointer.")
--- 4229,4235 ----
  int mouse_track_top, mouse_track_left, mouse_track_width;
  
  /* Offset in buffer of character under the pointer, or 0.  */
! int x_mouse_buffer_offset;
  
  DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 0, 0, 0,
    "Track the pointer.")
***************
*** 4280,4286 ****
  		     current_pointer_shape);
  
        buf = XBUFFER (XWINDOW (Vmouse_window)->buffer);
!       c = *(BUF_CHAR_ADDRESS (buf, mouse_buffer_offset));
      }
    else if (EQ (Vmouse_frame_part, Qmodeline_part)
  	   && (current_pointer_shape != f->display.x->modeline_cursor))
--- 4251,4257 ----
  		     current_pointer_shape);
  
        buf = XBUFFER (XWINDOW (Vmouse_window)->buffer);
!       c = *(BUF_CHAR_ADDRESS (buf, x_mouse_buffer_offset));
      }
    else if (EQ (Vmouse_frame_part, Qmodeline_part)
  	   && (current_pointer_shape != f->display.x->modeline_cursor))
***************
*** 4618,4624 ****
  #endif /* not HAVE_XSCREENNUMBEROFSCREEN */
  
  Visual *
! select_visual (dpy, screen, depth)
       Display *dpy;
       Screen *screen;
       unsigned int *depth;
--- 4589,4595 ----
  #endif /* not HAVE_XSCREENNUMBEROFSCREEN */
  
  Visual *
! x_select_visual (dpy, screen, depth)
       Display *dpy;
       Screen *screen;
       unsigned int *depth;
***************
*** 4838,4919 ****
    /* This is zero if not using X windows.  */
    x_in_use = 0;
  
-   /* The section below is built by the lisp expression at the top of the file,
-      just above where these variables are declared.  */
-   /*&&& init symbols here &&&*/
-   Qauto_raise = intern ("auto-raise");
-   staticpro (&Qauto_raise);
-   Qauto_lower = intern ("auto-lower");
-   staticpro (&Qauto_lower);
-   Qbackground_color = intern ("background-color");
-   staticpro (&Qbackground_color);
-   Qbar = intern ("bar");
-   staticpro (&Qbar);
-   Qborder_color = intern ("border-color");
-   staticpro (&Qborder_color);
-   Qborder_width = intern ("border-width");
-   staticpro (&Qborder_width);
-   Qbox = intern ("box");
-   staticpro (&Qbox);
-   Qcursor_color = intern ("cursor-color");
-   staticpro (&Qcursor_color);
-   Qcursor_type = intern ("cursor-type");
-   staticpro (&Qcursor_type);
-   Qfont = intern ("font");
-   staticpro (&Qfont);
-   Qforeground_color = intern ("foreground-color");
-   staticpro (&Qforeground_color);
-   Qgeometry = intern ("geometry");
-   staticpro (&Qgeometry);
-   Qicon_left = intern ("icon-left");
-   staticpro (&Qicon_left);
-   Qicon_top = intern ("icon-top");
-   staticpro (&Qicon_top);
-   Qicon_type = intern ("icon-type");
-   staticpro (&Qicon_type);
-   Qicon_name = intern ("icon-name");
-   staticpro (&Qicon_name);
-   Qinternal_border_width = intern ("internal-border-width");
-   staticpro (&Qinternal_border_width);
-   Qleft = intern ("left");
-   staticpro (&Qleft);
-   Qmouse_color = intern ("mouse-color");
-   staticpro (&Qmouse_color);
-   Qnone = intern ("none");
-   staticpro (&Qnone);
-   Qparent_id = intern ("parent-id");
-   staticpro (&Qparent_id);
-   Qscroll_bar_width = intern ("scroll-bar-width");
-   staticpro (&Qscroll_bar_width);
-   Qsuppress_icon = intern ("suppress-icon");
-   staticpro (&Qsuppress_icon);
-   Qtop = intern ("top");
-   staticpro (&Qtop);
-   Qundefined_color = intern ("undefined-color");
-   staticpro (&Qundefined_color);
-   Qvertical_scroll_bars = intern ("vertical-scroll-bars");
-   staticpro (&Qvertical_scroll_bars);
-   Qvisibility = intern ("visibility");
-   staticpro (&Qvisibility);
-   Qwindow_id = intern ("window-id");
-   staticpro (&Qwindow_id);
-   Qx_frame_parameter = intern ("x-frame-parameter");
-   staticpro (&Qx_frame_parameter);
-   Qx_resource_name = intern ("x-resource-name");
-   staticpro (&Qx_resource_name);
-   Quser_position = intern ("user-position");
-   staticpro (&Quser_position);
-   Quser_size = intern ("user-size");
-   staticpro (&Quser_size);
-   Qdisplay = intern ("display");
-   staticpro (&Qdisplay);
-   /* This is the end of symbol initialization.  */
- 
    Fput (Qundefined_color, Qerror_conditions,
  	Fcons (Qundefined_color, Fcons (Qerror, Qnil)));
    Fput (Qundefined_color, Qerror_message,
  	build_string ("Undefined color"));
  
    init_x_parm_symbols ();
  
    DEFVAR_LISP ("x-bitmap-file-path", &Vx_bitmap_file_path,
--- 4809,4822 ----
    /* This is zero if not using X windows.  */
    x_in_use = 0;
  
    Fput (Qundefined_color, Qerror_conditions,
  	Fcons (Qundefined_color, Fcons (Qerror, Qnil)));
    Fput (Qundefined_color, Qerror_message,
  	build_string ("Undefined color"));
  
+   Qx_frame_parameter = intern ("x-frame-parameter");
+   staticpro (&Qx_frame_parameter);
+   
    init_x_parm_symbols ();
  
    DEFVAR_LISP ("x-bitmap-file-path", &Vx_bitmap_file_path,
***************
*** 5011,5018 ****
  #endif
    defsubr (&Sx_parse_geometry);
    defsubr (&Sx_create_frame);
-   defsubr (&Sfocus_frame);
-   defsubr (&Sunfocus_frame);
  #if 0
    defsubr (&Sx_horizontal_line);
  #endif
--- 4914,4919 ----
Index: emacs/src/xmenu.c
diff -c emacs/src/xmenu.c:1.1.1.2 emacs/src/xmenu.c:1.3
*** emacs/src/xmenu.c:1.1.1.2	Mon Jul 22 01:42:18 1996
--- emacs/src/xmenu.c	Wed Jul 31 01:39:05 1996
***************
*** 41,46 ****
--- 41,47 ----
  #include "keyboard.h"
  #include "blockinput.h"
  #include "puresize.h"
+ #include "multi-frame.h"
  
  #ifdef MSDOS
  #include "msdos.h"
***************
*** 89,95 ****
  extern Lisp_Object Vdefine_key_rebound_commands;
  
  #ifdef USE_X_TOOLKIT
! extern void process_expose_from_menu ();
  extern XtAppContext Xt_app_con;
  
  static Lisp_Object xdialog_show ();
--- 90,96 ----
  extern Lisp_Object Vdefine_key_rebound_commands;
  
  #ifdef USE_X_TOOLKIT
! extern void x_process_expose_from_menu ();
  extern XtAppContext Xt_app_con;
  
  static Lisp_Object xdialog_show ();
***************
*** 1080,1086 ****
      {
        /* Handle expose events for editor frames right away.  */
        if (event.type == Expose)
! 	process_expose_from_menu (event);
        /* Make sure we don't consider buttons grabbed after menu goes.  */
        else if (event.type == ButtonRelease
  	       && dpyinfo->display == event.xbutton.display)
--- 1081,1087 ----
      {
        /* Handle expose events for editor frames right away.  */
        if (event.type == Expose)
! 	x_process_expose_from_menu (event);
        /* Make sure we don't consider buttons grabbed after menu goes.  */
        else if (event.type == ButtonRelease
  	       && dpyinfo->display == event.xbutton.display)
***************
*** 1256,1262 ****
     must be left alone.  */
  
  void
! free_menubar_widget_value_tree (wv)
       widget_value *wv;
  {
    if (! wv) return;
--- 1257,1263 ----
     must be left alone.  */
  
  void
! x_free_menubar_widget_value_tree (wv)
       widget_value *wv;
  {
    if (! wv) return;
***************
*** 1265,1276 ****
  
    if (wv->contents && (wv->contents != (widget_value*)1))
      {
!       free_menubar_widget_value_tree (wv->contents);
        wv->contents = (widget_value *) 0xDEADBEEF;
      }
    if (wv->next)
      {
!       free_menubar_widget_value_tree (wv->next);
        wv->next = (widget_value *) 0xDEADBEEF;
      }
    BLOCK_INPUT;
--- 1266,1277 ----
  
    if (wv->contents && (wv->contents != (widget_value*)1))
      {
!       x_free_menubar_widget_value_tree (wv->contents);
        wv->contents = (widget_value *) 0xDEADBEEF;
      }
    if (wv->next)
      {
!       x_free_menubar_widget_value_tree (wv->next);
        wv->next = (widget_value *) 0xDEADBEEF;
      }
    BLOCK_INPUT;
***************
*** 1425,1431 ****
     has been changed.  */
  
  static void
! update_frame_menubar (f)
       FRAME_PTR f;
  {
    struct x_display *x = f->display.x;
--- 1426,1432 ----
     has been changed.  */
  
  static void
! x_update_frame_menubar (f)
       FRAME_PTR f;
  {
    struct x_display *x = f->display.x;
***************
*** 1482,1491 ****
  
  /* Set the contents of the menubar widgets of frame F.
     The argument FIRST_TIME is currently ignored;
!    it is set the first time this is called, from initialize_frame_menubar.  */
  
  void
! set_frame_menubar (f, first_time)
       FRAME_PTR f;
       int first_time;
  {
--- 1483,1492 ----
  
  /* Set the contents of the menubar widgets of frame F.
     The argument FIRST_TIME is currently ignored;
!    it is set the first time this is called, from x_initialize_frame_menubar.  */
  
  void
! x_set_frame_menubar (f, first_time)
       FRAME_PTR f;
       int first_time;
  {
***************
*** 1595,1603 ****
      f->display.x->menubar_height = menubar_size;
    }
    
!   free_menubar_widget_value_tree (first_wv);
  
!   update_frame_menubar (f);
  
    UNBLOCK_INPUT;
  }
--- 1596,1604 ----
      f->display.x->menubar_height = menubar_size;
    }
    
!   x_free_menubar_widget_value_tree (first_wv);
  
!   x_update_frame_menubar (f);
  
    UNBLOCK_INPUT;
  }
***************
*** 1608,1627 ****
     is visible.  */
  
  void
! initialize_frame_menubar (f)
       FRAME_PTR f;
  {
    /* This function is called before the first chance to redisplay
       the frame.  It has to be, so the frame will have the right size.  */
    FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
!   set_frame_menubar (f, 1);
  }
  
  /* Get rid of the menu bar of frame F, and free its storage.
     This is used when deleting a frame, and when turning off the menu bar.  */
  
  void
! free_frame_menubar (f)
       FRAME_PTR f;
  {
    Widget menubar_widget;
--- 1609,1628 ----
     is visible.  */
  
  void
! x_initialize_frame_menubar (f)
       FRAME_PTR f;
  {
    /* This function is called before the first chance to redisplay
       the frame.  It has to be, so the frame will have the right size.  */
    FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
!   x_set_frame_menubar (f, 1);
  }
  
  /* Get rid of the menu bar of frame F, and free its storage.
     This is used when deleting a frame, and when turning off the menu bar.  */
  
  void
! x_free_frame_menubar (f)
       FRAME_PTR f;
  {
    Widget menubar_widget;
***************
*** 1856,1862 ****
    XtSetValues (menu, av, ac);
  
    /* Free the widget_value objects we used to specify the contents.  */
!   free_menubar_widget_value_tree (first_wv);
  
    /* No selection has been chosen yet.  */
    menu_item_selection = 0;
--- 1857,1863 ----
    XtSetValues (menu, av, ac);
  
    /* Free the widget_value objects we used to specify the contents.  */
!   x_free_menubar_widget_value_tree (first_wv);
  
    /* No selection has been chosen yet.  */
    menu_item_selection = 0;
***************
*** 2006,2012 ****
  	
  	if (NILP (item_name))
  	  {
! 	    free_menubar_widget_value_tree (first_wv);
  	    *error = "Submenu in dialog items";
  	    return Qnil;
  	  }
--- 2007,2013 ----
  	
  	if (NILP (item_name))
  	  {
! 	    x_free_menubar_widget_value_tree (first_wv);
  	    *error = "Submenu in dialog items";
  	    return Qnil;
  	  }
***************
*** 2020,2026 ****
  	  }
  	if (nb_buttons >= 10)
  	  {
! 	    free_menubar_widget_value_tree (first_wv);
  	    *error = "Too many dialog items";
  	    return Qnil;
  	  }
--- 2021,2027 ----
  	  }
  	if (nb_buttons >= 10)
  	  {
! 	    x_free_menubar_widget_value_tree (first_wv);
  	    *error = "Too many dialog items";
  	    return Qnil;
  	  }
***************
*** 2072,2078 ****
  			   dialog_selection_callback, 0);
    lw_modify_all_widgets (dialog_id, first_wv->contents, True);
    /* Free the widget_value objects we used to specify the contents.  */
!   free_menubar_widget_value_tree (first_wv);
  
    /* No selection has been chosen yet.  */
    menu_item_selection = 0;
--- 2073,2079 ----
  			   dialog_selection_callback, 0);
    lw_modify_all_widgets (dialog_id, first_wv->contents, True);
    /* Free the widget_value objects we used to specify the contents.  */
!   x_free_menubar_widget_value_tree (first_wv);
  
    /* No selection has been chosen yet.  */
    menu_item_selection = 0;
Index: emacs/src/xselect.c
diff -c emacs/src/xselect.c:1.1.1.2 emacs/src/xselect.c:1.3
*** emacs/src/xselect.c:1.1.1.2	Mon Jul 22 01:42:23 1996
--- emacs/src/xselect.c	Wed Jul 31 01:39:09 1996
***************
*** 22,27 ****
--- 22,28 ----
  
  #include <config.h>
  #include "lisp.h"
+ #include "multi-frame.h"
  #include "xterm.h"	/* for all of the X includes */
  #include "dispextern.h"	/* frame.h seems to want this */
  #include "frame.h"	/* Need this to get the X window of selected_frame */
***************
*** 731,737 ****
    /* Let random lisp code notice that the selection has been asked for.  */
    {
      Lisp_Object rest;
!     rest = Vx_sent_selection_hooks;
      if (!EQ (rest, Qunbound))
        for (; CONSP (rest); rest = Fcdr (rest))
  	call3 (Fcar (rest), selection_symbol, target_symbol, successful_p);
--- 732,738 ----
    /* Let random lisp code notice that the selection has been asked for.  */
    {
      Lisp_Object rest;
!     rest = Vsent_selection_hooks;
      if (!EQ (rest, Qunbound))
        for (; CONSP (rest); rest = Fcdr (rest))
  	call3 (Fcar (rest), selection_symbol, target_symbol, successful_p);
***************
*** 792,798 ****
  
    {
      Lisp_Object rest;
!     rest = Vx_lost_selection_hooks;
      if (!EQ (rest, Qunbound))
        {
  	for (; CONSP (rest); rest = Fcdr (rest))
--- 793,799 ----
  
    {
      Lisp_Object rest;
!     rest = Vlost_selection_hooks;
      if (!EQ (rest, Qunbound))
        {
  	for (; CONSP (rest); rest = Fcdr (rest))
***************
*** 824,830 ****
        /* Let random Lisp code notice that the selection has been stolen.  */
        Lisp_Object hooks, selection_symbol;
  
!       hooks = Vx_lost_selection_hooks;
        selection_symbol = Fcar (Vselection_alist);
  
        if (!EQ (hooks, Qunbound))
--- 825,831 ----
        /* Let random Lisp code notice that the selection has been stolen.  */
        Lisp_Object hooks, selection_symbol;
  
!       hooks = Vlost_selection_hooks;
        selection_symbol = Fcar (Vselection_alist);
  
        if (!EQ (hooks, Qunbound))
***************
*** 843,849 ****
  	/* Let random Lisp code notice that the selection has been stolen.  */
  	Lisp_Object hooks, selection_symbol;
  
! 	hooks = Vx_lost_selection_hooks;
  	selection_symbol = Fcar (XCONS (rest)->cdr);
  
  	if (!EQ (hooks, Qunbound))
--- 844,850 ----
  	/* Let random Lisp code notice that the selection has been stolen.  */
  	Lisp_Object hooks, selection_symbol;
  
! 	hooks = Vlost_selection_hooks;
  	selection_symbol = Fcar (XCONS (rest)->cdr);
  
  	if (!EQ (hooks, Qunbound))
***************
*** 1125,1132 ****
    UNBLOCK_INPUT;
  
    /* This allows quits.  Also, don't wait forever.  */
!   secs = x_selection_timeout / 1000;
!   usecs = (x_selection_timeout % 1000) * 1000;
    wait_reading_process_input (secs, usecs, reading_selection_reply, 0);
  
    BLOCK_INPUT;
--- 1126,1133 ----
    UNBLOCK_INPUT;
  
    /* This allows quits.  Also, don't wait forever.  */
!   secs = selection_timeout / 1000;
!   usecs = (selection_timeout % 1000) * 1000;
    wait_reading_process_input (secs, usecs, reading_selection_reply, 0);
  
    BLOCK_INPUT;
***************
*** 2097,2176 ****
    prop_location_identifier = 0;
    property_change_reply = Fcons (Qnil, Qnil);
    staticpro (&property_change_reply);
- 
-   Vselection_alist = Qnil;
-   staticpro (&Vselection_alist);
- 
-   DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist,
-   "An alist associating X Windows selection-types with functions.\n\
- These functions are called to convert the selection, with three args:\n\
- the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
- a desired type to which the selection should be converted;\n\
- and the local selection value (whatever was given to `x-own-selection').\n\
- \n\
- The function should return the value to send to the X server\n\
- \(typically a string).  A return value of nil\n\
- means that the conversion could not be done.\n\
- A return value which is the symbol `NULL'\n\
- means that a side-effect was executed,\n\
- and there is no meaningful selection value.");
-   Vselection_converter_alist = Qnil;
- 
-   DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks,
-   "A list of functions to be called when Emacs loses an X selection.\n\
- \(This happens when some other X client makes its own selection\n\
- or when a Lisp program explicitly clears the selection.)\n\
- The functions are called with one argument, the selection type\n\
- \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.)");
-   Vx_lost_selection_hooks = Qnil;
- 
-   DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks,
-   "A list of functions to be called when Emacs answers a selection request.\n\
- The functions are called with four arguments:\n\
-   - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
-   - the selection-type which Emacs was asked to convert the\n\
-     selection into before sending (for example, `STRING' or `LENGTH');\n\
-   - a flag indicating success or failure for responding to the request.\n\
- We might have failed (and declined the request) for any number of reasons,\n\
- including being asked for a selection that we no longer own, or being asked\n\
- to convert into a type that we don't know about or that is inappropriate.\n\
- This hook doesn't let you change the behavior of Emacs's selection replies,\n\
- it merely informs you that they have happened.");
-   Vx_sent_selection_hooks = Qnil;
- 
-   DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
-    "Number of milliseconds to wait for a selection reply.\n\
- If the selection owner doens't reply in this time, we give up.\n\
- A value of 0 means wait as long as necessary.  This is initialized from the\n\
- \"*selectionTimeout\" resource.");
-   x_selection_timeout = 0;
- 
-   QPRIMARY   = intern ("PRIMARY");	staticpro (&QPRIMARY);
-   QSECONDARY = intern ("SECONDARY");	staticpro (&QSECONDARY);
-   QSTRING    = intern ("STRING");	staticpro (&QSTRING);
-   QINTEGER   = intern ("INTEGER");	staticpro (&QINTEGER);
-   QCLIPBOARD = intern ("CLIPBOARD");	staticpro (&QCLIPBOARD);
-   QTIMESTAMP = intern ("TIMESTAMP");	staticpro (&QTIMESTAMP);
-   QTEXT      = intern ("TEXT"); 	staticpro (&QTEXT);
-   QTIMESTAMP = intern ("TIMESTAMP");	staticpro (&QTIMESTAMP);
-   QDELETE    = intern ("DELETE");	staticpro (&QDELETE);
-   QMULTIPLE  = intern ("MULTIPLE");	staticpro (&QMULTIPLE);
-   QINCR      = intern ("INCR");		staticpro (&QINCR);
-   QEMACS_TMP = intern ("_EMACS_TMP_");	staticpro (&QEMACS_TMP);
-   QTARGETS   = intern ("TARGETS");	staticpro (&QTARGETS);
-   QATOM	     = intern ("ATOM");		staticpro (&QATOM);
-   QATOM_PAIR = intern ("ATOM_PAIR");	staticpro (&QATOM_PAIR);
-   QNULL	     = intern ("NULL");		staticpro (&QNULL);
- 
- #ifdef CUT_BUFFER_SUPPORT
-   QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0);
-   QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1);
-   QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2);
-   QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3);
-   QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4);
-   QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5);
-   QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6);
-   QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7);
- #endif
- 
  }
--- 2098,2101 ----
Index: emacs/src/xterm.c
diff -c emacs/src/xterm.c:1.1.1.2 emacs/src/xterm.c:1.3
*** emacs/src/xterm.c:1.1.1.2	Mon Jul 22 01:42:26 1996
--- emacs/src/xterm.c	Wed Jul 31 01:39:12 1996
***************
*** 36,41 ****
--- 36,42 ----
  
  #include "lisp.h"
  #include "blockinput.h"
+ #include "multi-frame.h"
  
  /* This may include sys/types.h, and that somehow loses
     if this is not done before the other system files.  */
***************
*** 84,90 ****
  #include "intervals.h"
  
  #ifdef USE_X_TOOLKIT
! extern void free_frame_menubar ();
  extern void _XEditResCheckMessages ();
  #endif /* USE_X_TOOLKIT */
  
--- 85,91 ----
  #include "intervals.h"
  
  #ifdef USE_X_TOOLKIT
! extern void x_free_frame_menubar ();
  extern void _XEditResCheckMessages ();
  #endif /* USE_X_TOOLKIT */
  
***************
*** 205,212 ****
  /* Nonzero enables some debugging for the X interface code. */
  extern int _Xdebug;
  
- extern Lisp_Object Qface, Qmouse_face;
- 
  extern int errno;
  
  /* A mask of extra modifier bits to put into every keyboard char.  */
--- 206,211 ----
***************
*** 467,473 ****
     compute_char_face and compute_glyph_face on everything it puts in
     the display structure, we can assume that the face code on each
     glyph is a valid index into FRAME_COMPUTED_FACES (f), and the one
!    to which we can actually apply intern_face.
     Call this function with input blocked.  */
  
  #if 1
--- 466,472 ----
     compute_char_face and compute_glyph_face on everything it puts in
     the display structure, we can assume that the face code on each
     glyph is a valid index into FRAME_COMPUTED_FACES (f), and the one
!    to which we can actually apply x_intern_face.
     Call this function with input blocked.  */
  
  #if 1
***************
*** 520,526 ****
        /* Now output this run of chars, with the font and pixel values
  	 determined by the face code CF.  */
        {
! 	struct face *face = FRAME_DEFAULT_FACE (f);
  	XFontStruct *font = FACE_FONT (face);
  	GC gc = FACE_GC (face);
  	int stippled = 0;
--- 519,525 ----
        /* Now output this run of chars, with the font and pixel values
  	 determined by the face code CF.  */
        {
! 	struct x_face *face = FRAME_DEFAULT_FACE (f);
  	XFontStruct *font = FACE_FONT (face);
  	GC gc = FACE_GC (face);
  	int stippled = 0;
***************
*** 541,547 ****
  	    if (cf == 1)
  	      face = FRAME_MODE_LINE_FACE (f);
  	    else
! 	      face = intern_face (f, FRAME_COMPUTED_FACES (f) [cf]);
  	    font = FACE_FONT (face);
  	    gc = FACE_GC (face);
  	    if (FACE_STIPPLE (face))
--- 540,546 ----
  	    if (cf == 1)
  	      face = FRAME_MODE_LINE_FACE (f);
  	    else
! 	      face = x_intern_face (f, FRAME_COMPUTED_FACES (f) [cf]);
  	    font = FACE_FONT (face);
  	    gc = FACE_GC (face);
  	    if (FACE_STIPPLE (face))
***************
*** 1083,1090 ****
      }
  
      {
!       int width  = PIXEL_WIDTH  (f);
!       int height = PIXEL_HEIGHT (f);
  
        XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc,
  		      width/4, height/4, width/2, height/2);
--- 1082,1089 ----
      }
  
      {
!       int width  = X_PIXEL_WIDTH  (f);
!       int height = X_PIXEL_HEIGHT (f);
  
        XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc,
  		      width/4, height/4, width/2, height/2);
***************
*** 1682,1688 ****
     If NOCLIP is nonzero, do not force the value into range.  */
  
  void
! pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip)
       FRAME_PTR f;
       register int pix_x, pix_y;
       register int *x, *y;
--- 1681,1687 ----
     If NOCLIP is nonzero, do not force the value into range.  */
  
  void
! x_pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip)
       FRAME_PTR f;
       register int pix_x, pix_y;
       register int *x, *y;
***************
*** 1725,1731 ****
  }
  
  void
! glyph_to_pixel_coords (f, x, y, pix_x, pix_y)
       FRAME_PTR f;
       register int x, y;
       register int *pix_x, *pix_y;
--- 1724,1730 ----
  }
  
  void
! x_glyph_to_pixel_coords (f, x, y, pix_x, pix_y)
       FRAME_PTR f;
       register int x, y;
       register int *pix_x, *pix_y;
***************
*** 1760,1766 ****
      int row, column;
  
  #if 0
!     pixel_to_glyph_coords (f, event->x, event->y, &column, &row, NULL, 0);
      XSETFASTINT (result->x, column);
      XSETFASTINT (result->y, row);
  #endif
--- 1759,1765 ----
      int row, column;
  
  #if 0
!     x_pixel_to_glyph_coords (f, event->x, event->y, &column, &row, NULL, 0);
      XSETFASTINT (result->x, column);
      XSETFASTINT (result->y, row);
  #endif
***************
*** 1900,1906 ****
      }
  
    /* Find out which glyph the mouse is on.  */
!   pixel_to_glyph_coords (f, x, y, &column, &row,
  			 &new_glyph, FRAME_X_DISPLAY_INFO (f)->grabbed);
  
    /* Which window is that in?  */
--- 1899,1905 ----
      }
  
    /* Find out which glyph the mouse is on.  */
!   x_pixel_to_glyph_coords (f, x, y, &column, &row,
  			 &new_glyph, FRAME_X_DISPLAY_INFO (f)->grabbed);
  
    /* Which window is that in?  */
***************
*** 2215,2221 ****
    dpyinfo->mouse_face_window = Qnil;
  }
  
! static struct scroll_bar *x_window_to_scroll_bar ();
  static void x_scroll_bar_report_motion ();
  
  /* Return the current position of the mouse.
--- 2214,2220 ----
    dpyinfo->mouse_face_window = Qnil;
  }
  
! static struct x_scroll_bar *x_window_to_scroll_bar ();
  static void x_scroll_bar_report_motion ();
  
  /* Return the current position of the mouse.
***************
*** 2365,2371 ****
  	/* If not, is it one of our scroll bars?  */
  	if (! f1)
  	  {
! 	    struct scroll_bar *bar = x_window_to_scroll_bar (win);
  
  	    if (bar)
  	      {
--- 2364,2370 ----
  	/* If not, is it one of our scroll bars?  */
  	if (! f1)
  	  {
! 	    struct x_scroll_bar *bar = x_window_to_scroll_bar (win);
  
  	    if (bar)
  	      {
***************
*** 2384,2393 ****
  
  	    /* Ok, we found a frame.  Store all the values.  */
  
! 	    pixel_to_glyph_coords (f1, win_x, win_y, &ignore1, &ignore2,
  				   &last_mouse_glyph,
  				   FRAME_X_DISPLAY_INFO (f1)->grabbed
  				   || insist);
  
  	    *bar_window = Qnil;
  	    *part = 0;
--- 2383,2395 ----
  
  	    /* Ok, we found a frame.  Store all the values.  */
  
! #if 0
! CHECKNS
! 	    x_pixel_to_glyph_coords (f1, win_x, win_y, &ignore1, &ignore2,
  				   &last_mouse_glyph,
  				   FRAME_X_DISPLAY_INFO (f1)->grabbed
  				   || insist);
+ #endif
  
  	    *bar_window = Qnil;
  	    *part = 0;
***************
*** 2404,2413 ****
  
  /* Scroll bar support.  */
  
! /* Given an X window ID, find the struct scroll_bar which manages it.
     This can be called in GC, so we have to make sure to strip off mark
     bits.  */
! static struct scroll_bar *
  x_window_to_scroll_bar (window_id)
       Window window_id;
  {
--- 2406,2415 ----
  
  /* Scroll bar support.  */
  
! /* Given an X window ID, find the struct x_scroll_bar which manages it.
     This can be called in GC, so we have to make sure to strip off mark
     bits.  */
! static struct x_scroll_bar *
  x_window_to_scroll_bar (window_id)
       Window window_id;
  {
***************
*** 2433,2441 ****
  	   ! GC_NILP (bar) || (bar = condemned,
  			       condemned = Qnil,
  			       ! GC_NILP (bar));
! 	   bar = XSCROLL_BAR (bar)->next)
! 	if (SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar)) == window_id)
! 	  return XSCROLL_BAR (bar);
      }
  
    return 0;
--- 2435,2443 ----
  	   ! GC_NILP (bar) || (bar = condemned,
  			       condemned = Qnil,
  			       ! GC_NILP (bar));
! 	   bar = XX_SCROLL_BAR (bar)->next)
! 	if (X_SCROLL_BAR_X_WINDOW (XX_SCROLL_BAR (bar)) == window_id)
! 	  return XX_SCROLL_BAR (bar);
      }
  
    return 0;
***************
*** 2443,2456 ****
  
  /* Open a new X window to serve as a scroll bar, and return the
     scroll bar vector for it.  */
! static struct scroll_bar *
  x_scroll_bar_create (window, top, left, width, height)
       struct window *window;
       int top, left, width, height;
  {
    FRAME_PTR f = XFRAME (WINDOW_FRAME (window));
!   struct scroll_bar *bar
!     = XSCROLL_BAR (Fmake_vector (make_number (SCROLL_BAR_VEC_SIZE), Qnil));
  
    BLOCK_INPUT;
  
--- 2445,2458 ----
  
  /* Open a new X window to serve as a scroll bar, and return the
     scroll bar vector for it.  */
! static struct x_scroll_bar *
  x_scroll_bar_create (window, top, left, width, height)
       struct window *window;
       int top, left, width, height;
  {
    FRAME_PTR f = XFRAME (WINDOW_FRAME (window));
!   struct x_scroll_bar *bar
!     = XX_SCROLL_BAR (Fmake_vector (make_number (X_SCROLL_BAR_VEC_SIZE), Qnil));
  
    BLOCK_INPUT;
  
***************
*** 2476,2485 ****
      sb_widget = XtCreateManagedWidget ("box",
  				       boxWidgetClass,
  				       f->display.x->edit_widget, al, ac);
!     SET_SCROLL_BAR_X_WINDOW
        (bar, sb_widget->core.window);
  #endif
!     SET_SCROLL_BAR_X_WINDOW
        (bar,
         XCreateWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
  
--- 2478,2487 ----
      sb_widget = XtCreateManagedWidget ("box",
  				       boxWidgetClass,
  				       f->display.x->edit_widget, al, ac);
!     X_SET_SCROLL_BAR_X_WINDOW
        (bar, sb_widget->core.window);
  #endif
!     X_SET_SCROLL_BAR_X_WINDOW
        (bar,
         XCreateWindow (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
  
***************
*** 2507,2515 ****
    bar->prev = Qnil;
    XSETVECTOR (FRAME_SCROLL_BARS (f), bar);
    if (! NILP (bar->next))
!     XSETVECTOR (XSCROLL_BAR (bar->next)->prev, bar);
  
!   XMapRaised (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (bar));
  
    UNBLOCK_INPUT;
  
--- 2509,2517 ----
    bar->prev = Qnil;
    XSETVECTOR (FRAME_SCROLL_BARS (f), bar);
    if (! NILP (bar->next))
!     XSETVECTOR (XX_SCROLL_BAR (bar->next)->prev, bar);
  
!   XMapRaised (FRAME_X_DISPLAY (f), X_SCROLL_BAR_X_WINDOW (bar));
  
    UNBLOCK_INPUT;
  
***************
*** 2529,2540 ****
     move to the very end of the buffer.  */
  static void
  x_scroll_bar_set_handle (bar, start, end, rebuild)
!      struct scroll_bar *bar;
       int start, end;
       int rebuild;
  {
    int dragging = ! NILP (bar->dragging);
!   Window w = SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
    GC gc = f->display.x->normal_gc;
  
--- 2531,2542 ----
     move to the very end of the buffer.  */
  static void
  x_scroll_bar_set_handle (bar, start, end, rebuild)
!      struct x_scroll_bar *bar;
       int start, end;
       int rebuild;
  {
    int dragging = ! NILP (bar->dragging);
!   Window w = X_SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
    GC gc = f->display.x->normal_gc;
  
***************
*** 2547,2555 ****
    BLOCK_INPUT;
  
    {
!     int inside_width = VERTICAL_SCROLL_BAR_INSIDE_WIDTH (XINT (bar->width));
!     int inside_height = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (XINT (bar->height));
!     int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (XINT (bar->height));
  
      /* Make sure the values are reasonable, and try to preserve
         the distance between start and end.  */
--- 2549,2557 ----
    BLOCK_INPUT;
  
    {
!     int inside_width = X_VERTICAL_SCROLL_BAR_INSIDE_WIDTH (XINT (bar->width));
!     int inside_height = X_VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (XINT (bar->height));
!     int top_range = X_VERTICAL_SCROLL_BAR_TOP_RANGE (XINT (bar->height));
  
      /* Make sure the values are reasonable, and try to preserve
         the distance between start and end.  */
***************
*** 2576,2585 ****
      if (end > top_range)
        end = top_range;
  
!     /* Draw bottom positions VERTICAL_SCROLL_BAR_MIN_HANDLE pixels
         below top positions, to make sure the handle is always at least
         that many pixels tall.  */
!     end += VERTICAL_SCROLL_BAR_MIN_HANDLE;
  
      /* Draw the empty space above the handle.  Note that we can't clear
         zero-height areas; that means "clear to end of window."  */
--- 2578,2587 ----
      if (end > top_range)
        end = top_range;
  
!     /* Draw bottom positions X_VERTICAL_SCROLL_BAR_MIN_HANDLE pixels
         below top positions, to make sure the handle is always at least
         that many pixels tall.  */
!     end += X_VERTICAL_SCROLL_BAR_MIN_HANDLE;
  
      /* Draw the empty space above the handle.  Note that we can't clear
         zero-height areas; that means "clear to end of window."  */
***************
*** 2587,2594 ****
        XClearArea (FRAME_X_DISPLAY (f), w,
  
  		  /* x, y, width, height, and exposures.  */
! 		  VERTICAL_SCROLL_BAR_LEFT_BORDER,
! 		  VERTICAL_SCROLL_BAR_TOP_BORDER,
  		  inside_width, start,
  		  False);
  
--- 2589,2596 ----
        XClearArea (FRAME_X_DISPLAY (f), w,
  
  		  /* x, y, width, height, and exposures.  */
! 		  X_VERTICAL_SCROLL_BAR_LEFT_BORDER,
! 		  X_VERTICAL_SCROLL_BAR_TOP_BORDER,
  		  inside_width, start,
  		  False);
  
***************
*** 2596,2603 ****
      XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
  
  		    /* x, y, width, height */
! 		    VERTICAL_SCROLL_BAR_LEFT_BORDER,
! 		    VERTICAL_SCROLL_BAR_TOP_BORDER + start,
  		    inside_width, end - start);
  
  
--- 2598,2605 ----
      XFillRectangle (FRAME_X_DISPLAY (f), w, gc,
  
  		    /* x, y, width, height */
! 		    X_VERTICAL_SCROLL_BAR_LEFT_BORDER,
! 		    X_VERTICAL_SCROLL_BAR_TOP_BORDER + start,
  		    inside_width, end - start);
  
  
***************
*** 2607,2614 ****
        XClearArea (FRAME_X_DISPLAY (f), w,
  
  		  /* x, y, width, height, and exposures.  */
! 		  VERTICAL_SCROLL_BAR_LEFT_BORDER,
! 		  VERTICAL_SCROLL_BAR_TOP_BORDER + end,
  		  inside_width, inside_height - end,
  		  False);
  
--- 2609,2616 ----
        XClearArea (FRAME_X_DISPLAY (f), w,
  
  		  /* x, y, width, height, and exposures.  */
! 		  X_VERTICAL_SCROLL_BAR_LEFT_BORDER,
! 		  X_VERTICAL_SCROLL_BAR_TOP_BORDER + end,
  		  inside_width, inside_height - end,
  		  False);
  
***************
*** 2621,2630 ****
     window configurations.  */
  static void
  x_scroll_bar_move (bar, top, left, width, height)
!      struct scroll_bar *bar;
       int top, left, width, height;
  {
!   Window w = SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
  
    BLOCK_INPUT;
--- 2623,2632 ----
     window configurations.  */
  static void
  x_scroll_bar_move (bar, top, left, width, height)
!      struct x_scroll_bar *bar;
       int top, left, width, height;
  {
!   Window w = X_SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
  
    BLOCK_INPUT;
***************
*** 2644,2650 ****
      if (height != XINT (bar->height))	mask |= CWHeight;
  
      if (mask)
!       XConfigureWindow (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (bar),
  			mask, &wc);
    }
  
--- 2646,2652 ----
      if (height != XINT (bar->height))	mask |= CWHeight;
  
      if (mask)
!       XConfigureWindow (FRAME_X_DISPLAY (f), X_SCROLL_BAR_X_WINDOW (bar),
  			mask, &wc);
    }
  
***************
*** 2660,2673 ****
     to nil.  */
  static void
  x_scroll_bar_remove (bar)
!      struct scroll_bar *bar;
  {
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
  
    BLOCK_INPUT;
  
    /* Destroy the window.  */
!   XDestroyWindow (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (bar));
  
    /* Disassociate this scroll bar from its window.  */
    XWINDOW (bar->window)->vertical_scroll_bar = Qnil;
--- 2662,2675 ----
     to nil.  */
  static void
  x_scroll_bar_remove (bar)
!      struct x_scroll_bar *bar;
  {
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
  
    BLOCK_INPUT;
  
    /* Destroy the window.  */
!   XDestroyWindow (FRAME_X_DISPLAY (f), X_SCROLL_BAR_X_WINDOW (bar));
  
    /* Disassociate this scroll bar from its window.  */
    XWINDOW (bar->window)->vertical_scroll_bar = Qnil;
***************
*** 2696,2704 ****
      = (FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0
         ? FRAME_SCROLL_BAR_PIXEL_WIDTH (f)
         : (FRAME_SCROLL_BAR_COLS (f) * FONT_WIDTH (f->display.x->font)));
!   int pixel_height = VERTICAL_SCROLL_BAR_PIXEL_HEIGHT (f, height);
  
!   struct scroll_bar *bar;
  
    /* Does the scroll bar exist yet?  */
    if (NILP (window->vertical_scroll_bar))
--- 2698,2706 ----
      = (FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0
         ? FRAME_SCROLL_BAR_PIXEL_WIDTH (f)
         : (FRAME_SCROLL_BAR_COLS (f) * FONT_WIDTH (f->display.x->font)));
!   int pixel_height = X_VERTICAL_SCROLL_BAR_PIXEL_HEIGHT (f, height);
  
!   struct x_scroll_bar *bar;
  
    /* Does the scroll bar exist yet?  */
    if (NILP (window->vertical_scroll_bar))
***************
*** 2708,2714 ****
    else
      {
        /* It may just need to be moved and resized.  */
!       bar = XSCROLL_BAR (window->vertical_scroll_bar);
        x_scroll_bar_move (bar, pixel_top, pixel_left, pixel_width, pixel_height);
      }
  
--- 2710,2716 ----
    else
      {
        /* It may just need to be moved and resized.  */
!       bar = XX_SCROLL_BAR (window->vertical_scroll_bar);
        x_scroll_bar_move (bar, pixel_top, pixel_left, pixel_width, pixel_height);
      }
  
***************
*** 2716,2722 ****
       dragged.  */
    if (NILP (bar->dragging))
      {
!       int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (pixel_height);
  
        if (whole == 0)
  	x_scroll_bar_set_handle (bar, 0, top_range, 0);
--- 2718,2724 ----
       dragged.  */
    if (NILP (bar->dragging))
      {
!       int top_range = X_VERTICAL_SCROLL_BAR_TOP_RANGE (pixel_height);
  
        if (whole == 0)
  	x_scroll_bar_set_handle (bar, 0, top_range, 0);
***************
*** 2765,2777 ****
  XTredeem_scroll_bar (window)
       struct window *window;
  {
!   struct scroll_bar *bar;
  
    /* We can't redeem this window's scroll bar if it doesn't have one.  */
    if (NILP (window->vertical_scroll_bar))
      abort ();
  
!   bar = XSCROLL_BAR (window->vertical_scroll_bar);
  
    /* Unlink it from the condemned list.  */
    {
--- 2767,2779 ----
  XTredeem_scroll_bar (window)
       struct window *window;
  {
!   struct x_scroll_bar *bar;
  
    /* We can't redeem this window's scroll bar if it doesn't have one.  */
    if (NILP (window->vertical_scroll_bar))
      abort ();
  
!   bar = XX_SCROLL_BAR (window->vertical_scroll_bar);
  
    /* Unlink it from the condemned list.  */
    {
***************
*** 2793,2808 ****
  	  abort ();
        }
      else
!       XSCROLL_BAR (bar->prev)->next = bar->next;
  
      if (! NILP (bar->next))
!       XSCROLL_BAR (bar->next)->prev = bar->prev;
  
      bar->next = FRAME_SCROLL_BARS (f);
      bar->prev = Qnil;
      XSETVECTOR (FRAME_SCROLL_BARS (f), bar);
      if (! NILP (bar->next))
!       XSETVECTOR (XSCROLL_BAR (bar->next)->prev, bar);
    }
  }
  
--- 2795,2810 ----
  	  abort ();
        }
      else
!       XX_SCROLL_BAR (bar->prev)->next = bar->next;
  
      if (! NILP (bar->next))
!       XX_SCROLL_BAR (bar->next)->prev = bar->prev;
  
      bar->next = FRAME_SCROLL_BARS (f);
      bar->prev = Qnil;
      XSETVECTOR (FRAME_SCROLL_BARS (f), bar);
      if (! NILP (bar->next))
!       XSETVECTOR (XX_SCROLL_BAR (bar->next)->prev, bar);
    }
  }
  
***************
*** 2822,2828 ****
  
    for (; ! NILP (bar); bar = next)
      {
!       struct scroll_bar *b = XSCROLL_BAR (bar);
  
        x_scroll_bar_remove (b);
  
--- 2824,2830 ----
  
    for (; ! NILP (bar); bar = next)
      {
!       struct x_scroll_bar *b = XX_SCROLL_BAR (bar);
  
        x_scroll_bar_remove (b);
  
***************
*** 2841,2850 ****
     mark bits.  */
  static void
  x_scroll_bar_expose (bar, event)
!      struct scroll_bar *bar;
       XEvent *event;
  {
!   Window w = SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
    GC gc = f->display.x->normal_gc;
  
--- 2843,2852 ----
     mark bits.  */
  static void
  x_scroll_bar_expose (bar, event)
!      struct x_scroll_bar *bar;
       XEvent *event;
  {
!   Window w = X_SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
    GC gc = f->display.x->normal_gc;
  
***************
*** 2868,2874 ****
     mark bits.  */
  static void
  x_scroll_bar_handle_click (bar, event, emacs_event)
!      struct scroll_bar *bar;
       XEvent *event;
       struct input_event *emacs_event;
  {
--- 2870,2876 ----
     mark bits.  */
  static void
  x_scroll_bar_handle_click (bar, event, emacs_event)
!      struct x_scroll_bar *bar;
       XEvent *event;
       struct input_event *emacs_event;
  {
***************
*** 2888,2904 ****
    emacs_event->timestamp = event->xbutton.time;
    {
      int internal_height
!       = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (XINT (bar->height));
      int top_range
!       = VERTICAL_SCROLL_BAR_TOP_RANGE (XINT (bar->height));
!     int y = event->xbutton.y - VERTICAL_SCROLL_BAR_TOP_BORDER;
  
      if (y < 0) y = 0;
      if (y > top_range) y = top_range;
  
      if (y < XINT (bar->start))
        emacs_event->part = scroll_bar_above_handle;
!     else if (y < XINT (bar->end) + VERTICAL_SCROLL_BAR_MIN_HANDLE)
        emacs_event->part = scroll_bar_handle;
      else
        emacs_event->part = scroll_bar_below_handle;
--- 2890,2906 ----
    emacs_event->timestamp = event->xbutton.time;
    {
      int internal_height
!       = X_VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (XINT (bar->height));
      int top_range
!       = X_VERTICAL_SCROLL_BAR_TOP_RANGE (XINT (bar->height));
!     int y = event->xbutton.y - X_VERTICAL_SCROLL_BAR_TOP_BORDER;
  
      if (y < 0) y = 0;
      if (y > top_range) y = top_range;
  
      if (y < XINT (bar->start))
        emacs_event->part = scroll_bar_above_handle;
!     else if (y < XINT (bar->end) + X_VERTICAL_SCROLL_BAR_MIN_HANDLE)
        emacs_event->part = scroll_bar_handle;
      else
        emacs_event->part = scroll_bar_below_handle;
***************
*** 2947,2953 ****
     mark bits.  */
  static void
  x_scroll_bar_note_movement (bar, event)
!      struct scroll_bar *bar;
       XEvent *event;
  {
    last_mouse_movement_time = event->xmotion.time;
--- 2949,2955 ----
     mark bits.  */
  static void
  x_scroll_bar_note_movement (bar, event)
!      struct x_scroll_bar *bar;
       XEvent *event;
  {
    last_mouse_movement_time = event->xmotion.time;
***************
*** 2992,2999 ****
       Lisp_Object *x, *y;
       unsigned long *time;
  {
!   struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
!   Window w = SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
    int win_x, win_y;
    Window dummy_window;
--- 2994,3001 ----
       Lisp_Object *x, *y;
       unsigned long *time;
  {
!   struct x_scroll_bar *bar = XX_SCROLL_BAR (last_mouse_scroll_bar);
!   Window w = X_SCROLL_BAR_X_WINDOW (bar);
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
    int win_x, win_y;
    Window dummy_window;
***************
*** 3019,3029 ****
    else
      {
        int inside_height
! 	= VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (XINT (bar->height));
        int top_range
! 	= VERTICAL_SCROLL_BAR_TOP_RANGE     (XINT (bar->height));
  
!       win_y -= VERTICAL_SCROLL_BAR_TOP_BORDER;
  
        if (! NILP (bar->dragging))
  	win_y -= XINT (bar->dragging);
--- 3021,3031 ----
    else
      {
        int inside_height
! 	= X_VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (XINT (bar->height));
        int top_range
! 	= X_VERTICAL_SCROLL_BAR_TOP_RANGE     (XINT (bar->height));
  
!       win_y -= X_VERTICAL_SCROLL_BAR_TOP_BORDER;
  
        if (! NILP (bar->dragging))
  	win_y -= XINT (bar->dragging);
***************
*** 3040,3046 ****
  	*part = scroll_bar_handle;
        else if (win_y < XINT (bar->start))
  	*part = scroll_bar_above_handle;
!       else if (win_y < XINT (bar->end) + VERTICAL_SCROLL_BAR_MIN_HANDLE)
  	*part = scroll_bar_handle;
        else
  	*part = scroll_bar_below_handle;
--- 3042,3048 ----
  	*part = scroll_bar_handle;
        else if (win_y < XINT (bar->start))
  	*part = scroll_bar_above_handle;
!       else if (win_y < XINT (bar->end) + X_VERTICAL_SCROLL_BAR_MIN_HANDLE)
  	*part = scroll_bar_handle;
        else
  	*part = scroll_bar_below_handle;
***************
*** 3069,3076 ****
    Lisp_Object bar;
  
    for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
!        bar = XSCROLL_BAR (bar)->next)
!     XClearArea (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar)),
  		0, 0, 0, 0, True);
  }
  
--- 3071,3078 ----
    Lisp_Object bar;
  
    for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
!        bar = XX_SCROLL_BAR (bar)->next)
!     XClearArea (FRAME_X_DISPLAY (f), X_SCROLL_BAR_X_WINDOW (XX_SCROLL_BAR (bar)),
  		0, 0, 0, 0, True);
  }
  
***************
*** 3079,3085 ****
     when handling menubar or popup items.  */
  
  void
! process_expose_from_menu (event)
       XEvent event;
  {
    FRAME_PTR f;
--- 3081,3087 ----
     when handling menubar or popup items.  */
  
  void
! x_process_expose_from_menu (event)
       XEvent event;
  {
    FRAME_PTR f;
***************
*** 3106,3112 ****
      }
    else
      {
!       struct scroll_bar *bar
  	= x_window_to_scroll_bar (event.xexpose.window);
  
        if (bar)
--- 3108,3114 ----
      }
    else
      {
!       struct x_scroll_bar *bar
  	= x_window_to_scroll_bar (event.xexpose.window);
  
        if (bar)
***************
*** 3494,3500 ****
  		}
  	      else
  		{
! 		  struct scroll_bar *bar
  		    = x_window_to_scroll_bar (event.xexpose.window);
  
  		  if (bar)
--- 3496,3502 ----
  		}
  	      else
  		{
! 		  struct x_scroll_bar *bar
  		    = x_window_to_scroll_bar (event.xexpose.window);
  
  		  if (bar)
***************
*** 3819,3825 ****
  		  note_mouse_movement (f, &event.xmotion);
  		else
  		  {
! 		    struct scroll_bar *bar
  		      = x_window_to_scroll_bar (event.xmotion.window);
  
  		    if (bar)
--- 3821,3827 ----
  		  note_mouse_movement (f, &event.xmotion);
  		else
  		  {
! 		    struct x_scroll_bar *bar
  		      = x_window_to_scroll_bar (event.xmotion.window);
  
  		    if (bar)
***************
*** 3951,3957 ****
  		  }
  		else
  		  {
! 		    struct scroll_bar *bar
  		      = x_window_to_scroll_bar (event.xbutton.window);
  
  		    if (bar)
--- 3953,3959 ----
  		  }
  		else
  		  {
! 		    struct x_scroll_bar *bar
  		      = x_window_to_scroll_bar (event.xbutton.window);
  
  		    if (bar)
***************
*** 4309,4315 ****
  /* Refresh bitmap kitchen sink icon for frame F
     when we get an expose event for it. */
  
! refreshicon (f)
       struct frame *f;
  {
    /* Normally, the window manager handles this function. */
--- 4311,4317 ----
  /* Refresh bitmap kitchen sink icon for frame F
     when we get an expose event for it. */
  
! x_refreshicon (f)
       struct frame *f;
  {
    /* Normally, the window manager handles this function. */
***************
*** 4779,4785 ****
        XSetFont (FRAME_X_DISPLAY (f), f->display.x->cursor_gc,
  		f->display.x->font->fid);
  
!       frame_update_line_height (f);
        x_set_window_size (f, 0, f->width, f->height);
      }
    else
--- 4781,4787 ----
        XSetFont (FRAME_X_DISPLAY (f), f->display.x->cursor_gc,
  		f->display.x->font->fid);
  
!       x_frame_update_line_height (f);
        x_set_window_size (f, 0, f->width, f->height);
      }
    else
***************
*** 4838,4850 ****
    if (flags & XNegative)
      f->display.x->left_pos = (FRAME_X_DISPLAY_INFO (f)->width
  			      - 2 * f->display.x->border_width - win_x
! 			      - PIXEL_WIDTH (f)
  			      + f->display.x->left_pos);
  
    if (flags & YNegative)
      f->display.x->top_pos = (FRAME_X_DISPLAY_INFO (f)->height
  			     - 2 * f->display.x->border_width - win_y
! 			     - PIXEL_HEIGHT (f)
  			     - (FRAME_EXTERNAL_MENU_BAR (f)
  				? f->display.x->menubar_height : 0)
  			     + f->display.x->top_pos);
--- 4840,4852 ----
    if (flags & XNegative)
      f->display.x->left_pos = (FRAME_X_DISPLAY_INFO (f)->width
  			      - 2 * f->display.x->border_width - win_x
! 			      - X_PIXEL_WIDTH (f)
  			      + f->display.x->left_pos);
  
    if (flags & YNegative)
      f->display.x->top_pos = (FRAME_X_DISPLAY_INFO (f)->height
  			     - 2 * f->display.x->border_width - win_y
! 			     - X_PIXEL_HEIGHT (f)
  			     - (FRAME_EXTERNAL_MENU_BAR (f)
  				? f->display.x->menubar_height : 0)
  			     + f->display.x->top_pos);
***************
*** 4963,4970 ****
       wouldn't be reported in the frame parameters until some random
       point in the future when the ConfigureNotify event arrives.  */
    change_frame_size (f, rows, cols, 0, 0);
!   PIXEL_WIDTH (f) = pixelwidth;
!   PIXEL_HEIGHT (f) = pixelheight;
  
    /* If cursor was outside the new size, mark it as off.  */
    if (f->phys_cursor_y >= rows
--- 4965,4972 ----
       wouldn't be reported in the frame parameters until some random
       point in the future when the ConfigureNotify event arrives.  */
    change_frame_size (f, rows, cols, 0, 0);
!   X_PIXEL_WIDTH (f) = pixelwidth;
!   X_PIXEL_HEIGHT (f) = pixelheight;
  
    /* If cursor was outside the new size, mark it as off.  */
    if (f->phys_cursor_y >= rows
***************
*** 4998,5007 ****
    pix_y = CHAR_TO_PIXEL_ROW (f, y) + f->display.x->line_height / 2;
  
    if (pix_x < 0) pix_x = 0;
!   if (pix_x > PIXEL_WIDTH (f)) pix_x = PIXEL_WIDTH (f);
  
    if (pix_y < 0) pix_y = 0;
!   if (pix_y > PIXEL_HEIGHT (f)) pix_y = PIXEL_HEIGHT (f);
  
    BLOCK_INPUT;
  
--- 5000,5009 ----
    pix_y = CHAR_TO_PIXEL_ROW (f, y) + f->display.x->line_height / 2;
  
    if (pix_x < 0) pix_x = 0;
!   if (pix_x > X_PIXEL_WIDTH (f)) pix_x = X_PIXEL_WIDTH (f);
  
    if (pix_y < 0) pix_y = 0;
!   if (pix_y > X_PIXEL_HEIGHT (f)) pix_y = X_PIXEL_HEIGHT (f);
  
    BLOCK_INPUT;
  
***************
*** 5390,5399 ****
    XDestroyWindow (FRAME_X_DISPLAY (f), f->display.x->window_desc);
  #ifdef USE_X_TOOLKIT
    XtDestroyWidget (f->display.x->widget);
!   free_frame_menubar (f);
  #endif /* USE_X_TOOLKIT */
  
!   free_frame_faces (f);
    XFlush (FRAME_X_DISPLAY (f));
  
    xfree (f->display.x);
--- 5392,5401 ----
    XDestroyWindow (FRAME_X_DISPLAY (f), f->display.x->window_desc);
  #ifdef USE_X_TOOLKIT
    XtDestroyWidget (f->display.x->widget);
!   x_free_frame_menubar (f);
  #endif /* USE_X_TOOLKIT */
  
!   x_free_frame_faces (f);
    XFlush (FRAME_X_DISPLAY (f));
  
    xfree (f->display.x);
***************
*** 5458,5465 ****
    size_hints.height = widget_height;
    size_hints.width = widget_width;
  #else /* not USE_X_TOOLKIT */
!   size_hints.height = PIXEL_HEIGHT (f);
!   size_hints.width = PIXEL_WIDTH (f);
  #endif /* not USE_X_TOOLKIT */
  
    size_hints.width_inc = FONT_WIDTH (f->display.x->font);
--- 5460,5467 ----
    size_hints.height = widget_height;
    size_hints.width = widget_width;
  #else /* not USE_X_TOOLKIT */
!   size_hints.height = X_PIXEL_HEIGHT (f);
!   size_hints.width = X_PIXEL_WIDTH (f);
  #endif /* not USE_X_TOOLKIT */
  
    size_hints.width_inc = FONT_WIDTH (f->display.x->font);
***************
*** 5817,5823 ****
  
    dpyinfo->screen = ScreenOfDisplay (dpyinfo->display,
  				     DefaultScreen (dpyinfo->display));
!   dpyinfo->visual = select_visual (dpyinfo->display, dpyinfo->screen,
  				   &dpyinfo->n_planes);
    dpyinfo->height = HeightOfScreen (dpyinfo->screen);
    dpyinfo->width = WidthOfScreen (dpyinfo->screen);
--- 5819,5825 ----
  
    dpyinfo->screen = ScreenOfDisplay (dpyinfo->display,
  				     DefaultScreen (dpyinfo->display));
!   dpyinfo->visual = x_select_visual (dpyinfo->display, dpyinfo->screen,
  				   &dpyinfo->n_planes);
    dpyinfo->height = HeightOfScreen (dpyinfo->screen);
    dpyinfo->width = WidthOfScreen (dpyinfo->screen);
Index: emacs/src/xterm.h
diff -c emacs/src/xterm.h:1.1.1.2 emacs/src/xterm.h:1.3
*** emacs/src/xterm.h:1.1.1.2	Mon Jul 22 01:43:31 1996
--- emacs/src/xterm.h	Wed Jul 31 01:39:18 1996
***************
*** 132,138 ****
  extern struct frame *x_top_window_to_frame ();
  #endif
  
! extern Visual *select_visual ();
  
  enum text_cursor_kinds {
    filled_box_cursor, hollow_box_cursor, bar_cursor
--- 132,138 ----
  extern struct frame *x_top_window_to_frame ();
  #endif
  
! extern Visual *x_select_visual ();
  
  enum text_cursor_kinds {
    filled_box_cursor, hollow_box_cursor, bar_cursor
***************
*** 445,451 ****
    /* Table of parameter faces for this frame.  Any X resources (pixel
       values, fonts) referred to here have been allocated explicitly
       for this face, and should be freed if we change the face.  */
!   struct face **param_faces;
    int n_param_faces;
  
    /* Table of computed faces for this frame.  These are the faces
--- 445,451 ----
    /* Table of parameter faces for this frame.  Any X resources (pixel
       values, fonts) referred to here have been allocated explicitly
       for this face, and should be freed if we change the face.  */
!   struct x_face **param_faces;
    int n_param_faces;
  
    /* Table of computed faces for this frame.  These are the faces
***************
*** 453,459 ****
       combining the parameter faces specified by overlays, text
       properties, and what have you.  The X resources mentioned here
       are all shared with parameter faces.  */
!   struct face **computed_faces;
    int n_computed_faces;		/* How many are valid */
    int size_computed_faces;	/* How many are allocated */
  
--- 453,459 ----
       combining the parameter faces specified by overlays, text
       properties, and what have you.  The X resources mentioned here
       are all shared with parameter faces.  */
!   struct x_face **computed_faces;
    int n_computed_faces;		/* How many are valid */
    int size_computed_faces;	/* How many are allocated */
  
***************
*** 503,513 ****
  #define FRAME_X_SCREEN(f) (FRAME_X_DISPLAY_INFO (f)->screen)
  
  /* These two really ought to be called FRAME_PIXEL_{WIDTH,HEIGHT}.  */
! #define PIXEL_WIDTH(f) ((f)->display.x->pixel_width)
! #define PIXEL_HEIGHT(f) ((f)->display.x->pixel_height)
  
  #define FRAME_DESIRED_CURSOR(f) ((f)->display.x->desired_cursor)
  
  
  /* X-specific scroll bar stuff.  */
  
--- 503,554 ----
  #define FRAME_X_SCREEN(f) (FRAME_X_DISPLAY_INFO (f)->screen)
  
  /* These two really ought to be called FRAME_PIXEL_{WIDTH,HEIGHT}.  */
! #define X_PIXEL_WIDTH(f) ((f)->display.x->pixel_width)
! #define X_PIXEL_HEIGHT(f) ((f)->display.x->pixel_height)
  
  #define FRAME_DESIRED_CURSOR(f) ((f)->display.x->desired_cursor)
  
+ #ifdef HAVE_FACES
+ struct x_face
+   {
+     /* If this is non-zero, it is a GC we can use without modification
+        to represent this face.  */
+     GC gc;
+   
+     /* Pixel value for foreground color.  */
+     EMACS_UINT foreground;
+   
+     /* Pixel value for background color.  */
+     EMACS_UINT background;
+   
+     /* Font used for this face.  */
+     XFontStruct *font;
+   
+     /* Background stipple or bitmap used for this face.  */
+     Pixmap stipple;
+ 
+     /* Pixmap_depth.  */
+     unsigned int pixmap_w, pixmap_h;
+   
+     /* Whether or not to underline text in this face.  */
+     char underline;
+   };
+ 
+ /* Let's stop using this and get rid of it.  */
+ typedef struct x_face *FACE;
+ 
+ #define NORMAL_FACE ((struct x_face *) 0)
+ 
+ #define FACE_HAS_GC(f) ((f)->gc)
+ #define FACE_GC(f) ((f)->gc)
+ #define FACE_FOREGROUND(f) ((f)->foreground)
+ #define FACE_BACKGROUND(f) ((f)->background)
+ #define FACE_FONT(f) ((f)->font)
+ #define FACE_STIPPLE(f) ((f)->stipple)
+ #define FACE_UNDERLINE_P(f) ((f)->underline)
+ 
+ #endif
+ 
  
  /* X-specific scroll bar stuff.  */
  
***************
*** 516,525 ****
     end up with windows referring to dead scroll bars; the garbage
     collector will free it when its time comes.
  
!    We use struct scroll_bar as a template for accessing fields of the
     vector.  */
  
! struct scroll_bar {
  
    /* These fields are shared by all vectors.  */
    EMACS_INT size_from_Lisp_Vector_struct;
--- 557,566 ----
     end up with windows referring to dead scroll bars; the garbage
     collector will free it when its time comes.
  
!    We use struct x_scroll_bar as a template for accessing fields of the
     vector.  */
  
! struct x_scroll_bar {
  
    /* These fields are shared by all vectors.  */
    EMACS_INT size_from_Lisp_Vector_struct;
***************
*** 547,553 ****
       These are not actually the locations where the beginning and end
       are drawn; in order to keep handles from becoming invisible when
       editing large files, we establish a minimum height by always
!      drawing handle bottoms VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
       where they would be normally; the bottom and top are in a
       different co-ordinate system.  */
    Lisp_Object start, end;
--- 588,594 ----
       These are not actually the locations where the beginning and end
       are drawn; in order to keep handles from becoming invisible when
       editing large files, we establish a minimum height by always
!      drawing handle bottoms X_VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
       where they would be normally; the bottom and top are in a
       different co-ordinate system.  */
    Lisp_Object start, end;
***************
*** 559,601 ****
    Lisp_Object dragging;
  };
  
! /* The number of elements a vector holding a struct scroll_bar needs.  */
! #define SCROLL_BAR_VEC_SIZE					\
!   ((sizeof (struct scroll_bar)					\
      - sizeof (EMACS_INT) - sizeof (struct Lisp_Vector *))	\
     / sizeof (Lisp_Object))
  
! /* Turning a lisp vector value into a pointer to a struct scroll_bar.  */
! #define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
  
  
  /* Building a 32-bit C integer from two 16-bit lisp integers.  */
! #define SCROLL_BAR_PACK(low, high) (XINT (high) << 16 | XINT (low))
  
  /* Setting two lisp integers to the low and high words of a 32-bit C int.  */
! #define SCROLL_BAR_UNPACK(low, high, int32) \
    (XSETINT ((low),   (int32)        & 0xffff), \
     XSETINT ((high), ((int32) >> 16) & 0xffff))
  
  
  /* Extract the X window id of the scroll bar from a struct scroll_bar.  */
! #define SCROLL_BAR_X_WINDOW(ptr) \
!   ((Window) SCROLL_BAR_PACK ((ptr)->x_window_low, (ptr)->x_window_high))
  
! /* Store a window id in a struct scroll_bar.  */
! #define SET_SCROLL_BAR_X_WINDOW(ptr, id) \
!   (SCROLL_BAR_UNPACK ((ptr)->x_window_low, (ptr)->x_window_high, (int) id))
  
  
  /* Return the outside pixel height for a vertical scroll bar HEIGHT
     rows high on frame F.  */
! #define VERTICAL_SCROLL_BAR_PIXEL_HEIGHT(f, height) \
    ((height) * (f)->display.x->line_height)
  
  /* Return the inside width of a vertical scroll bar, given the outside
     width.  */
! #define VERTICAL_SCROLL_BAR_INSIDE_WIDTH(width) \
!   ((width) - VERTICAL_SCROLL_BAR_LEFT_BORDER - VERTICAL_SCROLL_BAR_RIGHT_BORDER)
  
  /* Return the length of the rectangle within which the top of the
     handle must stay.  This isn't equivalent to the inside height,
--- 600,642 ----
    Lisp_Object dragging;
  };
  
! /* The number of elements a vector holding a struct x_scroll_bar needs.  */
! #define X_SCROLL_BAR_VEC_SIZE					\
!   ((sizeof (struct x_scroll_bar)					\
      - sizeof (EMACS_INT) - sizeof (struct Lisp_Vector *))	\
     / sizeof (Lisp_Object))
  
! /* Turning a lisp vector value into a pointer to a struct x_scroll_bar.  */
! #define XX_SCROLL_BAR(vec) ((struct x_scroll_bar *) XVECTOR (vec))
  
  
  /* Building a 32-bit C integer from two 16-bit lisp integers.  */
! #define X_SCROLL_BAR_PACK(low, high) (XINT (high) << 16 | XINT (low))
  
  /* Setting two lisp integers to the low and high words of a 32-bit C int.  */
! #define X_SCROLL_BAR_UNPACK(low, high, int32) \
    (XSETINT ((low),   (int32)        & 0xffff), \
     XSETINT ((high), ((int32) >> 16) & 0xffff))
  
  
  /* Extract the X window id of the scroll bar from a struct scroll_bar.  */
! #define X_SCROLL_BAR_X_WINDOW(ptr) \
!   ((Window) X_SCROLL_BAR_PACK ((ptr)->x_window_low, (ptr)->x_window_high))
  
! /* Store a window id in a struct x_scroll_bar.  */
! #define X_SET_SCROLL_BAR_X_WINDOW(ptr, id) \
!   (X_SCROLL_BAR_UNPACK ((ptr)->x_window_low, (ptr)->x_window_high, (int) id))
  
  
  /* Return the outside pixel height for a vertical scroll bar HEIGHT
     rows high on frame F.  */
! #define X_VERTICAL_SCROLL_BAR_PIXEL_HEIGHT(f, height) \
    ((height) * (f)->display.x->line_height)
  
  /* Return the inside width of a vertical scroll bar, given the outside
     width.  */
! #define X_VERTICAL_SCROLL_BAR_INSIDE_WIDTH(width) \
!   ((width) - X_VERTICAL_SCROLL_BAR_LEFT_BORDER - X_VERTICAL_SCROLL_BAR_RIGHT_BORDER)
  
  /* Return the length of the rectangle within which the top of the
     handle must stay.  This isn't equivalent to the inside height,
***************
*** 603,616 ****
  
     This is the real range of motion for the scroll bar, so when we're
     scaling buffer positions to scroll bar positions, we use this, not
!    VERTICAL_SCROLL_BAR_INSIDE_HEIGHT.  */
! #define VERTICAL_SCROLL_BAR_TOP_RANGE(height) \
!   (VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (height) - VERTICAL_SCROLL_BAR_MIN_HANDLE)
  
  /* Return the inside height of vertical scroll bar, given the outside
!    height.  See VERTICAL_SCROLL_BAR_TOP_RANGE too.  */
! #define VERTICAL_SCROLL_BAR_INSIDE_HEIGHT(height) \
!   ((height) - VERTICAL_SCROLL_BAR_TOP_BORDER - VERTICAL_SCROLL_BAR_BOTTOM_BORDER)
  
  
  /* Border widths for scroll bars.
--- 644,657 ----
  
     This is the real range of motion for the scroll bar, so when we're
     scaling buffer positions to scroll bar positions, we use this, not
!    X_VERTICAL_SCROLL_BAR_INSIDE_HEIGHT.  */
! #define X_VERTICAL_SCROLL_BAR_TOP_RANGE(height) \
!   (X_VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (height) - X_VERTICAL_SCROLL_BAR_MIN_HANDLE)
  
  /* Return the inside height of vertical scroll bar, given the outside
!    height.  See X_VERTICAL_SCROLL_BAR_TOP_RANGE too.  */
! #define X_VERTICAL_SCROLL_BAR_INSIDE_HEIGHT(height) \
!   ((height) - X_VERTICAL_SCROLL_BAR_TOP_BORDER - X_VERTICAL_SCROLL_BAR_BOTTOM_BORDER)
  
  
  /* Border widths for scroll bars.
***************
*** 624,636 ****
     The handle moves up and down/back and forth in a rectangle inset
     from the edges of the scroll bar.  These are widths by which we
     inset the handle boundaries from the scroll bar edges.  */
! #define VERTICAL_SCROLL_BAR_LEFT_BORDER (2)
! #define VERTICAL_SCROLL_BAR_RIGHT_BORDER (2)
! #define VERTICAL_SCROLL_BAR_TOP_BORDER (2)
! #define VERTICAL_SCROLL_BAR_BOTTOM_BORDER (2)
  
  /* Minimum lengths for scroll bar handles, in pixels.  */
! #define VERTICAL_SCROLL_BAR_MIN_HANDLE (5)
  
  
  /* Manipulating pixel sizes and character sizes.
--- 665,677 ----
     The handle moves up and down/back and forth in a rectangle inset
     from the edges of the scroll bar.  These are widths by which we
     inset the handle boundaries from the scroll bar edges.  */
! #define X_VERTICAL_SCROLL_BAR_LEFT_BORDER (2)
! #define X_VERTICAL_SCROLL_BAR_RIGHT_BORDER (2)
! #define X_VERTICAL_SCROLL_BAR_TOP_BORDER (2)
! #define X_VERTICAL_SCROLL_BAR_BOTTOM_BORDER (2)
  
  /* Minimum lengths for scroll bar handles, in pixels.  */
! #define X_VERTICAL_SCROLL_BAR_MIN_HANDLE (5)
  
  
  /* Manipulating pixel sizes and character sizes.
***************
*** 709,735 ****
  
  /* Create the first two computed faces for a frame -- the ones that
     have GC's.  */
! extern void init_frame_faces (/* FRAME_PTR */);
  
  /* Free the resources for the faces associated with a frame.  */
! extern void free_frame_faces (/* FRAME_PTR */);
  
  /* Given a computed face, find or make an equivalent display face
     in face_vector, and return a pointer to it.  */
! extern struct face *intern_face (/* FRAME_PTR, struct face * */);
  
  /* Given a frame and a face name, return the face's ID number, or
     zero if it isn't a recognized face name.  */
! extern int face_name_id_number (/* FRAME_PTR, Lisp_Object */);
  
  /* Return non-zero if FONT1 and FONT2 have the same size bounding box.
     We assume that they're both character-cell fonts.  */
! extern int same_size_fonts (/* XFontStruct *, XFontStruct * */);
  
  /* Recompute the GC's for the default and modeline faces.
     We call this after changing frame parameters on which those GC's
     depend.  */
! extern void recompute_basic_faces (/* FRAME_PTR */);
  
  /* Return the face ID associated with a buffer position POS.  Store
     into *ENDPTR the next position at which a different face is
--- 750,776 ----
  
  /* Create the first two computed faces for a frame -- the ones that
     have GC's.  */
! extern void x_init_frame_faces (/* FRAME_PTR */);
  
  /* Free the resources for the faces associated with a frame.  */
! extern void x_free_frame_faces (/* FRAME_PTR */);
  
  /* Given a computed face, find or make an equivalent display face
     in face_vector, and return a pointer to it.  */
! extern struct x_face *x_intern_face (/* FRAME_PTR, struct x_face * */);
  
  /* Given a frame and a face name, return the face's ID number, or
     zero if it isn't a recognized face name.  */
! extern int x_face_name_id_number (/* FRAME_PTR, Lisp_Object */);
  
  /* Return non-zero if FONT1 and FONT2 have the same size bounding box.
     We assume that they're both character-cell fonts.  */
! extern int x_same_size_fonts (/* XFontStruct *, XFontStruct * */);
  
  /* Recompute the GC's for the default and modeline faces.
     We call this after changing frame parameters on which those GC's
     depend.  */
! extern void x_recompute_basic_faces (/* FRAME_PTR */);
  
  /* Return the face ID associated with a buffer position POS.  Store
     into *ENDPTR the next position at which a different face is
***************
*** 738,749 ****
     window displaying the current buffer.
  
     REGION_BEG, REGION_END delimit the region, so it can be highlighted.  */
! extern int compute_char_face (/* FRAME_PTR frame,
! 				 struct window *w,
! 				 int pos,
! 				 int region_beg, int region_end,
! 				 int *endptr */);
  /* Return the face ID to use to display a special glyph which selects
     FACE_CODE as the face ID, assuming that ordinarily the face would
     be BASIC_FACE.  F is the frame.  */
! extern int compute_glyph_face (/* FRAME_PTR, int */);
--- 779,790 ----
     window displaying the current buffer.
  
     REGION_BEG, REGION_END delimit the region, so it can be highlighted.  */
! extern int x_compute_char_face (/* FRAME_PTR frame,
!                                    struct window *w,
!                                    int pos,
!                                    int region_beg, int region_end,
!                                    int *endptr */);
  /* Return the face ID to use to display a special glyph which selects
     FACE_CODE as the face ID, assuming that ordinarily the face would
     be BASIC_FACE.  F is the frame.  */
! extern int x_compute_glyph_face (/* FRAME_PTR, int */);
Index: emacs/src/bitmaps/README
diff -c emacs/src/bitmaps/README:1.1.1.1 emacs/src/bitmaps/README:1.2
*** emacs/src/bitmaps/README:1.1.1.1	Fri Jul 19 01:53:55 1996
--- emacs/src/bitmaps/README	Fri Jul 19 05:09:13 1996
***************
*** 2,4 ****
--- 2,5 ----
  /usr/include/X11/bitmaps.  That directory doesn't seem to exist under
  VMS.
  
+ It also contains all the tiff files for emacs 19 for NS.
Index: emacs/src/bitmaps/bibfile.tiff
Index: emacs/src/bitmaps/cfile.tiff
Index: emacs/src/bitmaps/elfile.tiff
Index: emacs/src/bitmaps/emacs.tiff
Index: emacs/src/bitmaps/f90file.tiff
Index: emacs/src/bitmaps/hfile.tiff
Index: emacs/src/bitmaps/lfile.tiff
Index: emacs/src/bitmaps/mfile.tiff
Index: emacs/src/bitmaps/texfile.tiff
Index: emacs/src/bitmaps/text.tiff
Index: emacs/src/bitmaps/yfile.tiff
Index: emacs/src/m/next.h
diff -c emacs/src/m/next.h:1.1.1.2 emacs/src/m/next.h:1.3
*** emacs/src/m/next.h:1.1.1.2	Mon Jul 22 01:45:10 1996
--- emacs/src/m/next.h	Wed Jul 31 01:39:24 1996
***************
*** 38,46 ****
--- 38,67 ----
  
  /* Let the compiler tell us.  */
  #ifdef __BIG_ENDIAN__
+ #ifndef BIG_ENDIAN
+ #define BIG_ENDIAN
+ #endif
  #define WORDS_BIG_ENDIAN
  #endif
  
+ #ifdef hppa
+ /* The following are glommed from the hp9000s800.h file */
+ 
+ /* Define NO_ARG_ARRAY if you cannot take the address of the first of a
+  * group of arguments and treat it as an array of the arguments.  */
+ #define NO_ARG_ARRAY
+ 
+ #define STACK_DIRECTION 1
+ #endif
+ 
+ #ifdef sparc
+ /* The following are glommed from the sparc.h file */
+ 
+ /* Define NO_ARG_ARRAY if you cannot take the address of the first of a
+  * group of arguments and treat it as an array of the arguments.  */
+ #define NO_ARG_ARRAY
+ #endif
+ 
  /* Define how to take a char and sign-extend into an int.
     On machines where char is signed, this is a no-op.  */
  
***************
*** 100,111 ****
  
  #define LIB_GCC
  
- #if 0  /* ohl@chico.harvard.edu says to do this.  */
- /* Compile "strict bsd" to avoid warnings from include files */
- 
- #define C_SWITCH_MACHINE	-bsd
- #endif
- 
  /* Link this program just by running cc.  */
  #define ORDINARY_LINK
  
--- 121,126 ----
***************
*** 120,132 ****
     stupidly gets confused by it.  */
  #undef KERNEL_FILE
  
! #define LD_SWITCH_MACHINE -X -noseglinkedit
  
! #define environ _environ
  
- #if 0 /* This is ok for NeXT system version 3.0 or above.  */
  /* Where to find the kernel, for load average.  */
  #define KERNEL_FILE "/mach"
  #endif
  
  /* This should be true for recent NeXT systems.  At least since 3.2.  */
--- 135,155 ----
     stupidly gets confused by it.  */
  #undef KERNEL_FILE
  
! #define LD_SWITCH_MACHINE
  
! /* #define environ _environ */
  
  /* Where to find the kernel, for load average.  */
+ #if 0
  #define KERNEL_FILE "/mach"
+ #endif
+ 
+ #ifdef sparc
+ 
+ /* Define NO_ARG_ARRAY if you cannot take the address of the first of a
+  * group of arguments and treat it as an array of the arguments.  */
+ 
+ #define NO_ARG_ARRAY
  #endif
  
  /* This should be true for recent NeXT systems.  At least since 3.2.  */
Index: emacs/src/s/mach2.h
diff -c emacs/src/s/mach2.h:1.1.1.1 emacs/src/s/mach2.h:1.3
*** emacs/src/s/mach2.h:1.1.1.1	Fri Jul 19 01:53:50 1996
--- emacs/src/s/mach2.h	Thu Aug  1 02:03:53 1996
***************
*** 25,30 ****
--- 25,39 ----
  #undef SYSTEM_TYPE
  #define SYSTEM_TYPE "next-mach"
  
+ #ifdef HAVE_NS
+ #define LD_SWITCH_SYSTEM -X -noseglinkedit -sectcreate __ICON __header ${srcdir}/emacs.iconheader -segprot __ICON r r -sectcreate __ICON app ${srcdir}/bitmaps/emacs.tiff -sectcreate __ICON text ${srcdir}/bitmaps/text.tiff -sectcreate __ICON bibfile ${srcdir}/bitmaps/bibfile.tiff -sectcreate __ICON cfile ${srcdir}/bitmaps/cfile.tiff -sectcreate __ICON elfile ${srcdir}/bitmaps/elfile.tiff -sectcreate __ICON elcfile ${srcdir}/bitmaps/elfile.tiff -sectcreate __ICON hfile ${srcdir}/bitmaps/hfile.tiff -sectcreate __ICON mfile ${srcdir}/bitmaps/mfile.tiff -sectcreate __ICON texfile ${srcdir}/bitmaps/texfile.tiff -sectcreate __ICON lfile ${srcdir}/bitmaps/lfile.tiff -sectcreate __ICON yfile ${srcdir}/bitmaps/yfile.tiff -sectcreate __ICON f90file ${srcdir}/bitmaps/f90file.tiff
+ 
+ /* Don't use -lc on the NeXT.  */
+ #define LIB_STANDARD -lNeXT_s
+ #define LIB_MATH
+ 
+ #else /* ! HAVE_NS */
+ 
  #define LD_SWITCH_SYSTEM -X -noseglinkedit
  
  /* Don't use -lc on the NeXT.  */
***************
*** 32,37 ****
--- 41,48 ----
  #define LIB_MATH -lm
  
  #define environ _environ
+ 
+ #endif /* HAVE_NS */
  
  #define START_FILES pre-crt0.o
  #define UNEXEC unexnext.o
